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微秒通常带一个微秒级时间戳。这个对日志分析特别重要。
我的习惯:拿到一份陌生日志,我第一件事就是看消息ID分布。如果GPS_RAW_INT和VISION_POSITION_ESTIMATE同时出现,说明飞控在融合视觉和GPS数据。这时候定位漂移,大概率是融合权重出了问题。

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把视觉权重降了。根因是视觉特征点不足。

避坑指南:我曾经犯过一个错误——只看GLOBAL_POSITION_INT,不看GPS_RAW_INT。结果发现位置跳变,以为是GPS漂移,折腾了半天。后来才发现是飞控的EKF参数配错了,把视觉数据当成了GPS在用。所以,一定要对比原始数据和融合数据。

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 知识体系总览

下面这张图,我把本章的核心逻辑画出来了。大家先看个整体印象:

MAVLink日志分析知识体系 MAVLink日志分析:定位漂移诊断知识体系 日志文件 .bin / .log / .ulg 消息解析 MAVLink v2帧格式 消息类型 GPS / 视觉 / 姿态 GPS_RAW_INT eph / epv / fix_type 卫星数量 / 精度因子 VISION_POSITION x / y / z / covariance 视觉置信度矩阵 ESTIMATOR_STATUS pos_horiz_ratio 各传感器贡献比 定位漂移诊断流程 提取原始数据 → 时间对齐 → 对比融合结果 → 定位根因 核心原则 永远对比原始传感器数据与融合后的位置估计,不要只看单一消息

这张图把我们的知识体系串起来了。从日志文件出发,经过消息解析,到具体消息类型,再到关键字段,最后落到诊断流程。你想想看,定位漂移诊断其实就三步:提取原始数据、时间对齐、对比融合结果。