1. 机器人项目的基本构成模块

通过以前章节的学习,我们知道了一个机器人项目,大概需要很多模块,我们用一张图来清晰的描述这些所需的模块。
在这里插入图片描述

2. 什么是RViz?

RViz(ROS Visualization) 是 ROS/ROS 2 提供的一个可视化工具,用于可视化机器人状态、传感器数据、环境信息和机器人的运动轨迹等。RViz 在机器人开发中非常重要,作用主要包括:

  • 1. 可视化传感器数据
    - 激光雷达(LiDAR)的点云
    - 摄像头图像、深度图
    - IMU、GPS 等传感器数据
  • 2. 可视化机器人状态和模型
    - URDF/Xacro 机器人模型
    - 机器人的关节状态(joint state)
    - 机器人当前位姿(pose)
  • 3. 路径和规划可视化
    - 导航路径、轨迹
    - 动作规划(MoveIt2 规划轨迹)
  • 4. 调试和开发
    - 可以查看 topic 数据,帮助验证传感器数据是否正确
    - 可用于调试机器人算法、SLAM、导航、避障等模块

2.1 Rviz 启动 & 使用

$ source /opt/ros/humble/setup.bash
$ ros2 run rviz2 rviz2
# 指定配置文件
$ ros2 run rviz2 rviz2 -- -d ~/ros2_ws/src/my_robot/rviz/my_robot_view.rviz
# 或者
$ rviz2 -d ~/ros2_ws/src/my_robot/rviz/my_robot_view.rviz

当 RViz 第一次启动时,你会看到这个窗口:
在这里插入图片描述
中间的大黑窗口是 3D 视图(目前为空,因为没有可显示的内容)。左侧是 Displays 列表,会显示你加载的所有 Display。目前它只包含 全局选项 和一个 Grid 网格,稍后我们会讲到。右侧是其他一些面板,下面会详细说明。

根据前面章节的描述,我们使用Rviz 可以直接显示出URDF 中描述的机器人模型,其原理如下:

  • RViz 订阅 /robot_description topic 或读取机器人模型参数
  • 然后根据 URDF 渲染 3D 模型

然而,URDF 只描述机器人模型本身, 也就是说你只能在Rviz 中看到机器人基础模型,不能看到机器人在ROS 2 中的数据,例如:

  • 激光雷达扫描(LaserScan)
  • 点云数据(PointCloud2)
  • 机器人路径轨迹(Path)
  • 坐标系(TF)

又根据上面描述的Rviz 的一个主要功能是 可视化传感器数据。看来,我们之前了解的Rviz, 只是显示了它的模型,并没有关注其数据显示的部分。那么, 到底如何显示ROS 2 中的数据呢? 那就是Display

3. 什么是Displays


在 RViz 中,Display 是一种可视化模块或组件,它负责在 3D 窗口中ROS 2 世界中的数据“画出来”

  • 每个 Display 对应 一种数据类型 或 一种可视化方式。
  • 它会订阅 ROS 2 的 topic 或读取机器人状态,并将数据转换为图形显示。
  • RViz 支持多种 Display,可以同时显示多个不同的数据。

3.1 Display 的工作原理


  • 1. 订阅数据
    • Display 会订阅 ROS 2 topic(如 /scan、/tf、/camera/image_raw 等)。
    • 根据消息类型,它知道如何解析数据。
  • 2. 渲染内容
    • 将数据绘制在 3D 窗口中。
    • 比如:
      • LaserScan Display → 把激光雷达扫描点画出来
      • PointCloud2 Display → 把点云数据渲染为 3D 点
      • RobotModel Display → 根据 URDF 画出机器人模型
  • 3. 提供可配置选项
    • 每个 Display 都可以调整显示效果:
      • 颜色、大小、透明度
      • 数据更新频率
      • 坐标系选择
    • 这些选项都在 Displays 列表中可见并可编辑。

3.2 Display 的类型举例


