ROS 2 互操作
rrbot 是一个带有旋转关节的双连杆机械臂,本教程以它为例,演示 ROS 2 与 Gazebo Sim 的互操作。
本教程利用 ROS 2 的通信和控制机制与机器人交互。Gazebo 作为仿真环境,为 rrbot 机械臂提供物理仿真和可视化。机器人模型使用 SDFormat(Simulation Description Format,仿真描述格式)描述,定义了机器人的结构、关节、连杆及其属性。Gazebo 的物理引擎负责仿真机器人的动力学,而 ROS 2 的可视化工具 RViz 则基于控制节点发布的数据来显示机器人模型及其运动,两者共用同一个机器人描述文件。可以通过 ROS 2 命令与 rrbot 交互,移动机械臂或获取关节状态信息。
- 要继续本教程,需要安装好可用的 ROS 2 和 Gazebo。请先按照 安装 Gazebo 和 ROS 文档 操作。
- 对 ROS 概念和终端命令有基本的了解。
- 开始本教程前,请先阅读 ROS 2 集成,熟悉
ros_gz_bridge。
新建一个 ROS 2 Python launch 文件,或在项目的主 launch 文件中添加以下节点。目标是实现:
- 一套机器人模型开发和测试环境
- 配置 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()启动状态发布节点
Section titled “启动状态发布节点”要发布和控制机器人位姿,需要机器人的关节状态。

-
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']) -
在 RViz 中可视化,并借助
joint_state_publisher_gui,通过滑块调整关节状态和位姿来配置机器人模型。
-
如果需要进一步可视化机器人的运动,就还需要位置和变换信息。
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话题发布,可用于跟踪和规划机器人的运动、在机器人不同部分之间通信,以及评估机器人的性能。
配置通信桥接
Section titled “配置通信桥接”这些关节状态既可以像前面那样来自 joint_state_publisher,也可以来自仿真中 JointStatePub 系统发布的 joint_state 消息。
通过在节点配置中添加 remapping(重映射),或创建 bridge.yaml,即可配置 ROS 话题 /joint_states 与 Gazebo 话题 /world/demo/model/diff_drive/joint_state 之间的桥接:
- 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 集成。
维护单一的机器人描述格式
Section titled “维护单一的机器人描述格式”在 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 配置中已经完成了这一步。
运行 RViz 和 Gazebo
Section titled “运行 RViz 和 Gazebo”环境搭建中定义的第二个目标,本质上是只维护一种机器人描述格式,并直接用 Gazebo 控制它。仿真器使用机器人的 SDFormat XML 描述发布模型的关节状态,robot_state_publisher 负责将这些关节状态转换为 tf,供 RViz 和其他 ROS 工具使用。由此即可在 RViz 中可视化 Gazebo 仿真模型。

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