Ros2Supervisor 节点

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

教程级别:高级

时间:10 分钟

背景

在本教程中,您将学习如何启用“Ros2Supervisor”节点,该节点通过创建其他服务和主题来与模拟交互,从而增强界面。 例如,您可以在模拟运行时直接从 ROS 2 界面录制动画或生成 Webots 节点。 这些说明详细列出了当前实现的功能及其使用方法。

先决条件

在继续本教程之前,请确保您已完成以下操作:

Ros2Supervisor

Ros2Supervisor 由两个主要部分组成:

  • 添加到模拟世界的 Webots Robot 节点。其 supervisor 字段设置为 TRUE。

  • 作为外部控制器连接到 Webots Robot 的 ROS 2 节点(与您自己的机器人插件类似)。

ROS 2 节点充当控制器,调用 Supervisor API 函数来控制或与模拟世界交互。

用户与 ROS 2 节点的交互主要通过服务和主题执行。

可以使用 WebotsLauncher 中的 ros2_supervisor 参数在 Webots 启动时自动创建这些节点。

webots = WebotsLauncher(
    world=PathJoinSubstitution([package_dir, 'worlds', world]),
    mode=mode,
    ros2_supervisor=True
)

启动文件返回的“LaunchDescription”中还必须包含“webots._supervisor”对象。

return LaunchDescription([
    webots,
    webots._supervisor,

    # This action will kill all nodes once the Webots simulation has exited
    launch.actions.RegisterEventHandler(
        event_handler=launch.event_handlers.OnProcessExit(
            target_action=webots,
            on_exit=[
                launch.actions.EmitEvent(event=launch.events.Shutdown())
            ],
        )
    )
])

有关“webots_ros2”项目启动文件的更多信息,请参阅:doc:./Setting-Up-Simulation-Webots-Basic。

时钟主题

“Ros2Supervisor”节点负责获取 Webots 模拟的时间并将其发布到“/clock”主题。

这意味着,如果其他节点的“use_sim_time”参数设置为“true”,则必须生成“Ros2Supervisor”。

有关“/clock”主题的更多信息,请参阅“ROS wiki <http://wiki.ros.org/Clock>”。

导入 Webots 节点

“Ros2Supervisor”节点还允许您通过服务从字符串生成 Webots 节点。

该服务名为 /Ros2Supervisor/spawn_node_from_string,类型为 webots_ros2_msgs/srv/SpawnNodeFromStringSpawnNodeFromString 类型需要 data 字符串作为输入,并返回 success 布尔值。

从给定的字符串中,Supervisor 节点获取导入节点的名称并将其添加到实习列表中,以便以后可能删除(请参阅:ref:删除 Webots 导入的节点)。

使用 importMFNodeFromString(nodeString) API 函数 导入节点。

以下是导入名为 imported_robot 的简单机器人的示例:

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

Note

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

删除 Webots 导入的节点

使用 /Ros2Supervisor/spawn_node_from_string 服务导入节点后,也可以删除该节点。

可以通过将节点名称发送到名为 /Ros2Supervisor/remove_node 且类型为 std_msgs/msg/String 的主题来实现。

如果节点确实在导入列表中,则使用 remove() API 方法 将其删除。

以下是有关如何删除 imported_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"}"

The /Ros2Supervisor/animation_stop_recording service is of type webots_ros2_msgs/srv/GetBool and allows to stop the animation.

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

摘要

在本教程中,您学习了如何启用“Ros2Supervisor”以及如何使用 Webots 模拟扩展接口。 该节点创建多个服务和主题来与模拟进行交互和修改。