多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

PlotJuggler ROS1安装指南:高效回放bag数据可视化工具

PlotJuggler ROS1安装指南:高效回放bag数据可视化工具 做机器人、自动驾驶或者传感器数据采集的朋友应该都经历过这种场景车跑了一圈、机器人在实验台上转了几分钟回来以后手里攒了一大包.bag文件心里想着赶紧把数据翻出来看看到底哪里出了问题。结果打开rqt_plot以后一边拖变量一边等曲线刷新好不容易把感兴趣的 topic 拉出来发现时间轴稍微一拉就糊成一团想对比两个传感器之间的延迟还得自己算半天。后来我换成了 PlotJuggler整个回放和分析 bag 数据的体验可以说是直接换了一个量级。今天这篇就专门聊聊在 Ubuntu 环境下的 ROS1 版本 PlotJuggler 怎么下载安装、怎么把录好的 bag 数据可视化出来以及我在实际使用中踩过的一些坑。这篇内容适合三类人看刚接触 ROS1、正在为数据分析工具发愁的新手已经被rqt_plot折磨到想换工具的老手以及想在 Ubuntu 上快速搭一套 bag 回放分析环境、但又不想折腾一堆配置的人。放心安装路径会写全操作逻辑会讲透坑也会提前说清楚。1. 为什么回放 bag 我放弃了 rqt_plot改用 PlotJuggler1.1 rqt_plot 的三个痛点先说句公道话rqt_plot 本身不是不能用早期我确实拿它看过很多数据。但它有三个问题在长时间回放 bag 时会变得特别明显。第一个痛点是刷新机制。rqt_plot 是订阅 topic 实时绘制一旦服务器端的消息频率比较高或者你同时订阅了五六个 topic界面就会明显卡顿曲线刷新像幻灯片一样一帧一帧地跳。对于录下来的 bag 数据这个问题尤其烦人——rosbag play的重放速度稍微调快一点rqt_plot 的绘制线程就会跟不上你看不到细节只看到一片锯齿。第二个痛点是时间轴操作不顺手。rqt_plot 虽然能拖动时间范围但它的交互设计明显更偏向“实时监视”而不是“事后分析”。我想看某个时间段里两条曲线的相位差得缩小时间窗、暂停播放、再调整坐标轴范围来回操作非常累。PlotJuggler 在这方面的交互是专门为数据分析设计的缩放、平移、框选放大都极流畅命令触发之后你几乎是本能地就能完成这些操作。第三个痛点也是我最在意的布局不能保存和复用。每次打开 rqt_plot你都得重新从 topic 列表里拖变量、调整窗口排列。如果面对的是每星期都要回放一遍的重复性实验数据这种重复劳动就很没有意义了。PlotJuggler 可以把当前整个图形布局保存成文件下次一键加载这也是我后面会单独拿出来讲的一个高效用法。1.2 PlotJuggler 到底是个什么东西简单来说PlotJuggler 是一个专门做时序数据可视化和分析的开源工具。你可以把它理解成一个“数据波形播放器”把数据源接进来把感兴趣的变量拖到画布上它就能给你画出随时间变化的曲线还支持缩放、游标测量、数据导出、简单脚本变换这些功能。它对 ROS 的支持是插件式的。也就是说PlotJuggler 本身可以完全脱离 ROS 运行靠加载 CSV 文件、UDP 数据流、网络接口等等数据源工作而当你把它和 ROS1 的插件一起编译安装时它就变成了一个 ROS 工具可以直接订阅 ROS topic也可以直接打开.bag文件。这正是标题里“ROS1 版本”的含义——不是指 PlotJuggler 分 ROS1 和 ROS2 两个独立软件而是指它装上了面向 ROS1 的插件和数据接口。1.3 它真正解决了什么问题如果只用一个词来概括 PlotJuggler 的价值我会选“效率”。用 rqt_plot 分析一段 20 分钟的 bag你可能要花 10 分钟在“拉变量—调范围—重新拉变量”的循环里用 PlotJuggler 的话步骤基本是打开 bag 文件在左侧 topic 树里勾选需要的字段它们就会批量生成曲线然后用鼠标拖一拖、缩放一下看到异常段落后用游标精确读取数值整个流程两三分钟就能完成。更进一步它还可以把某一段数据导出成 CSV再交给 Python 做后续处理。这个能力把它从“看图工具”变成了“数据预分析工具”。我自己在排查底盘速度反馈异常的时候就是先用 PlotJuggler 快速定位是哪一段数据出了问题再把那一段导出来做频谱分析。这种工作流rqt_plot 完全做不到。2. 安装前的选择题版本、形态、依赖一起想清楚2.1 你的 Ubuntu 和 ROS1 版本决定了下载源这是安装前最应该先确认的事情。ROS1 的几个发行版和 Ubuntu 版本是有固定对应关系的一旦对应关系错了要么 apt 源里找不到包要么编译出来的二进制和系统库不兼容。常见的搭配是Ubuntu 版本对应 ROS1 发行版apt 源中 PlotJuggler 支持情况Ubuntu 18.04Melodic有 apt 包版本较旧但稳定Ubuntu 20.04Noetic有 apt 包也是目前 ROS1 用户最多的搭配Ubuntu 22.04无官方 ROS1 支持需要自行编译或容器方案Ubuntu 24.04无官方 ROS1 支持需要自行编译或容器方案如果你是 Ubuntu 20.04 ROS Noetic恭喜你这是最省心的一条路下面讲的第一种安装方式直接适用。如果你用的是 Ubuntu 22.04 或 24.04 还非要跑 ROS1那就要做好自己编译的心理准备而且很可能要面对系统 Qt 版本带来的兼容问题。这个坑我后面会专门展开。2.2 核心版与 ROS 插件版别把两者搞混打开 PlotJuggler 的 GitHub 主页你会发现它分两个仓库PlotJuggler是主程序plotjuggler-ros是 ROS 插件。把它们的关系说透你就理解了安装时到底要装什么。PlotJuggler主程序本身不依赖 ROS它管的是界面、曲线绘制、缩放交互、CSV 解析这些事情。plotjuggler-ros则是给主程序提供一个“数据源适配层”它通过 ROS 的 message_filters、rosbag 等接口把话题数据或 bag 文件转成 PlotJuggler 内部的数据结构。所以标题里说的“ROS1 版本下载安装”本质上就是两件事把主程序弄到手再把 ROS 插件编译进去。如果只装了主程序没有 ROS 插件你会发现打不开 bag 文件、也订阅不了话题界面里只有一个光秃秃的数据源选择面板。2.3 Qt5 依赖为什么是最大的拦路虎PlotJuggler 的界面基于 Qt5 构建而且它用到了 Qt5 的 WebEngine 组件用于显示一些富文本和网页类面板。源码编译时CMake 会显式查找Qt5Widgets和Qt5WebEngineWidgets。这两个组件在很多精简版 Ubuntu 系统上并不会预装一旦缺失编译会在配置阶段直接报错。这里要特别提醒一下装了 Ubuntu 24.04 的朋友24.04 默认的 GUI 开发库重心已经明显偏向 Qt6如果系统里同时存在 Qt5 和 Qt6CMake 的搜索路径又没有被正确约束编译 PlotJuggler 时会遇到老代码找不到 Qt5 模块的问题。最稳妥的方案是先把 Qt5 的开发包完整装好明确指定CMAKE_PREFIX_PATH指向 Qt5 的安装目录。如果你打算用 24.04 跑 ROS1这其实是比 PlotJuggler 本身更麻烦的一件事建议先评估清楚再动手。3. 三种下载安装路径实测ROS13.1 路径 Aapt 安装最省事建议优先试如果你是 Ubuntu 20.04 ROS Noetic直接走 apt 安装就行。打开终端先保证 ROS 的 apt 源已经配置好然后执行sudo apt update sudo apt install ros-noetic-plotjuggler-rosUbuntu 18.04 Melodic 对应的是sudo apt install ros-melodic-plotjuggler-ros安装完成后先source /opt/ros/noetic/setup.bash按你的发行版调整路径然后试着启动rosrun plotjuggler plotjuggler如果界面正常弹出来说明安装成功了。有些发行版里可执行文件的包名可能叫plotjuggler_ros找不到命令时可以用rospack find plotjuggler或rospack find plotjuggler_ros看一下实际安装路径再直接用绝对路径启动。apt 方式的优点很明显所有依赖都被自动处理好了版本经过了官方打包测试。缺点也很直接版本不是最新的。你可能会发现自己打开的是两年前编译的版本缺少一些新功能。但对大部分人来说稳定比追新更重要所以我建议不要跳过这条路径直接去源码编译。3.2 路径 B源码编译安装能跟上主分支的功能如果你想用最新的功能或者你的 Ubuntu 版本没有现成的 apt 包那就自己编译。整个过程不复杂但有几个细节要提前处理。先安装编译相关的基础依赖sudo apt update sudo apt install build-essential cmake git sudo apt install qtbase5-dev qtwebengine5-dev libqt5svg5-dev然后创建工作空间并拉取源码mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone https://github.com/PlotJuggler/PlotJuggler.git git clone https://github.com/PlotJuggler/plotjuggler-ros.git回到工作空间根目录开始编译cd ~/catkin_ws catkin_make如果你装了catkin_tools也可以用catkin build plotjuggler plotjuggler-ros编译完成后运行前记得加载环境source devel/setup.bash rosrun plotjuggler_ros plotjuggler源码编译最值得注意的坑是 Qt5 路径。如果你的系统里同时装了 Qt6CMake 很可能找到 Qt6 然后报错。这时可以在编译命令里手动指定 Qt5 的安装位置比如 Ubuntu 20.04 下 Qt5 默认在/usr/lib/x86_64-linux-gnu/cmake/Qt5可以在catkin_make前加一行export CMAKE_PREFIX_PATH/usr/lib/x86_64-linux-gnu/cmake/Qt5:$CMAKE_PREFIX_PATH另外源码编译时如果提示缺少 Qwt 或者 protobuf 之类的老依赖通常是因为版本较新的 PlotJuggler 已经不强制依赖它们但如果你的系统是较老的发行版把libqwt-qt5-dev也装上会更稳妥。3.3 路径 C直接下载 AppImage 单文件版本PlotJuggler 的主仓库 Release 页面会提供 AppImage 单文件版本下载后赋予执行权限就能直接运行chmod x PlotJuggler-*.AppImage ./PlotJuggler-*.AppImage但这里要提醒你官方发布的 AppImage 一般只是主程序本体通常没有集成 ROS 插件。也就是说你可以拿它快速体验曲线绘制、CSV 数据分析这些功能但如果你指望它直接打开 ROS 的 bag 文件或者订阅 topic大概率会失望。所以我的建议是AppImage 只当作“体验版”或者“在没有 ROS 的机器上分析 CSV 数据”的备用方案。真正要在 ROS1 工作流里用还是优先走 apt 或源码编译。3.4 三个路径怎么选直接给结论安装方式适合场景优点缺点推荐度apt 安装Ubuntu 18.04/20.04 ROS1零依赖烦恼稳定版本相对旧高源码编译想用最新特性或 Ubuntu 版本较新功能完整可控性强需要处理 Qt5 依赖中高AppImage快速体验、无 ROS 环境免安装不带 ROS 插件低一句话总结能 apt 就先 aptapt 没有就源码编译AppImage 用来临时应急。4. 装好之后的第一步加载 bag 和实时订阅4.1 直接打开 bag 文件是最常用的方式启动 PlotJuggler 后你会看到一个主要由三块组成的界面左侧是数据源和 topic 列表中间是曲线绘制区右侧是变量管理和属性面板。直接加载 bag 文件的方式是在菜单栏找到File选择Load Bag/Bag file文件选择窗口里选中你的.bag加载完成后左侧会出现 bag 里所有 topic 的树形结构。这里需要留意PlotJuggler 并不是把整个 bag 一次性塞进内存而是按需读取所以即使 bag 文件有好几个 GB加载过程通常也比较顺畅。在 topic 树里找到你关心的字段。比如你想看速度 topic展开后会有linear/x、linear/y、linear/z这样的字段。点击字段名曲线就会出现在绘制区里按住 Ctrl 可以同时点选多个字段批量生成曲线这个比 rqt_plot 一个变量一个变量拖高效得多。4.2 配合 rosbag play 实时订阅话题如果你的分析流程是“现场实时看”而不是事后翻 bag那就走订阅模式。先启动 ROS 核心roscore新开终端回放 bagrosbag play your_data.bag再新开终端启动 PlotJugglersource /opt/ros/noetic/setup.bash rosrun plotjuggler plotjuggler启动后在左侧数据源区域应该能看到当前 ROS 环境里活跃的 topic 列表。选择字段后曲线会实时刷新。这个模式下 PlotJuggler 相当于一个订阅者一边接收rosbag play发出来的消息一边绘制。它的订阅绘制效率明显优于 rqt_plot数据频率高时也很少出现明显掉帧。不过我个人更推荐事后直接加载 bag 文件的方式理由有两点一是你可以用时间轴随意前后跳转、反复查看某个时间片段而实时订阅模式下数据流过去了就过去了二是直接打开 bag 时 PlotJuggler 可以利用文件的索引结构快速定位分析体验更接近“回放录像”而不是“监听广播”。4.3 三个高频操作Timeseries、XY Plot、布局保存PlotJuggler 的曲线视图有两种核心模式左上角可以切换Timeseries时间序列和XY Plot相位图。Timeseries 适合看“随时间变化的趋势”比如车速曲线、舵角曲线、温度曲线这是最常用的模式。XY Plot 适合看两个变量之间的关系典型场景是画 Lissajous 图分析两个正交方向上的运动耦合或者做传感器标定时看两个轴的线性度。布局保存的入口在菜单Layout - Save layout。你可以把当前打开的变量、窗口排列、配色方案全部保存成一个 XML 文件。下次打开 PlotJuggler 直接加载布局文件就省去了重新拉变量的时间。这一步配合后面要讲的 CSV 导出能形成一个非常稳定的日常分析流水线。5. 我踩过的坑和解决办法汇总5.1 源码编译时报错找不到 Qt5WebEngineWidgets这是我第一次源码编译时遇到的第一个报错。CMake 提示找不到Qt5WebEngineWidgets_DIR当时我还以为是源码仓库的问题后来才发现是系统里根本没装对应的 Qt 模块。解决办法很简单sudo apt install qtwebengine5-dev但要注意这个包在有些 Ubuntu 版本里可能叫libqt5webenginewidgets5或者qtwebengine5-dev装的时候先apt search确认一下。装了之后如果 CMake 还是找不到多半是 Qt5 和 Qt6 的路径冲突按照前面说的设置CMAKE_PREFIX_PATH指向 Qt5 的 CMake 目录即可。5.2 打开 bag 以后曲线全是空的这个坑很多人遇到过。明明 bag 里的 topic 有数据加载后字段名也出现了但曲线一画出来就是一条直线或者整个视图一片空白。我遇到这个问题的根源是时间戳单位不匹配。ROS 消息里的时间戳有的字段是秒比如header.stamp有的字段是纳秒比如一些传感器驱动直接把stamp填成了uint64的纳秒数PlotJuggler 在解析不同 topic 时如果对时间单位的处理不一致曲线就会挤在一个点上。解决方法是在左侧的数据源或时间轴设置里把时间基准切换成Header time同时检查时间轴的缩放级别用鼠标滚轮放大时间范围。大多数情况下把时间范围从“整段自动范围”缩小到某个具体时间段曲线就会正常显示出来。如果仍然是一条直线去右侧变量面板确认该字段是否真的在 bag 里有消息有些自定义消息类型在 PlotJuggler 解析时不会自动展开数值字段需要在 topic 树里手动找。5.3 数组类型和嵌套结构怎么画出来sensor_msgs/Imu、sensor_msgs/NavSatFix 这类标准消息PlotJuggler 能直接把里面的数值字段展开比如 Imu 的angular_velocity.x、linear_acceleration.y这些都能直接在左侧树里看到。但你如果用的是自定义消息里面嵌套了 vector 数组或者复杂结构就会遇到 PlotJuggler 无法直接绘图的问题。它不像 rviz 那样有类型专用的显示插件数组类型会被它当成不可标量化的数据topic 树里可能干脆不显示这些字段。我遇到这种情况时有两种处理方式如果数组长度是固定的比如 4×4 矩阵可以在录制 bag 之前把数据拆成多个单独的 float32 字段发布提前做好数据标准化如果 bag 已经录完了就写一个小的 ROS 节点订阅原始消息把数组里的第几个元素提取出来重新发布成标准消息类型再用 PlotJuggler 重新订阅。这个流程正是我后来会建议大家养成“先规划数据格式再决定工具链”习惯的原因。5.4 在 Ubuntu 22.04/24.04 上想跑 ROS1 版本怎么办这是现在很多新手问得最多的问题。说实话在 Ubuntu 22.04 和 24.04 上跑 ROS1 本身就比较折腾因为官方并不支持这两个版本的 ROS1 安装PlotJuggler 的 apt 包自然也无从谈起。可行的方案有几条一是用 Docker 镜像跑一个 Ubuntu 20.04 的容器在容器里装 ROS Noetic 和 PlotJuggler然后把主机的 bag 文件挂载进容器进行分析。这个方法我已经用了很长时间优点是环境干净、可复用缺点是 GUI 显示需要额外的 X11/Wayland 转发配置。二是把 PlotJuggler 当作纯桌面应用单独编译出来不依赖 ROS然后用rosbag_to_csv之类的工具把 bag 里的数据先转换成 CSV再丢给 AppImage 版 PlotJuggler 分析。这个方案绕开了 ROS 依赖但会损失一部分直接打开 bag 的便利性。我自己现在的做法是主力分析环境还是 Ubuntu 20.04 ROS Noetic apt 版 PlotJuggler备用机器上用 Docker 跑同一套环境。如果你只是偶尔分析 bagDocker 方案足够用了如果要频繁做室内外实验和数据分析建议还是老老实实用 20.04 作为工作系统。6. 进阶玩法从“看图”到“数据分析”6.1 把数据导出 CSV 再做深入分析PlotJuggler 不只是一个“波形显示器”它最实用的进阶能力是数据导出。在曲线视图里你可以用框选工具选中一段感兴趣的时间范围然后通过File - Export data to CSV把该范围内的所有曲线数据导出成 CSV 文件。为什么这个功能重要因为很多分析工作本质上不适合在图形界面里完成。比如你想对 IMU 信号做功率谱分析、想统计某段时间内电池电压的方差、想计算两条曲线之间的互相关系数这些在 GUI 里做都太笨重了。正确的姿势是用 PlotJuggler 快速找到异常数据所在的时间段导出 CSV再交给 Python 脚本处理。PlotJuggler 负责“定位”Python 负责“深挖”两者搭配效率极高。导出之后用 pandas 读取就是常规操作了import pandas as pd df pd.read_csv(exported_data.csv) print(df.head()) print(df[imu.accel.x].mean())6.2 内置脚本做简单变换省去改包重录的麻烦PlotJuggler 自带一个轻量级的脚本引擎你可以对画布上的数据做简单变换比如单位换算、减去偏移量、翻转符号。这个功能听起来不起眼但在分析时非常实用。举个例子我录的传感器原始数据里加速度单位是g我想看成m/s^2就在数据列表里右键该变量选择写一个简单表达式把数值乘以 9.80665新曲线会立即生成在同一条时间轴上。再比如陀螺仪的零偏很严重我可以直接减去一段静止时的平均值不用重新录包、不用写一个完整的 ROS 节点去处理数据界面里点几下就能完成。这个脚本能力虽然比不了 Python 的灵活性但它足够覆盖 80% 的“基础上变换”需求而且变换结果是即时可视的对快速排查问题太方便了。6.3 把布局当成模板沉淀个人分析流程前面提过布局保存功能这里展开讲一下它的实际价值。做机器人调试的人往往不是只看一次数据而是隔几天就要回放一次同类实验。如果你每次都能复用同一套布局文件分析效率会高很多。我在自己工作里会把分析习惯沉淀成不同的布局模板有一个专门看底盘响应的布局里面预置了左右轮速差、目标速度和实际速度四条曲线有一个专门看 IMU 的布局把三轴角速度和线加速度排成两行还有一个用于传感器延迟标定的布局同时打开同一事件的多个时间戳字段。每次拿到新的 bag我只需要Load layout再重新挂载 bag 文件剩下的事情几乎都是自动化的。这套工作流rqt_plot 做不到普通现成的 GUI 工具也做不到算是 PlotJuggler 帮我沉淀下来最值钱的一笔习惯。现在哪怕是别人给我一份格式陌生的自定义消息 bag我也是先导入 PlotJuggler 泡一遍交互界面再针对具体环节决定要不要写代码处理。最后再分享一个操作小技巧在 PlotJuggler 的曲线视图里双击某个变量名可以直接把它放到绘图区对应的槽位上比拖拽更精准配合Ctrl多选字段批量生成曲线基本能做到“打开 bag 后 30 秒内看到所有关键曲线”。很多人第一次用 PlotJuggler 会先被它相对“空荡”的界面劝退以为功能很少其实它的设计思路是“把数据源的接入做简单把数据本身的呈现做到极致”。静下心用半小时摸清楚时间轴缩放和字段连接逻辑后面基本就回不去 rqt_plot 了。
返回列表