4. rqt_plot 实时绘图:监控传感器数据变化趋势、多话题叠加分析

做机器人调试,最怕什么?

我最怕传感器数据“看起来正常”,但机器人就是跑不稳。你打印日志,满屏数字,眼睛都看花了,也看不出个所以然。这时候,rqt_plot 就是我的救星。

说白了,rqt_plot 就是一个实时绘图工具。它能把你话题里的数值数据,变成一条条曲线。趋势、抖动、异常值,一眼就能抓住。我习惯在调试 IMU、激光雷达、电机反馈时,第一时间把它打开。

4.1 为什么需要实时绘图?

你想想看,打印日志是“点状”信息。你看到某个时刻的数值,但不知道它之前怎么变的。而曲线是“线状”信息。上升、下降、震荡、毛刺,全在一条线上。

举个例子。我在调试一个四轮差速底盘时,发现左轮转速偶尔会跳变。打印日志看,数值确实有异常,但不知道是偶发还是周期性。打开 rqt_plot 一看,好家伙,每 2 秒一个尖峰。原来是电机编码器线束接触不良。要是只看日志,我可能得排查一整天。

核心价值: 将离散数据转化为连续趋势,让异常模式“可视化”。

4.2 快速上手:启动与基础操作

启动 rqt_plot 很简单。终端里敲一行命令就行:

ros2 run rqt_plot rqt_plot

或者,你也可以在 rqt 主界面里,通过 Plugins → Visualization → Plot 打开。我个人习惯用命令行,因为快。

启动后,界面很清爽。左边是话题列表,右边是绘图区。你需要做的,就是把话题拖进去。

4.2.1 添加话题的两种方式

  • 直接拖拽: 在左侧话题浏览器里,找到你的话题(比如 /imu/angular_velocity),直接拖到绘图区。松开鼠标,曲线就出来了。
  • 手动输入: 在顶部输入框里,输入话题全名,比如 /motor/left_wheel/velocity,然后点击绿色的加号按钮。

小技巧: 如果你只想看某个话题里的某一个字段,比如 Twist.linear.x,可以在话题名后面加个冒号,然后输入字段路径。例如:/cmd_vel:linear.x。这样就不用把整个话题都拖进来了,曲线更干净。

4.3 多话题叠加分析:把相关数据放在一起看

rqt_plot 最强大的地方,就是能同时绘制多个话题。你可以把“期望值”和“实际值”放在一张图上,对比着看。

我记得有一次调试机械臂的轨迹跟踪。我把 /arm/joint1_position_cmd(期望位置)和 /arm/joint1_position_state(实际位置)同时拖进 rqt_plot。两条曲线一叠加,延迟和超调量一目了然。我立刻就知道 PID 参数该往哪个方向调。

4.3.1 叠加分析的典型场景

场景 叠加的话题 分析目标
电机控制 /cmd_vel:linear.x + /odom:twist.twist.linear.x 检查指令与反馈的跟随性
IMU 滤波 /imu/data_raw:angular_velocity.z + /imu/data:angular_velocity.z 对比滤波前后的噪声抑制效果
激光雷达 /scan:ranges[0] + /scan:ranges[180] 观察不同角度的测距值变化
电池管理 /battery/voltage + /battery/current 分析放电曲线和功耗模式

嗯,这里要注意。叠加分析时,Y 轴的量纲可能不同。比如电压是 12V 左右,电流是 2A 左右。如果直接叠加,电流的曲线会趴在底部。这时候,你需要右键点击曲线,选择 Split Axes,给每条曲线分配独立的 Y 轴。这样两条曲线都能看得清清楚楚。

4.4 高级配置:让曲线更“听话”

默认的 rqt_plot 配置,够用,但不够好用。我一般会做几项调整:

4.4.1 调整时间窗口

默认显示最近 10 秒的数据。如果你在调试一个缓慢变化的过程(比如电池放电),10 秒太短了。在绘图区右键,选择 Config,把 Time window 改成 60 秒或 120 秒。这样你能看到更长时间的趋势。

4.4.2 修改曲线颜色和线宽

多条曲线叠在一起,颜色容易混淆。在曲线图例上双击,可以修改颜色和线宽。我习惯把“期望值”设为绿色粗线,“实际值”设为蓝色细线。一眼就能区分。

