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
命令行参数¶
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 文件:
包含以下显示: - Grid(XY 平面,10m × 10m) - RobotModel(alpha=0.5,可透视) - TF(坐标系轴 + 名称) - LaserScan(红色,0.05m 点) - Camera image 面板
使用方式:
保存修改:
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 |
显示/隐藏网格 |