1. PX4日志基础:ULog文件、存储位置与下载方法

做PX4飞控调试,说白了就是跟日志打交道。我见过太多开发者,飞机炸了、参数调乱了,第一反应是「再飞一次看看」,结果第二次炸得更惨。其实日志就在SD卡里,它已经把故障原因写得明明白白了。

这一章,我们就从最基础的东西说起。什么是ULog文件?日志存在哪?怎么把它弄到电脑上?文件里面到底长什么样?

1.1 什么是ULog文件

ULog是PX4专用的二进制日志格式。全称是「UAV Log」,也就是无人机日志。它跟CSV、TXT那些文本日志不一样——ULog是紧凑的二进制格式,记录效率高,而且自带数据结构描述。

我刚开始接触PX4时,第一反应是:「为什么不用CSV?多直观啊。」后来飞了一次长航时,发现CSV日志文件动辄几百MB,而同样时长的ULog只有几十MB。你想想看,SD卡空间有限,二进制格式才是正经方案。

ULog的核心特点:

  • 二进制格式:体积小、写入快,适合嵌入式实时记录
  • 自描述结构:文件头部包含所有数据类型的定义,解析器不需要外部配置文件
  • 多主题订阅:可以同时记录传感器、姿态、GPS、RC输入等多个数据流
  • 时间戳同步:每条数据都带有微秒级时间戳,方便回放分析

说白了,ULog就是PX4的「黑匣子」。它记录了飞控在飞行过程中的所有关键数据。你调参、排故、分析炸机原因,都得靠它。

1.2 日志存储位置:SD卡

日志存在哪?答案是SD卡。PX4飞控板(比如Pixhawk系列)都带有microSD卡槽。飞控上电后,会自动在SD卡根目录下创建 /log 文件夹,所有ULog文件都存在里面。

目录结构大概是这样的:

/fs/microsd/log/
├── 2024-01-15/
│   ├── 10_23_45.ulg
│   └── 11_05_12.ulg
├── 2024-01-16/
│   ├── 08_12_33.ulg
│   └── 09_44_21.ulg
└── 2024-02-01/
    └── 14_20_00.ulg

每个日志文件以 起飞时间 命名,格式是 时_分_秒.ulg。外层文件夹是日期。这样找日志很方便——你只要记得哪天飞的,进去翻就行。

我的习惯:每次飞行前,我都会格式化SD卡。因为旧日志太多,找起来费劲。而且SD卡用久了会产生碎片,影响写入速度。我建议你每飞5-10个架次就格式化一次。

有一点要注意:如果SD卡没插好,或者卡满了,飞控会报 SD Card Error 或 Logging Failed。这时候日志是写不进去的。我曾经有一次忘了插卡就起飞,结果炸了之后想分析数据,发现啥也没有……嗯,从那以后我每次起飞前都会检查SD卡状态。

1.3 如何下载日志

把日志从飞控弄到电脑上,有几种常用方法。我按推荐程度排个序:

方法 工具 速度 适用场景
直接拔卡 读卡器 最快 现场调试、大量日志批量下载
MAVLink下载 QGroundControl 较慢 不方便拔卡时(比如飞控装在机架内部)
WiFi/数传 QGC + 数传模块 最慢 远程下载、快速查看日志摘要

方法一:直接拔卡(推荐)

这是我最常用的方式。把SD卡从飞控上拔下来,插进读卡器,连上电脑。日志文件就在 /log 目录下。复制粘贴就行,简单粗暴。

方法二:通过QGroundControl下载

如果你不想拔卡,可以用QGC。操作步骤:

  1. 飞控连接QGC(USB或数传都行)
  2. 点击左上角「齿轮」图标 → 选择「参数」页面
  3. 在左侧菜单找到「日志文件」
  4. 勾选你要下载的.ulg文件
  5. 点击「下载」按钮,选择保存路径

注意:通过MAVLink下载日志很慢。一个50MB的日志,用USB下载大概要2-3分钟,用数传可能要10分钟以上。如果日志很多,我建议直接拔卡。

方法三:通过WiFi/数传远程下载

这个适合你在室外,飞控装在机架里不方便拆的情况。QGC支持通过WiFi或数传模块远程下载日志。但速度嘛……你懂的。我只在紧急情况下用这个方法。

1.4 日志文件结构概览

ULog文件虽然是个二进制文件,但它的结构其实很清晰。我画了一张图,帮你理解它的内部组织方式:

ULog文件结构概览 文件头 (Header) — 魔数、版本号、时间戳、标志位 定义区 (Definition Section) 消息格式定义、参数定义、订阅主题声明 (包含所有数据类型的结构描述,解析器靠它理解后续数据) 数据区 (Data Section) — 核心内容 由多个数据包 (Data Packet) 组成 每个数据包包含:消息ID + 时间戳 + 实际数据 传感器数据、姿态估计、GPS、RC输入、执行器输出…… 按时间顺序连续排列 索引区 (Index Section) — 快速定位 解析器先读文件头 → 再读定义区 → 然后顺序读取数据区

ULog文件从结构上分为四个部分:

  1. 文件头:固定长度(16字节),包含魔数(0x55 0x4C 0x6F 0x67,也就是"ULog")、文件版本、时间戳、标志位。解析器先读这个,确认文件格式正确。
  2. 定义区:这是ULog的精髓。它包含了所有数据类型的定义——比如传感器数据格式、姿态消息结构、参数键值对。解析器读完定义区,就知道后面数据怎么解析了。这也是ULog「自描述」的原因。
  3. 数据区:日志的主体。按时间顺序排列的数据包。每个数据包包含消息ID、微秒级时间戳、实际数据。传感器数据、姿态、GPS、RC输入……都在这里。
  4. 索引区:可选部分。包含数据区中各个消息的偏移量,方便快速定位。如果日志文件损坏,索引区可能丢失,但数据区仍然可读。

一个小技巧:如果你用文本编辑器打开ULog文件,看到开头是 ULog 三个字母,那就说明文件头没问题。如果开头是乱码,那文件可能损坏了。我遇到过几次SD卡坏道导致日志损坏的情况,这时候可以试试用 ulog2csv 工具强制转换,有时候能抢救出部分数据。

1.5 日志文件命名规则

PX4的日志命名规则很简单:时_分_秒.ulg。比如 14_30_15.ulg 表示14点30分15秒起飞的。

但这里有个坑:这个时间戳是飞控的 系统运行时间,不是UTC时间,也不是本地时间。如果你飞控没有GPS授时,或者GPS没锁定,这个时间可能不准。

我个人的做法是:在日志文件名前面加个前缀,比如 v2_参数测试_14_30_15.ulg。这样一眼就能看出这次飞行的目的。不过PX4默认不支持自定义文件名,你需要手动重命名。

1.6 日志文件大小与存储策略

ULog文件的大小取决于几个因素:

  • 飞行时长:飞得越久,数据越多
  • 记录的主题数量:默认记录所有主题,但你可以通过参数 SDLOG_PROFILE 选择只记录关键数据
  • 传感器采样率:IMU通常是1kHz,GPS是10Hz,不同主题频率差异很大

一般来说,10分钟的飞行会产生大约30-50MB的日志。一张32GB的SD卡,大概能存600-1000个日志文件。够你飞很久了。

注意:如果SD卡空间不足,飞控会自动停止记录。它会先尝试删除最旧的日志文件来腾空间,但如果删除失败(比如文件被锁定),就会直接停止记录。所以定期清理SD卡很重要。