Skip to content

ROS 2 互操作

rrbot 是一个带有旋转关节的双连杆机械臂,本教程以它为例,演示 ROS 2 与 Gazebo Sim 的互操作。

本教程利用 ROS 2 的通信和控制机制与机器人交互。Gazebo 作为仿真环境,为 rrbot 机械臂提供物理仿真和可视化。机器人模型使用 SDFormat(Simulation Description Format,仿真描述格式)描述,定义了机器人的结构、关节、连杆及其属性。Gazebo 的物理引擎负责仿真机器人的动力学,而 ROS 2 的可视化工具 RViz 则基于控制节点发布的数据来显示机器人模型及其运动,两者共用同一个机器人描述文件。可以通过 ROS 2 命令与 rrbot 交互,移动机械臂或获取关节状态信息。

  1. 要继续本教程,需要安装好可用的 ROS 2 和 Gazebo。请先按照 安装 Gazebo 和 ROS 文档 操作。
  2. 对 ROS 概念和终端命令有基本的了解。
  3. 开始本教程前,请先阅读 ROS 2 集成,熟悉 ros_gz_bridge。

新建一个 ROS 2 Python launch 文件,或在项目的主 launch 文件中添加以下节点。目标是实现:

  1. 一套机器人模型开发和测试环境
  2. 配置 RViz(以及其他 ROS 2 工具)来控制由 Gazebo 世界仿真的机器人模型

注意:本教程的完整源代码可以在 ros_gz_example_bringup 包的 launch 文件中找到。

将机器人描述加载到参数服务器

Section titled “将机器人描述加载到参数服务器”

加载机器人描述文件,在参数服务器上设置 robot_description 参数。

sdf_file = os.path.join(pkg_project_description, 'models', 'rrbot', 'model.sdf')
with open(sdf_file, 'r') as infp:
robot_desc = infp.read()

要发布和控制机器人位姿,需要机器人的关节状态。

joint_state_publisher 示意图

  1. joint_state_publisher 从参数服务器读取 robot_description 参数,找出所有非固定关节,并发布一条包含所有这些关节定义的 JointState 消息。

    joint_state_publisher_gui = Node(
    package='joint_state_publisher_gui',
    executable='joint_state_publisher_gui',
    name='joint_state_publisher_gui',
    arguments=[sdf_file],
    output=['screen']
    )
  2. 在 RViz 中可视化,并借助 joint_state_publisher_gui,通过滑块调整关节状态和位姿来配置机器人模型。

    joint_state_publisher GUI 界面

    节点 API 请参见 文档。该功能在模型开发的初始阶段非常有用。至此,已经实现了 环境搭建 中定义的第一个目标。

  3. 如果需要进一步可视化机器人的运动,就还需要位置和变换信息。robot_state_publisher 以机器人的描述和关节角度为输入,利用机器人的运动学树模型发布机器人各连杆的 3D 位姿。

    robot_state_publisher = Node(
    package='robot_state_publisher',
    executable='robot_state_publisher',
    name='robot_state_publisher',
    output='both',
    parameters=[
    {'use_sim_time': True},
    {'robot_description': robot_desc},
    ]
    )

    这些 3D 位姿通过 /tf 话题发布,可用于跟踪和规划机器人的运动、在机器人不同部分之间通信,以及评估机器人的性能。

这些关节状态既可以像前面那样来自 joint_state_publisher,也可以来自仿真中 JointStatePub 系统发布的 joint_state 消息。

通过在节点配置中添加 remapping(重映射),或创建 bridge.yaml,即可配置 ROS 话题 /joint_states 与 Gazebo 话题 /world/demo/model/diff_drive/joint_state 之间的桥接:

Terminal window
- ros_topic_name: "/joint_states"
gz_topic_name: "/world/demo/model/diff_drive/joint_state"
ros_type_name: "sensor_msgs/msg/JointState"
gz_type_name: "gz.msgs.Model"
direction: GZ_TO_ROS

更多关于桥接的信息,请参阅 ROS 2 集成。

在 ROS 2 工具中使用现有仿真资源的主要痛点,是把 URDF 文件转换为 Gazebo 可读的格式。如今已不再需要这一步骤。如果项目同时维护 URDF 和 SDF 文件,可以放弃 URDF,只使用 SDF 即可同时服务于 ROS 和 Gazebo。

这得益于 sdformat_urdf:它是一个解析器插件库,能将 SDF 文件转换为 URDF C++ DOM 结构,使其能被 ROS 2 生态系统理解。不过该插件也有一些限制,比如并非所有 SDFormat 标签都兼容。例如,如果关节上挂载了传感器,就不会被解析。更多细节见 该仓库。

要启用这一功能,只需把 SDFormat 文件内容发布到 /robot_description 这个 ROS 话题上,ROS 会自动找到合适的解析器——此处即 sdformat_urdf——来读取该文件。前面的 robot_state_publisher 配置中已经完成了这一步。

环境搭建中定义的第二个目标,本质上是只维护一种机器人描述格式,并直接用 Gazebo 控制它。仿真器使用机器人的 SDFormat XML 描述发布模型的关节状态,robot_state_publisher 负责将这些关节状态转换为 tf,供 RViz 和其他 ROS 工具使用。由此即可在 RViz 中可视化 Gazebo 仿真模型。

Gazebo 与 RViz 同步显示

按照本教程的步骤配置,即可增强现有的 ROS 和 Gazebo 项目。ros_gz_project_template 为 ROS 2 和 Gazebo 项目提供了结构化的组织方式,包括必要的目录、构建文件和 launch 脚本。模板使用指南请参阅 使用 ros_gz_project_template 进行 ROS 2 和 Gazebo 开发入门。