前言
RViz 是 ROS 框架中常用的三维可视化工具,主要用于展示传感器数据、机器人模型、坐标变换、路径规划结果等信息。通过 RViz,开发者可以直观地观察系统运行状态,从而更高效地进行调试、验证与分析。
RVIz简介及使用
在启动 RViz 之前,加载 ROS2 的环境变量:
source /opt/ros/jazzy/setup.bash
然后启动 RViz:
ros2 run rviz2 rviz2
首次启动时,将看到如图 1 所示的界面(图中背景颜色已修改为白色,默认背景为黑色):

图 1: RViz界面
RViz 界面主要由以下几个部分组成:
- 中央区域:3D 视图显示区,用于显示机器人模型、传感器数据等(初始状态为空)。
- 左侧区域:显示列表(Displays 面板),用于管理和配置所有可视化显示项。
- 右侧区域:视图设置区域(Views 面板),用于配置当前相机视角。
添加显示
RViz 的核心概念是 显示项(Display)。每一种显示项对应一种数据类型的可视化方式,例如激光雷达、点云、图像、地图等。
1. 添加显示项
点击左下角的 Add 按钮:
弹出“添加显示项”窗口,如图 2 所示:

图 2: rviz2添加选项
窗口各区域说明如下:
- 顶部列表:所有可用的显示类型
- 中部区域:当前选中显示类型的功能说明
- 底部输入框:用于自定义显示名称,便于区分多个同类型显示项
2. 显示属性
每个显示项都有一组可配置属性,以 PointCloud2 显示项为例,其属性界面如图 3 所示:

图 3: PointCloud2数据属性
从属性面板中可以看到:
- 该显示项订阅的话题为
/pcd - 点的显示尺寸(Size)为
0.01 - 还可进一步配置颜色、样式、坐标系等参数
3. 显示状态
每个显示项都有对应的状态指示,用于反映当前数据是否正常:
-
OK:数据正常,显示无异常
-
Warning:存在警告,但仍可显示
-
Error:发生错误,通常是话题或坐标系问题
-
Disabled:该显示项被禁用
状态通过显示项标题颜色和图标进行区分,并可在属性面板中查看详细信息:

图 4: 数据的状态
在图 4 中,Image 显示项为红色,表示发生错误,原因是系统中未检测到 sensor_msgs/Image 类型的数据话题。
常用显示项类型
下表列出了 RViz 中常用的显示项及其对应的消息类型:
| 名称 | 描述 | 使用的消息类型 |
|---|---|---|
| 坐标轴(Axes) | 显示一组坐标轴 | 无 |
| 力矩(Effort) | 显示机器人每个旋转关节的力矩 | sensor_msgs/msg/JointStates |
| 相机(Camera) | 从相机视角创建一个新的渲染窗口,并在其上叠加图像 | sensor_msgs/msg/Image, sensor_msgs/msg/CameraInfo |
| 网格(Grid) | 在平面上显示 2D 或 3D 网格 | 无 |
| 网格单元(Grid Cells) | 绘制来自网格的单元格,通常是导航堆栈中的成本图中的障碍物 | nav_msgs/msg/GridCells |
| 图像(Image) | 创建一个新的图像渲染窗口。与相机显示不同,此显示不使用 CameraInfo | sensor_msgs/msg/Image |
| 交互式标记(InteractiveMarker) | 显示来自一个或多个交互式标记服务器的 3D 对象,并允许通过鼠标与它们交互 | visualization_msgs/msg/InteractiveMarker |
| 激光扫描(Laser Scan) | 显示激光扫描数据,提供不同的渲染模式、累积等选项 | sensor_msgs/msg/LaserScan |
| 地图(Map) | 在地面上显示地图 | nav_msgs/msg/OccupancyGrid |
| 标记(Markers) | 允许程序员通过主题显示任意原始形状 | visualization_msgs/msg/Marker, visualization_msgs/msg/MarkerArray |
| 路径(Path) | 显示来自导航堆栈的路径 | nav_msgs/msg/Path |
| 点(Point) | 以小球形式绘制点 | geometry_msgs/msg/PointStamped |
| 姿态(Pose) | 以箭头或坐标轴形式绘制姿态 | geometry_msgs/msg/PoseStamped |
| 姿态数组(Pose Array) | 绘制姿态数组中的每个姿态的箭头“云” | geometry_msgs/msg/PoseArray |
| 点云(2)(Point Cloud(2)) | 显示点云数据,提供不同的渲染模式、累积等选项 | sensor_msgs/msg/PointCloud, sensor_msgs/msg/PointCloud2 |
| 多边形(Polygon) | 绘制多边形的轮廓线 | geometry_msgs/msg/Polygon |
| 里程计(Odometry) | 累积随时间变化的里程计姿态 | nav_msgs/msg/Odometry |
| 距离(Range) | 显示来自超声波或红外距离传感器的范围测量的锥形 | sensor_msgs/msg/Range |
| 机器人模型(RobotModel) | 显示机器人在正确姿态下的视觉表示(由当前 TF 变换定义) | 无 |
| TF | 显示 tf2 变换层级 | 无 |
| 力(Wrench) | 以箭头(力)和箭头加圆圈(扭矩)形式绘制力 | geometry_msgs/msg/WrenchStamped |
| 速度(Twist) | 以箭头(线性)和箭头加圆圈(角速度)形式绘制速度 | geometry_msgs/msg/TwistStamped |
通过 TF 显示坐标系
RViz 使用 tf2 库进行坐标变换管理,其中两个概念尤为重要:
固定坐标系(Fixed Frame)
-
作为所有可视化数据的全局参考坐标系
-
通常设置为
map、odom或world -
不应随时间变化
-
设置错误将导致数据显示异常或错位
目标坐标系(Target Frame)
-
当前视角相对于该坐标系进行定位
-
可设置为
map、base_link、camera_link等
本节通过之前编写的 TF 示例程序,演示如何在 RViz 中加载并显示坐标系。
在前文中,我们构建了一个名为 tf2_broadcaster_py 的功能包,该功能包用于发布海龟的位姿信息。系统中包含:
-
一个固定的父坐标系
world -
一个动态变化的子坐标系
turtleX(如turtle1、turtle2)
首先运行启动文件:
cd ~/ros2_ws
source install/setup.bash
ros2 launch tf2_broadcaster_py turtle_tf2_demo_launch.py
随后在 RViz 中添加 TF 显示项,并将 Fixed Frame 设置为 world。此时可以看到 world 与 turtle1 坐标系。当海龟移动时,对应的坐标系也会随之实时更新,如图 15.5 所示。

