开源无人机通信协议MAVLink解析

基本概念

MAVLink(Micro Air Vehicle Link)是一种轻量级的消息传输协议,专为无人机、机器人等资源受限的嵌入式系统设计。其核心数据单元是消息(Message),即MAVLink v1版本的数据协议。

消息结构

每条MAVLink消息都包含以下核心字段:

  • 系统ID(sysid):标识发送消息的系统(如无人机、传感器)。
  • 组件ID(compid):标识发送消息的组件(如飞控、相机)。
  • 消息ID(msgid):唯一标识消息类型(如心跳包、姿态数据)。
  • 有效载荷(payload):消息的实际数据内容,长度可变。
  • 校验和(checksum):用于验证消息完整性的CRC校验值。

常见消息类型

  1. HEARTBEAT(心跳包):定期发送,表明系统在线并报告其类型和状态。
  2. ATTITUDE(姿态):包含滚转、俯仰、偏航角及其角速度。
  3. GLOBAL_POSITION_INT(全局位置):经纬度、海拔高度和相对高度。
  4. SYS_STATUS(系统状态):电池电压、CPU负载、通信错误计数等。
  5. RAW_IMU(IMU数据):常作机载SLAM的输入,如FastDrone工程。
  6. OBSTACLE_DISTANCE:测距传感器数据,如激光雷达、毫米波雷达等输出给APM飞控实现避障功能。

MAVLink v2

MAVLink v2在v1的基础上升级,引入了更灵活的封装格式,支持更长的消息、签名和更好的兼容性。

斜体样式帧结构

一个完整的MAVLink v2数据帧如下所示:

字节偏移 字段 长度 说明
0 起始标志 1 固定为 0xFD(v2特有)
1 载荷长度 1 有效载荷长度(0-255)
2 不兼容标志 1 指示v2不兼容特性(如签名)
3 兼容标志 1 指示v2兼容特性
4 序列号 1 每发送一条消息递增
5 系统ID 1 发送系统ID
6 组件ID 1 发送组件ID
7-8 消息ID 2 扩展的消息ID(0-65535)
9-(9+len-1) 有效载荷 len 消息数据
校验和 2 CRC校验值
签名(可选) 13 消息签名(若启用)

v2的主要改进

  1. 扩展消息ID:从v1的1字节扩展到3字节,支持更多的消息类型。
  2. 可变长度载荷:载荷长度字段明确指示数据长度,无需依赖消息定义中的固定长度。
  3. 消息签名:可选13字节签名,提供身份验证和防篡改保护。
  4. 兼容性处理:通过“不兼容标志”和“兼容标志”,允许v2解析器正确处理v1消息,并指示是否使用了v2特有功能。

封装示例

以下是一个简化的MAVLink v2心跳包封装流程:

  1. 构造心跳消息载荷(系统类型、状态等)。
  2. 设置帧头(起始标志0xFD、长度、标志位、序列号、系统/组件ID)。
  3. 填入消息ID(如HEARTBEAT的ID为0)。
  4. 附加载荷。
  5. 计算CRC校验和并附加。
  6. (可选)如果启用签名,计算并附加13字节签名。
// 简化的MAVLink v2帧结构示例(伪代码)
uint8_t frame[MAVLINK_MAX_PACKET_LEN];
frame[0] = 0xFD; // 起始标志
frame[1] = payload_len;
frame[2] = incompat_flags;
frame[3] = compat_flags;
frame[4] = seq;
frame[5] = sysid;
frame[6] = compid;
frame[7] = msgid & 0xFF;
frame[8] = (msgid >> 8) & 0xFF;
memcpy(&frame[9], payload, payload_len);
// ... 计算并填充校验和
// ... 可选:计算并填充签名

与v1的兼容性

MAVLink v2解析器能够自动识别并解析v1格式的消息(起始标志为0xFE),实现了向后兼容。这使得新旧系统可以混合组网,平滑升级。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