MAVLink v1.0详解——结构
本文针对 MAVLink v1.0版本,协议版本:3。
MAVLink是为微型飞行器MAV(Micro Air Vehicle)设计的(LGPL)开源的通讯协议。是无人飞行器和地面站(Ground Control Station ,GCS)之间,以及无人飞行器之间通讯常用的协议。APM、PIXHAWK飞控,Mission Planner、QGroundControl地面站均使用了MAVLink协议进行通讯。
MAVLink源码下载地址(现已更新至v2.0):https://github.com/mavlink/qgroundcontrol
用户手册:https://docs.qgroundcontrol.com/en/
MAVLink源文件结构

1、 common文件夹:原始的MAVLink消息,包括各种消息的头文件
common.h:定义MAVLink各个消息包中用到的枚举类型,各个消息包对应的CRC—EXTRA值、LENGTH值,包含(include)各个消息包的头文件
各个消息的头文件:1)定义消息内容对应的数据结构,2)打包、发送消息的便捷函数,3)消息包解析并获取各个参数
2、 autopilotmega,ASLUAV,pixhawk等文件夹:这些文件夹包含各个飞控自定义的MAVLink消息类型
3、 checksum.h:计算校验码的代码
4、 mavlink_conversions.h:dcm,欧拉角,四元数之间的转换
5、 mavlink_helper.h:提供各种便捷函数:
1)将各个消息包补充完整并发送。将数据载荷加上消息帧的头部,如sysid和compid等,计算校验码,补充成为完整的mavlink消息包后发送;
2)MAVLink消息包解析。
6、 mavlink_types.h:定义用到的各种基本结构体(如mavlink_message_t)、枚举类型(如 mavlink_param_union_t)
MAVLink消息包结构
MAVLink传输时,以消息包作为基本单位,数据长度为8~263字节。消息数据包的结构如下:

| 字节索引 | 内容 | 值 | 解释 | |
| STX | 0 | 包起始标志 | v1.0:0xFE | 包的起始标志,在v1.0中以“FE”作为起始标志(FE=254) | 
| LEN | 1 | 有效载荷长度 | 0~255 | 有效载荷数据的字节长度(N) | 
| SEQ | 2 | 包的序列号 | 0~255 | 每发送完一个消息,内容加1。用以检测丢包情况 | 
| SYS | 3 | 系统ID编号 | 1~255 | 发送本条消息包的系统/飞行器的编号。用于消息接收端在同一网络中识别不同的MAV系统 | 
| COMP | 4 | 部件ID编号 | 0~255 | 发送本条消息包的部件的编号。用于消息接收端在同一系统中区分不同的组件,如IMU和飞控 | 
| MSG | 5 | 消息包ID编号 | 0~255 | 有效载荷中消息包的编号。该id定义了有效载荷内放的是什么类型的消息,以便消息接收端正确地解码消息包 | 
| PAYLOAD | 6~N+6 | 有效载荷数据 | 0~255字节 | 要用的数据放在有效载荷里。内容取决于message id。 | 
| CKA | N+7 | 校验和低字节 | 16位校验码; ITU X.25/SAE AS-4哈希校验(CRC-16-CCITT),不包括数据包起始位,从第一个字节到有效载荷(字节1 ..(N+6))进行crc16计算(还要额外加上一个MAVLINK_CRC_EXTRA字节),得到一个16位校验码 | |
| CKB | N+8 | 校验和高字节 | 
注:校验(checksum)功能。加入MAVLINK_CRC_EXTRA,当两个通讯终端之间(飞行器和地面站,或飞行器和飞行器)使用不同版本的MAVLink协议时,双方计算得到的校验码会不同,则不同版本的MAVLink协议之间将无法通讯。MAVLINK_MESSAGE_CRCS中存储了每种消息包对应的MAVLINK_CRC_EXTRA。这个 MAVLINK_CRC_EXTRA在用python生成MAVLink代码时在common.h头文件中自动生成。
MAVLink数据包的结构在mavlink_types.h中用mavlink_message_t结构体定义:
 typedef struct __mavlink_message {
 uint16_t checksum; /// CRC
 uint8_t magic;   /// STX
 uint8_t len;     /// LEN
 uint8_t seq;     /// SEQ
 uint8_t sysid;   /// SYS
 uint8_t compid;  /// COMP
 uint8_t msgid;   /// MSG
 uint64_t payload64[(MAVLINK_MAX_PAYLOAD_LEN+MAVLINK_NUM_CHECKSUM_BYTES+)/];
 } mavlink_message_t;  
MAVLINK Common Message Set
MAVLink通用消息集可以在《MAVLLINK Common Message set specifications》文档中查看。这些消息定义了通用消息集,这是大多数地面控制站和自动驾驶仪实现的参考消息集,头文件包含在common文件夹中。
分为两部分:MAVLink Type Enumerations(MAVLink类型枚举 )和MAVLink Messages(MAVLink消息包)。
MAVLink Type Enumerations
MAVLink Type Enumerations在common.h文件中定义。如下,枚举变量定义了飞行器的类型MAV_AUTOPILOT。

