1、日志基础:什么是ULog?PX4日志文件结构解析,日志文件的存储位置与获取方式
各位同学,咱们正式开始这门课。第一讲,先聊聊最基础的东西——日志文件本身。
做飞控调试,说白了就是跟日志打交道。飞机飞得好不好,出了问题到底是谁的锅,最后都得靠日志说话。我个人习惯是,拿到一架新飞机或者一个新固件,第一件事就是先飞一个起落,把日志拉下来看看。这就像医生看病先拍个片子,没有片子,你再厉害也是瞎猜。
1.1 什么是ULog?
ULog,全称是 UAV Log,是PX4飞控原生使用的二进制日志格式。你想想看,飞控在飞行过程中要记录几百个传感器数据、控制指令、状态信息,如果存成文本,那文件体积会大得吓人,而且写入速度也跟不上。ULog就是为了解决这个问题而设计的。
它的核心特点就三个:
- 紧凑:二进制格式,体积小,写入快。
- 结构化:自带数据定义,不需要外部配置文件就能解析。
- 可追加:飞行过程中可以持续写入,不会因为掉电而损坏已有数据。
关键点:ULog不是普通的CSV或者TXT文件。它是一个自带“说明书”的二进制容器。你拿到一个.ulg文件,里面不仅存了数据,还存了这些数据是什么格式、什么单位、什么名字。这就是它最厉害的地方——自描述。
我记得早期做PX4开发时,有一次客户发来一个日志,说飞机在空中突然失控。我拿到日志,用旧版本的解析工具打不开,报格式错误。后来一查,是固件版本升级后,ULog的message格式有细微变化。好在ULog自描述的特性让我能直接从文件头里读出新的定义,这才把问题定位到是IMU数据异常,而不是控制逻辑的锅。要是换成纯二进制流,那可就抓瞎了。
1.2 PX4日志文件结构解析
一个标准的.ulg文件,内部结构其实很清晰。我把它拆成几个部分,你一看就明白。
整个文件由一系列 Token(令牌)组成。每个Token都有一个类型标识,告诉解析器“我后面跟着的是什么数据”。
文件结构概览:
+------------------+
| ULog Header | <-- 文件头,固定8字节
+------------------+
| Definitions | <-- 数据定义区,包含所有消息格式
+------------------+
| Data Section | <-- 数据区,包含实际飞行数据
| (多个Token) |
+------------------+
咱们具体看看每个部分:
| 组成部分 | 说明 | 大小 |
|---|---|---|
| ULog Header | 固定8字节,包含魔数(Magic Number)、版本号、时间戳 | 8 bytes |
| Flag Bits | 标识日志属性,比如是否包含附加信息 | 1 byte |
| Definitions Section | 包含所有消息类型的定义,包括multi-instantiation(多实例) | 可变 |
| Data Section | 实际数据,由多个Data Token组成 | 可变 |
这里有个容易踩坑的地方,我提醒一下:
避坑指南:我曾经遇到过一个情况,日志文件头部的魔数被意外修改,导致所有解析工具都认不出这个文件。后来排查发现是SD卡在写入过程中被意外拔出,导致文件头损坏。所以,千万不要在飞控还在写日志时拔SD卡,一定要先安全关机。
1.3 日志文件的存储位置
PX4的日志存储位置,取决于你用的是哪个硬件平台。我整理了一下常见的几种情况:
- Pixhawk系列(SD卡):日志存储在SD卡的根目录下的
/log文件夹中。每次飞行会生成一个以日期和时间命名的子文件夹,里面放着.ulg文件。 - 树莓派/CM4(eMMC或SD卡):同样在
/log目录下,但路径可能因系统配置略有不同。 - QGroundControl(地面站):如果你通过MAVLink实时下载日志,QGC会把它保存在你电脑的
QGroundControl/Logs目录下。
嗯,这里要注意:SD卡的文件系统必须是 FAT32 或 exFAT。我见过有人用NTFS格式的卡插进去,飞控根本认不出来,飞了半天一条日志都没存下来。
1.4 日志文件的获取方式
拿到日志,通常有三种途径。我个人最推荐第一种:
- 直接拔SD卡:最稳定、最完整的方式。飞行结束后,安全关机,拔出SD卡,用读卡器拷贝。这样能拿到最原始、最完整的日志文件。
- 通过MAVLink下载:用QGroundControl连接飞控,在“分析”页面选择“下载日志”。这种方式方便,但受限于数传带宽,大日志下载很慢,而且可能丢包。
- 通过USB串口导出:用
px4_log命令行工具,或者直接通过MAVLink的LOG_DATA协议逐块读取。适合开发者调试时用。
我的建议:如果你在做正式的飞行测试,尤其是试飞新机型或者新参数,一定要用SD卡直读的方式。我曾经有一次用数传下载日志,结果飞到一半数传断连,日志只下了80%,关键数据全丢了。从那以后,凡是重要测试,我都是直接拔卡。
1.5 ULog文件结构图
下面这张图,我把ULog的完整结构画出来了。你对照着看,会更清楚。
这张图里,从上到下依次是文件头、标志位、定义区、数据区。数据区里可以有很多个Data Token,最后以一个Done Token结束。每个Token都自带类型信息,所以解析器可以按顺序读下去,不会乱。
1.6 小结
这一章的内容,说白了就是让你明白:ULog是什么,它长什么样,去哪找它。这些都是最基础的东西,但也是后面所有分析工作的前提。你想想看,如果连日志文件都拿不到、打不开,那后面的数据分析、故障排查就全是空谈。