MAVLink简介fromQGstation

MAVLink—Micro Air Vehicle Communication Protocol
1 简介
MAVLink 通讯协议是一个为微型飞行器设计的非常轻巧的、只由头文件构成的信息编 组库。 它可以通过串口非常高效地封装 C 结构数据, 并将这些数据包发送至地面控制站。 该协 议被 PX4, PIXHAWK, APM 和 Parrot AR.Drone 平台所广泛测试并在以上的项目中作为 MCU/IMU 间以及 Linux 进程和地面站链路通信间的主干通信协议。 MAVLink 最初由 Lorenz Meier 根据 LGPL 许可在 2009 年初发表。 1.1 综合教程(见附件1) 1.2 MAVLink消息格式及MAVLink API标准文件(见附件2) 1.3 协议内容 1) 线上(On-the-wire)格式和 CRC 冗余校验—— 2) MAVLink 1.1 版兼容性和特点 3) MAVLink 任务内容 (1) 路径点协议 (2) 参数协议 (3) 图像传输协议 (4) 控制接口 4) MAVLink 数据类型及相关约定 5) 常见 MAVLink 消息 1.4 MAVLink代码及生成器 “普通信息集” 包含了非常广泛的常用信息并以 C 语言头文件储存。 如果你想定义并使 用自己的代码,可以使用 MAVLink Generator(C/C++,python)或 QGroundcontrol。 1.5 MAVLink生态系统 1) 使用 MAVLink 的自动驾系统 ? ? ? ? ? ? ? ArduPilotMega (main protocol) pxIMU Autopilot (main protocol) SLUGS Autopilot (main protocol) FLEXIPILOT (optional protocol) UAVDevBoard/Gentlenav/MatrixPilot (optional protocol) SenseSoar Autopilot (main protocol) SmartAP Autopilot (main protocol)

?

AutoQuad 6 AutoPilot (main protocol)

2) 使用 MAVLink 的软件包 ? ? ? ? ? ? ? ? ? ? ? QGroundControl (Windows/Mac/Linux) HK Ground Control Station (Windows) APM Planner (Windows/Mac) QGroundControl w/ AutoQuad MainWidget (Windows/Mac/Linux) Copter GCS (Android) AutoQuad GCS (Android) ROS to MAVLink bridge: https://github.com/mavlink/mavlink-ros MAVCONN Lightweight Middleware http://pixhawk.ethz.ch/software/middleware/start oooArk / MAVSim http://www.youtube.com/watch?v=-wQVrM5SL2o&fe MAVLink python bindings MAVProxy (allows to connect multiple UDP/serial links, including flightgear): Aerial

3) 使用 MAVLink 的项目 ? ? ? ? ? ? ? ? ? ? ArduPilotMega http://code.google.com/p/ardupilot-mega/ MatrixPilot UAV DevBoard http://code.google.com/p/gentlenav/ PIXHAWK http://pixhawk.ethz.ch/ ETH Flying Machine Arena http://www.idsc.ethz.ch/Research_DAndrea/FMA ETH SenseSoar Solar Airplane Project http://www.sensesoar.ethz.ch/doku.php?id=news ETH Skye Blimp Project http://www.projectskye.ch/ UC Santa Cruz SLUGS http://slugsuav.soe.ucsc.edu/index.html ArduCAM OSD http://code.google.com/p/arducam-osd/ Sky-Drones - UAV Flight Control Systems http://www.sky-drones.com/ AutoQuad - Autonomous Multirotor Vehicle controller http://autoquad.org/

1.6 MAVLink 数据格式分解 以一个 MAVLink 数据包为例, 下图为其数据包具体的结构剖析。 该结构是受到 CAN 和 SAE AS-4 标准的启发构建的。

字节 顺序 0

内容



含义

数据包开 始标志

v1.0: 0xFE (v0.9: 0x55) 0 - 255

指示新的数据包即将开始

1

有效载荷 长度

指示接下来的有效负载长度

2

数据包 序列号

0 - 255

