4. pyulog 工具入门:安装、基本命令与三大实用工具
好,咱们进入实战环节的第一步。你手里现在应该已经有一份 PX4 的 .ulog 文件了,对吧?
直接拿文本编辑器打开它?别试了,那是二进制文件,打开全是乱码。我们需要一个趁手的工具——pyulog。
说白了,pyulog 就是一套用 Python 写的解析库,外加几个命令行小工具。我个人习惯把它当成“日志瑞士军刀”,虽然功能没有 FlightPlot 那么花哨,但胜在轻量、可脚本化,尤其适合在服务器上批量处理日志。
核心思路: pyulog 负责把二进制 ulog 文件“翻译”成我们能看懂的结构化数据。你不需要记住所有细节,但必须掌握它的三个核心命令:ulog_info、ulog_params、ulog_messages。
4.1 安装 pyulog:两条路,选简单的走
安装其实没什么门槛。我建议你直接用 pip 装,干净利落。
pip install pyulog
如果你用的是 Ubuntu 或者 macOS,可能会遇到权限问题。这时候加个 --user 参数就行:
pip install --user pyulog
我的小习惯: 我一般会在 Python 虚拟环境里装,避免把系统环境搞乱。尤其是你后面可能还要装 pyplot、numpy 这些库,虚拟环境能省很多麻烦。
装完之后,验证一下:
ulog_info --help
如果能看到帮助信息,恭喜你,环境搭好了。
注意: 有些同学在 Windows 上会遇到“ulog_info 不是内部或外部命令”的报错。这通常是因为 Python 的 Scripts 目录没加到 PATH 里。解决办法:重新运行安装程序,勾选“Add Python to PATH”。
4.2 基本命令概览:一张表说清楚
pyulog 安装后会提供几个命令行工具。我帮你整理了一下:
| 命令 | 作用 | 常用场景 |
|---|---|---|
ulog_info |
查看日志的元信息 | 检查飞行时长、版本、消息类型总数 |
ulog_params |
提取参数列表 | 对比两次飞行的参数差异 |
ulog_messages |
查看日志中的文本消息 | 快速定位报错、警告信息 |
ulog2csv |
将 ulog 转为 CSV | 导出数据给 Excel 或 Matlab 处理 |
ulog_extract |
提取特定 topic 的数据 | 只保留 GPS 或 IMU 数据,缩小文件体积 |
嗯,这里要注意:ulog2csv 和 ulog_extract 我们后面章节会细讲,今天先把前三个吃透。
4.3 ulog_info:给日志做“体检”
拿到一份日志,我第一件事就是跑 ulog_info。它就像体检报告,告诉你这份日志的基本健康状况。
ulog_info sample.ulg
输出大概长这样:
Logging start time: 2024-03-15 10:32:18, duration: 423 seconds
Number of messages: 28415
- 1: vehicle_attitude (100 Hz)
- 2: vehicle_gps_position (10 Hz)
- 3: sensor_combined (250 Hz)
...
你能看到什么?
- 飞行时长: 423 秒,大概 7 分钟,正常。
- 消息频率:
vehicle_attitude是 100 Hz,vehicle_gps_position只有 10 Hz。GPS 更新慢,这是硬件限制,不是 bug。 - 消息总数: 28415 条,说明日志记录完整,没有中途卡死。
避坑指南: 我曾经遇到过一次日志只有 3 秒的情况。当时排查了半天,最后发现是 SD 卡满了。所以拿到日志先看 duration,如果太短,先检查存储介质。
4.4 ulog_params:参数“快照”对比
定位模块出问题,很多时候是参数配错了。比如 GPS_CONFIG 没设对,或者 EKF2_AID_MASK 少开了某个传感器。
ulog_params 能帮你把日志里记录的参数全部导出来。
ulog_params sample.ulg
输出是一长串参数列表:
param: CAL_GYRO0_ID = 2293760
param: CAL_ACC0_ID = 2293760
param: GPS_CONFIG = 0
param: EKF2_AID_MASK = 1
param: EKF2_GPS_CHECK = 245
...
你想想看,如果两次飞行结果不一样,你可以用这个命令分别导出参数,然后用 diff 工具对比。我经常这么干,特别快。
实用技巧: 如果你只想看某个参数,可以配合 grep 过滤。比如只看 GPS 相关的参数:
ulog_params sample.ulg | grep GPS
这样输出就清爽多了。
4.5 ulog_messages:日志里的“聊天记录”
PX4 在运行过程中会输出各种文本消息,包括错误、警告、调试信息。这些消息藏在日志里,用 ulog_messages 就能拉出来。
ulog_messages sample.ulg
输出示例:
10:32:18.123 [INFO] GPS 1: detected as u-blox
10:32:20.456 [WARN] GPS 1: jamming detected
10:33:01.789 [ERROR] EKF2: GPS quality poor
看到了吗?这里直接告诉你 GPS 被检测到了,但后来出现了干扰,最后 EKF 报 GPS 质量差。这就是定位模块出问题的直接证据。
注意: 不是所有错误都会导致炸机。比如“jamming detected”可能只是短暂干扰,后面又恢复了。你需要结合后面的数据曲线来综合判断。
4.6 本章知识体系:一张图看懂
为了让你对 pyulog 的整体结构有个直观印象,我画了张图:
这张图把今天的内容串起来了。你从 ulog 文件出发,通过三个命令分别获取元信息、参数和消息,最终目标就是快速定位定位模块的问题。
4.7 实战小练习:动手试试
光看不练可不行。我建议你现在就找一份 ulog 日志,按下面的步骤走一遍:
- 运行
ulog_info your_log.ulg,看看飞行时长和消息频率。 - 运行
ulog_params your_log.ulg | grep GPS,检查 GPS 相关参数。 - 运行
ulog_messages your_log.ulg,看看有没有 ERROR 或 WARN。
做完这三步,你就能对这份日志有个基本判断了。如果发现 GPS 参数不对,或者有错误消息,那问题大概率就出在这里。
我的经验: 刚开始用 pyulog 时,我总觉得命令行太枯燥。但用习惯了你会发现,它比任何 GUI 工具都高效。尤其是你要批量处理几十份日志的时候,写个脚本循环跑,几分钟就能筛出有问题的日志。