1. PX4日志系统概述:日志的作用、文件格式与获取方式

做无人机调试,说白了就是在跟看不见的东西打交道。电机转没转、传感器数据对不对、控制指令发没发出去——这些全靠日志来还原。我个人习惯把日志叫做“飞行黑匣子”,它记录了你飞机上每一个关键节点的状态。

今天咱们就从日志的作用开始聊,然后看看它的文件格式,最后说说怎么把日志从飞机上拿下来。

1.1 日志到底能干什么?

你可能遇到过这种情况:飞机飞着飞着突然掉高,或者莫名其妙地偏航。这时候你第一反应是什么?我刚开始做飞控时,第一反应是“是不是硬件坏了”。后来踩的坑多了才发现,90%的问题都能从日志里找到线索。

日志的核心作用,我总结为三点:

  • 故障排查:飞机炸了、偏航了、抖动了,日志能告诉你“哪一步出了问题”。
  • 性能调优:PID参数合不合理?传感器噪声大不大?日志里的数据曲线会说话。
  • 合规验证:有些行业应用需要证明飞机“飞得稳”,日志就是最好的证据。

我的经验:有一次客户反馈飞机在悬停时高度波动超过±30cm。我拿到日志一看,气压计数据里有一段明显的“台阶”——原来是飞控被太阳晒得太热,气压计温漂了。没有日志,这种问题你猜一辈子也猜不出来。

1.2 ULog文件格式——PX4的“黑匣子”语言

PX4从很早的版本就开始用ULog格式了。它跟常见的CSV或者TXT不一样,是一种二进制日志格式。为什么要用二进制?说白了就两个原因:体积小、写入快。

你想想看,飞控上的存储空间本来就有限,SD卡读写速度也远不如电脑硬盘。如果用文本格式写日志,飞控可能还没来得及写完,下一帧数据就来了——丢数据就是这么发生的。

ULog的结构其实不复杂,我画了一张图帮你理解:

ULog 文件结构示意图 文件头 (File Header) 魔数 + 时间戳 + 版本号 定义段 (Definition Section) 消息类型定义、多字节格式、参数列表 例如:定义 sensor_accel 包含 x/y/z 三个 float 字段 数据段 (Data Section) 包含多个数据块,每个数据块由 标志位 + 时间戳 + 数据内容 组成 标志位 (1 byte) 0x01=数据, 0x02=信息 时间戳 (8 bytes) 微秒级绝对时间 数据内容 (N bytes) 按定义段格式排列 可选段 (Optional Section) 日志结束标记、附加信息块(非必须) 数据段是日志的主体,占文件体积的 95% 以上

嗯,这里要注意:ULog是自描述的。什么意思?就是日志文件自己带着“说明书”——定义段里写清楚了每个数据字段叫什么、是什么类型。所以你用任何工具解析ULog,只要工具支持这个格式,就能自动识别出所有数据。

小技巧:如果你用文本编辑器打开ULog文件,会看到一堆乱码。别慌,这是正常的。二进制格式本来就不是给人直接读的。用 ulog2csv 或者 pyulog 工具转成CSV就能看了。

1.3 日志存在哪儿?

PX4的日志存储位置,取决于你用的硬件平台。我整理了一个表格,方便你对照:

硬件平台 存储介质 默认路径 注意事项
Pixhawk 系列 SD 卡 /fs/microsd/log/ 建议使用 Class 10 以上高速卡
CUAV 系列 板载 Flash / SD 卡 /fs/microsd/log/ 或 /fs/kparam/ Flash 容量有限,建议插 SD 卡
Holybro 系列 SD 卡 /fs/microsd/log/ 部分型号支持热插拔
树莓派 + PX4 eMMC / SD 卡 /home/pi/.px4/log/ 注意磁盘空间,日志容易撑爆

日志文件的命名规则也很简单:年月日_时分秒_序号.ulg。比如 2025_01_15_14_30_22_001.ulg,一看就知道是2025年1月15日下午2点30分22秒产生的第一条日志。

我曾经踩过的坑:有一次飞完忘了拔SD卡,第二次飞行时日志直接覆盖了上一次的。后来我养成了习惯——每次飞完立刻拔卡备份。PX4默认的日志策略是“保留最近N个文件”,旧日志会被自动删除。如果你有重要的试飞数据,记得及时拷出来。

1.4 怎么把日志取出来?

获取日志的方式有好几种,我按使用频率排个序:

  1. 拔SD卡直接拷贝——最原始也最可靠。飞控断电,拔卡,插电脑,复制粘贴。我90%的情况都用这个。
  2. 通过MAVLink下载——不用拔卡,用QGroundControl就能下载。适合不方便拆机的情况。但速度慢,一个几十MB的日志可能要传好几分钟。
  3. 通过WiFi/数传下载——用 mavlink ftp 协议,远程拉取日志。适合在户外调试时用,但信号不好容易断。
  4. 通过USB串口下载——连接飞控的USB口,用 px4_log_downloader.py 脚本下载。速度比数传快,但需要带电脑。

我的建议:如果你在做参数调优,需要反复飞、反复看日志,那就用QGC的日志下载功能,省得来回拔卡。但如果是炸机分析,我强烈建议拔卡拷贝——确保数据完整,不会被传输过程损坏。

1.5 日志文件的大小与数量控制

你可能关心一个问题:飞控能存多少日志?这取决于几个因素:

  • SD卡容量:一般用8GB~32GB,够存几十个小时的飞行数据。
  • 日志记录频率:默认是记录所有传感器数据,频率很高。如果你只关心特定数据,可以调整 SDLOG_PROFILE 参数来减少记录量。
  • 飞行时长:10分钟的飞行,日志大小大约在50MB~200MB之间,取决于传感器数量。

PX4默认的日志保留策略是:保留最近25个日志文件,或者保留最近3GB的日志数据。超过这个限制,最旧的日志会被自动删除。这个策略可以通过 SDLOG_DIR 和 SDLOG_MAX_FILES 参数调整。

小技巧:如果你在做长航时飞行测试,建议把 SDLOG_PROFILE 设置为“仅记录高优先级数据”,这样日志体积能减少一半以上。具体怎么配,我们后面章节会详细讲。