3. 日志系统入门:PX4/ArduPilot日志结构、日志文件格式(.bin/.log)、常用日志查看工具(flightplot, pyulog)

做飞控调试这么多年,我有个习惯——拿到一架有问题的飞机,第一件事不是拆桨上电,而是先看日志。说白了,日志就是飞控的“黑匣子”。你想想看,飞机在天上飞了几分钟,姿态、位置、传感器数据全在里面。定位漂移这种问题,很多时候光靠肉眼复现是看不出来的,但日志里一翻,真相就出来了。

这一节,我就带你把这套“黑匣子”系统摸清楚。我们从日志结构、文件格式,再到常用工具,一条线捋下来。

3.1 PX4日志结构:.ulog文件

PX4的日志格式是 .ulog。这个格式是PX4团队专门为飞控设计的,紧凑、可扩展。我个人觉得它最大的优点是——你不需要提前定义好所有字段,飞控在运行时会动态告诉你“我要记录什么”。

一个典型的 .ulog 文件结构是这样的:

┌─────────────────────────────┐
│         Header              │  ← 文件头,固定8字节
├─────────────────────────────┤
│      Definition Section     │  ← 定义区:消息格式、参数、版本
│  - 多个 <format> 定义       │
│  - 多个 <parameter> 定义    │
├─────────────────────────────┤
│       Data Section          │  ← 数据区:真正的飞行数据
│  - 时间戳 + 消息ID + 数据   │
│  - 每个消息按定义区格式解析 │
├─────────────────────────────┤
│         Footer              │  ← 文件尾(可选)
└─────────────────────────────┘

这里有个关键点:定义区只出现一次,在文件开头。后面的数据区全是紧凑的二进制流。所以解析 .ulog 时,必须先读完定义区,才能正确解析数据区。

我的小技巧: 如果你用 pyulog 解析日志时遇到“unknown message id”错误,八成是定义区没读完整。检查一下日志文件是否被截断。

3.2 ArduPilot日志结构:.bin与.log

ArduPilot的日志系统跟PX4不太一样。它有两种格式:.bin(二进制)和 .log(文本)。

.bin 格式是主力。它也是紧凑的二进制格式,但结构跟 .ulog 不同。ArduPilot的 .bin 日志是按“消息类型”分块的,每个消息类型有一个固定的ID(比如 ATT 表示姿态,GPS 表示GPS数据)。

我记得第一次看 ArduPilot 的 .bin 日志时,被它的“FMT”消息搞懵了。后来才明白——FMT 就是格式定义消息,它告诉解析器后面每个消息的字段名和类型。跟 PX4 的 definition section 是一个道理。

.log 格式是纯文本的,每行一条记录。虽然可读性好,但文件体积大,解析慢。我一般只在快速验证时用 .log,正式分析还是用 .bin。

特性 PX4 (.ulog) ArduPilot (.bin) ArduPilot (.log)
格式 二进制 二进制 文本
文件大小 小 小 大(约10倍)
解析速度 快 快 慢
可读性 需工具 需工具 可直接查看
定义区位置 文件开头 分散在数据流中(FMT消息) 每行自带字段名
注意: 我曾经遇到过一个问题——用旧版解析工具读新版 ArduPilot 的 .bin 日志,结果一堆字段解析错误。原因是固件升级后新增了消息类型,但工具没更新。所以,解析工具版本一定要跟固件版本匹配。

3.3 常用日志查看工具

工具这东西,用顺手了就是利器。我常用的有三个:FlightPlot、pyulog,还有 Mission Planner 自带的日志查看器。下面一个个说。

3.3.1 FlightPlot

FlightPlot 是 PX4 官方推荐的日志查看工具。它基于 Java,跨平台。界面清爽,功能也够用。

我最常用的功能是:

  • 曲线绘制:把任意字段拖到 Y 轴,时间轴自动匹配
  • 多图对比:比如同时看 GPS 位置和视觉里程计位置,漂移一目了然
  • 数据导出:可以导出 CSV,方便用 Excel 或 Python 进一步分析

嗯,这里要注意——FlightPlot 加载大日志(超过 500MB)时会有点慢。我一般先用 pyulog info 看看日志大小,太大的话先裁剪一下再导入。

3.3.2 pyulog

pyulog 是 Python 写的命令行工具集。它不提供 GUI,但胜在灵活。你可以写脚本批量处理日志。

常用命令:

# 查看日志基本信息
pyulog info flight.ulg

# 列出所有消息类型
pyulog messages flight.ulg

# 提取特定字段为 CSV
pyulog extract --messages vehicle_local_position --fields x,y,z flight.ulg

# 将 ulog 转换为 CSV(所有数据)
pyulog to_csv flight.ulg

我个人习惯用 pyulog 做自动化分析。比如写个脚本,批量检查一批日志里有没有 GPS 丢星、位置跳变等问题。省时省力。

避坑指南: 我曾经用 pyulog 解析一个损坏的日志,结果直接报错退出。后来发现可以加 --strict false 参数,让它跳过损坏部分继续解析。这个参数在排查问题时很管用。

3.3.3 Mission Planner 日志查看器

如果你用 ArduPilot,那 Mission Planner 自带的日志查看器是首选。它直接集成在地面站里,打开日志就能看到图形化数据。

它的优点是:

  • 自动识别 ArduPilot 的所有消息类型
  • 支持 3D 回放飞行轨迹
  • 可以叠加地图显示

缺点嘛,就是只支持 ArduPilot 的 .bin 和 .log,不支持 PX4 的 .ulog。

3.4 知识体系总览

下面这张图,把这一节的核心内容串起来了。你一看就明白:日志从飞控产生,经过不同格式存储,最后用不同工具解析。每个环节都有坑,也有技巧。

日志系统知识体系图 日志系统知识体系 飞控固件 PX4 (.ulog) ArduPilot (.bin/.log) 定义区 + 数据区 FlightPlot / pyulog FMT 消息 + 数据流 Mission Planner / pyulog 工具版本必须与固件版本匹配 否则解析可能出错

3.5 实战建议

最后,给你几个实战建议:

  1. 养成看日志的习惯:每次飞行后,不管有没有问题,都看一眼日志。时间长了,你就能一眼看出异常。
  2. 学会用命令行:GUI 工具方便,但批量处理还是命令行高效。花半小时学学 pyulog,绝对值。
  3. 注意日志大小:飞控的存储空间有限。如果日志太大,可以调整记录频率,或者只记录关键消息。
  4. 备份原始日志:我吃过亏——用工具转换后把原始日志删了,结果发现转换有问题,想重新解析都没办法。所以,原始日志一定要保留。