目标:使用默认的监督机器人扩展接口,命名为 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\" }"
便条
如果您尝试在节点字符串中导入一些 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}"
记录动画
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 仿真扩展接口。该节点创建了多个服务和主题,以便与仿真进行交互和修改。