3. 日志记录机制与参数配置

各位同学,欢迎来到第三章。上一章我们聊了怎么把日志文件从飞控里拽出来,也见识了bin文件长什么样。但光有文件还不够——你得能看懂里面每一行数据在说什么。

说白了,飞控日志就像飞机的“黑匣子”。它每秒都在拼命记录:姿态多少、GPS收了几颗星、电机转得多快、遥控器打了多少杆……但这些东西不是写作文,而是按一种固定的“数据包格式”打包存放的。不理解这个格式,你看到的就只是一堆乱码。

我个人习惯把数据包比作一封信。信有信封、有收件人、有正文、有落款。数据包也一样,它有一个固定的结构。今天我们就来拆开这封信,看看里面到底装了些什么。

数据包结构:一封“飞控来信”

ArduPilot的日志数据包,结构非常紧凑。每个包由以下几个部分组成:头、时间、ID、长度、数据体、CRC。我画了一张图,你可以对照着看。

ArduPilot 数据包结构图 ArduPilot 日志数据包结构 头 (Header) 0xA3 0x95 时间 (Time) 微秒时间戳 ID 消息类型 长度 数据体字节数 数据体 (Data) 实际数据内容 CRC 校验和 关键说明 • 头:固定为 0xA3 0x95,用于识别数据包起始 • 时间:从飞控启动开始的微秒数,用于对齐不同消息 • CRC:对头+时间+ID+长度+数据体进行校验,防数据损坏

嗯,这里要注意。头是两个固定字节:0xA3 0x95。飞控在解析日志时,只要看到这两个字节,就知道“哦,一个新包来了”。时间戳是微秒级的,从飞控上电开始算。ID就是消息类型,比如ATT、IMU、GPS这些。长度告诉你数据体占了多少字节。数据体是真正的数据,比如姿态角、加速度、GPS坐标。最后CRC是校验和,用来检查数据在传输或存储过程中有没有被损坏。

我的小习惯: 在分析日志时,我一般先看CRC有没有报错。如果CRC错误很多,说明日志文件可能已经损坏了,这时候分析出来的结论不可靠。我曾经遇到过一块老旧的SD卡,写日志时经常丢包,CRC错误率高达5%,换了卡就好了。

常见消息ID速查表:快速定位关键数据

ArduPilot的日志消息ID有上百种,但常用的其实就十几个。我把它们整理成了一张表,你最好能记下来,或者至少知道去哪里查。

消息ID 中文含义 数据体内容 典型频率
ATT 姿态 Roll, Pitch, Yaw (角度) 10-50 Hz
IMU 惯性测量单元 加速度计、陀螺仪原始值 100-400 Hz
GPS 全球定位系统 经纬度、高度、速度、卫星数 5-10 Hz
RCIN 遥控器输入 各通道PWM值 (Ch1-Ch16) 10-50 Hz
RCOU 遥控器输出 各通道PWM输出值 (Ch1-Ch16) 10-50 Hz
BARO 气压计 气压、温度、海拔 10-25 Hz
MAG 磁力计 磁场强度 (X, Y, Z) 10-50 Hz
MOT 电机输出 各电机PWM值 10-50 Hz
CTUN 控制回路 油门、高度、速度控制量 10-50 Hz
NTUN 导航回路 位置、速度、航向控制量 10-50 Hz

你想想看,如果飞机在空中突然抖了一下,你该看哪个消息?我建议先看ATT,看姿态角有没有突变。如果ATT正常,再看IMU,看加速度计和陀螺仪有没有异常。如果IMU也正常,那可能是GPS或者气压计的问题。这就是一个排查思路。

注意: 不同版本的ArduPilot,消息ID可能会略有不同。比如Copter 4.0和4.5,有些消息的ID号变了。我建议你在分析日志前,先确认一下飞控的固件版本,然后去官方文档查对应的消息ID表。别拿4.0的ID去套4.5的日志,会出笑话的。

数据包频率与记录条件:为什么有些数据丢了?

这个问题很关键。很多新手问我:“为什么我的日志里GPS数据只有5Hz,而IMU数据有200Hz?是不是飞控坏了?”

其实不是。每个消息都有自己的记录频率和记录条件。飞控不会把所有数据都记录下来,那样SD卡很快就写满了。它是有选择地记录。

我举个例子。IMU数据变化很快,飞控需要高频采样才能准确感知姿态变化,所以IMU的记录频率通常很高,100-400Hz。而GPS数据变化慢,5-10Hz就够用了。你想想看,GPS每秒才更新一次位置,你记录100Hz有什么意义?全是重复数据。

另外,有些消息是有记录条件的。比如MOT(电机输出)消息,只有在电机解锁后才会记录。飞机在地上停着的时候,你记录电机输出干嘛?浪费空间。再比如GPS消息,如果GPS没有锁定,飞控就不会记录GPS数据。所以如果你发现日志里没有GPS数据,先检查一下GPS有没有锁定。

记录条件速查:

  • ATT / IMU / BARO / MAG: 只要飞控上电就记录,无条件。
  • GPS: 只有GPS锁定(3D Fix)后才记录。
  • RCIN: 只要接收机有信号就记录。
  • RCOU / MOT: 只有电机解锁(armed)后才记录。
  • CTUN / NTUN: 只有飞行模式为自动模式(如Loiter、Auto)时才记录。

嗯,这里还有一个坑。有些飞控参数会影响记录频率。比如LOG_BITMASK参数,它控制哪些消息被记录。如果你把这个参数设错了,某些消息可能根本就不会被记录。我曾经帮一个朋友排查问题,他死活找不到GPS数据,最后发现是LOG_BITMASK把GPS消息给屏蔽了。改回来就好了。

避坑指南: 如果你发现日志里缺少某个消息,先别急着怀疑飞控坏了。按这个顺序排查:
1. 检查LOG_BITMASK参数,确认该消息没有被屏蔽。
2. 检查该消息的记录条件是否满足(比如GPS是否锁定、电机是否解锁)。
3. 检查SD卡剩余空间,如果空间不足,飞控会优先丢弃非关键消息。
4. 最后再怀疑硬件问题。