启动了驱动和控制器,机器人却没有按预期运动:先看谁在发消息,再看数值有没有变化,最后对照日志。rqt 适合把这些观察放在同一个调试工作台里;它不是仿真器,也不替代命令行。
本文以 Ubuntu 22.04 + ROS 2 Humble 为基线,介绍最常用的 Graph、Plot、Console 和 Image View,并用 turtlesim 串起一条不连接真机的排查流程。核对日期:2026-10-12。空间位置、机器人模型与点云显示接着看 RViz 实战。
一、rqt、RViz 和仿真器分别看什么
| 工具 | 主要问题 | 不应据此下的结论 |
|---|---|---|
| rqt | 谁与谁通信?字段怎样变化?节点报了什么? | 图上有连线,不等于数据有效或控制闭环正确 |
| RViz | 数据在哪个坐标系?模型、路径、点云是否对齐? | 画面正常,不等于接触、力矩或动力学正确 |
| Gazebo 等仿真器 | 给定模型和输入,系统怎样演化? | 仿真能跑,不等于真机参数和时延一致 |
rqt 是可加载插件的 Qt 界面。可以在主窗口中组合多个插件,也可以单独启动某一个。在自己的工作流里,我更倾向于先问一个具体问题,再打开对应插件,避免所有面板同时挤满屏幕。
二、准备环境与启动
下列安装命令假定已经配置好 Humble 的官方 apt 软件源;已安装就不必重复安装。本机 WSL 已能找到本文涉及的 rqt 插件、turtlesim 和 RViz 可执行程序。
sudo apt update |
每个新 Bash 终端都加载同一 ROS 环境。如果还有自己的工作空间,再加载它的 install/setup.bash。
source /opt/ros/humble/setup.bash |
在 Plugins 菜单里按名称寻找 Node Graph、Plot、Console、Image View。想快速启动单项时,下列命令各自运行在独立终端中:
ros2 run rqt_graph rqt_graph |
ros2 run rqt_plot rqt_plot |
ros2 run rqt_console rqt_console |
ros2 run rqt_image_view rqt_image_view |
WSL 下 GUI 需要可用的 WSLg 或其他显示服务;Docker 内有这些包,也不表示图形窗口会自动出现在 Windows/macOS 上,还需要项目配置的显示转发或远程桌面。若提示无法连接 display,应先处理图形环境,不要把它误判为 ROS 话题故障。
所有相关终端要使用一致的 ROS_DOMAIN_ID,并确认 RMW、网络发现范围和容器网络配置能互通。只在宿主机加载 ROS 环境,并不会替容器加载环境。
三、先用 rqt_graph 看通信拓扑
在终端 A 启动模拟小海龟:
ros2 run turtlesim turtlesim_node |
终端 B 启动键盘控制,把键盘焦点留在这个终端,用方向键操作:
ros2 run turtlesim turtle_teleop_key |
终端 C 启动 rqt_graph,刷新后关注这条链:
/teleop_turtle → /turtle1/cmd_vel → /turtlesim |
如果没显示话题,检查图的模式是否包含 topics,以及 Hide 中是否隐藏了叶子话题、调试节点或未连接端点。图被过滤掉,不等于系统没有它。官方 turtlesim 入门也使用这一组节点。
通信图回答的是“拓扑关系”,下一步仍要看端点和实际消息:
ros2 topic info /turtle1/cmd_vel --verbose |
真实项目里,出现“名称和类型正确,但收不到消息”,再检查 QoS。发现到发布者与订阅者,不代表它们的 QoS 一定兼容;例如 best-effort 发布者不能满足 reliable 订阅者。Humble QoS 兼容规则
四、用 rqt_plot 看字段,而不是只看话题名
Plot 的输入要具体到数值字段。小海龟的位置消息可直接画成:
ros2 run rqt_plot rqt_plot /turtle1/pose/x /turtle1/pose/y |
也可以在 Topic 输入框添加 /turtle1/pose/theta 或 /turtle1/pose/linear_velocity。当海龟移动时,应看到相应曲线变化。这里的 x 和 y 是两条随时间变化的曲线,不是俯视平面的 XY 轨迹。
迁移到机器人控制调试时,比较有用的组合是“指令—反馈—误差”:
| 观察对象 | 能帮助发现什么 | 对齐前提 |
|---|---|---|
| 目标与实测关节位置 | 跟踪延迟、偏差、振荡 | 同一关节、同一单位、相同零位约定 |
| 速度指令与里程计速度 | 限幅、死区、响应慢 | 坐标系和速度分量一致 |
| 力矩指令与反馈 | 饱和、符号反向、异常尖峰 | 分清电流、估计力矩和真实传感器力矩 |
对于 sensor_msgs/msg/JointState,position[0] 是数组第一个元素,不自动等于“左前髋关节”。先查看 name 与数组顺序,再决定字段;数组顺序若会变化,应先在调试节点里按名字重排或发布命名明确的标量话题。
Plot 的 GUI 刷新、缓存与绘图库都有开销,不能把屏幕上每个像素当成实时控制周期的精确测量。需要查毫秒级延迟或抖动时,记录原始消息及时间戳,或使用 tracing;ros2 topic hz 测到的也是该订阅端观察到的接收频率,不能直接当成发布线程的精确周期。参见 ROS 2 排障:GDB、日志与 Tracing。
曲线为空时按顺序看:话题有没有消息 → 字段是不是数值 → 是否暂停绘图 → 时间范围是否合适 → 订阅 QoS 是否匹配。字段路径与插件支持范围可对照 rqt_plot 项目。
五、用 rqt_console 对照事件发生顺序
Console 适合收集和筛选 ROS 日志,按节点、级别、文本定位事件。建议先保留完整上下文,再高亮关键词;只看 Error 可能错过故障前的状态切换。
要分清两个开关:节点的日志级别决定“发出哪些日志”,Console 的筛选决定“显示已收到日志中的哪些”。默认 INFO 下没发出的 DEBUG,不能通过界面勾选补回来。确有需要时,在重启目标节点时指定:
# 先停止原 turtlesim_node,再启动,避免同名节点并存 |
普通的 printf、std::cout 或 Python print 不等于 ROS 日志,不保证进入 Console。排查时也保留进程终端输出。Console 用法与日志级别见 ROS 官方说明。
六、用 Image View 先确认图像流
当相机算法没有输出时,先用 Image View 选择实际图像话题,确认是否持续出图、是否黑屏、方向是否正常。若想选择压缩 transport,发送端和查看端都要具备对应的 image_transport 插件;它不是把任意消息强行变成图像。
不要仅凭显示颜色判断深度单位。深度图的编码、驱动约定与可视化归一化都影响观感;要同时检查消息的 encoding 和上游说明。看得到彩色图,也不等于相机内参、深度对齐和外参正确。
只想看一帧图像,用 Image View;想确认相机与机器人或点云的空间关系,转到 RViz 的 Camera/PointCloud2/TF 显示。插件实现与 transport 支持见 rqt_image_view 项目。
七、把常用布局保存下来
在 rqt 的 Perspectives 菜单保存或导出当前布局。导出的 .perspective 文件可以随工程保存,另一台电脑安装同样插件后再加载:
# 路径替换成自己的导出文件 |
它保存工作台布局和插件设置,不打包插件、ROS 环境或实验数据。刚安装的插件未出现时,可重新发现:
rqt --force-discover |
不要把 --clear-config 当常规修复命令:它会清除已保存的设置和布局。
八、在四足机器人项目里怎么搭配
例如“发了速度指令,但四足没有向前走”,可以沿着信息流检查:
- 用 Graph 确认命令发到了正确命名空间下的控制节点。
- 用 Plot 对比输入速度、控制器实际接收值与里程计反馈,注意坐标系。
- 用 Console 对照模式切换、使能、限幅与安全状态的日志。
- 用 RViz 查看机身朝向、足端位置、里程计和传感器坐标是否一致。
rqt 也有服务调用等能改变系统状态的插件;对真机不要随意点击使能、模式切换或运动相关服务。本文的小海龟例子与硬件无关,结束后在各启动终端按 Ctrl+C。
本文已核对本机 Humble 包入口及 Plot、rqt 的命令行参数;不把这些检查等同于实际机器人或全部 GUI 场景的验收。
继续阅读:RViz:模型、TF 与传感器 · TF2:坐标树与时间排查 · 返回 ROS 与仿真