Mavlink主要是飞控和地面站之间的消息指令发送,包含地面站解析飞控发来的mavlink数据流,和地面站向飞控发送mavlink指令(指令,航点数据,校准数据)两部分。地面站有mavlink库,对应飞控端也有一套mavlink库。
1、协议介绍
Mavlink协议官网:http://qgroundcontrol.org/mavlink/start Pixhawk/APM都是采用MAVLINK协议实现的飞控的数据链路传输。先简单介绍下mavlink协议。Mavlink协议最早由 苏黎世联邦理工学院 计算机视觉与几何实验组的 Lorenz Meier于2009年发布,并遵循LGPL开源协议。Mavlink协议是在串口通讯(可扩展为网络TCP/IP通信)基础上的一种更高层的开源通讯协议,主要应用在微型飞行器(micro aerial vehicle)的通讯上。Mavlink是为小型飞行器和地面站(或者其他飞行器)通讯时常常用到的那些数据制定一种发送和接收的规则并加入了校验(checksum)功能。
消息结构
比较简单的消息结构如图:
消息解析
消息数据流
我们接上数传在串口调试助手具体分析下MAVLINK消息的解析:
尝试解析 0号消息
FE 09 57 01 01 00 00 00 01 00 02 0C 51 03 03 04 5F - FE消息头, - 09表示数据包长度, - 57消息帧序号,- 01表示系统ID, - 01表示组件ID, - 00表示消息序号(表示心跳包),-00 00 01 00 02 0C 51 03 03 有效载荷数据
http://mavlink.org/messages/common(Mvlink消息定义)
00 ---- type
00 ---- autopilot
01 ---- base_mode(基本模式)
00 02 0C 51 ---- custom_mode(自稳模式)
03 ---- sytem_status
03 ---- mavlink_version
04 5F --CRC校验
尝试解析
FE 3E 4B 01 01 69 DB 7E C8 1D 00 00 00 00 A0 6D 2C BD CC 23 E3 BE D2 D5 1C C1 FC 3A AD 3A 68 6C 31 3A 00 E0 99 BA EB 43 9A BE 40 1B 6D 3E 9F 86 04 3F 00 00 00 00 00 00 00 00 70 72 06 44 1F 85 04 42 FF 1B 9F F8 69号消息
2、消息解析
MissionPlanner-MissionPlanner1.3.49\ExtLibs\SimpleExample 这个源码目录里面有一个非常好的地面站开发入门教程,是一个原始的地面站开发教程,里面有完整的协议解析,指令发送,飞控应答方法
步骤
1打开串口
2配置串口,设置超时时间
3读取串口数据流,调用mavlink库,解析数据packet.data.GetType()==typeof(MAVLink.mavlinkheartbeatt)
4向飞控请求数据流mavlink.GenerateMAVLinkPacket10(MAVLink.MAVLINKMSGID.REQUESTDATASTREAM
5判断消息包类型
6发送mavlink消息指令,等待飞控应答
3、指令发送
向飞控发送指令协议,重点是指令发送成功,飞控接受以后会返回一个应答数据,通过判断应答数据是否成功,可以知道飞控是否接受本次指令。
1。byte[]packet=mavlink.GenerateMAVLinkPacket10(MAVLink.MAVLINKMSGID.COMMAND_LONG,req);//消息命令封装,封装到packet
2。 serialPort1.Write(packet, 0, packet.Length);//通过串口读写,把封装好的packet(mavlink命令消息)发送到飞控var ack = readsomedata(sysid, compid);//读取飞控发来的应答数据
3。if (ack.result == (byte)MAVLink.MAV_RESULT.ACCEPTED) //如果飞控解锁成功