pixhawk-----mavlink

来源:blog.csdn.net/super_mice/article/details/44836585


之前看了mavlink协议,网上关于mavlink的资料不多。本文大概总结了下对mavlink协议的理解。以下如不说明都是说mavlink v1.0版本。


首先附上mavlink的各个消息的简介http://qgroundcontrol.org/mavlink/start


之后会在我的资源里上传一份为初学者准备的mavlink资料(转载)已经上传至笔者资源,免费下载。Lorenz Meier 于2009年发布,并遵循LGPL开源协议。Mavlink协议是在串口通讯基础上的一种更高层的开源通讯协议,主要应用在微型飞行器(micro aerial vehicle)的通讯上。Mavlink是为小型飞行器和地面站(或者其他飞行器)通讯时常常用到的那些数据制定一种发送和接收的规则并加入了校验(checksum)功能。


【1】下面开始说介绍mavlink所发送的数据结构。Mavlink传输时的基本单位是消息帧。

pixhawk-----mavlink_第1张图片

1.png (46.04 KB, 下载次数: 19)

下载附件

2015-6-16 17:27 上传

如图所示,每个消息帧都是上述的结构,除了灰色外,其他的格子都代表了一个字节的数据。


红色的是起始标志位(stx),在v1.0版本中以“FE”作为起始标志。这个标志位在mavlink消息帧接收端进行消息解码时有用处。


第二个格子代表的是灰色部分(payload,称作有效载荷,要用的数据在有效载荷里面)的字节长度(len),范围从0到255之间。在mavlink消息帧接收端可以用它和实际收到的有效载荷的长度比较,以验证有效载荷的长度是否正确。


第三个格子代表的是本次消息帧的序号(seq),每次发完一个消息,这个字节的内容会加1,加到255后会从0重新开始。这个序号用于mavlink消息帧接收端计算消息丢失比例用的,相当于是信号强度。


第四个格子代表了发送本条消息帧的设备的系统编号(sys),使用PIXHAWK刷PX4固件时默认的系统编号为1,用于mavlink消息帧接收端识别是哪个设备发来的消息。


第五个格子代表了发送本条消息帧的设备的单元编号(comp),使用PIXHAWK刷PX4固件时默认的单元编号为50,用于mavlink消息帧接收端识别是设备的哪个单元发来的消息(暂时没什么用) 。


第六个格子代表了有效载荷中消息包的编号(msg),注意它和序号是不同的,这个字节很重要,mavlink消息帧接收端要根据这个编号来确定有效载荷里到底放了什么消息包并根据编号选择对应的方式来处理有效载荷里的信息包。


最后两个字节是16位校验位,ckb是高八位,cka是低八位。校验码由crc16算法得到,算法将整个消息(从起始位开始到有效载荷结束,还要额外加上个MAVLINK_CRC_EXTRA字节)进行crc16计算,得出一个16位的校验码。之前提到的每种有效载荷里信息包(由消息包编号来表明是哪种消息包)会对应一个MAVLINK_CRC_EXTRA,这个 MAVLINK_CRC_EXTRA 是由生成mavlink代码的xml文件生成的,加入这个额外的东西是为了当飞行器和地面站使用不同版本的mavlink协议时,双方计算得到的校验码会不同,这样不同版本间的mavlink协议就不会在一起正常工作,避免了由于不同版本间通讯时带来的重大潜在问题。


为了方便叙述,消息包将称作包,包所代表的信息称作消息。上图中的sys将称为sysidcomp将称为compidmsg将称为msgid。

官方的介绍如下图:


pixhawk-----mavlink_第2张图片

2.png (17.74 KB, 下载次数: 13)

下载附件

2015-6-16 17:27 上传


pixhawk-----mavlink_第3张图片


由于图片上传量到达上限,将在接下去的博客中继续介绍mavlink协议。下节主要介绍mavlink里消息的种类和如何看懂开始时提到的那个官方的mavlink消息介绍。



mavlink协议 一帧数据的长度为8到263个字节。
其具体的解析如下所示:
字节的索引        值                         含义
    0                    0xFE(V1.0)           帧头,表示一帧数据的开始
    1                    0 ~ 255                表示有效数据的长度
    2                    0 ~ 255                包序列,允许丢包
    3                    1 ~ 255                系统的ID,发送系统的ID,允许在同一网络区分不同的飞行器。
    4                    0 ~ 255                组件的ID,允许在同一系统中区分不同的组件,如IMU和自动驾驶仪。
    5                    0 ~ 255                消息ID,定义有效载荷应如何解码
    6(n+6)      0 ~ 255个字节     消息数据,取决于消息的ID
    n+7               校验低字节
    n+8               校验高字节           CRC-16、包括MAVLINK_CRC_EXTRA

校验步骤:
    1、先校验前面五个字节,不包括帧头;
    2、在校验有效数据;
    3、在校验MAVLINK_CRC_EXTRA(MAVLINK_MESSAGE_CRCS[消息ID]),RC的为124
uint8_t MAVLINK_MESSAGE_CRCS[] =  {50, 124, 137, 0, 237, 217, 104, 119, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 214, 159, 220, 168, 24, 23, 170, 144, 67, 115, 39, 246, 185, 104, 237, 244, 222, 212, 9, 254, 230, 28, 28, 132, 221, 232, 11, 153, 41, 39, 214, 223, 141, 33, 15, 3, 100, 24, 239, 238, 30, 240, 183, 130, 130, 118, 148, 21, 0, 243, 124, 0, 0, 0, 20, 0, 152, 143, 0, 0, 127, 106, 147, 211, 198, 0, 0, 0, 0, 231, 183, 63, 54, 0, 0, 0, 0, 0, 0, 0, 175, 102, 158, 208, 56, 93, 211, 108, 32, 185, 235, 93, 124, 124, 119, 4, 76, 128, 56, 116, 134, 237, 203, 250, 87, 203, 220, 25, 226, 0, 29, 223, 85, 6, 229, 203, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, 241, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 49, 170, 44, 83, 46, 0};

版权声明:本文为博主原创文章,未经博主允许不得转载。



你可能感兴趣的:(Drone)