【ROS2】高级:模拟器-Webots-Ros2Supervisor 节点

目标:使用默认的监督机器人扩展接口,命名为 Ros2Supervisor 。

 教程级别:高级

 时间:10 分钟

 目录

  •  背景

  •  先决条件

  •   Ros2Supervisor

  •  时钟主题 Clock topic

  • 导入一个 Webots 节点

  • 删除一个 Webots 导入的节点

  •  记录动画

  •  摘要

 背景

在本教程中,您将学习如何启用 Ros2Supervisor 节点,该节点通过创建额外的服务和主题来增强界面,以便与仿真进行交互。例如,您可以在仿真运行时直接从 ROS 2 界面记录动画或生成 Webots 节点。这些说明详细列出了当前实现的功能以及如何使用它们。

 先决条件

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

  • 理解初学者教程中涵盖的 ROS 2 节点和主题。

  • 对 Webots 和 ROS 2 及其接口包的了解。

  • 熟悉设置机器人仿真(基础)。

Ros2Supervisor 

Ros2Supervisor 由两个主要部分组成:

  • 将一个 Webots 机器人节点添加到仿真世界中。其 supervisor 字段设置为 TRUE。

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

ROS 2 节点充当控制器,调用 Supervisor API 函数来控制或与仿真世界交互。用户与 ROS 2 节点的交互主要通过服务和主题进行。

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

webots = WebotsLauncher(
    world=PathJoinSubstitution([package_dir, 'worlds', world]),  # 指定Webots仿真世界文件的路径
    mode=mode,  # 指定Webots的运行模式
    ros2_supervisor=True  # 启用ROS 2监督器
)

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

# 返回LaunchDescription对象,包含所有节点和处理程序
return LaunchDescription([
    webots,  # 启动Webots仿真
    webots._supervisor,  # 启动Webots的监督器节点


    # 当Webots仿真退出时,终止所有节点的操作
    launch.actions.RegisterEventHandler(
        event_handler=launch.event_handlers.OnProcessExit(
            target_action=webots,  # 目标动作:Webots仿真
            on_exit=[
                launch.actions.EmitEvent(event=launch.events.Shutdown())  # 退出时触发关闭事件
            ],
        )
    )
])

有关 webots_ros2 项目启动文件的更多信息,请参见设置机器人仿真(基础)。

时钟主题

Ros2Supervisor 节点负责获取 Webots 仿真的时间并将其发布到 /clock 主题。这意味着如果其他节点的 use_sim_time 参数设置为 true ,则必须生成 Ros2Supervisor 。有关 /clock 主题的更多信息可以在 ROS 维基中找到。http://wiki.ros.org/Clock

导入一个 Webots 节点

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

该服务名为 /Ros2Supervisor/spawn_node_from_string ,类型为 webots_ros2_msgs/srv/SpawnNodeFromString 。 SpawnNodeFromString 类型期望输入 data 字符串,并返回 success 布尔值。

从给定的字符串中,Supervisor 节点获取导入节点的名称并将其添加到 intern 实习生列表中,以便以后可能删除(参见删除 Webots 导入节点 https://docs.ros.org/en/jazzy/Tutorials/Advanced/Simulators/Webots/Simulation-Supervisor.html#remove-a-webots-imported-node )。

节点是使用 importMFNodeFromString(nodeString) API 函数 https://cyberbotics.com/doc/reference/supervisor?tab-language=python#wb_supervisor_field_import_mf_node_from_string 导入的。

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

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

b434c4e863914a0e182d235178e9776c.png

 便条

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

删除一个 Webots 导入的节点

一旦使用 /Ros2Supervisor/spawn_node_from_string 服务导入节点,它也可以被移除。

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

如果节点确实在导入列表中,则使用 remove() API 方法将其删除。https://cyberbotics.com/doc/reference/supervisor?tab-language=python#wb_supervisor_node_remove

以下是如何移除 imported_robot 机器人的示例:

ros2 topic pub --once /Ros2Supervisor/remove_node std_msgs/msg/String "{data: imported_robot}"

429dc54ce8e69ea72d8fc37fe8d4b665.png

 记录动画

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"}"

15b2fddb27ff98bdd4a34bed8b285bf4.png

/Ros2Supervisor/animation_stop_recording 服务是 webots_ros2_msgs/srv/GetBool 类型,并允许停止动画。

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

03749e41bbc5b756b0801c9b61448e82.png

 摘要

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值