每个传输部件都会对发送序列进行计数。该结构能够 检测到数据包的丢失

3

系统 ID

1 – 255

发送该包的系统 ID。 该结构能够区分在同一网络中不 同的 MAV。

4

设备 ID

0 – 255

发送该数据包的设备 ID。 该结构能够区分同一系统的 不同发送设备。如:IMU 和 AutoPilot。

5

消息 ID

0 - 255

消息 ID。该 ID 定义了有效负载的“含义”以及负载 应被如何正确的解码

6至 (n+6) (n+7) 至 (n+8)

数据

(0 – 255)字节

消息数据。具体内容取决于消息 ID

校验位 (低字节和 高字节)

ITU X.25/ SAE AS-4 哈希校验,不包括数据包开始的标志,所以字节 1 ..(N+6)注意:校验码同样包括 MAVLINK_CRC_EXTRA(数值从 消息字段开始计算,避免同一个数据包因版本而变量值不同因其的解 码问题。

? 校验值使用的是与 ITU X.25 和 SAE AS-4 相同的校验标准 (CRC-16-CCITT) ,在文档 SAE AS5669A 中有叙述。 ? 通信包的最小长度为不带任何有效负载的 8 字节大小。

? 通信包的最大长度为满载 263 字节。

1.7 协议支持的数据结构 MAVLink 协议支持固定大小的整形数据类型、 IEEE 754 协议规定的单精度浮点型数据、 以上数据构成的数组(如: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 位整型字段读取。

1.8 性能 该协议主要面向两方面特性:传输速度和安全性。协议允许检验消息内容,同样允许检 测丢失的消息序列但仍然只需要每个包中 6 个字节的开销来保证。 传输实例: 链路速度/波特 115200 baud 115200 baud 57600 baud 9600 baud 9600 baud 硬件 XBee Pro 2.4 GHz XBee Pro 2.4 GHz XBee Pro 2.4 GHz XBee Pro XSC 900 XBee Pro XSC 900 更新速率 50 Hz 100 Hz 100 Hz 50 Hz 20 Hz 负载 224 bytes 109 bytes 51 bytes 13 bytes 42 bytes 浮点值 56 27 12 3 10

1.9 未来的工作/想法 ? 采用变长数组

? 支持位域(例如:将 8 个布尔型的值封装入一个 uint8_t 结构中,但所有的 C 结构函数 都可调用全部的 8 个布尔型量。用户就不必在整体移动或隐藏中浪费时间) ? 可变的多样头部,允许设定目标系统和目标部件(不改变协议本身,只是方便函数调 用它们)

2 路径点协议
路径点协议描述了路径点是如何被发送到 MAV 并被它所读取的。其目标是在发送端和 接收端确保建立一种连续稳定的状态。QGroundControl 执行了在地面控制端的协议要求, 每个在 MAV 上使用 MAVLink 实现路径点协议的规划模块能够和 QGroundControl 通讯并交 换和更新它的路径点。 2.1 通信/状态机 协议中包含很多事务, 每一个事务的完成情况以成功和失败来描述, 在接收端的路径点 列表状态未改变则被认为该事务的完成情况是失败的。 只有在两个正在通讯的部分之间么有 其他的事务在活动中时,新的事务才可以被一个特定的消息字段唤起进行。这意味着,如果 想要发起一个新的事务,参与到该事务中的通讯部分必须全部处于 IDLE 即空状态。如果开 始了一个事务,则通讯部分的状态将改变。引入一个以这种方式工作的状态机,则路径点协 议可以十分简单的实现。 除了应答消息之外的其他信息在被发送之后, 发送端的部件就会启动一个定时器。 如果 在特定的时间内, 没有收到响应则请求的消息将会被重新发送一次。 该重传过程会重复数次, 如果在最后一次的重传超时后仍然没有收到相应, 则认定该项事务失败。 该重传机制意味着 所有的部件必须能够处理重复的消息。 2.2 读取MAV的路径点列表 为了能够从部件中检索含 有所有路径点的列表, 将会发送 一个 WAYPOINT_REQUEST_LIST 的消息, 而目标部件将会回应一 个 WAYPOINT_COUNT 消息, 描述在它的列表中的路径点数 量。 之后, 正在发送请求的部件 会要求没有个路径点从序列号 0 开始发送 WAYPOINT_REQUEST 消息, 而目标部件会以包含有路径点 数据的对应的 WAYPOINT 消息 来回应每一个请求。 当最后一个路径节点成功 的接收到消息之后, 发送请求的 部件会向目的地部件发送一个

WAYPOINT_ACK 消息。这个消息将结束该项事务。需要注意的是,目的地部件必须监听来 自最后一个路径节点的 WAYPOINT_REQUEST 消息, 知道它拿到 WAYPOINT_ACK 消息或 另一个消息命令开启一个不同的事务或者发生了超时。 2.3 书写MAV的路径列表 为了能够发送一个路径点 的列表, 一个包含有列表中路径 点数量的 WAYPOINT_COUNT 消息会被发送至目的地设备。 而 该设备将做好接收消息的准备, 同时通过发送从序列号 0 开始 的 WAYPOINT_REQUEST 消息 开始检索所有的路径点。 而发送 路径点列表的设备将会以 WAYPOINT 消息来回应所有的 请求。 当最后一个路径节点被目 的地设备成功接收后, 该目标设 备将向发送设备发送一个 WAYPOINT_ACK 消息。 之后将 结束该事务。 如果一个路径点计划器设 备 在 事 务 之 外 收 到 了 WAYPOINT 消息,它将发送一 个 WAYPOINT_ACK 消息。 2.4 清除MAV的路径点列表 要清除一个设备的路径点 列 表 则 可 以 发 送 WAYPOINT_CLEAR_ALL 消息。 在清除了路径点列表之后, 目标 设备将以 WAYPOINT_ACK 消 息作为回应。 2.5 设置新的当前MAV路径点 要向设备设置新的当前活 跃 路 径 点 , 发 送 一 个 WAYPOINT_SET_CURRENT 消息即可。 在完成了更改当前的 路径点后目标设备将通过带有 新 的 当 前 序 列 号 的 WAYPOINT_CURRENT 消息作 为回应。

2.6 MAV抵达路径点的状态消息 如 果 MAV 上 的 路 径 点 规 划 设 备 抵 达 一 个 路 径 点 , 它 将 会 广 播 一 个 WAYPOINT_REACHED 消息。由于是广播消息,因此不需要发送 ACK 消息,同样也就不 能保证消息的接收。 2.7 MAV更改当前路径点的状态消息 如果一个 MAV 上的路径点规划设备选择了一个新的路径点作为它的新的当前航电,它 将会广播一个 WAYPOINT_CURRENT 消息。 由于是广播消息, 因此不需要发送 ACK 消息, 同样也就不能保证消息的接收。 建议该消息能够在较小的间隔中发送两次, 从而保证能够有 较大的可能性使得所有接收端收到。 2.8 路径点文件格式 尽管这不是 MAVLink 协议的一部分,这个是建议的路径点文件格式(QGroundControl 和其他设备默认使用) 。 请注意在参数之间的空格实质上是<tab> (在大多数编程语言中是”\t”)

3 参数协议
板载参数协议接口允许向内存(RAM)读写参数(例如:PID 增益)也可以向参数存 储器读写(EEPROM 或者硬盘) 。 它不仅可以被部署安装在一个微型控制器上(例如:带有 ARM7 的 pxIMU) ,也可以是 标准软件(如:Linux 系统中的 px_multitracker 进程) 。 3.1 支持的数据类型 MAVLink v1.0 支持如下数据类型:
? ? ?

uint32_t - 32bit unsigned integer (use the ENUM value MAV_PARAM_TYPE_UINT32) int32_t - 32bit signed integer (use the ENUM value MAV_PARAM_TYPE_INT32) float - IEEE754 single precision floating point number (use the ENUM value MAV_PARAM_TYPE_FLOAT)

注意:所有的参数都以浮点型的 mavlink_param_union_t 值发送,也就是意味着一个 参数应当已这个按字节转换为相应的浮点型数据(没有类型转换) 【which means that a parameter should be byte-wise converted with this union to a byte-wise float (no type conversion)】 。这对于为了不影响和限制扩展后的整型参数的最大精确度的目的是非常必要 的。例如:GPS 定位的参数以单精度浮点型数据只能精确到几米的级别,而 GPS 定位参数 如果以 1E7 扩展后整型数据可以提供很高的准确度。

3.2 多系统和多部件支持 MAVLink 在同一链接上支持并行的多系统/飞行器。不仅如此,它同样还支持在同一飞 行器上的多个支持 MAVLink 协议设备的情况。例如,协议允许自动驾驶设备和负载单元在 一个电磁波链接上来沟通。因此,在不同的部件之间参数协议也是不同的。通过发送请求参 数消息 target_component 从 0 开始进行计数(步进值设置:MAV_COMP_ID_ALL)来从系 统 获 得 完 整 的 参 数 列 表 。 所 有 的 机 载 部 件 都 应 当 以 带 有 他 们 的 ID 或 是 MAV_COMP_ID_ALL(0)的 ID 对参数请求信息进行回应。QGroundControl 默认查询系统的 所有部件(它只查询当前选定的系统,并不是所有系统) , 因 此 发 送 ID 0/MAV_COMP_ID_ALL。 3.3 QGroundControl里的图形用户界面 基于这个原因, 参数接口将会辨别不同系统 (一个系统就 是一架飞机)和部件(一个部件就是一个实体的架构,例如: IMU 或一个 Linux 进程) 。这可以允许透明的访问每一个独立 的部件参数而不再需要一个主要的机载单元来负责翻译对于 机载部件的读/写参数请求。 如下图所示,在参数树中每个部件被一个顶层节点代表。 系统(即无人机)可以从顶层的下拉菜单中选择。GUI 将会跟 踪参数的改变并且将参数发送至正确的部件当中。 为了方便多个参数的使用, 树是根据第一下划线中的参数 名 称 从 顶 层 开 始 分 组 和 构 建 的 。 所 以 PID_POS_X_P 和 PID_POS_Y_P 将会被划分在在 PID 节点下。 3.4 通信/状态机 机载参数被定义为一个 14 字符的字符串并存储了一个浮点值 (IEEE 754 单精度,4 字节) 。此键值对有许多重要的属性: ? ? ? ? 可读的变量名对于用户来说是非常有帮助的, 但是它仍然 足够小。 GCS 不需要提前知道机载部件的参数有哪些。 确保支持未知的 autopilots 设备, 只要他们执行协议内容。 添加一个参数只会改变飞机上的代码。

3.4.1 读取参数

发送 PARAM_REQUEST_LIST 消息将激活读取参数列表的活动。飞机上的部件在收到 这条指令后应当开始独立的传输参数。 发送过程中在每个参数之后要适当的延迟, 以免占用 全部的无线电带宽。
3.4.2 读取单个参数

单个参数可以通过 PARAM_REQUEST_READ 消息来读取。
3.4.3 写参数

由于 QGroundControl 在初始状态时并没有自己的参数列表,在写参数列表之前参数列表首 先要被读取一次。在那之后,参数才可以通过向部件发送键值对来被写入进去。由于 QGroundControl 会追踪参数的改变,电机写入按钮只会传输那些已经被更改的值。MAV 必 须确认这个写入的操作通过发送一个含有最新被写入进去的参数值的 PARAM_VALUE 的参 数值消息。

3.5 机上永久存储器 参数接口提供了两个按钮来将飞机上的参数从永久的机上存储器装载至 RAM 和将当前 的参数值从 RAM 保存至永久存储器。若需要从 QGroundControl 向永久存储器写入数据, 首先数据需要被传输然后必须执行写入到 ROM 的命令。 3.6 QGroundControl的参数文档 QGroundControl 允许将当前飞机上的参数值保存至一个文本文档中。之后文档可以被再次 的导入和传输到 MAV 中。这就可以允许如配置几个飞行器都是完全相似的默认安全值。 3.7 MCU 这个单片机实现来自 PIXHAWK IMU/Autopilot 代码库。它允许贮存机上参数。请注意,这段 代码可能没有编译,您首先需要调整你的板载数据结构。

4 图像传输协议
本 节 讲 述 图 像 数 据 流 是 如 何 工 作 和 如 何 囊 括 了 包 括 实 施 细 节 ( 在 MAV 和 QGroundControl)和 MAV 与 QGroundControl 之间的通讯。 图像传输协议包含两个模块:图像流和视频流: ? 图像流部分使用 MAVLink 作为通讯频道,同时图像流部分能够被用来从 MAV 向 QGroundControl 传输任何类型的图像(原始图像、体感数据…) 。它主要是获取相机的 实时图像病将其分解为小块通过 MAVLink 来进行发送。该模块主要是用来直接向 QGroundControl 传输图像(即 HUD 不见如下所述) 。 注意:该模块也可以用来向 QGroundControl 发送海量数据块而不是图像。 ? 视频流部分以 MPEG2 的格式流式发送“真实(real) ”的视频。它使用实时的照相机图 像并使用 FFMpeg 来编码视频流。 这个模块的主要应用情形是在任意的移动设备 (笔记 本电脑、只能手机、 、 、 )上观看实时的视频传输而不需要使用 QGroundControl 和 MAVLink 的客户端。

图像流部分相较于视频流部分的主要优点是更好的融入了 QGroundControl。最主要的 缺点是需要 MAVLink 的支持(因此不像视频流部分由较好的跨平台特性) 。 4.1 通讯 4.1.1 图像流 图 像 流 部 分 使 用 了 两 个 MAVLink 消 息 : 一 个 是 握 手 消 息 , DATA_TRANSMISSION_HANDSHAKE 来初始化、控制和停止图像流;还有一个数据容器 消息,ENCAPSULATED_IMAGE,来传输图像数据(见右图) 。 (1) 通讯是由 QGroundControl 发起开始数据流的请求而发起的。因此,若要开始通讯, MAVLink 消息的如下字段必须被设置: ? target:设置为目标 MAV 的 ID; ? state:设置为 0; ? id:表示图像流的 ID; 注意:目前,图像流部分只支持每个图像类型一个数据流,因此需要将 id 设置 为和 type 字段想吐的整数。

? ?

type:在 mavlink.h 头文件中 ENUM MAVLINK_DATA_STREAM_TYPES 记录 的任意类型。 freq:对于“frame per seconds”则大于 0, “seconds per frame”则小于 0。

该协议允许请求一个特定图像的质量。如需要,则必须设置 quality 字段。在初始请 求时所有其他的字段必须为 0。 (2) 当目标 MAV 收到握手请求之后,它会回送一个确认消息并开始在请求的帧频上进 行图像流传输。握手消息的 ACK 包通常情况下包含和由 QGroundControl 请求的消 息相同的值(state 设置为 1,因为这是 ACK 消息) ,并增添有关下一个发送消息的 大小的相关数据: ? 值 packets 包括 MAVLink ENCAPSULATED_DATA 包的数量; ? 值 payload 指定了每个数据包的有效载荷大小(通常为 252 字节) 。 ? 值 size 指定了图像的字节大小。 (3) 之后,图像数据会被分割成适合正常的 MAVLink 消息的数据块。它们会被封装在 ENCAPSULATED_DATA 数据包中通过 MAVLink 进行发送。每个数据包包含一个 序列号以及图像流对应的 ID。然后,图像流就开始定期的发送新的图片,期间不再 需要其他的交互。每一个新图像都有一个新的 DATA_TRANSMISSION_HANDSHAKE 的 ACK 包并更新图像的 size,packets 和 payload 值。在这个 ACK 包之后,新的图像作为一系列的 ENCAPSULATED_DATA 包而到达。注意:对于流中的每一个新图像,序列号都从 0 开始。 (4) 要停止一个图像流, 你必须要发送一个新的 DATA_TRANSMISSION_HANDSHAKE 请求包,并将频率设置为 0。

4.1.2 视频流 视 频 传 输 协 议 相 较 于 图 像 传 输 协 议 简 单 许 多 : 它 只 包 含 一 个 MAVLink 消 息 , VIDEO_STREAM,用来开始和停止视频流(见下图) 。 视频流消息有两个值需要设置: ? target:目标 MAV; ? start_stop:1 为开始视频流,0 为结束视频流。 视频流由 FFMpeg 于 MAV 端创建并开始。一个小的 MAVLink 包抓取摄像机图像,添 加(Y)UV 渠道给 YUV420 rawimage 格式,并将该图片填制 FFMpeg。之后,输出将被传输 至地面站(注意:目前,这需要地面站有一个固定的 IP 并且在初始状态时有一个配置 MAV 的步骤) 。收到视频后,QGroundControl 打开 VLC 窗口对视频流进行重新分配:它从 MAV 得到这个视频流并将它作为 RTP 流(在一个多播地址)和 HTTP 流(直接单播流)提供给 网络。这个过程并没有对原始流进行代码转换,以保持尽可能低的性能影响。 现在其他的移动设备可以通过多播地址 239.255.12.45 来链接到这个视频流,或通过 http://[QGC-HOST]/MAVLive.mpg 来链接到 HTTP 流。多播流通过 SAP 声明为”MAVLive”. 4.2 使用/配置 在 MAV 上使用这两个模块,你需要做如下几步: 4.2.1 图像流 1、为你的 MAV 编译 mavconn 中间件 2、至少开启 MAV 上的这些设备: px_mavlink_bridge_udp & px_system_control --heartbeat & px_camera -o lcm & 3、编译并启动 QGroundControl

4、开启图像流设备(你可以添加-v 标志来查看更多输出) : px_imagestreamer 5、初始化图像流: 打开 HUD 部件,到小部件上单击右键并选择“启用图像直播” 。 现在你可以观看每秒一个画面的视频了(默认,此处为硬编码) 4.2.2 视频流 1、执行上文所述的图像流的 1 至 3 步; 2、在主目录中创建一个符号链接: cd ~ ln -s mavconn/src/comm/video/px_videostreamer.sh px_videostreamer.sh (注意:你可以复制这个文件,但不建议这么做) ; 3、开启 MAV 上的视频流传输部件: px_videostreamer 4、初始化视频流:打开 HUD 插件,单击右键并选择“启用视频直播” 。 之后一个 VLC 窗口将开启。只要你想向其他人传输视频流,就请不要关闭这个窗口! 如果你想观看当前的视频流,只需在其他的 VLC 窗口中打开这个视频流。 4.2.3 Developer 目前,只实现了对当前摄像机的图像以 JPEG 格式进行图像流传输。要想实现自己的图像流 传输,你必须做如下的事情: ? 编写一个 MAVLink 处理程序来处理您选定的格式的图片流开始传输的请求。 ? 编写一个数据处理程序来处理你的数据(如,立体相机图像) ,将其编码为你选择的格 式(如,原始图像、JPEG、BMP)然后将其分散并通过 MAVLink 进行传输。 ? 扩展 QGroundControl 中 UAS 部件内的数据/消息处理程序来正确处理你的数据(如, 对选定的格式进行拆包) 。 ? 编写或对原来的插件进行扩展来根据你的想法显示你的数据。


相关文档

mavlink协议是什么
QGroundControl —— MAVLink 命令
11 增加新的mavlink消息
基于Mavlink协议的植保无人机地面监测终端设计
MAVLink微型飞行器的通信协议
基于MAVLink实现无人机一键起飞
Pixhawk源码笔记十一:增加新的MAVLink消息
基于APM飞控制作的MAVLink通信协议分析
科技股份有限公司-公司简介
优秀教师主要事迹简介
电脑版