跳到主要内容

前言

RViz 是 ROS 框架中常用的三维可视化工具,主要用于展示传感器数据、机器人模型、坐标变换、路径规划结果等信息。通过 RViz,开发者可以直观地观察系统运行状态,从而更高效地进行调试、验证与分析。

RVIz简介及使用

在启动 RViz 之前,加载 ROS2 的环境变量:

source /opt/ros/jazzy/setup.bash

然后启动 RViz:

ros2 run rviz2 rviz2

首次启动时,将看到如图 1 所示的界面(图中背景颜色已修改为白色,默认背景为黑色):

Rviz2菜单

图 1: RViz界面

RViz 界面主要由以下几个部分组成:

  • 中央区域:3D 视图显示区,用于显示机器人模型、传感器数据等(初始状态为空)。
  • 左侧区域:显示列表(Displays 面板),用于管理和配置所有可视化显示项。
  • 右侧区域:视图设置区域(Views 面板),用于配置当前相机视角。

添加显示

RViz 的核心概念是 显示项(Display)。每一种显示项对应一种数据类型的可视化方式,例如激光雷达、点云、图像、地图等。

1. 添加显示项

点击左下角的 Add 按钮:

弹出“添加显示项”窗口,如图 2 所示:

rviz2添加选项

图 2: rviz2添加选项

窗口各区域说明如下:

  • 顶部列表:所有可用的显示类型
  • 中部区域:当前选中显示类型的功能说明
  • 底部输入框:用于自定义显示名称,便于区分多个同类型显示项

2. 显示属性

每个显示项都有一组可配置属性,以 PointCloud2 显示项为例,其属性界面如图 3 所示:

rviz2添加选项

图 3: PointCloud2数据属性

从属性面板中可以看到:

  • 该显示项订阅的话题为 /pcd
  • 点的显示尺寸(Size)为 0.01
  • 还可进一步配置颜色、样式、坐标系等参数

3. 显示状态

每个显示项都有对应的状态指示,用于反映当前数据是否正常:

  • OK:数据正常,显示无异常

  • Warning:存在警告,但仍可显示

  • Error:发生错误,通常是话题或坐标系问题

  • Disabled:该显示项被禁用

状态通过显示项标题颜色和图标进行区分,并可在属性面板中查看详细信息:

rviz2添加选项

图 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)创建一个新的图像渲染窗口。与相机显示不同,此显示不使用 CameraInfosensor_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)

  • 作为所有可视化数据的全局参考坐标系

  • 通常设置为 mapodomworld

  • 不应随时间变化

  • 设置错误将导致数据显示异常或错位

目标坐标系(Target Frame)

  • 当前视角相对于该坐标系进行定位

  • 可设置为 mapbase_linkcamera_link

本节通过之前编写的 TF 示例程序,演示如何在 RViz 中加载并显示坐标系。

在前文中,我们构建了一个名为 tf2_broadcaster_py 的功能包,该功能包用于发布海龟的位姿信息。系统中包含:

  • 一个固定的父坐标系 world

  • 一个动态变化的子坐标系 turtleX(如 turtle1turtle2

首先运行启动文件:

cd ~/ros2_ws
source install/setup.bash
ros2 launch tf2_broadcaster_py turtle_tf2_demo_launch.py

随后在 RViz 中添加 TF 显示项,并将 Fixed Frame 设置为 world。此时可以看到 worldturtle1 坐标系。当海龟移动时,对应的坐标系也会随之实时更新,如图 15.5 所示。

Rviz2菜单

图 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 所示。

rviz2添加选项

图 6: 自动加载RViz

本章小结

本章系统介绍了 RViz 的基本概念、常用显示项及其配置方法,并通过示例演示了如何使用配置文件和 Launch 文件实现 RViz 的自动化启动。

RViz 是 ROS 开发过程中不可或缺的调试工具,熟练掌握其使用方法,将显著提升系统调试效率和工程开发体验。