Display 类型 数据来源 (订阅topic) 可视化内容 用途
RobotModel /robot_description + /joint_states 机器人模型 验证 URDF、关节动作
LaserScan /scan 激光雷达扫描点 查看障碍物、调试雷达
PointCloud2 /velodyne_points 点云数据 3D 环境建模
Path /planned_path 路径轨迹 导航或运动规划可视化
TF /tf 坐标系关系 检查机器人坐标系是否正确

3.3 添加一个新的Display

要添加一个 Display,请点击底部的 Add 按钮:
在这里插入图片描述
这会弹出 新建 Display 对话框:
在这里插入图片描述
顶部的列表显示 Display 类型。类型说明了该 Display 将可视化哪种数据。中间的文本框提供所选 Display 类型的描述。最后,你必须为 Display 设置一个 唯一名称。例如,如果你的机器人上有两个激光雷达,你可以创建两个 Laser Scan Display,分别命名为 “Laser Base” 和 “Laser Head”。

3.3.1 Display 属性

每个 Display 都有自己的一组属性列表。例如:
在这里插入图片描述

3.3.2 Display 状态

每个 Display 都有自己的状态,用来帮助你判断它当前是否正常工作。
状态可能是以下几种之一:OK(正常)、Warning(警告)、Error(错误) 或 Disabled(禁用)。
Display 的状态会通过 标题栏的背景颜色 来表示,同时在你展开该 Display 时,也可以在 Status(状态) 分类下看到详细信息。
在这里插入图片描述
“Status(状态)”分类还可以展开,以显示更具体的状态信息。
这些信息会因不同的 Display 而有所不同,通常从提示内容本身就能理解其含义。

3.3.3 配置

不同的 Display 配置在可视化工具的不同使用场景中往往会非常有用。
例如,适用于完整 PR2 机器人的配置,不一定适合用于测试小车。
因此,RViz 可视化工具允许你 加载和保存不同的配置,以便根据需要切换使用。
一个配置包含以下内容:

  • Displays 及其属性
  • 工具(Tool)的属性
  • 3D 可视化的视角和相关设置

3.3.4 视图面板(Views Panel)

在 RViz(可视化工具)里,你可以用 不同的方式来观察 3D 场景,就像换不同的“摄像机”来看机器人和环境。
在这里插入图片描述
具体来说,RViz Views 提供了多种摄像头视角,来供你选用。

  • 控制方式不同
    • 有的摄像机让你环绕目标旋转查看(Orbit)
    • 有的摄像机像第一人称视角一样,可以自由前后左右移动(FPS)
    • 有的摄像机固定在上方俯视(Top-down)
  • 投影方式不同
    • 透视投影(Perspective):远的物体看起来小,近的物体看起来大,像我们平时用眼睛看到的效果
    • 正交投影(Orthographic):远近不影响大小,物体尺寸固定,常用于工程图或精确测量
环绕摄像机(Orbital Camera,默认)

环绕摄像机会围绕一个焦点旋转,同时始终注视该焦点。当你移动摄像机时(3D界面),焦点会以一个小圆盘的形式显示出来。
在这里插入图片描述
操作方式:

  • 左键:点击并拖动以围绕焦点旋转视角。
  • 中键:点击并拖动以在摄像机的上向量和右向量所在的平面内移动焦点。移动的距离取决于焦点的位置——如果焦点上有物体,并且你点击在物体上,它会保持在鼠标下方。
  • 右键:点击并拖动以对焦点进行放大或缩小。向上拖动放大,向下拖动缩小。
  • 滚轮:对焦点进行放大或缩小。
第一人称(FPS, First-Person)摄像机

FPS 摄像机是一种第一人称视角的摄像机,它的旋转方式就像你用头在观察环境一样。
操作方式:

  • 左键:点击并拖动以旋转视角。按住 Ctrl 再点击可以选择鼠标下的物体并直接注视它。
  • 中键:点击并拖动以在摄像机的上向量和右向量所在的平面内移动。
  • 右键:点击并拖动沿摄像机的前向向量移动。向上拖动向前移动,向下拖动向后移动。
  • 滚轮:沿前向向量前后移动。
俯视正交摄像机(Top-down Orthographic)