图 5: 添加并显示TF坐标系
自动添加显示项类型
在实际工程中,RViz 往往需要加载多个显示项(如 TF、图像、机器人模型等)。如果每次都手动配置,会非常繁琐。RViz 提供了 配置文件(.rviz) 机制,用于自动加载显示项。
编写rviz的配置文件
首先,创建功能包
cd ~/ros2_ws/src
ros2 pkg create --build-type ament_python rviz2_test --dependencies rviz2 rclpy
在功能包中创建 rviz 目录,并在目录中创建一个名为 urdf.rviz 的文件,这里的文件名可以任意给,只需要前后对应即可。在文件中编写如下代码:
Panels:
- Class: rviz_common/Displays
Name: Displays
- Class: rviz_common/Views
Name: Views
Visualization Manager:
Displays:
- Class: rviz_default_plugins/Grid
Name: Grid
Value: true
- Class: rviz_default_plugins/Image
Name: Image
Enabled: true
Topic: /camera/image_raw
Transport Hint: raw
- Class: rviz_default_plugins/TF
Name: TF
Value: true
Global Options:
Fixed Frame: world
Background Color: 255; 255; 255 # 白色背景
Tools:
- Class: rviz_default_plugins/MoveCamera
Views:
Current:
Class: rviz_default_plugins/Orbit
Distance: 5.0
Name: Current View
Pitch: 0.785
Yaw: 1.57
Window Geometry:
Height: 800
Width: 1200
这段代码是一个 RViz 2 的配置文件内容,用 YAML 格式描述了 RViz 在启动时加载的插件、显示内容、窗口布局等。它主要完成了以下几件事:
1. 配置 RViz 面板(Panels)
Panels:
- Class: rviz_common/Displays
Name: Displays
- Class: rviz_common/Views
Name: Views
这部分设置了左侧 RViz 界面上的两个面板:
-
Displays 面板:显示和管理所有可视化插件(如 Grid、TF、Image)。
-
Views 面板:用于控制视角,比如 Orbit、TopDownOrtho 等。
2. 配置 Visualization Manager
在 Visualization Manager 中首先对 Displays 面板进行设置:
- Class: rviz_default_plugins/Grid
Name: Grid
Value: true
添加了 Grid 网格,用于可视化地面或坐标系平面。
- Class: rviz_default_plugins/Image
Name: Image
Enabled: true
Topic: /camera/image_raw
Transport Hint: raw
添加了一个 图像显示器,从话题 /camera/image_raw 接收图像,并以原始(raw)方式显示图像(无压缩/转换)
- Class: rviz_default_plugins/TF
Name: TF
Value: true
启用了 TF 坐标变换可视化,可以显示不同坐标系的变换关系(如 base_link → camera_link)。
在设置完了 Displays 面板后,又对 Tools 进行了设置,
Global Options:
Fixed Frame: world
Background Color: 255; 255; 255 # 白色背景
- 设置 RViz 的 固定坐标系为
world,这是所有显示数据转换的参考系。如果 TF 中没有名为world的坐标系,会导致无法正常显示坐标变换数据. - 设置3D显示区域的背景为白色
在设置完了 Global Options 后,又对 Tools 进行了设置,
Tools:
- Class: rviz_default_plugins/MoveCamera
添加了一个相机移动工具,可在场景中自由旋转/平移视角。
最后,在 Visualization Manager 中对 views 进行了设置,
Views:
Current:
Class: rviz_default_plugins/Orbit
Distance: 5.0
Name: Current View
Pitch: 0.785
Yaw: 1.57
设置当前视角为 Orbit(环绕视角),并设置:
- 距离(Distance) 5 米
- 俯仰角(Pitch) ≈ 45°
- 偏航角(Yaw) ≈ 90°
3. 设置窗口大小
Window Geometry:
Height: 800
Width: 1200
启动 RViz 时窗口大小为 1200×800 像素。
编写并配置 launch 启动文件
在功能包中创建一个 launch 目录,并在该目录中创建一个名为 display.launch.py 的启动文件,通过 display.launch.py,可以在启动 RViz 的同时加载 .rviz 配置文件,并联合启动其他功能包(如 TF 发布节点),文件内容如下:
from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription, DeclareLaunchArgument
from launch.substitutions import LaunchConfiguration, PathJoinSubstitution
from launch_ros.substitutions import FindPackageShare
from launch_ros.actions import Node
from launch.launch_description_sources import PythonLaunchDescriptionSource
def generate_launch_description():
rviz_config_file = 'rviz/urdf.rviz'
return LaunchDescription([
DeclareLaunchArgument(
name='rvizconfig',
default_value=PathJoinSubstitution([FindPackageShare('rviz2_test'), rviz_config_file]),
description='RViz config file'
),
# 启动 urdf_launch 提供的 display.launch.py
Node(
package='rviz2',
executable='rviz2',
name='rviz2',
arguments=['-d', LaunchConfiguration('rvizconfig')],
output='screen'
),
IncludeLaunchDescription(
PathJoinSubstitution([
FindPackageShare('tf2_broadcaster_py'),
'launch',
'turtle_tf2_demo_launch.py'
])
),
])
该 launch 文件自动启动 RViz2,并加载了指定的 RViz 配置文件(.rviz)。为了可以运行该launch文件,需要对 setup.py 进行配置,配置内容如下:
在文件顶部添加适当的模块
import os
from glob import glob
在data_files字段添加如下代码:
data_files=[
...
(os.path.join('share', package_name, 'launch'), glob(os.path.join('launch', '*launch.[pxy][yma]*'))),
(os.path.join('share', package_name, 'rviz'), glob(os.path.join('rviz', '*.*'))),
],
构建并运行功能包
在工作空间的根目录,构建功能包:
colcon build --packages-select rviz2_test
打开一个新的终端,导航到工作空间的根目录,并加载设置文件:
source install/setup.bash
现在运行启动文件,启动rviz2节点并加载urdf.rviz文件的配置,同时打开 tf2_broadcaster_py 功能包中的 lauch 文件:
ros2 launch rviz2_test display.launch.py
运行后,RViz 将自动加载 Grid、Image、TF 等显示项,并使用白色背景,如图 6 所示。

图 6: 自动加载RViz
本章小结
本章系统介绍了 RViz 的基本概念、常用显示项及其配置方法,并通过示例演示了如何使用配置文件和 Launch 文件实现 RViz 的自动化启动。
RViz 是 ROS 开发过程中不可或缺的调试工具,熟练掌握其使用方法,将显著提升系统调试效率和工程开发体验。