Skip to content

Webots Ros2Supervisor 节点

目标: 使用默认的 Supervisor 机器人(名为 Ros2Supervisor)扩展接口。

教程级别: 进阶

预计时间: 10 分钟

在本教程中,你将学习如何启用 Ros2Supervisor 节点。该节点通过创建额外的服务和话题来与仿真交互,从而增强接口。

例如,可以在仿真运行时录制动画,或直接从 ROS 2 接口生成 Webots 节点。

下面详细介绍了当前已实现的功能及其使用方法。

在继续本教程之前,请确保你已完成以下内容:

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 机器人仿真设置(基础)。

Ros2Supervisor 节点负责获取 Webots 仿真的时间并发布到 /clock 话题。

因此,如果其他节点的 use_sim_time 参数设置为 true,则必须启动 Ros2Supervisor。

关于 /clock 话题的更多信息,请参见 ROS wiki。

Ros2Supervisor 节点还支持通过服务从字符串生成 Webots 节点。

该服务名为 /Ros2Supervisor/spawn_node_from_string,类型为 webots_ros2_msgs/srv/SpawnNodeFromString。

SpawnNodeFromString 类型需要一个 data 字符串作为输入,并返回一个 success 布尔值。

从给定的字符串中,Supervisor 节点提取导入节点的名称并将其添加到内部列表中,以便后续移除(参见移除 Webots 导入节点)。

该节点使用 importMFNodeFromString(nodeString) API 函数 来完成导入。

以下是一个导入名为 imported_robot 的简单 Robot 的示例:

Terminal window
$ ros2 service call /Ros2Supervisor/spawn_node_from_string webots_ros2_msgs/srv/SpawnNodeFromString "data: Robot { name \"imported_robot\" }"

注意: 如果尝试在节点字符串中导入某些 PROTO,它们各自的 URL 必须在 .wbt 世界文件中声明为 EXTERNPROTO 或 IMPORTABLE EXTERNPROTO。

一旦通过 /Ros2Supervisor/spawn_node_from_string 服务导入了节点,也可以将其移除。

只需将节点名称发送到名为 /Ros2Supervisor/remove_node、类型为 std_msgs/msg/String 的话题即可。

如果节点确实在导入列表中,会使用 remove() API 方法 移除。

以下是移除 imported_robot Robot 的示例:

Terminal window
$ 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 表示动画文件保存目录的绝对路径。

以下是开始录制动画的示例:

Terminal window
$ 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,用于停止录制动画。

Terminal window
$ ros2 service call /Ros2Supervisor/animation_stop_recording webots_ros2_msgs/srv/GetBool "{ask: True}"

在本教程中,你学习了如何启用 Ros2Supervisor 以及如何扩展与 Webots 仿真的接口。

该节点创建了多个服务和话题,用于与仿真交互和修改仿真。