俯视正交摄像机会始终沿 Z 轴(机器人坐标系中)向下观察,并使用正交投影,这意味着物体不会随着距离变远而变小。
操作方式:

  • 左键:点击并拖动绕 Z 轴旋转。
  • 中键:点击并拖动沿 XY 平面移动摄像机。
  • 右键:点击并拖动缩放视图。
  • 滚轮:缩放视图。
XY 环绕摄像机(XY Orbit)

与环绕摄像机相同,但焦点被限制在 XY 平面内。
操作方式:

  • 参考 环绕摄像机(Orbital Camera) 的操作方式。
第三人称跟随摄像机(Third Person Follower)

该摄像机会始终保持对目标坐标系的固定观察角度。与 XY 环绕摄像机不同,当目标坐标系偏航(旋转)时,摄像机会随之转动。例如,如果你在对带有拐角的走廊进行 3D 建图,这种摄像机模式会非常有用。

操作方式:

  • 参考 环绕摄像机(Orbital Camera) 的操作方式。
自定义视图(Custom Views)

视图面板还允许你创建不同的命名视图,这些视图可以保存并在它们之间切换。
一个视图包含以下内容:

  • 目标坐标系(target frame)
  • 摄像机类型(camera type)
  • 摄像机姿态(camera pose)
    你可以通过点击视图面板的 保存(Save) 按钮来保存当前视图。
    在这里插入图片描述
    一个视图包含以下内容:
  • 视图控制器类型(View controller type)
  • 视图配置(View configuration):包括位置、朝向等;不同的视图控制器类型可能有不同的配置项
  • 目标坐标系(Target Frame)

视图是按用户保存的,不会保存在配置文件中。

3.3.5 坐标系(Coordinate Frames)

RViz 使用 tf 变换系统,将数据从它所在的坐标系转换到全局参考坐标系。在可视化中,有两个重要的坐标系需要了解:目标坐标系(Target Frame)固定坐标系(Fixed Frame)

固定坐标系(The Fixed Frame)

这两个坐标系中更重要的是固定坐标系。

  • 固定坐标系是用于表示世界坐标的参考系。
  • 通常是 mapworld 或类似的全局坐标系,也可以是例如你的里程计坐标系(odometry frame)。

❗ 注意:

  • 如果固定坐标系错误地设置为机器人底座(base),那么机器人曾经看到的所有物体都会显示在机器人前方,并以被检测时相对于机器人的位置显示。
  • 为了得到正确的结果,固定坐标系 不应随世界移动
  • 如果你更改固定坐标系,当前显示的所有数据会被清空,而不是重新变换。
目标坐标系(The Target Frame)

目标坐标系是摄像机视角的参考坐标系。

  • 例如,如果目标坐标系是 map,你会看到机器人在地图上移动。
  • 如果目标坐标系是机器人的底座(base),机器人会保持在屏幕中央,而其他所有物体相对于它移动。

3.3.6 工具(Tools)

RViz 可视化工具栏中提供了多种工具可供使用。下面的章节将对这些工具进行简要介绍。
你也可以通过菜单 Help → Show Help panel 获取更多信息。
在这里插入图片描述
交互工具(Interact)
该工具允许你与可视化环境进行交互。
你可以点击对象,根据对象属性进行选择、移动等操作。

  • 快捷键i

移动摄像机(Move Camera)
移动摄像机工具是默认工具。
当选择该工具并在 3D 视图中点击时,视角会根据你在 Views 面板 中选择的摄像机类型和选项进行变化。

  • 快捷键m
  • 详细信息请参考前面 Views Panel 章节。

选择工具(Select)
选择工具允许你选中 3D 视图中显示的项目。

  • 支持 单点选择框选(点击并拖动)
  • 按住 Shift 可以增加选中项
  • 按住 Ctrl 可以从选中项中移除
  • 若在选择时想移动摄像机而不切回 Move Camera 工具,可按住 Alt
  • f 键可以将摄像机焦点对准当前选中的对象
    在这里插入图片描述
    在这里插入图片描述
    选择工具快捷键s

