设置重置处理程序

目标 使用重置处理程序扩展机器人模拟,以便在按下 Webots 的重置按钮时重新启动节点。

辅导水平: 高级

时间 10 分钟

背景介绍

在本教程中,您将学习如何使用 Webots 在机器人仿真中实现重置处理程序。Webots 重置按钮可将世界还原为初始状态,并重新启动控制器。这很方便,因为它能快速重置模拟,但在 ROS 2 中,机器人控制器不会再次启动,从而导致模拟停止。当按下 Webots 中的重置按钮时,重置处理程序可以重启特定节点或执行其他操作。这对于需要重置模拟状态或重启特定组件而无需完全重启整个 ROS 系统的情况非常有用。

先决条件

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

简单案例的重置处理程序(仅限控制器)

在软件包的启动文件中,添加 重生 参数。

捍卫 生成发射描述():
    机器人驱动程序 = 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 启动应用程序接口中,无法在节点需要在重启前关闭的启动文件中使用重置功能(例如 导航2RViz).原因是 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 中的重置按钮时重启特定节点或执行其他操作。您将根据仿真的复杂程度和节点的要求探索不同的方法。