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 轴分量是否平滑。
- 启动 rqt_plot:
ros2 run rqt_plot rqt_plot - 添加话题: 在输入框里输入
/imu/data:angular_velocity.z,点击加号。 - 开始旋转机器人: 手动转动机器人底盘,或者发送旋转指令。
- 观察曲线: 正常情况下,曲线应该是一条接近直线的水平线(匀速旋转时),或者平滑的上升/下降曲线。如果曲线出现大量毛刺或突变,说明 IMU 数据有噪声,或者存在机械振动。
- 叠加对比: 再添加一个话题
/imu/data_raw:angular_velocity.z(原始数据)。两条曲线叠加,你就能看到滤波前后的效果。如果滤波后的曲线过于平滑(延迟很大),说明滤波参数需要调整。
这个流程,我在调试 AGV 的导航系统时,几乎每天都在用。它帮我快速定位了 IMU 安装位置不当、滤波器截止频率设置错误等多个问题。
4.6 知识体系:rqt_plot 的核心逻辑
为了让你更直观地理解 rqt_plot 的工作原理,我画了一张图。它展示了从话题数据到可视化曲线的完整链路。
从这张图你可以看到,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 的内容就这些。它不复杂,但很实用。下次调试时,别光盯着终端了,把曲线打开,让数据“说话”。