我在终端敲下rosrun rviz rviz的那一刻,第一反应是:这玩意儿怎么是灰的?一个空荡荡的 3D 场景、一堆看不懂的英文面板、几个不知道干嘛的按钮。这是很多初学者接触 ROS 后遇到的第一道坎,也是 ROS 生态里最容易被低估的工具——RVIZ。
先给这篇教程定位一下:它默认你已经有了一台能跑 ROS 的 Ubuntu 系统,不管是用双系统、虚拟机还是 WSL 都行;你已经装好或者正准备装 ROS,想搞清楚 RVIZ 到底怎么用、界面每一项是什么意思、怎么把数据“显示”出来。这篇不讲 ROS 核心原理,只讲一件事:怎么让 RVIZ 真正为你干活,以及遇到rviz打不开、黑屏、闪退这些破事的时候,怎么把问题定位出来。
对了,系列标题里的“(四)”不用太在意,内容是完全独立的。你看完能带着一个真实机器人或仿真数据源,把 RVIZ 从“看了头大”用到“顺手当眼睛”,就算成功。
1. 先用30秒弄清楚RVIZ在做的事
1.1 一张可交互的“数据照片”
RVIZ 的全称是 ROS Visualization,直译就是“ROS 可视化工具”。它干的事情特别简单:把你 ROS 系统里正在运行的数据,画到 3D 场景里给你看。
注意我的用词,是“数据”,不是“机器人模型”。你可以把 RVIZ 理解成一台数据相机——相机本身不知道拍的是什么,但它能把光信号变成照片;RVIZ 不知道你的机器人长什么样,但它能把激光数据、点云、坐标变换、图像、路径这些信息变成视觉元素,呈现在同一个场景里。
所以我一直反对初学者把 RVIZ 当成“机器人上位机软件”。它不是控制台,不是 IDE,而是一个“实时调试的眼睛”。你的机器人底盘、传感器、导航算法跑得怎么样,RVIZ 都能用可视化方式让你一眼看出来。
1.2 ROS话题与显示插件的关系
既然 RVIZ 是“数据相机”,那数据是从哪儿来的?答案是:ROS 通信框架里的话题(Topic)。
ROS 里各种节点之间通过话题传递消息。比如激光雷达驱动节点发布/scan话题,里面是sensor_msgs/LaserScan格式的数据;相机驱动节点发布/image_raw,里面是图像。RVIZ 要做的事情是:订阅你指定的话题,拿到数据,然后用对应的“显示插件”把它们画出来。
这里有个很关键的概念:一个话题的数据类型决定了你该用哪种显示插件。LaserScan 数据要用LaserScan显示;点云用PointCloud2;地图用Map;图像用Camera。RVIZ 左边那一大列“Display”,其实就是一个插件容器,你往里加什么显示项,它就去订阅对应的数据。
所以先把这个逻辑刻在脑子里:
没有数据源,RVIZ 就真的只是一片灰。你看到的一切都是数据驱动的结果。
1.3 适合哪些场景使用
RVIZ 最常见的三类用途,你迟早都会碰到:
- 传感器可视化:激光雷达、深度相机、毫米波雷达的数据,动不动就是几万、几十万个点,光靠打日志根本看不出规律。RVIZ 能直接把点云、障碍物显示成空间里的形状,方便你判断雷达装歪没有、可通行区域在哪、扫描频率正不正常。
- 机器人状态调试:机器人当前坐标、关节角度、路径规划结果、代价地图,这些都是带空间的。RVIZ 能同时显示 TF 坐标树、底盘模型、规划路径,让你一看就知道“机器人以为自己在哪里”。
- 算法结果验证:SLAM 建图、避障、感知、定位。跑完一个算法,把输出的地图和轨迹在 RVIZ 里叠在一起看,比看数据表格直观太多。
这三个场景覆盖了 ROS 开发里 80% 的日常调试需求。所以别看 RVIZ 界面简单,它其实是整个 ROS 生态里性价比最高的学习对象之一。
2. 打开RVIZ之前的缺一不可的三件事:安装、启动与数据源
2.1 先搞定ROS环境:官方步骤与一键脚本二选一
RVIZ 不是独立软件,它依赖 ROS 环境。如果你还没装 ROS,得先把 ROS 装好。
我建议你二选一:
- 按官方步骤安装:优点是有完整文档,哪儿报错都能搜到。缺点是步骤长,要自己配置软件源、添加密钥、装几十个依赖包。适合想顺便理解系统底层关系的朋友。
- 用社区的一键安装脚本:国内 ROS 社区里有“鱼香ROS一键安装”这类脚本,虽然名字带“鱼香肉丝”的梗,但实际是把 ROS 版本选择、依赖处理、环境变量配置全部自动化了。你只要执行脚本,按提示选好对应的 ROS 版本(比如 ROS 1 选 Noetic,ROS 2 选 Humble),它就会帮你把环境搭好,省去很多写博客教程时最容易漏掉的细节。
不管用哪种方法,装完以后第一件事就是验证环境变量:
source /opt/ros/noetic/setup.bash如果你用的是 ROS 2:
source /opt/ros/humble/setup.bash新手最容易犯的错是每次打开新终端都不 source。别急,通常安装脚本或官方教程会让你把这句话写进~/.bashrc,这样以后每次开终端就自动加载 ROS 环境了。
2.2 确认rviz命令可用
环境配好之后,最简单的启动方式:
rosrun rviz rvizROS 2 里是:
ros2 run rviz2 rviz2如果命令能弹出一个窗口,说明安装成功。如果提示“找不到命令”,先排查环境变量有没有 source 对;如果提示“程序打不开”或者直接闪退,别在这会儿死磕,我后面专门有一章讲rviz打不开的排查链路,那是一整套方法论。
这里再补充一个从 ROS 1 到 ROS 2 很容易踩的小坑:rviz 和 rviz2 是两个完全不同的可执行文件,命令别混用。很多人 Section 1 和 Section 2 各开一个终端,稀里糊涂输入rviz发现没问题,但对 ROS 2 来说这就是错的。
2.3 没有数据源的RVIZ是“空摆设”:准备一个Demo
启动之后你只会看到空荡荡的灰色场景。要真正学 RVIZ,第一步得准备数据源。最省事的方式不是真接传感器,而是用仿真机器人的话题。
我后文实操部分会用到 TurtleBot3 这个经典小车模型。你先把相关仿真包装上:
sudo apt update sudo apt install -y ros-noetic-turtlebot3-simulations ros-noetic-turtlebot3-teleopROS 2 Humble 对应的包名改成ros-humble-turtlebot3-*,命令逻辑一样。装完之后设置一下小车型号,这个环境变量会直接影响仿真时加载哪种底盘模型:
echo "export TURTLEBOT3_MODEL=burger" >> ~/.bashrc source ~/.bashrc然后启动一个最轻量的 fake 节点,它不启动 Gazebo,直接发布一个模拟底盘的话题,对于学习 RVIZ 完全够用:
roslaunch turtlebot3_fake turtlebot3_fake.launch这一条命令会顺带启动 roscore 和 robot_state_publisher,并且发布 TF 和/scan数据。你可以再开一个终端,验证一下有没有话题在跑:
rostopic list如果能看到/scan、/odom、/tf这些话题,说明数据源已经准备好了,接下来进入 RVIZ 的重头戏。
3. 第一次启动后的界面逐区拆解:别被灰屏唬住
3.1 菜单栏:核心是File与Panels
RVIZ 顶部的菜单栏拆开看,真正常用的其实不多。
File菜单里最常用的是New Config、Open Config、Save Config As。这几个功能我劝你从一开始就养成习惯:每调好一套显示方案,就另存为一个.rviz配置文件。比如建图调试一套、导航调试一套、点云分析一套,以后要用直接rviz -d xxx.rviz加载。
Panels菜单管的是各个侧边面板的显隐。比如你误关了左侧的Display面板,或者想把Tool Properties面板调出来,都在这儿操作。
剩下的View(视角管理)、Help(版本信息)平时用得不多。重点放在下面几个区域。
3.2 左侧Display面板:软件的灵魂
左边这一列叫Display,它是整个 RVIZ 的核心。你在里面添加多少个显示项,RVIZ 就会去订阅多少个话题。
默认情况下,RVIZ 只有一个Grid(地面网格)显示项。你点左下角的Add,会弹出一个窗口,里面按分类列出了所有可用的显示插件。
我梳理一份最常用的对照表,方便你直接查阅:
| 显示插件 | 数据话题类型 | 典型场景 |
|---|---|---|
| Grid | 无 | 地面参考网格,几乎所有配置都会保留 |
| RobotModel | 机器人 URDF 描述 | 显示机器人关节模型 |
| TF | TF 树消息 | 显示各个坐标系的坐标轴和名称 |
| LaserScan | sensor_msgs/LaserScan | 单线激光雷达数据 |
| PointCloud2 | sensor_msgs/PointCloud2 | 三维点云数据 |
| Map | nav_msgs/OccupancyGrid | 栅格地图 |
| Path | nav_msgs/Path | 导航路径 |
| Camera | 图像消息 | 相机图像 |
每次新增显示项,下方就会出现它的属性配置区。比如Topic设置订阅哪个话题,Fixed Frame决定站在哪个坐标系看世界。这些属性才是真正需要精调的地方,我建议你把每一项都点开看看,不要只看中文翻译。
3.3 3D视图区怎么旋转、平移与缩放
中间的 3D 视图是可以直接用鼠标操作的:
- 左键拖动:旋转视角。
- 右键拖动:缩放。往里推是放大,往外拉是缩小。
- 中键或右键平移:在平面上移动视角。
还有更快的做法:点击上方工具栏的Select、Move Camera、Focus Camera等工具。
初学者最容易懵的是视角经常转着转着就不知道自己在哪了。解决办法有两个:一是按F聚焦到当前选中的对象;二是在View面板里把视角类型切回Top View Orthographic(俯视正交视角),一秒回到地面坐标系。做导航调试时,俯视视角几乎永远是你的主力视角。
3.4 Global Options里的固定坐标系几乎决定一切
刚打开 RVIZ 时,Global Options里的Fixed Frame默认是map或base_link之类。这个参数极其重要,因为 RVIZ 渲染任何数据都要先知道“站在哪个坐标系里看”。
打个比方:你在同一个广场上,站在东门看和站在北门看,周围建筑的相对位置会完全不一样。Fixed Frame就是这个“站的位置”。如果雷达在laser_link坐标系下发布数据,而你的固定坐标系是map,RVIZ 会通过 TF 树把数据从laser_link转换到map下再显示。
所以当你发现物体位置全乱、或者 RVIZ 报“No transform from [laser_link] to [map]”这类警告时,第一反应不该是“数据是不是错了”,而应该是“坐标系关系对不对”。这一步理解透了,后面基本上不会出大乱子。
4. 实操:把TurtleBot3放进RVIZ里并让它跑起来
4.1 启动仿真数据与键盘遥控
回到第 2.3 节,我们已经启动了turtlebot3_fake。现在打开新终端,再启动 RVIZ:
rosrun rviz rviz画面还是灰的?正常的,因为你还没告诉 RVIZ 要看什么数据。点左下角的Add,在By topic标签页里,你会看到 RVIZ 自动列出了当前有数据的话题列表。这就是 RVIZ 的另一层便利:它会自动发现当前系统所有有数据的话题,你只要挑要看的,双击添加就行。
先别急着全部加上,按照下面顺序一步步来。
如果你想让它动起来,再开一个终端:
roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch终端会显示按键说明,按w前进、a左转、d右转。如果你在 RVIZ 里看不到任何变化,说明漏了东西,继续看。
4.2 添加RobotModel与TF显示项
点Add,在弹出的窗口里选择By display type,找到RobotModel,双击添加。然后在Display面板下方找到刚添加的RobotModel,展开它的属性,把Description Topic设为/robot_description。
这一步的作用是让 RVIZ 去订阅机器人的 URDF 模型描述,然后画出完整的小车模型。TurtleBot3 的 fake 节点会发布这个话题,所以模型会立刻出现在 3D 视图中央。
紧接着添加TF显示项。TF 任务栏会画出各个坐标系的小坐标系箭头,每个坐标轴用红、绿、蓝表示 X、Y、Z。这时候你应该能在小车周围看到base_link、base_scan等坐标系符号。
初学者常常问:为什么看到一堆箭头和小车重合?因为 TF 本来就是描述坐标系之间关系的,坐标轴全叠在小车身上属于正常现象。你把Display里TF项的Marker Scale调小一点,比如从 1 改成 0.3,看起来会清爽很多。
4.3 加上LaserScan,看到“雷达波”
继续Add,选择LaserScan。把它属性里的Topic改成/scan,再把Size(点的大小)稍微调大一点,默认的 0.05 在屏幕里几乎看不见,调到 0.1 或 0.15 比较明显。
此时你会看到小车周围散布着一圈密密麻麻的点,这就是模拟激光雷达扫描出来的障碍物点。用键盘遥控小车转一圈,这圈“雷达点”会跟着base_scan坐标系一起移动。如果你在地图里放几个障碍物,点上会出现明显的边界,那就是激光打到的位置。
这一步看着简单,但它验证了整个链路:驱动节点发布数据 → 话题传输 → RVIZ 订阅 → 坐标变换 → 渲染显示。链路里任何一环出问题,你都会在 RVIZ 里看到空白、抖点或者位置漂移。
4.4 保存为配置文件方便复用
现在你的 RVIZ 已经能同时显示机器人模型、TF 坐标轴、激光点云了。这时候第一件事,不是继续加显示项,而是保存配置。
文件菜单 → Save Config As我习惯按项目建目录,比如~/rviz_configs/nav_demo.rviz。以后启动直接:
rosrun rviz rviz -d ~/rviz_configs/nav_demo.rviz保存配置不只是为了“以后方便”,更重要的是:它让团队的调试视角统一。你调出来的显示方案,别人拿过去跑同样的数据,看到的画面完全一致,避免了“我这儿没这个问题,你是不是显示设置不对”的无效沟通。
5. 进阶:点云可视化、坐标系选择与性能调优
5.1 点云显示该选PointCloud还是PointCloud2
很多做三维视觉的朋友会来问:RVIZ 里明明有PointCloud和PointCloud2两种显示插件,到底用哪个?
答案是优先用PointCloud2。PointCloud是 ROS 早期版本的消息类型,字段固定,扩展性差;PointCloud2是后来标准化为sensor_msgs/PointCloud2的消息,灵活性更高,现在主流驱动和算法基本都发布这个类型。RVIZ 同时兼容两者,但你实际数据是什么类型,就得用对应的显示插件去订阅。
点云显示里最值得调的是Style和Color Transformer:
Style建议先选Points,点比较大,容易观察;点特别密的时候再换Flat Squares或Spheres,不过会吃更大性能。Color Transformer里如果点云自带 RGB 信息,选RGB8;如果只有强度信息,选Intensity,然后配合Color Scheme里的色带映射,非常直观。
我实测过,一个 16 线激光雷达直接全部点云显示,帧率很容易掉到个位数。千万别指望 RVIZ 是无敌渲染引擎,它是调试工具,不是性能基准。
5.2 坐标系选择是“东西跑偏”的唯一根源
当你同时显示地图、点云、路径时,这些数据可能来自不同的坐标系。RVIZ 会根据 TF 树,把所有数据统一到Fixed Frame下。
这里有一个高频翻车现场:你明明把 RobotModel 和 LaserScan 都加上了,结果小车模型在旁边,激光雷达点数却显示在世界的某个角落。这时候不要怀疑数据坏了,先看三件事:
- Fixed Frame 是什么?如果设成了
odom,数据源里有没有发布odom到base_link的 TF? - TF 显示里有没有报错?TF 面板里能不能看到一条从
map到base_link、再到laser_link的完整链路? - 话题的时间戳对不对?数据可能是实时发布的,但也可能是录制好的 rosbag,时间戳对不上,RVIZ 会拒绝进行坐标变换。
如果报错信息类似No transform from [laser_link] to [odom],说明缺失了某个坐标变换,先把这个链路的 TF 补上再说。这一步卡住的概率极高,但方向其实很单一,不要乱猜测。
5.3 性能调优:降采样、固定帧率与隐藏无用显示
RVIZ 用久了,尤其接了相机、点云、地图,会变得格外卡顿。我常用的几招,按收益排序:
- 降低显示频率:有人把
LaserScan、PointCloud2的Topic下加一个节流显示,或者降低 TF 刷新频率,肉眼几乎看不出差别,但帧率能显著回升。 - 减少显示项:做某一步调试时,只保留当前需要的显示插件。比如现在只调激光,就把
Map显示项临时禁用,别一直挂着。 - 点云降采样:在数据发布端做 voxel 降采样,发布端已经把 10 万个点变成 1 万个点,RVIZ 显示自然就流畅了。这是治本办法。
- 关闭渲染特效:
Display面板里有些插件带阴影、透明效果,能关就关。RVIZ 不是做摄影级渲染的,要好看,等调试完了再开。
性能调优的核心思路是:只显示你当前需要的数据,用最合适的显示粒度。把这几条做好了,即使是在虚拟机上跑 RVIZ,也能保持基本流畅。
6. RVIZ打不开/闪退/黑屏的完整排查链路
6.1 先确认错误信息出现在哪一层
在终端里启动 RVIZ:
rosrun rviz rviz如果有窗口弹出,但马上消失,先别急着搜“rviz打不开”。你应该做的是:仔细阅读终端输出。RVIZ 的所有错误,几乎都会在终端里留下痕迹。
常见的错误分层大概是这样的:
- 环境层:找不到
rviz命令,提示command not found。大概率是 ROS 环境没有 source,或者安装不完整。 - 依赖层:提示缺少某个
.so动态库,或者 Qt 相关报错。一般是 ROS 包安装不完整,重装对应依赖即可。 - 渲染层:提示
Could not initialize OpenGL、GLXBadFBConfig、Segmentation fault。问题基本出在显卡驱动或者虚拟机/远程显示环境。 - 数据层:窗口能打开,但总是空白、没有数据。这反而是最容易解决的,回看第 4 节,把 Topic 对应上就行。
记住这个分层思路,你排查时就知道该往哪个方向使劲,而不是对着整个系统瞎试。
6.2 RVIZ启动即退出的图形与驱动原因
RVIZ 依赖 OpenGL 做 3D 渲染。如果你的系统没有显卡驱动,或者显卡驱动版本不对,最常见的表现就是窗口一闪而过,终端里出现Segmentation fault (core dumped)。
先把显卡问题排除掉。我建议的顺序是:
- 查看显卡型号:
lspci | grep -i vga- 如果是 NVIDIA 显卡,确保驱动正常:
nvidia-smi如果找不到这个命令,说明 NVIDIA 驱动没装好。在 Ubuntu 上可以用额外的驱动仓库安装,装完重启再试。
- 如果是双显卡笔记本,一些机器上默认走核显,反而更适合 RVIZ,可以先在 BIOS 或驱动设置里指定用集显跑桌面环境。
这一步要承认:显卡驱动是 RVIZ 打不开头号原因,但并不是每个系统都要换驱动。我见过不少人在虚拟机里把显卡配置折腾半天,最后发现问题是 VMware 默认没有开启 3D 加速,白白浪费了几个小时。
6.3 虚拟机/双系统环境下的软件渲染方案
如果你是在虚拟机里跑 Ubuntu,发现 RVIZ 怎么都打不开,先别急着卸载。大多数虚拟机默认没有把 GPU 直通给虚拟机系统,OpenGL 渲染支持很弱。此时最简单的方案是强制 RVIZ 使用软件渲染:
export LIBGL_ALWAYS_SOFTWARE=1 rosrun rviz rviz另外,在 VMware 里还可以装增强工具:
sudo apt install -y open-vm-tools-desktop装完重启虚拟机,再用上面的命令启动。软件渲染的性能肯定比硬件渲染差,画面放大缩小会略卡,但至少能跑起来,学会 RVIZ 的操作逻辑是没问题的。
如果你用的是 WSL,而且系统比较旧,没有 WSLg 支持,RVIZ 的 3D 渲染会非常受限。这种环境下我的建议很直接:别在 WSL 里死磕 3D 图形,直接上双系统。双系统虽然切来切去麻烦,但至少图形栈是完整的,调试效率高得多。真要用 WSL,优先升级到 Windows 11,开 WSLg 之后 RVIZ 的可用性会好很多。
6.4 几个“玄学”但真实有用的小技巧
以下小技巧看起来莫名其妙,但都是我实际排查中验证过有效,却很少写进官方文档的:
- 删掉
~/.rviz目录。这个目录保存着 RVIZ 的默认配置和插件缓存。有时候配置损坏会导致 RVIZ 启动就崩,删掉它,RVIZ 会恢复默认配置。注意这只是可视化配置,不会动你的数据。
rm -rf ~/.rviz- 重新安装依赖。如果终端里有 Qt 相关报错,试着重装 ROS 的桌面依赖包,把缺的库补回来。
sudo apt install --reinstall ros-noetic-desktop-full- 降低分辨率跑。有的服务器远程桌面环境下,RVIZ 默认分辨率太高,渲染压力直接爆表,把着色和分辨率调低一点就能稳定运行。
- 用
-d参数指定一个简单配置启动。默认配置偶尔会加载过多插件导致崩溃,不如先加载一个只有 Grid 的配置,再逐步添加显示项。
这几招单独看都不起眼,但组合起来能解决 90% 以上的rviz打不开问题。
我把 RVIZ 当成 ROS 开发的“仪表盘”之后,很多排查工作都从“看代码”变成了“看画面”。传感器数据对不对、坐标变换通不通、路径规划好不好,画面上一眼就能判断出来。如果你正在学 ROS,我非常建议把 RVIZ 作为你打开系统后第一个启动的工具,甚至只是开着它观察一个空场景,也能帮你逐渐理解“话题、坐标、显示”这三者之间是怎么咬合的。等哪天你不用看教程也能随手拉出几套显示方案,说明你基本已经跨过 ROS 可视化这道门槛了。