4. 日志分析工具入门

日志分析的第一步,是看懂日志里到底存了什么。说白了,ArduPilot的日志就是一系列“消息”的集合。每条消息都有自己的ID、时间戳和数据结构。如果你看不懂这些消息,那后面的分析就无从谈起。

我个人习惯,拿到一份新日志,第一件事不是看曲线,而是先扫一遍消息类型列表。这就像看一本书的目录,能让你快速知道这份日志记录了哪些关键信息。

4.1 消息类型概览

ArduPilot的日志消息类型非常多,但核心的其实就那么几个。我把它们分成三类:系统状态类、传感器类、控制执行类。下面这张图能帮你快速建立整体认知。

ArduPilot 日志核心消息类型结构 日志文件 (.bin/.log) 系统状态类 传感器数据类 控制执行类 MSG MODE EV/ERR GPS IMU BARO ATT RCIN/OUT NTUN/PID 核心要点 • MSG/MODE:记录系统事件和飞行模式切换,是分析飞行逻辑的第一线索 • GPS/IMU/BARO:原始传感器数据,用于诊断传感器故障或数据异常 • ATT:融合后的姿态数据,直接反映飞控的控制效果 • 时间戳同步:所有消息通过 TimeUS 字段对齐,精度达微秒级

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名称数据格式(列定义)
1FMTType, Length, Name, Format, Columns
2PARMName, Value
3MSGMessage
4MODEMode, ModeNum
5ATTRoll, Pitch, Yaw, RollRate, PitchRate, YawRate
6GPSStatus, NSats, HDop, Lat, Lng, Alt, Spd, GCrs, VZ
7IMUGyrX, GyrY, GyrZ, AccX, AccY, AccZ
8BAROPress, Temp, Alt
9NTUNDPos, DVel, DAcc, PPos, PVel, PAcc
10PIDDes, P, I, D, FF, Out

实用工具:如果你需要手动解析二进制日志,可以使用 ardupilot/Tools/scripts/LogDump.py 脚本。它会自动读取FMT定义并解析所有消息。我个人经常用它来提取特定时间段的数据做深入分析。

4.5 实战:如何快速定位一条消息

假设你拿到一份日志,想找到某次飞行中GPS信号丢失的时刻。你会怎么做?

  1. 打开日志文件,用Mission Planner或MAVExplorer加载。
  2. 筛选GPS消息,查看Status字段。如果Status从3(3D定位)跳到了0(无定位),那就是信号丢失的时刻。
  3. 交叉验证,查看同一时间点的MSG消息,看是否有“GPS lost”之类的警告。
  4. 检查IMU数据,确认在GPS丢失前后,IMU数据是否正常。如果IMU也异常,可能是飞控供电问题;如果IMU正常,那问题大概率出在GPS本身。

总结一下:理解消息类型是日志分析的第一步。MSG告诉你发生了什么事件,MODE告诉你飞控在什么状态,ATT/GPS/IMU/BARO告诉你传感器和控制数据。时间戳则是把这些信息串起来的线索。掌握了这些,你就能像侦探一样,从日志中还原出飞行的每一个细节。