1. PX4日志系统概述

做飞控调试这么多年,我越来越觉得日志就是飞行器的「黑匣子」。飞机在天上飞了几分钟,到底发生了什么——姿态为什么抖、定位为什么跳、电机为什么突然停转——这些问题的答案,全写在日志里。

PX4的日志系统,说白了就是把飞控上所有传感器的原始数据、状态估计结果、控制输出,按时间顺序一股脑儿记下来。你想想看,没有日志,你连飞机炸了是人为操作失误还是算法bug都说不清楚。

日志的核心价值:把飞行过程中的每一个状态变化都记录下来,让事后分析成为可能。

1.1 日志的作用

我个人习惯把日志的作用归纳为三个层面:

  • 故障排查:飞机炸了、定位飘了、高度跳变——日志是第一手证据。我在项目中遇到过好几次,现场飞手说「飞机自己乱飞」,结果一拉日志,发现是GPS天线被机臂挡住了,卫星数掉到6颗以下。
  • 性能评估:定位精度够不够?EKF收敛快不快?传感器有没有异常跳变?这些指标光靠感觉不行,得从日志里算出来。
  • 算法迭代:改了一个参数、换了一种融合策略,效果到底好不好?拉两组日志对比一下,比什么仿真都实在。

我的经验:每次飞行前,我都会确认一下SD卡有没有插好、剩余空间够不够。曾经有一次飞了15分钟,落地发现SD卡松了,日志全丢了——那种感觉,嗯,你懂的。

1.2 ULog文件格式

PX4从1.6版本开始用ULog格式替代了原来的px4log。为什么换?因为ULog更紧凑、更结构化,解析起来也更快。

ULog文件本质上是一个二进制流,按「消息」组织。每个消息都有一个类型标识,比如:

  • B — 定义消息格式(类似于结构体声明)
  • D — 数据消息(真正的传感器值、状态量)
  • I — 信息字符串(固件版本、参数值)
  • S — 同步标记(用于文件完整性校验)

文件结构大致是这样的:

+------------------+
| 文件头 (magic)    |  — 固定8字节,标识ULog格式
+------------------+
| 定义段            |  — 所有消息格式定义、参数、信息
| (Definitions)     |
+------------------+
| 数据段            |  — 按时间戳排列的数据消息
| (Data)            |
|   - 传感器数据    |
|   - 状态估计      |
|   - 控制输出      |
+------------------+
| 可选索引段        |  — 快速定位某个topic的数据
+------------------+

这里有个关键点:定义段只出现一次,后面全是数据段。所以ULog文件是「先定义、后使用」的格式。解析器必须先读完定义段,才能正确解析后面的数据。

注意:如果你用文本编辑器打开ULog文件,看到的全是乱码。别慌,这是二进制文件,需要用专门的工具(比如ulog2csv、pyulog)来解析。

1.3 日志存储位置

日志存在哪里?这取决于飞控的硬件配置。

存储介质 路径 说明
SD卡 /fs/microsd/log/ 最常用,容量大,推荐使用
内部Flash /fs/mtd_params/log/ 容量小(通常几MB),仅用于紧急情况
RAM(掉电丢失) /log/ 极少使用,仅用于调试

我个人强烈建议使用SD卡。内部Flash那点空间,飞个几分钟就满了,而且擦写次数有限,用多了容易坏。

避坑指南:SD卡建议用Class 10或以上的高速卡。我曾经用了一张低速卡,日志写入速度跟不上数据产生速度,结果丢了好多关键数据。另外,SD卡文件系统必须是FAT32,PX4不支持exFAT。

1.4 日志文件命名规则

PX4的日志文件名不是随便起的,它包含了很多有用信息。命名格式如下:

YYYY-MM-DD_HH-MM-SS.ulg

举个例子:2024-03-15_14-32-08.ulg,表示2024年3月15日14点32分08秒开始记录的日志。

为什么用时间戳命名?有两个好处:

  • 天然排序:按文件名排序就是按时间排序,找起来方便
  • 避免重名:同一秒内不会起飞两次(除非你手速特别快)

不过要注意,这个时间戳是飞控的UTC时间,不是你的本地时间。如果飞控没有GPS授时或者电池拔掉过,时间可能不准。我遇到过好几次,日志文件名显示的是1970-01-01——那是飞控的RTC电池没电了。

小技巧:如果你同时飞多架飞机,建议在SD卡根目录下建不同的文件夹,比如log/plane01/、log/plane02/,这样日志不会混在一起。PX4默认把所有日志都放在log/目录下,多架飞机混着飞的时候,找起来很头疼。

知识体系总览

下面这张图把本章的核心内容串起来了,你可以对照着看:

PX4日志系统知识体系 PX4日志系统知识体系 PX4日志系统 日志的作用 ULog文件格式 存储位置 命名规则 故障排查 性能评估 算法迭代 文件头 定义段 数据段 SD卡 内部Flash YYYY-MM-DD_HH-MM-SS.ulg 日志是飞行器的「黑匣子」——故障排查、性能评估、算法迭代都离不开它 ULog是二进制格式,需用专用工具解析;推荐使用SD卡存储,Class 10以上