您正在阅读的是旧版本但仍受支持的 ROS 2 文档。 Jazzy.
设置重置处理程序
目标 使用重置处理程序扩展机器人模拟,以便在按下 Webots 的重置按钮时重新启动节点。
辅导水平: 高级
时间 10 分钟
背景介绍
在本教程中,您将学习如何使用 Webots 在机器人仿真中实现重置处理程序。Webots 重置按钮可将世界还原为初始状态,并重新启动控制器。这很方便,因为它能快速重置模拟,但在 ROS 2 中,机器人控制器不会再次启动,从而导致模拟停止。当按下 Webots 中的重置按钮时,重置处理程序可以重启特定节点或执行其他操作。这对于需要重置模拟状态或重启特定组件而无需完全重启整个 ROS 系统的情况非常有用。
先决条件
在继续本教程之前,请确保您已完成以下内容:
了解 ROS 2 节点和初级课程涵盖的主题 教程.
了解 Webots 和 ROS 2 及其界面软件包。
熟悉 设置机器人模拟(基础).
简单案例的重置处理程序(仅限控制器)
在软件包的启动文件中,添加 重生
参数。
捍卫 生成发射描述():
机器人驱动程序 = WebotsController(
机器人名称='我的机器人';,
参数=[
{'robot_description';: 机器人描述路径}
],
# 每次重置模拟时,控制器都会自动重生
重生=正确
)
# 开始 Webots
网点 = WebotsLauncher(世界=路径连接替换([软件包目录, '世界';, 世界]))
返回 启动说明([
网点,
机器人驱动程序
])
重置时,Webots 会杀死所有驱动节点。因此,要在重置后再次启动它们,应设置 重生
驱动节点的 正确
.它将确保重置后驱动程序节点正常运行。
多节点重置处理程序(无需关机)
如果有其他节点必须与驱动程序节点一起启动(如 ros2_control
节点),然后可以使用 进程结束时
事件处理程序:
捍卫 get_ros2_control_spawners(*参数):
# 在此声明模拟重置时必须重新启动的所有节点
控制节点 = 节点(
包装='controller_manager';,
可执行='spawner';,
论点=['diffdrive_controller';]
)
返回 [
控制节点
]
捍卫 生成发射描述():
机器人驱动程序 = WebotsController(
机器人名称='我的机器人';,
参数=[
{'robot_description';: 机器人描述路径}
],
# 每次重置模拟时,控制器都会自动重生
重生=正确
)
# 开始 Webots
网点 = WebotsLauncher(世界=路径连接替换([软件包目录, '世界';, 世界]))
# 声明重置处理程序,以便在机器人驱动程序退出时重新生成节点
重置处理程序 = 启动.行动.注册事件处理程序(
事件处理程序=启动.事件处理程序.进程结束时(
target_action=机器人驱动程序,
on_exit=get_ros2_control_spawners,
)
)
返回 启动说明([
网点,
机器人驱动程序,
重置处理程序
] + get_ros2_control_spawners())
无法使用 重生
上的 ros2_control
节点,因为产卵器在启动时退出,而不是在重置模拟时退出。相反,我们应该在函数中声明一个节点列表(例如 get_ros2_control_spawners
).执行启动文件时,该列表中的节点会与其他节点一起启动。使用 重置处理程序
时,该函数也被声明为动作启动。 机器人驱动程序
节点退出,也就是 Webots 界面重置模拟的时刻。节点 机器人驱动程序
节点仍然具有 重生
属性设置为 正确
,使其与 ros2_control
节点。
需要关闭节点的重置处理程序
在当前的 ROS 2 启动应用程序接口中,无法在节点需要在重启前关闭的启动文件中使用重置功能(例如 导航2
或 RViz
).原因是 ROS 2 目前不允许从启动文件中关闭特定节点。有一个解决方案,但需要在按下重置按钮后手动重启节点。
Webots 需要在一个特定的启动文件中启动,不能有其他节点。
捍卫 生成发射描述():
# 开始 Webots
网点 = WebotsLauncher(世界=路径连接替换([软件包目录, '世界';, 世界]))
返回 启动说明([
网点
])
必须从另一个进程启动第二个启动文件。该启动文件包含所有其他节点,包括机器人控制器/插件、Navigation2 节点、RViz、状态发布器等。
捍卫 生成发射描述():
机器人驱动程序 = WebotsController(
机器人名称='我的机器人';,
参数=[
{'robot_description';: 机器人描述路径}
]
)
控制节点 = 节点(
包装='controller_manager';,
可执行='spawner';,
论点=['diffdrive_controller';]
)
导航 2 节点 = 包含启动描述(
PythonLaunchDescriptionSource(os.路.加入(
获取软件包共享目录('nav2_bringup'), 'launch';, 'bringup_launch.py';)),
启动参数=[
('map';, nav2_map),
('params_file', nav2_params),
],
)
rviz = 节点(
包装='rviz2';,
可执行='rviz2';,
产量='屏幕';
)
# 声明当机器人驱动程序退出时关闭所有节点的处理程序
关机处理程序 = 启动.行动.注册事件处理程序(
事件处理程序=启动.事件处理程序.进程结束时(
target_action=机器人驱动程序,
on_exit=[启动.行动.发射事件(事件=启动.活动.关闭())],
)
)
返回 启动说明([
机器人驱动程序,
控制节点,
导航 2 节点,
rviz,
关机处理程序
])
第二个启动文件包含一个处理程序,可在驱动节点退出时(即重置模拟时)触发关机事件。按下重置按钮后,必须通过命令行手动重启第二个启动文件。
摘要
在本教程中,您将学习如何使用 Webots 在机器人仿真中实现重置处理程序。重置处理程序允许您在按下 Webots 中的重置按钮时重启特定节点或执行其他操作。您将根据仿真的复杂程度和节点的要求探索不同的方法。