聚焦摄像机(Focus Camera)
聚焦摄像机工具允许你在可视化界面中选择一个位置。
摄像机会旋转以注视该点,但不会改变自身的位置。

  • 快捷键c

测量工具(Measure)
使用测量工具可以测量可视化界面中两点之间的距离。

  • 激活工具后,第一次点击设置起点,第二次点击设置终点。
  • 测量结果会显示在 RViz 窗口底部。
  • 注意:测量工具只对实际渲染的对象有效,不能在空白区域使用。
    在这里插入图片描述
    快捷键n

二维位姿估计(2D Pose Estimate)
该工具允许你为定位系统设置初始位姿(会发布到 initialpose ROS 话题)。

  • 使用方法:在地面平面上点击一个位置,并拖动以选择朝向。
  • 输出话题可以在 Tool Properties(工具属性) 面板中修改。
    在这里插入图片描述
    该工具适用于 导航栈(navigation stack)
    快捷键p

2D Nav Goal(二维导航目标)

  • 该工具允许你设置一个目标位姿,会发布到 goal_pose ROS 话题。
  • 使用方法:在地面平面上点击目标位置,并拖动以选择朝向。
  • 输出话题可以在 Tool Properties(工具属性) 面板中修改。
  • 该工具适用于 导航栈(navigation stack)
  • 快捷键g

Publish Point(发布点)

  • 该工具允许你在可视化界面中选择一个对象,工具会根据所在坐标系发布该点的坐标。
  • 测量结果会显示在 RViz 窗口底部(类似测量工具),同时发布到 clicked_point 话题。
  • 快捷键u

时间面板(Time)

  • 时间面板主要在 仿真环境 中有用,它可以显示 ROS 时间 已经过了多久,以及 实际时间(Wall Clock,即真实时间) 已经过了多久。
  • 时间面板还可以 重置可视化工具的内部时间状态,这会重置所有 Display 的显示以及 tf 的内部数据缓存。
    在这里插入图片描述
    如果不在仿真环境中运行,时间面板作用不大。大多数情况下可以关闭,不会影响 RViz 的其他功能,同时还能腾出更多屏幕空间。

4. 应用实例

如何把自己写的 URDF 模型在 RViz 中显示,并且让它能 关联对应的传感器/关节数据?这样机器人模型就能动起来或者显示传感器信息。我们可以分步骤来看:

4.1 在 RViz 中显示机器人模型

  1. 打开 RViz:
ros2 run rviz2 rviz2
  1. 添加 RobotModel Display:
    • 点击左下角 AddBy display type → 选择 RobotModel → 点击 OK
  2. 配置 RobotModel 的数据来源:
    • Description Source:选择 /robot_description

      • 这个 topic 通常在启动 URDF 的 launch 文件里由 robot_state_publisher 发布:
      ros2 run robot_state_publisher robot_state_publisher my_robot.urdf
      

4.2 让机器人关节可动(绑定关节状态数据)

  • RobotModel 显示机器人的静态结构,如果想让关节动,需要 关节状态数据
    1. 确保节点发布 /joint_states 消息:

      sensor_msgs/msg/JointState
      
      • 包含关节名称、位置、速度、力矩等。
      • 如果你有仿真环境或实际机器人,可以通过 joint_state_publisher 发布:
      ros2 run joint_state_publisher joint_state_publisher
      
    2. RobotModel Display 中,选择 Joint States Topic/joint_states

    3. 此时,URDF 模型就会根据关节状态动态移动。

4.3 关联传感器数据(如激光雷达、相机、点云)

  • LaserScan
    • Add → LaserScan → 设置 Topic 为 /scan
  • PointCloud2
    • Add → PointCloud2 → 设置 Topic 为 /velodyne_points
  • Camera
    • Add → Camera → 设置 Topic 为 /camera/image_raw
  • TF
    • Add → TF → 用于显示坐标系和连杆

⚠️ 关键点:你的 URDF 上面传感器的位置必须在 URDF 链路里定义好,且 robot_state_publisher 发布的 TF 正确。Display 会根据 TF 来定位传感器。

Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