4.4.3 数据导出

有时候,你需要把曲线数据导出来做进一步分析。rqt_plot 支持导出 CSV 文件。在 Config 面板里,找到 Export 按钮,选择保存路径。导出的数据包含时间戳和所有曲线的数值。我经常用这个功能,把数据扔到 Python 里做 FFT 分析。

避坑指南: 我曾经在导出 CSV 时,发现数据量特别大,文件有几百兆。原因是时间窗口设得太长,而且话题频率很高(比如 100Hz 的 IMU 数据)。建议在导出前,先把时间窗口缩短到 10-20 秒,或者降低话题的发布频率。否则,你的硬盘可能会报警。

4.5 实战案例:监控 IMU 数据变化趋势

我们用一个完整的例子,走一遍流程。假设你有一个 IMU 话题 /imu/data,里面包含角速度和线加速度。你想看看机器人在原地旋转时,角速度的 Z 轴分量是否平滑。

  1. 启动 rqt_plot: ros2 run rqt_plot rqt_plot
  2. 添加话题: 在输入框里输入 /imu/data:angular_velocity.z,点击加号。
  3. 开始旋转机器人: 手动转动机器人底盘,或者发送旋转指令。
  4. 观察曲线: 正常情况下,曲线应该是一条接近直线的水平线(匀速旋转时),或者平滑的上升/下降曲线。如果曲线出现大量毛刺或突变,说明 IMU 数据有噪声,或者存在机械振动。
  5. 叠加对比: 再添加一个话题 /imu/data_raw:angular_velocity.z(原始数据)。两条曲线叠加,你就能看到滤波前后的效果。如果滤波后的曲线过于平滑(延迟很大),说明滤波参数需要调整。

这个流程,我在调试 AGV 的导航系统时,几乎每天都在用。它帮我快速定位了 IMU 安装位置不当、滤波器截止频率设置错误等多个问题。

4.6 知识体系:rqt_plot 的核心逻辑

为了让你更直观地理解 rqt_plot 的工作原理,我画了一张图。它展示了从话题数据到可视化曲线的完整链路。

rqt_plot 数据流与可视化逻辑 rqt_plot 数据流与可视化逻辑 ROS2 话题 /imu/data 字段提取 angular_velocity.z 数据缓冲 时间窗口 10s 多话题叠加 期望 vs 实际 坐标轴配置 独立 Y 轴 / 时间轴 实时渲染 曲线绘制 核心逻辑:话题 → 字段提取 → 缓冲 → 叠加 → 配置 → 渲染 多话题叠加时,每个话题独立提取字段,共享时间轴,但可独立配置 Y 轴

从这张图你可以看到,rqt_plot 的核心流程并不复杂。它订阅话题,提取你指定的字段,存入一个环形缓冲区,然后根据你配置的坐标轴,把数据实时绘制出来。多话题叠加,本质上就是多个这样的流程并行运行,共享同一个时间轴。

4.7 常见问题与解决思路

用久了,总会遇到一些小问题。我整理了几个最常见的:

  • 曲线不更新: 检查话题是否在发布数据。可以用 ros2 topic echo /你的话题 验证一下。如果话题有数据,但曲线不动,试试重启 rqt_plot。
  • 曲线断断续续: 可能是网络延迟,或者话题发布频率太低。rqt_plot 默认的刷新率是 30Hz,如果你的话题只有 1Hz,曲线看起来就会一跳一跳的。可以在 Config 里降低刷新率。
  • 内存占用过高: 时间窗口太长,或者话题频率太高。建议把时间窗口控制在 30 秒以内。如果必须长时间监控,考虑用 rosbag 录制数据,事后分析。
  • 无法添加话题: 确认话题名和字段路径完全正确。ROS2 的字段路径是大小写敏感的。比如 linear.x 和 Linear.x 就是两个不同的字段。

我的习惯: 每次调试新硬件时,我都会先开一个 rqt_plot,把关键传感器的话题都拖进去。然后手动动一动机器人,看看所有曲线是否正常。这一步,能帮我过滤掉 80% 的硬件连接问题。剩下的 20%,再用日志和 rosbag 去深挖。

好了,rqt_plot 的内容就这些。它不复杂,但很实用。下次调试时,别光盯着终端了,把曲线打开,让数据“说话”。