4. 日志分析工具入门
日志分析的第一步,是看懂日志里到底存了什么。说白了,ArduPilot的日志就是一系列“消息”的集合。每条消息都有自己的ID、时间戳和数据结构。如果你看不懂这些消息,那后面的分析就无从谈起。
我个人习惯,拿到一份新日志,第一件事不是看曲线,而是先扫一遍消息类型列表。这就像看一本书的目录,能让你快速知道这份日志记录了哪些关键信息。
4.1 消息类型概览
ArduPilot的日志消息类型非常多,但核心的其实就那么几个。我把它们分成三类:系统状态类、传感器类、控制执行类。下面这张图能帮你快速建立整体认知。
4.2 核心消息类型详解
4.2.1 MSG —— 系统日志消息
MSG消息是飞控的“日记本”。它记录了系统启动、参数加载、校准完成、错误提示等文本信息。每条MSG消息都包含一个时间戳和一段字符串。
典型场景:我排查一次起飞后异常偏航的问题,就是在MSG里看到了一条“EKF3 IMU0 alignment failed”的警告。如果没有MSG,我可能还在傻傻地调PID。
// MSG 消息格式示例(二进制日志解析后)
TimeUS: 1234567890
Message: "PreArm: AHRS not healthy"
4.2.2 MODE —— 飞行模式切换
MODE消息记录了每一次飞行模式的切换。它包含切换时间、模式编号和模式名称。分析MODE消息,你能知道飞手在哪个时间点切了模式,或者飞控是否因为故障自动切换了模式。
| 字段 | 含义 | 示例值 |
|---|---|---|
| TimeUS | 时间戳(微秒) | 1234567890 |
| Mode | 模式编号 | 3 |
| ModeNum | 模式数值 | 3 |
小技巧:模式编号对照表可以在ArduPilot源码的 ArduCopter/defines.h 中找到。我个人习惯把常用模式的编号背下来:0-Stabilize, 1-Acro, 2-AltHold, 3-Auto, 4-Guided, 5-Loiter, 6-RTL, 9-Land。
4.2.3 ATT —— 姿态数据
ATT消息是飞控融合后的姿态输出,包含滚转、俯仰、偏航角以及对应的角速度。这是分析飞行控制性能的核心数据。
// ATT 消息字段
TimeUS: 1234567890
Roll: 1.23 // 滚转角(度)
Pitch: -0.56 // 俯仰角(度)
Yaw: 45.78 // 偏航角(度)
RollRate: 0.12 // 滚转角速度(度/秒)
PitchRate: -0.03 // 俯仰角速度(度/秒)
YawRate: 0.45 // 偏航角速度(度/秒)
注意:ATT消息是经过EKF融合后的数据,不是原始IMU数据。如果你发现ATT数据异常,先检查IMU原始数据,再检查EKF状态。我曾经被坑过一次——ATT显示剧烈震荡,结果发现是IMU的安装矩阵配置错了。
4.2.4 GPS —— 全球定位系统数据
GPS消息记录了位置、速度、卫星数量、定位精度等信息。它是分析定位性能、检查GPS健康状态的关键。
| 字段 | 含义 | 典型值 |
|---|---|---|
| Status | 定位状态(0=无定位, 1=2D, 2=3D, 3=3D+DGPS, 4=RTK Float, 5=RTK Fixed) | 3 |
| NSats | 卫星数量 | 12 |
| HDop | 水平精度因子 | 0.8 |
| Lat/Lng | 经纬度(度×10^7) | 223456789 |
| Alt | 海拔高度(米) | 100.5 |
| Spd | 地速(米/秒) | 5.2 |
实战经验:我遇到过一架无人机在悬停时位置漂移严重。查看GPS日志发现,HDop从0.8突然跳到了2.5,卫星数从14颗掉到6颗。这就是典型的GPS信号遮挡问题。后来检查发现是GPS天线被碳纤维机架遮挡了。
4.2.5 IMU —— 惯性测量单元数据
IMU消息记录加速度计和陀螺仪的原始数据。通常每个IMU实例(IMU0, IMU1, IMU2)都会独立记录。
// IMU 消息字段
TimeUS: 1234567890
GyrX: 0.01 // 陀螺仪X轴(弧度/秒)
GyrY: -0.02 // 陀螺仪Y轴
GyrZ: 0.03 // 陀螺仪Z轴
AccX: -0.05 // 加速度计X轴(米/秒²)
AccY: 0.10 // 加速度计Y轴
AccZ: -9.81 // 加速度计Z轴(重力加速度)
诊断技巧:检查IMU数据时,重点关注两点:一是静止时加速度计Z轴是否接近-9.81,二是陀螺仪在静止时是否接近0。如果偏差过大,说明IMU需要校准或存在硬件故障。
4.2.6 BARO —— 气压计数据
BARO消息记录气压计测量的气压和温度,以及由此计算出的海拔高度。它是高度控制的重要数据源。
| 字段 | 含义 | 典型值 |
|---|---|---|
| Press | 气压(百帕) | 1013.25 |
| Temp | 温度(摄氏度) | 25.0 |
| Alt | 气压高度(米) | 0.0 |
避坑指南:我曾经在夏天做飞行测试,BARO高度在起飞前就漂了2米。原因是飞控放在阳光下暴晒,气压计温度快速升高导致测量偏差。所以,飞行前一定要给飞控做好遮阳和通风。
4.3 时间戳同步机制
ArduPilot日志中,所有消息都带有一个 TimeUS 字段,单位是微秒。这个时间戳来自飞控的硬件定时器,精度非常高。但不同消息的采样频率不同,比如IMU通常是1kHz,GPS只有10Hz。那么,如何对齐这些不同频率的数据呢?
其实很简单。所有消息的 TimeUS 都基于同一个系统时钟。你只需要按时间戳排序,就能得到一条完整的时间线。分析工具(如Mission Planner的日志浏览器)会自动完成这个对齐工作。
核心原则:时间戳是绝对的,不是相对的。无论消息类型是什么,只要 TimeUS 相同,就代表它们发生在同一时刻。这就是多传感器数据融合的时间基础。
4.4 消息ID与数据格式对照表
在二进制日志中,每条消息都有一个唯一的ID(FMT类型定义)。解析日志时,你需要根据ID找到对应的数据格式。下面列出最常用的消息ID对照表。
| 消息ID | 名称 | 数据格式(列定义) |
|---|---|---|
| 1 | FMT | Type, Length, Name, Format, Columns |
| 2 | PARM | Name, Value |
| 3 | MSG | Message |
| 4 | MODE | Mode, ModeNum |
| 5 | ATT | Roll, Pitch, Yaw, RollRate, PitchRate, YawRate |
| 6 | GPS | Status, NSats, HDop, Lat, Lng, Alt, Spd, GCrs, VZ |
| 7 | IMU | GyrX, GyrY, GyrZ, AccX, AccY, AccZ |
| 8 | BARO | Press, Temp, Alt |
| 9 | NTUN | DPos, DVel, DAcc, PPos, PVel, PAcc |
| 10 | PID | Des, P, I, D, FF, Out |
实用工具:如果你需要手动解析二进制日志,可以使用 ardupilot/Tools/scripts/LogDump.py 脚本。它会自动读取FMT定义并解析所有消息。我个人经常用它来提取特定时间段的数据做深入分析。
4.5 实战:如何快速定位一条消息
假设你拿到一份日志,想找到某次飞行中GPS信号丢失的时刻。你会怎么做?
- 打开日志文件,用Mission Planner或MAVExplorer加载。
- 筛选GPS消息,查看Status字段。如果Status从3(3D定位)跳到了0(无定位),那就是信号丢失的时刻。
- 交叉验证,查看同一时间点的MSG消息,看是否有“GPS lost”之类的警告。
- 检查IMU数据,确认在GPS丢失前后,IMU数据是否正常。如果IMU也异常,可能是飞控供电问题;如果IMU正常,那问题大概率出在GPS本身。
总结一下:理解消息类型是日志分析的第一步。MSG告诉你发生了什么事件,MODE告诉你飞控在什么状态,ATT/GPS/IMU/BARO告诉你传感器和控制数据。时间戳则是把这些信息串起来的线索。掌握了这些,你就能像侦探一样,从日志中还原出飞行的每一个细节。