typedef enum MAV_AUTOPILOT
{
MAV_AUTOPILOT_GENERIC=, /* Generic autopilot, full support for everything | */
MAV_AUTOPILOT_RESERVED=, /* Reserved for future use. | */
MAV_AUTOPILOT_SLUGS=, /* SLUGS autopilot, http://slugsuav.soe.ucsc.edu | */
MAV_AUTOPILOT_ARDUPILOTMEGA=, /* ArduPilotMega / ArduCopter, http://diydrones.com | */
MAV_AUTOPILOT_OPENPILOT=, /* OpenPilot, http://openpilot.org | */
MAV_AUTOPILOT_GENERIC_WAYPOINTS_ONLY=, /* Generic autopilot only supporting simple waypoints | */
MAV_AUTOPILOT_GENERIC_WAYPOINTS_AND_SIMPLE_NAVIGATION_ONLY=, /* Generic autopilot supporting waypoints and other simple navigation commands | */
MAV_AUTOPILOT_GENERIC_MISSION_FULL=, /* Generic autopilot supporting the full mission command set | */
MAV_AUTOPILOT_INVALID=, /* No valid autopilot, e.g. a GCS or other MAVLink component | */
MAV_AUTOPILOT_PPZ=, /* PPZ UAV - http://nongnu.org/paparazzi | */
MAV_AUTOPILOT_UDB=, /* UAV Dev Board | */
MAV_AUTOPILOT_FP=, /* FlexiPilot | */
MAV_AUTOPILOT_PX4=, /* PX4 Autopilot - http://pixhawk.ethz.ch/px4/ | */
MAV_AUTOPILOT_SMACCMPILOT=, /* SMACCMPilot - http://smaccmpilot.org | */
MAV_AUTOPILOT_AUTOQUAD=, /* AutoQuad -- http://autoquad.org | */
MAV_AUTOPILOT_ARMAZILA=, /* Armazila -- http://armazila.com | */
MAV_AUTOPILOT_AEROB=, /* Aerob -- http://aerob.ru | */
MAV_AUTOPILOT_ASLUAV=, /* ASLUAV autopilot -- http://www.asl.ethz.ch | */
MAV_AUTOPILOT_ENUM_END=, /* | */
} MAV_AUTOPILOT;
MAVLink Messages
MAVLink Messages在common文件夹内每个消息包的头文件中定义。在文档中msgid以蓝色的“#”加数字的方式来表示,如心跳包的“#0”,在心跳包的头文件mavlink_msg_heartbeat.h中,MAVLINK_MSG_ID_HEARTBEAT对应心跳包的message ID,为0。
#define MAVLINK_MSG_ID_HEARTBEAT 0
心跳包的内容存放在payload数据载荷中。以心跳包为例,

typedef struct __mavlink_heartbeat_t
{
uint32_t custom_mode; /*< A bitfield for use for autopilot-specific flags.*/
uint8_t type; /*< Type of the MAV (quadrotor, helicopter, etc., up to 15 types, defined in MAV_TYPE ENUM)*/
uint8_t autopilot; /*< Autopilot type / class. defined in MAV_AUTOPILOT ENUM*/
uint8_t base_mode; /*< System mode bitfield, see MAV_MODE_FLAG ENUM in mavlink/include/mavlink_types.h*/
uint8_t system_status; /*< System status flag, see MAV_STATE ENUM*/
uint8_t mavlink_version; /*< MAVLink version, not writable by user, gets added by protocol because of magic data type: uint8_t_mavlink_version*/
} mavlink_heartbeat_t;
心跳包一般用来表明发出该消息的设备是否活跃(一般以1Hz发送),消息接收端会根据是否及时收到了心跳包来判断是否和消息发送端失去了联系。
心跳包由6个数据成员组成,占用9个字节。
1、 type:飞行器类型,表示了当前发消息的是什么飞行器,如四旋翼,直升机等。type的取值对应枚举类型MAV_TYPE(如四旋翼,对应数值2)。
2、autopilot:飞控类型,如apm,Pixhawk等,发送心跳包的飞行器的飞控类型。autopilot的取枚举类型MAV_AUTOPILOT。
3、base mode(基本模式):飞控现在所处的飞行模式,这个参数要看各个飞控自己的定义方式,会有不同的组合、计算方式。
4、custom mode(用户模式):飞控现在所处的飞行模式,这个参数要看各个飞控自己的定义方式,会有不同的组合、计算方式。
5、system status:系统状态,见MAV_STATE枚举变量。
6、mavlink version:消息发送端的MAVLink版本。
其余的消息也是类似的结构,基本消息的定义可以查看官方网页的说明(具体说明以各个飞控为准),也可查看各个消息包头文件的定义。
MAVLink v1.0详解——结构的更多相关文章
- 百度大脑UNIT3.0详解之知识图谱与对话
		如今,越来越多的企业想要在电商客服.法律顾问等领域做一套包含行业知识的智能对话系统,而行业或领域知识的积累.构建.抽取等工作对于企业来说是个不小的难题,百度大脑UNIT3.0推出「我的知识」版块专门为 ... 
