Skip to content

使用PlotJuggler进行日志分析

PlotJuggler 可用于深入的开发目的,对ULog日志进行分析。它极其有用,因为每个uORB主题都能展示出来并绘制图表,而且还具备自定义函数来修改数据(例如将四元数转换为横滚/俯仰/偏航值)。

安装

你可以在此处找到Plot Juggler的最新版本。

Windows版本说明

Windows系统下最新版的PlotJuggler可能无法正常运行。在这种情况下,可回退到此处的v2.8.4版本(已知该版本在Windows系统上可用)。

Linux系统AppImage说明

如果下载的AppImage文件无法打开,你可能需要更改其访问权限。在终端中使用以下命令来操作:

sh
chmod 777 <PlotJuggler-AppImage文件路>

一般用法

最常见的两项操作是在记录的uORB主题中“搜索”,以及将特定主题中的字段“拖放”到图形视图中。下面的示意图展示了这两个操作。

Plot Juggler基本用法

水平/垂直分割:多面板

PlotJuggler最强大的功能之一是可以水平或垂直分割屏幕,同时显示不同的图表(顶部有一个同步的时间轴,当你移动底部的时间游标时,它也会相应移动)。

下面的动画展示了这一功能:

Plot Juggler多面板演示

在这个例子中,首先将屏幕分割为三个部分,绘制vehicle_local_position主题的axayaz(加速度估计值)分量的图表。然后,在右侧面板下方添加vz(速度估计值)分量的图表,最后在中间下方的面板中绘制battery_status主题的current_a(电池电流)图表。

一开始可能不太明显,但你可以观察到,每当飞行器开始移动(电池电流值升高),加速度和速度值也会开始变化。这是因为所有数据都以时间序列的形式显示,每个值都对应一个特定的时间戳。

这对于全面了解发生了什么以及原因非常有用。通常仅通过查看一个图表很难排查问题,但通过同时显示多个图表,就更容易弄清楚系统中发生的情况。

二维数据显示

另一个强大的功能是能够以散点图的方式在XY平面上显示二维数据(X、Y轴各显示一个数据)。操作方法是在选择两个数据点时按住Ctrl键(例如vehicle_local_position主题的xy分量),然后按住鼠标右键进行拖放。

Plot Juggler二维绘图

在这个例子中,将飞行器在本地坐标系中的估计位置绘制到XY平面上,展示了估计位置的二维视图,右侧绘制了vxvy分量(速度估计值)的图表,下方分割视图中绘制了vz(垂直速度估计值)的图表。

这直观地展示了飞行器位置和速度之间的关系。例如,注意当飞行器沿X轴方向移动时,vx值会升高,当飞行器转向Y轴方向时,vy值也会开始变化。

使用“播放”按钮

这里的播放按钮用于实时播放记录的数据(速度因子可在右下角调整)。这详细展示了上述位置/速度关系。

Plot Juggler二维深入分析

:::信息 你可以通过下载上述使用的ULog和布局文件,亲自尝试对船只测试日志进行分析!

:::

布局模板

PX4开发者分享了一些PlotJuggler布局文件。每个文件都可用于特定目的(多旋翼飞行器调参、VTOL调参、船只调试等):

高级用法

使用LUA脚本创建自定义时间序列

Plot Juggler支持使用LUA脚本来处理和显示数据。这是一个强大的功能,可以实现诸如积分曲线、平均两条曲线、消除偏移等操作。

从四元数计算横滚/俯仰/偏航

使用Lua脚本将四元数转换为横滚角

为了解飞行器的姿态,PX4在vehicle_attitude主题中以浮点数值数组(q[4])的形式记录估计姿态的四元数。由于这些值没有给出上下文信息(例如“横滚角”),所以需要进行涉及三角函数的转换。

  1. 在左侧的时间序列列表面板中搜索vehicle_attitude主题。
  2. 先点击q.00,然后按住Shift键并点击q.03,选中4个四元数成员(q.00, q.01, q.02, q.03)。它们应该都被选中。
  3. 点击左下角“自定义序列”部分的“+”符号,创建新序列。
  4. 再次选中4个四元数成员,并将它们拖到左上角的“输入时间序列 + 附加源时间序列”选项卡中。
  5. 双击函数库中的quat_to_roll。现在你应该在上方看到绘图。
  6. 在右上角的文本框中为绘图指定名称(例如roll)。
  7. 点击“创建新时间序列”。现在你应该在“自定义序列”中看到该绘图。

这里展示了自定义序列“横滚角(Roll)”与其他时间序列一起显示的情况,包括右侧以四元数形式呈现的原始数据(人无法直接读懂,使用PlotJuggler 3.5.0):

绘制的四元数横滚角

quat_to_roll函数如下:

lua
w = value
x = v1
y = v2
z = v3

dcm21 = 2 * (w * x + y * z)
dcm22 = w*w - x*x - y*y + z*z

roll = math.atan(dcm21, dcm22)

return roll