Mavlink协议
Mavlink协议简介
⼀、Mavlink协议
MAVLink通讯协议是⼀个为微型飞⾏器设计的⾮常轻巧的、只由头⽂件构成的信息编组库。它可以通过串⼝⾮常⾼效地封装C结构数据,并将这些数据包发送⾄地⾯控制站。该协议被PX4, PIXHAWK, APM和Parrot AR.Drone平台所⼴泛测试并在以上的项⽬中作为MCU/IMU 间以及Linux进程和地⾯站链路通信间的主⼲通信协议。
MAVLink最初由LorenzMeier根据LGPL许可在2009年初发表。
⼆、数据结构
Mavlink传输时基本单位是消息帧,消息帧的结构如下:
索引名称内容值含义
0STX数据包起始标志0xFE(v1.0)/0x55(v0.9)标识新消息的开始
1LEN有效载荷长度0-255标识该消息包中负载长度
2SEQ数据包序列号0-255消息发送序列号,⽤于检测数据包的丢失
3SYS系统ID1-255发送该包的系统ID。能够区分在同⼀⽹络中不同的MAV
4COMP组件ID0-255发送该包的组件ID,能够区分同⼀系统的不同发送设备。如:IMU和AutoPilot 5MSG消息ID0-255该ID定义了有效负载的“含义”以及负载应被如何正确的解码
6⾄n+6PAYLOAD消息载荷0-255 字节消息内部的负载信息
n+7CKA校验位(低8位)-CRC校验码
n+8CKB校验位(⾼8位)-CRC校验码
注意:校验码由crc16算法得到,算法从消息包的1~n+6字节(不包含STX),还要额外加上个MAVLINK_CRC_EXTRA进⾏计算得到⼀个16位的校验码。每个消息的头⽂件⾥都包含MAVLINK_CRC
_EXTRA,这个 MAVLINK_CRC_EXTRA是由⽣成mavlink代码的xml⽂件⽣成的,加⼊这个额外的东西是为了当飞⾏器和地⾯站使⽤不同版本的mavlink协议时,双⽅计算得到的校验码会不同,这样不同版本间的mavlink协议就不会在⼀起正常⼯作,避免了由于不同版本间通讯时带来的重⼤潜在问题。
三、协议⽀持的数据类型
MAVLink协议⽀持固定⼤⼩的整形数据类型、IEEE754协议规定的单精度浮点型数据,或由以上数据构成的数组(如:char[10]),以及由协议⾃动添加的MAVLink版本号。具体如下:
- char - Characters / strings
- uint8_t - Unsigned 8 bit
- int8_t - Signed 8 bit
- uint16_t - Unsigned 16 bit
- int16_t - Signed 16 bit
- uint32_t - Unsigned 32 bit
-
int32_t - Signed 32 bit
- uint64_t - Unsigned 64 bit
- int64_t - Signed 64 bit
- float - IEEE 754 single precision floating point number
- double - IEEE 754 double precision floating point number
- uint8_t_mavlink_version - ⽆符号的8位字符⾃动补充到当前的mavlink版本,它不能被写⼊,只是读按照8位字符的⽅式读取。
四、性能
Mavlink协议有两⽅⾯的特性:传输速度快和安全性⾼。协议允许检验消息内容,同样允许检测丢失的消息序列且最少只需要每个包中6个字节的开销来保证。传输实例:
链接速度硬件更新速率负载浮点值115200 baud XBee Pro 2.4 GHz50 Hz224 bytes56
115200 baud XBee Pro 2.4 GHz100 Hz109 bytes27
57600 baud XBee Pro 2.4 GHz100 Hz51 bytes12
9600 baud XBee Pro XSC 90050 Hz13 bytes3
9600 baud XBee Pro XSC 90020 Hz42 bytes10
五、航点协议
航点协议描述了航点是如何发送和读取的。其⽬标是在发送端和接收端确保建⽴⼀种连续稳定的状态,以达到每个使⽤MAVLINK的MAV能够和QGC通信并交换或更新它的航点。
使⽤航点协议时,除了应答消息之外的其他信息在被发送之后,发送端的部件就会启动⼀个定时器。如果在特定的时间内,没有收到响应则请求的消息将会被重新发送⼀次。该重传过程会重复数次,如果在最后⼀次的重传超时后仍然没有收到相应,则认定该项事务失败。该重传机制意味着所有的部件必须能够处理重复的消息。
1. 读取MAV的航点列表
读取过程如下:
QGC端先发送⼀个WAYPOINT_REQUEST_LIST消息给MAV;MAV则会回⼀个WAYPOINT_COUNT消息,该消息描述了MAV的航点列表中航点的数量
system的头文件
QGC端发送⼀个WAYPOINT_REQUEST(WP0)的消息请求得到第1个航点的信息;MAV则会回对应的包含航点数据的消息WAYPOINT(WP0)
重复步骤2得到第2、3、4…直到最后⼀个航点的数据
当全部接收完所有的航点消息后,QGC端会发送⼀个WAYPOINT_ACK消息给MAV,⽤来表明整个读取过程结束了
整个过程如下图所⽰:
2. 写MAV的航点列表
写⼊过程为:
QGC先将航点列表中航点的数量以WAYPOINT_COUNT(N)消息发送给MAV;MAV则回应请求第1个航点的消息WAYPOINT_REQUEST(WP0) QGC接收到第1个航点的请求消息后,将包含第1个航点的数据以WAYPOINT(WP0)消息发送给MAV;MAV收到后继续请求下⼀个航点的信息当MAV接收到最后⼀个航点的信息后,MAV会向QGC发送⼀个WAYPOINT_ACK消息来表明整个事件的结束
整个过程如下图所⽰:
3. 清除MAV的航点列表
4. 设置当前MAV航点
六、参数的读写
1. 读取参数列表
2. 读取单个参数
单个参数可以通过PARAM_REQUEST_READ消息来读取3. 写参数
七、增加新的mavlink消息
MAVLINK的消息是定义在XML⽂件中,再被转换成C/C++,C#或Python代码。以⼼跳消息为例对如何增加新的消息进⾏说明。
注意:⼼跳消息heartbeat是唯⼀必须被使⽤的消息,飞⾏器与地⾯站相连时,地⾯站通常是根据⼼跳消息来判断是否和飞⾏器失去了
联系,所以飞⾏器端需要以⼀定频率发送这个⼼跳包(通常为1HZ)
1. XML⽂件中消息的定义
以下代码为在XML⽂件中⼼跳消息的定义,来⾃mavlink/message_l
<message id="0"name="HEARTBEAT">
<description>The heartbeat message shows that a system is present and responding. The type of the MAV and Autopilot hardware allow the receiving sys  <field type="uint8_t"name="type">Type of the MAV (quadrotor, helicopter, etc., up to15 types, defined in MAV_TYPE ENUM)</field>
<field type="uint8_t"name="autopilot">Autopilot type / class. defined in MAV_CLASS ENUM</field>
<field type="uint8_t"name="base_mode">System mode bitfield, see MAV_MODE_FLAGS ENUM in mavlink/include/mavlink_types.h</field>
<field type="uint32_t"name="custom_mode">Navigation mode bitfield, see MAV_AUTOPILOT_CUSTOM_MODE ENUM for some examples. This field  <field type="uint8_t"name="system_status">System status flag, see MAV_STATUS ENUM</field>
<field type="uint8_t_mavlink_version"name="mavlink_version">MAVLink version</field>
</message>
代码解读:
每条消息都是在<message></message>之间定义的
id="0"表⽰这条消息的ID或索引是数字0。消息ID的有效数字是从0~255,其中150~240是预留给⽤户来⾃定义消息的。
name="HEARTBEAT"是⼀个易读的消息名称,只⽤在定义代码中,消息传输时不会发送这个名字,消息本⾝只依赖于消息ID。
定义中的<description></description>表⽰消息的描述,消息的描述很重要,但不是必须的。消息的描述可以让⽤户明确该消息的含义和⽤途。
定义中的<field></field>表⽰消息的字段,类似于C中结构体的变量。消息的字段可以是有⽆符号的8位、16位、32位、64位的整型,也可以是单
双精度的IEEE754浮点型。
type="uint8_t"表⽰该字段为⽆符号的8位整型。如果你想定义⼀个数组可以这样定义:type="uint8_t[5]" ,uint8_t_mavlink_version是⼀个特殊的
类型,它是⼀个⽆符号的8位整型,⽤来表⽰当前使⽤的mavlink协议的版本号,该字段是只读的,当消息发送时会⾃动被填充。
2. 建⽴消息定义⽂件
如果你想建⽴⼀个单独的消息定义⽂件,就像l或其它位于message_definitions⽂件夹下的XML⽂件⼀样。你可以像下⾯代码⼀样
定义,注意⼀定要包含版本号;如果这个XML⽂件和l位于同⼀个路径下,那么最终⽣成的MAVLINK代码中会包含l的
内容。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。