- 百度大脑UNIT3.0详解之嵌入式对话理解技术
		相信很多人都体验过手机没有网时的焦虑,没有网什么也做不了.而机器人也会遇到这样的时刻,没有网或者网络环境不好的情况下,无法识别用户在说什么,也无法回复用户.在AIoT(AI+物联网)飞速普及的现在,智 ... 
- 百度大脑UNIT3.0详解之数据生产工具DataKit
		在智能对话项目搭建的过程中,高效筛选.处理对话日志并将其转化为新的训练数据,是对话系统效果持续提升的重要环节,也是当前开发者面临的难题之一.为此百度大脑UNIT推出学习反馈闭环机制,提供数据获取.辅助 ... 
- Mongostat 3.0详解
		可以参考之前写的这篇博客: Mongostat 2.6详解 mapped Changed in version 3.0.0. Only for MMAPv1 Storage Engine. The t ... 
- 菜鸟学习-C语言函数参数传递详解-结构体与数组                                                    分类:            C/C++             Nginx             2015-07-14 10:24    89人阅读    评论(0)    收藏
		C语言中结构体作为函数参数,有两种方式:传值和传址. 1.传值时结构体参数会被拷贝一份,在函数体内修改结构体参数成员的值实际上是修改调用参数的一个临时拷贝的成员的值,这不会影响到调用参数.在这种情况下 ... 
- iOS中 蓝牙2.0详解/ios蓝牙设备详解  韩俊强的博客
		每日更新关注:http://weibo.com/hanjunqiang 新浪微博 整体布局如下: 程序结构如右图: 每日更新关注:http://weibo.com/hanjunqiang ... 
- setTimout( , 0) 详解
		setTimout( , 0) 一.前言 前端工程师们工作久了,一般都会在某些地方看见过这样的代码: setTimeout(function(){ // TODO }, 0); 举个实例,移动端我们经 ... 
- php踩过的那些坑(4) false,NULL,0,''详解
		一.前方有坑 php开发过程中,难免会遇到这四个值:false,null,0,’',并且也会对这四个值进行比较,然后分别进行业务代码处理.一招不慎,就会踩到坑,影响数据判断的正确性和安全性,以至于造成 ... 
- CM自动化安装CDH5.14.0详解
		CDH5.14.0版本说明 CDH最早版本只包含hadoop.hive.hbase等基础组件,CDH5.14.0版本目前已经封装了spark.impala.kudu(CDH 5.13.x开始)等众多组 ... 
随机推荐
- Integer to Roman - LeetCode
			目录 题目链接 注意点 解法 小结 题目链接 Integer to Roman - LeetCode 注意点 考虑输入为0的情况 解法 解法一:从大到小考虑1000,900,500,400,100,9 ... 
- Android Emoji兼容包使用详解
			Emoji兼容性 我们经常会遇到这样的问题: 给朋友发的emoji表情, 在自己手机上展示是正常的, 但是到朋友手机上, 却没有展示出来, 或者展示出来了, 但是也跟自己手机上展示的不一样. 所以, ... 
- Linux及安全实践三——程序破解
			Linux及安全实践三--程序破解 一.基本知识 常用指令机器码 指令 作用 机器码 nop 无作用(no operation) 90 call 调用子程序,子程序以ret结尾 e8 ret 返回程序 ... 
- Git-balabala
			想必大家都听说过且用过Github(没听说过-.-),我也一直用Github管理我的代码到现在,如果你只是将其作为自己私有的代码仓库,那么平时用得最多的就是git clone, git add以及gi ... 
- bzoj 3816&&uoj #41. [清华集训2014]矩阵变换
			稳定婚姻问题: 有n个男生,n个女生,所有女生在每个男生眼里有个排名,反之一样. 将男生和女生两两配对,保证不会出现婚姻不稳定的问题. 即A-1,B-2 而A更喜欢2,2更喜欢A. 算法流程: 每次男 ... 
- 利用机器学习实现微信小程序-加减大师自动答题
			之前有看到微信小程序<跳一跳>别人用python实现自动运行,后来看到别人用hash码实现<加减大师>的自动答题领取娃娃,最近一直在研究深度学习,为啥不用机器学习实现呢?不就是 ... 
- UML类图与类间六种关系表示
			UML类图与类间六种关系表示 1.类与类图 类封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性,操作,关系的对象集合的总称. 类图是使用频率最高的UML图之一. 类图用于描述系统中所包含的 ... 
- Xpath语法与lxml库的用法
			BeautifulSoup 已经是非常强大的库了,不过还有一些比较流行的解析库,例如 lxml,使用的是 Xpath 语法,同样是效率比较高的解析方法. 1.安装 pip install lxml 2 ... 
- mongodb_修改器($inc/$set/$unset/$push/$pop/upsert)
			转自 https://blog.csdn.net/mcpang/article/details/7752736 对于文档的更新除替换外,针对某个或多个文档只需要部分更新可使用原子的更新修改器,能够 ... 
- [非常重要的总结] Linux C相关函数
			(1)字符测试函数 isalnum(测试字符是否为英文字母或数字) isalpha(测试字符是否为英文字母) isascii(测试字符是否为ASCII码字符) isblank(测试字符是否为空格字符) ... 
