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 时,必须先读完定义区,才能正确解析数据区。
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消息) | 每行自带字段名 |
.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 丢星、位置跳变等问题。省时省力。
--strict false 参数,让它跳过损坏部分继续解析。这个参数在排查问题时很管用。
3.3.3 Mission Planner 日志查看器
如果你用 ArduPilot,那 Mission Planner 自带的日志查看器是首选。它直接集成在地面站里,打开日志就能看到图形化数据。
它的优点是:
- 自动识别 ArduPilot 的所有消息类型
- 支持 3D 回放飞行轨迹
- 可以叠加地图显示
缺点嘛,就是只支持 ArduPilot 的 .bin 和 .log,不支持 PX4 的 .ulog。
3.4 知识体系总览
下面这张图,把这一节的核心内容串起来了。你一看就明白:日志从飞控产生,经过不同格式存储,最后用不同工具解析。每个环节都有坑,也有技巧。
3.5 实战建议
最后,给你几个实战建议:
- 养成看日志的习惯:每次飞行后,不管有没有问题,都看一眼日志。时间长了,你就能一眼看出异常。
- 学会用命令行:GUI 工具方便,但批量处理还是命令行高效。花半小时学学 pyulog,绝对值。
- 注意日志大小:飞控的存储空间有限。如果日志太大,可以调整记录频率,或者只记录关键消息。
- 备份原始日志:我吃过亏——用工具转换后把原始日志删了,结果发现转换有问题,想重新解析都没办法。所以,原始日志一定要保留。