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 日志文件的获取方式

拿到日志,通常有三种途径。我个人最推荐第一种:

  1. 直接拔SD卡:最稳定、最完整的方式。飞行结束后,安全关机,拔出SD卡,用读卡器拷贝。这样能拿到最原始、最完整的日志文件。
  2. 通过MAVLink下载:用QGroundControl连接飞控,在“分析”页面选择“下载日志”。这种方式方便,但受限于数传带宽,大日志下载很慢,而且可能丢包。
  3. 通过USB串口导出:用 px4_log 命令行工具,或者直接通过MAVLink的 LOG_DATA 协议逐块读取。适合开发者调试时用。

我的建议:如果你在做正式的飞行测试,尤其是试飞新机型或者新参数,一定要用SD卡直读的方式。我曾经有一次用数传下载日志,结果飞到一半数传断连,日志只下了80%,关键数据全丢了。从那以后,凡是重要测试,我都是直接拔卡。

1.5 ULog文件结构图

下面这张图,我把ULog的完整结构画出来了。你对照着看,会更清楚。

ULog文件结构图 ULog 文件结构图 ULog Header (8 bytes) Flag Bits (1 byte) Definitions Section 包含所有消息格式定义 (multi-instance) Data Section Data Token 1 Data Token 2 Token N ... Done Token (结束标记) 每个Token都有类型标识,解析器根据类型决定如何读取后续数据

这张图里,从上到下依次是文件头、标志位、定义区、数据区。数据区里可以有很多个Data Token,最后以一个Done Token结束。每个Token都自带类型信息,所以解析器可以按顺序读下去,不会乱。

1.6 小结

这一章的内容,说白了就是让你明白:ULog是什么,它长什么样,去哪找它。这些都是最基础的东西,但也是后面所有分析工作的前提。你想想看,如果连日志文件都拿不到、打不开,那后面的数据分析、故障排查就全是空谈。