1. MAVLink协议基础:消息格式、常见消息类型与日志文件结构
各位同学好,我是老张。做无人机飞控这些年,我调试过最多的东西就是定位漂移。说实话,十个疑难杂症里,有七个跟定位有关。而定位漂移的根因,往往就藏在MAVLink日志里。
这一章,我们先打好基础。把MAVLink协议的消息格式、常见类型、日志文件结构理清楚。别小看这些基础,我见过太多工程师拿着日志不知道怎么下手,就是因为对协议本身不够熟。
1.1 MAVLink消息格式——说白了就是一套通信“信封”
MAVLink全称是Micro Air Vehicle Link,微型飞行器链路协议。它定义了一套轻量级的消息格式,让飞控、地面站、机载计算机之间能互相说话。
我刚开始接触MAVLink时,觉得它跟串口协议差不多。后来才发现,它的设计非常精巧——每个消息都带时间戳、消息ID、校验,丢包了还能自动重传。
一个标准的MAVLink v2消息帧长这样:
| 起始标志 | 载荷长度 | 不兼容标志 | 兼容标志 | 序列号 | 系统ID | 组件ID | 消息ID | 载荷数据 | 校验和 |
| 0xFD | 1字节 | 1字节 | 1字节 | 1字节 | 1字节 | 1字节 | 3字节 | 0-255字节| 2字节 |
嗯,这里要注意几个关键字段:
- 消息ID(3字节):决定了这条消息是什么类型。比如GPS_RAW_INT的消息ID是24,VISION_POSITION_ESTIMATE是102。
- 系统ID和组件ID:区分是谁发的。系统ID=1通常是飞控,组件ID=1是自动驾驶仪,组件ID=100是摄像头。
- 时间戳:MAVLink v2里,载荷数据前10微秒通常带一个微秒级时间戳。这个对日志分析特别重要。
1.2 常见消息类型——定位漂移诊断的“眼睛”
日志里消息类型很多,但跟定位漂移直接相关的,就那么几种。我列个表,大家对照着看:
| 消息名称 | 消息ID | 关键字段 | 定位漂移诊断用途 |
|---|---|---|---|
| GPS_RAW_INT | 24 | lat, lon, alt, eph, epv, fix_type, satellites_visible | 检查GPS原始数据质量。eph(水平精度因子)>5米时,GPS本身就不靠谱 |
| GLOBAL_POSITION_INT | 33 | lat, lon, alt, relative_alt, vx, vy, vz, hdg | 飞控融合后的位置估计。跟GPS_RAW_INT对比,能看出融合效果 |
| VISION_POSITION_ESTIMATE | 102 | x, y, z, roll, pitch, yaw, covariance | 视觉里程计输出的位置。协方差矩阵能反映视觉置信度 |
| LOCAL_POSITION_NED | 32 | x, y, z, vx, vy, vz | 机体坐标系下的局部位置。用于检查IMU积分漂移 |
| ATTITUDE | 30 | roll, pitch, yaw, rollspeed, pitchspeed, yawspeed | 姿态数据。姿态不准会导致位置解算偏差 |
| ESTIMATOR_STATUS | 230 | vel_ratio, pos_horiz_ratio, pos_vert_ratio, mag_ratio, gps_ratio | EKF状态监测。各传感器贡献比一目了然 |
我举个例子。有一次客户反馈无人机悬停时水平漂移超过2米。我打开日志,先看GPS_RAW_INT的eph字段——稳定在0.8米,GPS没问题。再看VISION_POSITION_ESTIMATE的协方差——数值突然变大,说明视觉跟踪丢了。最后查ESTIMATOR_STATUS,发现pos_horiz_ratio从0.9掉到0.3,EKF把视觉权重降了。根因是视觉特征点不足。
1.3 日志文件结构——.bin、.log、.ulg的区别
不同飞控厂商用的日志格式不一样。我整理了一下主流格式:
| 格式 | 扩展名 | 飞控平台 | 特点 |
|---|---|---|---|
| 二进制日志 | .bin | PX4 Pro | 紧凑、高效、带时间戳。用pyulog解析 |
| 文本日志 | .log | ArduPilot | 可读性好,但文件大。用Mission Planner导出 |
| ULog | .ulg | PX4(新版) | 结构化、支持嵌套消息。用ulog2csv转换 |
我个人最常用的是.ulg格式。为什么?因为它把消息定义和消息数据分开存,解析起来特别干净。而且每个消息都带微秒级时间戳,做时间对齐很方便。
一个典型的.ulg文件结构是这样的:
ULog文件结构:
├── 文件头(8字节):魔数+版本+时间戳偏移
├── 消息定义段
│ ├── 格式定义(消息ID、字段名、字段类型)
│ ├── 参数定义(飞控参数键值对)
│ └── 订阅信息(哪些消息被记录)
└── 消息数据段
├── 数据块1:时间戳 + 消息ID + 载荷
├── 数据块2:时间戳 + 消息ID + 载荷
└── ...
嗯,这里有个小技巧。.ulg文件的消息定义段里,会记录每个消息的订阅频率。比如GPS_RAW_INT是10Hz,VISION_POSITION_ESTIMATE是30Hz。如果某个消息的频率突然下降,说明传感器或通信链路有问题。
核心要点:定位漂移诊断,本质上就是对比“原始传感器数据”和“融合后的位置估计”。MAVLink日志给了我们这两套数据。你只需要学会怎么提取、对齐、对比它们。
1.4 知识体系总览
下面这张图,我把本章的核心逻辑画出来了。大家先看个整体印象:
这张图把我们的知识体系串起来了。从日志文件出发,经过消息解析,到具体消息类型,再到关键字段,最后落到诊断流程。你想想看,定位漂移诊断其实就三步:提取原始数据、时间对齐、对比融合结果。