开源无人机通信协议MAVLink解析(1)
·
开源无人机通信协议MAVLink解析
基本概念
MAVLink(Micro Air Vehicle Link)是一种轻量级的消息传输协议,专为无人机、机器人等资源受限的嵌入式系统设计。其核心数据单元是消息(Message),即MAVLink v1版本的数据协议。
消息结构
每条MAVLink消息都包含以下核心字段:
- 系统ID(sysid):标识发送消息的系统(如无人机、传感器)。
- 组件ID(compid):标识发送消息的组件(如飞控、相机)。
- 消息ID(msgid):唯一标识消息类型(如心跳包、姿态数据)。
- 有效载荷(payload):消息的实际数据内容,长度可变。
- 校验和(checksum):用于验证消息完整性的CRC校验值。
常见消息类型
- HEARTBEAT(心跳包):定期发送,表明系统在线并报告其类型和状态。
- ATTITUDE(姿态):包含滚转、俯仰、偏航角及其角速度。
- GLOBAL_POSITION_INT(全局位置):经纬度、海拔高度和相对高度。
- SYS_STATUS(系统状态):电池电压、CPU负载、通信错误计数等。
- RAW_IMU(IMU数据):常作机载SLAM的输入,如FastDrone工程。
- 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的主要改进
- 扩展消息ID:从v1的1字节扩展到3字节,支持更多的消息类型。
- 可变长度载荷:载荷长度字段明确指示数据长度,无需依赖消息定义中的固定长度。
- 消息签名:可选13字节签名,提供身份验证和防篡改保护。
- 兼容性处理:通过“不兼容标志”和“兼容标志”,允许v2解析器正确处理v1消息,并指示是否使用了v2特有功能。
封装示例
以下是一个简化的MAVLink v2心跳包封装流程:
- 构造心跳消息载荷(系统类型、状态等)。
- 设置帧头(起始标志
0xFD、长度、标志位、序列号、系统/组件ID)。 - 填入消息ID(如
HEARTBEAT的ID为0)。 - 附加载荷。
- 计算CRC校验和并附加。
- (可选)如果启用签名,计算并附加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),实现了向后兼容。这使得新旧系统可以混合组网,平滑升级。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)