跳转至

RViz2 可视化 — ROS 2 机器人3D可视化教程

RViz2(Robot Visualizer)是 ROS 2 官方的 3D 可视化工具。 本教程覆盖 RViz2 界面配置、针对各机器人类型的显示面板、以及调试和演示技巧。

学习目标

  • 理解 RViz2 面板架构和各类 Display
  • 配置移动机器人、机械臂、无人机的 RViz 界面
  • 使用课程提供的预置 .rviz 配置文件
  • 添加自定义显示:TF 树、传感器数据、相机图像、导航叠加
  • 通过可视化手段诊断机器人状态问题

1. RViz2 架构

RViz2 是一个 ROS 2 节点,订阅 topics 并将数据渲染到 3D 视图中。 它不运行物理仿真,只负责可视化数据。

┌──────────────────────────────────────────┐
│           RViz2 主窗口                   │
│                                          │
│  ┌────────────────────────────────────┐  │
│  │                                    │  │
│  │        3D 视口                      │  │
│  │   (机器人、传感器、路径)            │  │
│  │                                    │  │
│  └────────────────────────────────────┘  │
│                                          │
│  ┌─────────┐ ┌────────────┐ ┌────────┐  │
│  │ Displays│ │ Toolbars   │ │ Views  │  │
│  └─────────┘ └────────────┘ └────────┘  │
│                                          │
│  ┌────────────────────────────────────┐  │
│  │      属性面板                        │  │
│  │  (Topic、颜色、样式、大小)           │  │
│  └────────────────────────────────────┘  │
└──────────────────────────────────────────┘

按类别分类的关键 Display

类别 Display Topic 用途
机器人 RobotModel /robot_description 从 URDF 加载3D模型
机器人 TF /tf 坐标变换树
传感器 LaserScan /scan 2D激光雷达点云
传感器 PointCloud2 /depth/points 3D点云
传感器 Image /camera/color/image_raw 相机画面
传感器 Camera /camera/color/camera_info 相机覆盖层
传感器 IMU /imu/data 姿态箭头
导航 Map /map 占据栅格地图
导航 Path /plan 规划路径
导航 Pose /goal_pose 目标位姿
控制 Marker /visualization_marker 调试标记

2. 启动 RViz2

从 Docker 容器内启动

# 方式 1: 使用预置配置文件(推荐)
rviz2 -d $(find robot_description)/config/robot.rviz

# 方式 2: 空白 RViz(手动配置)
rviz2

# 方式 3: 指定配置文件
rviz2 -d /path/to/config.rviz

命令行参数

rviz2 [OPTIONS]
  -d <file>    从文件加载显示配置
  -f <frame>   设置固定坐标系
  -s           使用零初始位姿(无相机动画)
  -h           显示帮助

3. 核心 Display 配置

3.1 RobotModel — 机器人3D模型

从 URDF 显示机器人几何形状。

Display Name:    RobotModel
Topic:           /robot_description (Parameter)
Alpha:           1.0 (不透明)
Description Source: Parameter
TF Prefix:       (留空)

Alpha < 1 用于透过机器人身体观察传感器。

3.2 TF — 坐标变换树

显示坐标系层级关系,是理解机器人机构的核心工具。

Display Name:    TF
Enabled:         true
Marker Scale:    0.3 m (坐标轴长度)
Show Axes:       true
Show Names:      true
Update Interval: 0 (尽可能快)

调试技巧

如果 TF 树断裂(缺少坐标系),检查: 1. ros2 node list — robot_state_publisher 是否在运行? 2. ros2 topic list | grep tf — TF 消息是否到达? 3. ros2 run rqt_tf_tree rqt_tf_tree — 可视化 TF 树

3.3 LaserScan — 激光雷达

2D 激光雷达数据,显示为水平面上的点。

Display Name:    LaserScan
Topic:           /scan
Color Transformer: Intensity  (按反射率着色)
Queue Size:      10
Style:           Points  (或 Flat Squares)
Size (m):        0.05   (视觉大小,非物理分辨率)
Position Transformer: XYZ

着色模式说明: - Flat Color: 所有点单一颜色 - Intensity: 灰度值基于回波强度(反射率) - AxisColor: 按距离传感器远近着色

3.4 Image — 相机画面

RGB 或深度相机画面,显示为浮动2D面板或3D平面叠加。

Display Name:    Image
Topic:           /depth_camera/color/image_raw
Transport Hint:  raw  (或 compressed, theora)

# 深度图像:
Topic:           /depth_camera/depth/image_raw

Image vs Camera 显示

Image 适合浮动2D面板。 Camera 用于3D平面叠加(需要 CameraInfo)。


4. 各机器人类型的可视化配置

4.1 移动机器人 — SLAM 与导航

移动机器人使用激光扫描 + 里程计 + IMU。配置 RViz 用于地图构建:

1. RobotModel → /robot_description
2. TF → 全部坐标系可见
3. LaserScan → /scan (红色点云, 0.05m大小)
4. Map → /map (占据栅格地图, alpha 0.7)
5. Path → /plan (Nav2规划路径, 蓝色)
6. Pose → /goal_pose (导航目标, 绿色箭头)
7. Odometry → /diff_drive/odometry (里程计箭头)

关键交互: - 2D Pose Estimate 工具:点击地图设置机器人初始位姿(用于 AMCL) - 2D Nav Goal 工具:点击地图设置导航目标 - 滚轮:缩放 - 中键 + 拖动:平移 - 右键 + 拖动:旋转视角

4.2 机械臂 — MoveIt2

机械臂使用关节状态 + TF 做正/逆运动学可视化:

1. RobotModel → /robot_description
2. TF → 关节坐标系可见
3. MotionPlanning (插件) → InteractiveMarkers 控制机械臂
4. JointStates → /joint_states (轨迹回放)
5. Trajectory → /display_planned_path (规划轨迹)
6. Path → /execute_trajectory (执行轨迹,不同颜色)

关键交互: - 在 MotionPlanning 插件中:拖动末端执行器设定目标位姿 - 绿色 = 规划路径,橙色 = 执行路径 - 轨迹回放速度可在属性面板调节

4.3 无人机 — Gazebo + 相机

无人机需要高度感知和相机画面:

1. RobotModel → /robot_description
2. TF → 包含 IMU 朝向的 base_link
3. Image → /depth_camera/color/image_raw
4. Image → /depth_camera/depth/image_raw (伪彩色)
5. Pose → /drone/pose (mavros 或真值)
6. Path → /trajectory (飞行计划轨迹)

4.4 视觉导航 — VSLAM

视觉 SLAM 关键帧 + 地图 + 轨迹:

1. RobotModel → /robot_description
2. PointCloud2 → /vslam/map_points (SLAM 3D地图点)
3. PoseArray → /vslam/keyframes (相机位姿)
4. Path → /vslam/trajectory (估计轨迹)
5. Image → /depth_camera/color/image_raw
6. Marker → /vslam/debug_markers (特征点调试)

5. 预置配置文件

课程提供了预配置的 RViz 文件:

$(find robot_description)/config/robot.rviz

包含以下显示: - Grid(XY 平面,10m × 10m) - RobotModel(alpha=0.5,可透视) - TF(坐标系轴 + 名称) - LaserScan(红色,0.05m 点) - Camera image 面板

使用方式:

rviz2 -d $(find robot_description)/config/robot.rviz

保存修改:

File → Save Config As → ~/ros2_ws/src/robot_description/robot_description/config/robot.rviz


6. 进阶:编程控制 RViz 显示

使用 rviz_visual_tools 可以编程控制 RViz 中的标记物:

#!/usr/bin/env python3
"""向 RViz 动态添加标记物和轨迹。"""
import rclpy
from rclpy.node import Node
from visualization_msgs.msg import Marker, MarkerArray
from geometry_msgs.msg import PoseStamped

class RvizVisualizer(Node):
    def __init__(self):
        super().__init__('rviz_visualizer')
        self.marker_pub = self.create_publisher(Marker, '/visualization_marker', 10)
        self.path_pub = self.create_publisher(PoseStamped, '/debug_path', 10)

    def add_sphere_marker(self, position, rgba=(1, 0, 0, 1), ns="debug"):
        """在指定位置添加球形标记。"""
        marker = Marker()
        marker.header.frame_id = "base_link"
        marker.type = Marker.SPHERE
        marker.action = Marker.ADD
        marker.pose.position.x = position[0]
        marker.pose.position.y = position[1]
        marker.pose.position.z = position[2]
        marker.scale.x = marker.scale.y = marker.scale.z = 0.05
        marker.color.r, marker.color.g, marker.color.b, marker.color.a = rgba
        marker.ns = ns
        self.marker_pub.publish(marker)

7. 常见调试模式

模式:机器人模型加载失败

1. 检查 /robot_description topic 是否存在:
   ros2 topic list | grep robot_description

2. 验证 URDF 是否有效:
   ros2 run robot_state_publisher robot_state_publisher

3. 检查 xacro 是否能生成 URDF:
   xacro $(find robot_description)/urdf/mobile_robot.urdf.xacro

模式:LaserScan 不显示

1. 确认 scan topic 存在:
   ros2 topic list | grep scan

2. 检查消息频率:
   ros2 topic hz /scan

3. 检查 RViz 中的 Fixed Frame:
   Fixed Frame 必须是 "world" 或 "odom"(不是 "base_link")

模式:导航中地图不显示

1. SLAM Toolbox 必须运行(不仅是 Nav2)
2. RViz 中的 Fixed Frame 必须是 "map"
3. 确认地图 topic:
   ros2 topic type /map
   # 应为 nav_msgs/OccupancyGrid

8. 快捷键

按键 动作
f 聚焦机器人(居中到选定坐标系)
s 显示/隐藏侧边栏
t 显示/隐藏工具属性
n 显示/隐藏所有面板
q 退出
r 重置视角
Space 重置所有视图
w 显示/隐藏网格

参考资料