mission planner发送数据之mavlink

前段时间研究mp的地面站,看了几天有点体会,看网上的解析比较少,写上来和大家分享下,全是自己的理解,东西比较少,硬货不多,还请见谅。

最开始是想做个无人机超声波定位的东西,不过定位机连着pc,数据首先传到pc。所以要设计个东西把定位机传过来的数据发到机载端去,因此先研究了mavlink协议。在GitHub下了mission planner的源码,这个好找,网上到处都有,有点C#基础就行了,代码比较简单。运行成功后,

这个是MP的全部文件。当时浏览里面的mavlink部分,主要在Libs文件夹,有个mavlink文件

里面集成了这几个很重要;其次的是第一个MissionPlanner文件里的Mavlink文件,其中的MAVLinkInterface很重要。如果想实现发送数据的功能,这几个最好还是都浏览下。

第一个mavlink.cs文件主要是传输协议的数据结构,每个帧的形式和发送的message_info。定义新的messageID的时候,其中有个crc自己设的很重要很重要,它其实是在飞控生成的,并不是自己随便写的,就是这个crc,如果会pixhawk,在上面创建了你自己的messageID后,会自动生成这个crc,你再在地面站填写这个crc,随便写是不能通过的(这个很重要,开始我自己设了一个crc,但是和飞控连接不上,还是后来写飞控的师兄找到了这个东西);第二个mavlinkCRC是校验位,看了一下就是个16位校验,有高位和低位两个;第三个mavlinkmessage就是把这个消息的头,序号,校验位等提取出来,但是未对payload里的内容进行处理;第四,五个param没怎么研究;最后一个util好像是个内存分配的东西,看着有点复杂,我没特别仔细看。

mavlinkinterface就很重要了,收发整个过程的发送,接收,打包,解析都是在这个文件里,其中的getHeartBeat是判断接收到的是不是心跳包的东西,是个握手的文件,要注意下;后面的sendPacket和 generatepacket就是发送的整个过程了,要好好的看,全部了解透,它把怎么压缩这个payload,每一位对应什么,整个过程都详细的表达在这个地方。

前面把背景介绍完了,就说怎么实现发数了。首先,你要把你发送数据的内容,长度,ID号都明确清楚,写在一张纸上;然后在Libs文件的mavlink的mavlink.cs中添加你要发送的数据结构,像这样

然后在枚举MAVLINK_MSG_ID 中加入你ID信息;再去这添加你的messageinfo

注意对着格式写,其中的crc要通过飞控自动生成,不能随便写。第二步,我是在MissionPlanner文件的GCSViews文件里找到FlightPlanner.cs这个界面窗口,在窗口中加了一个按钮,对应后面button1_Click调用。简单的发送指令就是这样

你的结构定义好后,生成对应的payload,你想把每个字节添加什么东西,都可以写进去,然后调用sendpacket方法就可以发送了。我是根据原始文件中一个上传信息写的,原始信息发送的是MAVLink.mavlink_hil_state_t这个信息,可以查看引用自己找找。

当程序写完,自己调试的时候,可以用两个串口调试助手,第一个是双口的助手,第二个单口的助手。把第一个的一端连在MP上,第二端连着第二个串口助手。这样就可以把第二个串口助手模拟成一个飞控。要建立连接的下一步就是你需要找一段飞控的握手代码(因为地面站和飞控第一步要建立连接,我的办法是先把自己的电脑连着飞控pixhawk,然后用串口接着pixhawk,这个时候串口里就有很多数,是飞控发下来的姿态等信息,这个时候我从中拷贝了一段复制下来),然后我把拷贝下来的代码放到第二个串口助手中,点的重复发送,这样相当于这个串口就是一个不断向外发数的“飞控”了,只不过他的参数都是假的- -。然后这个时候建立连接就没问题啦,虽然获取不到参数信息,但是通过这个“连接”的握手协议是没问题的。然后在MP上点击之前的按钮,就可以在串口中看到你发的信息啦。

猜你喜欢

转载自blog.csdn.net/cz_bykz/article/details/57506540