Webots Ros2Supervisor 节点
目标: 使用默认的 Supervisor 机器人(名为 Ros2Supervisor)扩展接口。
教程级别: 进阶
预计时间: 10 分钟
在本教程中,你将学习如何启用 Ros2Supervisor 节点。该节点通过创建额外的服务和话题来与仿真交互,从而增强接口。
例如,可以在仿真运行时录制动画,或直接从 ROS 2 接口生成 Webots 节点。
下面详细介绍了当前已实现的功能及其使用方法。
在继续本教程之前,请确保你已完成以下内容:
- 了解初级教程中涵盖的 ROS 2 节点和话题。
- 了解 Webots 和 ROS 2 及其接口包。
- 熟悉 Webots 机器人仿真设置(基础)。
Ros2Supervisor
Section titled “Ros2Supervisor”Ros2Supervisor 由两个主要部分组成:
- 一个添加到仿真世界中的 Webots Robot 节点,其
supervisor字段设置为 TRUE。 - 一个 ROS 2 节点,作为外部控制器连接到 Webots Robot(与你自己的机器人插件类似)。
该 ROS 2 节点充当控制器,调用 Supervisor API 函数来控制或与仿真世界交互。
用户与 ROS 2 节点的交互主要通过服务和话题进行。
该节点可以在 Webots 启动时通过 WebotsLauncher 中的 ros2_supervisor 参数自动创建。
webots = WebotsLauncher( world=PathJoinSubstitution([package_dir, 'worlds', world]), mode=mode, ros2_supervisor=True)webots._supervisor 对象也需要包含在 launch 文件返回的 LaunchDescription 中。
return LaunchDescription([ webots, webots._supervisor,
# 当 Webots 仿真退出时,此操作将杀死所有节点 launch.actions.RegisterEventHandler( event_handler=launch.event_handlers.OnProcessExit( target_action=webots, on_exit=[ launch.actions.EmitEvent(event=launch.events.Shutdown()) ], ) )])关于 webots_ros2 项目的 launch 文件的更多信息,请参见 Webots 机器人仿真设置(基础)。
Clock 话题
Section titled “Clock 话题”Ros2Supervisor 节点负责获取 Webots 仿真的时间并发布到 /clock 话题。
因此,如果其他节点的 use_sim_time 参数设置为 true,则必须启动 Ros2Supervisor。
关于 /clock 话题的更多信息,请参见 ROS wiki。
导入 Webots 节点
Section titled “导入 Webots 节点”Ros2Supervisor 节点还支持通过服务从字符串生成 Webots 节点。
该服务名为 /Ros2Supervisor/spawn_node_from_string,类型为 webots_ros2_msgs/srv/SpawnNodeFromString。
SpawnNodeFromString 类型需要一个 data 字符串作为输入,并返回一个 success 布尔值。
从给定的字符串中,Supervisor 节点提取导入节点的名称并将其添加到内部列表中,以便后续移除(参见移除 Webots 导入节点)。
该节点使用 importMFNodeFromString(nodeString) API 函数 来完成导入。
以下是一个导入名为 imported_robot 的简单 Robot 的示例:
$ ros2 service call /Ros2Supervisor/spawn_node_from_string webots_ros2_msgs/srv/SpawnNodeFromString "data: Robot { name \"imported_robot\" }"注意: 如果尝试在节点字符串中导入某些 PROTO,它们各自的 URL 必须在
.wbt世界文件中声明为 EXTERNPROTO 或 IMPORTABLE EXTERNPROTO。
移除 Webots 导入节点
Section titled “移除 Webots 导入节点”一旦通过 /Ros2Supervisor/spawn_node_from_string 服务导入了节点,也可以将其移除。
只需将节点名称发送到名为 /Ros2Supervisor/remove_node、类型为 std_msgs/msg/String 的话题即可。
如果节点确实在导入列表中,会使用 remove() API 方法 移除。
以下是移除 imported_robot Robot 的示例:
$ ros2 topic pub --once /Ros2Supervisor/remove_node std_msgs/msg/String "{data: imported_robot}"Ros2Supervisor 节点还创建了两个额外的服务来录制 HTML5 动画。
/Ros2Supervisor/animation_start_recording 服务的类型为 webots_ros2_msgs/srv/SetString,用于开始录制动画。
SetString 类型需要一个 value 字符串作为输入,并返回一个 success 布尔值。
输入的 value 表示动画文件保存目录的绝对路径。
以下是开始录制动画的示例:
$ ros2 service call /Ros2Supervisor/animation_start_recording webots_ros2_msgs/srv/SetString "{value: "<ABSOLUTE_PATH>/index.html"}"/Ros2Supervisor/animation_stop_recording 服务的类型为 webots_ros2_msgs/srv/GetBool,用于停止录制动画。
$ ros2 service call /Ros2Supervisor/animation_stop_recording webots_ros2_msgs/srv/GetBool "{ask: True}"在本教程中,你学习了如何启用 Ros2Supervisor 以及如何扩展与 Webots 仿真的接口。
该节点创建了多个服务和话题,用于与仿真交互和修改仿真。