2. 日志分析工具链:FlightPlot、PlotJuggler、pyulog库的安装与基本使用
拿到PX4的ulog文件,第一件事是什么?
我个人的习惯是——先别急着看代码,先把数据“画”出来。人眼对图形的敏感度远高于对数字的敏感度。你盯着几百行数字看半天,不如一张曲线图来得直观。
这一章,我们就来搞定三款最常用的日志分析工具:FlightPlot、PlotJuggler 和 pyulog 库。它们各有侧重,但组合起来几乎能覆盖你所有的分析场景。
一句话总结三者的定位:
- FlightPlot:官方出品,开箱即用,适合快速浏览。
- PlotJuggler:社区神器,灵活强大,适合深度分析。
- pyulog:Python库,脚本化处理,适合批量分析和自动化。
2.1 FlightPlot:官方工具,上手最快
FlightPlot 是 PX4 官方提供的 Java 桌面应用。说白了,它就是专门用来画 ulog 数据的。你不需要写一行代码,点几下鼠标就能看到曲线。
安装步骤
- 确保有 Java 环境:FlightPlot 依赖 Java 8 或更高版本。在终端输入
java -version检查。如果没有,去 Oracle 官网下载安装。 - 下载最新 JAR 包:从 PX4 官方 GitHub 仓库的
Tools/jetbrains目录下,找到flightplot.jar。或者直接去 Release 页面下载。 - 启动:双击 JAR 文件,或者在终端运行
java -jar flightplot.jar。
我的小经验: 如果你在 macOS 上双击没反应,试试在终端里运行。有时候系统安全策略会拦截未签名的 Java 应用。我第一次用的时候就卡在这儿了,还以为是文件坏了。
基本使用
启动后,界面很简洁。点击 File → Open Log,选择你的 .ulog 文件。加载完成后,左侧会列出所有可用的数据主题(Topic)。
- 选择数据:勾选你想看的主题,比如
vehicle_attitude(姿态)、vehicle_local_position(位置)。 - 绘制曲线:点击 Plot 按钮,右侧就会生成曲线图。你可以拖动缩放,也可以右键添加光标测量数值。
- 导出图片:File → Export Plot as Image,方便你放到报告里。
注意: FlightPlot 对超大日志文件(比如超过 500MB)处理起来会比较慢。我遇到过加载一个 1.2GB 的日志,等了快两分钟。这时候,我建议你用 PlotJuggler 或者 pyulog 先做数据裁剪。
2.2 PlotJuggler:社区神器,灵活到没朋友
PlotJuggler 是我个人最常用的工具。它最初是为 ROS 设计的,但后来支持了 PX4 的 ulog 格式。它的核心优势在于——你可以任意组合、计算、变换数据。
安装方式
安装 PlotJuggler 有几种途径,我推荐用包管理器,省心。
| 系统 | 安装命令 |
|---|---|
| Ubuntu 20.04+ | sudo apt install plotjuggler |
| macOS (Homebrew) | brew install plotjuggler |
| Windows | 从 GitHub Releases 下载 exe 安装包 |
如果你喜欢用 AppImage,也可以直接下载 Linux 版本的 AppImage 文件,给执行权限后直接运行。
基本使用流程
- 加载数据:启动后,点击 Data → Import,选择你的 ulog 文件。PlotJuggler 会自动解析出所有主题。
- 拖拽绘图:在左侧的 DataTree 中,找到你想看的变量,比如
vehicle_gps_position.vel_m_s(GPS 速度),直接拖拽到右侧的绘图区域。 - 多图联动:按住
Ctrl键,可以同时拖拽多个变量到同一个坐标系中对比。比如把期望姿态和实际姿态放在一起,一眼就能看出跟踪误差。 - 使用变换器:这是 PlotJuggler 最强大的功能。点击 Transform 按钮,你可以对数据进行数学运算。比如计算
加速度计模值 = sqrt(ax^2 + ay^2 + az^2),或者对数据进行低通滤波。
避坑指南: 我曾经在分析一次炸机日志时,发现姿态曲线看起来很正常,但加速度计数据有异常尖峰。用 PlotJuggler 的 低通滤波变换器 处理后,发现是高频振动导致的传感器饱和。这个发现,用 FlightPlot 很难直接看出来。
常用快捷键
- 鼠标滚轮:缩放时间轴。
- 按住 Shift + 鼠标拖拽:平移视图。
- 右键:添加光标,测量两点之间的差值。
- Ctrl + Z:撤销操作(这个很救命)。
2.3 pyulog:用 Python 脚本化处理日志
当你需要批量分析几十个日志,或者想把分析结果自动生成报表时,GUI 工具就不够用了。这时候,pyulog 库就派上了用场。
pyulog 是 PX4 官方维护的 Python 库,专门用来解析 ulog 文件。你可以把它看作是 ulog 文件的 Python 接口。
安装
直接用 pip 安装,很简单:
pip install pyulog
建议在 Python 3.8 以上的环境中安装。我遇到过在 Python 3.6 上安装报错的情况,升级到 3.8 就解决了。
核心用法
安装完成后,你可以在 Python 脚本中这样使用:
from pyulog import ULog
# 加载日志文件
ulog = ULog('flight_log.ulg')
# 获取所有数据主题
print(ulog.topic_list)
# 获取特定主题的数据
attitude_data = ulog.get_dataset('vehicle_attitude')
# attitude_data 是一个字典,包含时间戳和各个字段
time_us = attitude_data['timestamp']
q = attitude_data['q'] # 四元数
# 简单绘图示例(需要 matplotlib)
import matplotlib.pyplot as plt
plt.plot(time_us, q[:, 0], label='q0')
plt.plot(time_us, q[:, 1], label='q1')
plt.plot(time_us, q[:, 2], label='q2')
plt.plot(time_us, q[:, 3], label='q3')
plt.legend()
plt.show()
我的习惯: 我会写一个通用的分析脚本,输入日志文件路径,自动输出关键指标(比如最大振动值、GPS 丢星次数、姿态跟踪误差 RMS)。这样每次拿到新日志,跑一遍脚本就能快速定位问题。
常用功能清单
| 功能 | 代码示例 | 说明 |
|---|---|---|
| 列出所有主题 | ulog.topic_list |
返回主题名称列表 |
| 获取主题数据 | ulog.get_dataset('topic_name') |
返回包含时间戳和字段的字典 |
| 获取消息类型 | ulog.msg_types |
查看日志中包含哪些消息类型 |
| 获取参数 | ulog.initial_parameters |
返回飞行器初始参数列表 |
2.4 三款工具如何选择?
你可能会问,我到底该用哪个?我的建议是:
- 日常快速检查:用 FlightPlot。打开文件,点几下,看看曲线有没有明显异常。
- 深入分析问题:用 PlotJuggler。它的变换器和多图联动功能,能帮你发现隐藏的关联。
- 批量处理或自动化:用 pyulog。写个脚本,一键跑完所有日志,输出报告。
总结一下: 这三款工具不是互斥的,而是互补的。我自己的流程通常是:先用 FlightPlot 快速扫一眼,发现可疑点后,用 PlotJuggler 深入分析,最后用 pyulog 写脚本做批量验证。这套组合拳打下来,大部分问题都能水落石出。