设置生命周期和组合节点

在本指南中,我们将讨论 ROS 2 中的两个新概念,即生命周期和组合。在本指南的第一个部分,我们讨论了NAV2中生命线的概念以及如何添加生命周期节点以利用它。在第二部分中,我们讨论了组成的目的以及如何在NAV2中手动和动态实施它。 [校准@songhuangong]

生命周期

ROS 2 中引入了生命周期,以系统地管理机器人操作中涉及的不同节点的启动和关闭。 Lifecycle 节点的使用可确保所有节点在开始执行之前成功实例化,并且如果有任何无响应的节点,Nav2 会关闭这些节点。 [校准@songhuangong]

生命周期节点包含状态机转换,可在ROS 2服务器中实现确定性行为。生命周期节点转换Nav2由 Lifecycle Manager 处理 。生命周期管理器转换生命周期节点的状态,并更好的控制系统状态。 [校准@songhuangong]

生命周期节点的主要状态是``Unconfigured`` 、 InactiveActiveFinalized 。生命周期节点在实例化后以“未配置”状态开始。生命周期管理器通过实施``Configurating``转换将节点从``Unconfigured`` 转换为 InactiveConfigurating 转换设置所有配置参数并准备任何所需的设置,例如内存分配以及静态发布和订阅主题的设置。处于`Inactive``状态的节点可以重新配置其参数,但不能执行任何处理。从`Inactive``状态,生命周期管理器执行``Activating`` 转换状态,将节点从``Inactive`` 过渡到 Active ,这是主要状态。处于 Active 状态的节点被允许执行任何处理操作。如果节点崩溃,生命周期管理器会关闭系统以防止任何严重故障。在关闭时,执行必要的清理操作,节点通过 ``Deactivating ````CleaningUp ````ShuttingDown ``转换状态转换到 ``Finalized ``状态。 [校准@songhuangong]

参见

有关生命周期管理的更多信息,请参阅 Managed Nodes 的文章。 [校准@songhuangong]

生命周期节点框架由NAV2服务器大量使用,例如在上一个教程中讨论的规划器和控制器服务器。 [校准@songhuangong]

您可能希望将自己的节点集成到 Nav2 框架中,或者将新的生命周期节点添加到您的系统中。 例如,我们将添加一个新的名义生命周期节点“sensor_driver”,并通过 Nav2 生命周期管理器对其进行控制,以确保在激活导航之前传感器馈送可用。 您可以通过在启动文件中添加一个 sensor_driver 节点并将其添加到导航前由 lifecycle_manager 激活的节点列表中来实现,如下面的示例所示。 [校准@songhuangong]

lifecycle_nodes = ['sensor_driver',
                   'controller_server',
                   'smoother_server',
                   'planner_server',
                   'recoveries_server',
                   'bt_navigator',
                   'waypoint_follower']

...

Node(
    package='nav2_sensor_driver',
    executable='sensor_driver',
    name='sensor_driver',
    output='screen',
    parameters=[configured_params],
    remappings=remappings),

Node(
    package='nav2_lifecycle_manager',
    executable='lifecycle_manager',
    name='lifecycle_manager_navigation',
    output='screen',
    parameters=[{'autostart': autostart},
                {'node_names': lifecycle_nodes}]),

在上面的代码片段中,生命周期管理器要处理的节点是使用 node_names 参数设置的。 node_names 参数接受一个有序的节点列表,以通过生命周期转换来启动。 如代码片段所示,node_names 参数接

Lifecycle Manager 的另外两个参数是 autostartbond_timeout `` 如果您想在启动时将转换节点设置为 ``Active 状态,请将``autostart`` 设置为``true``。 否则,您将需要手动触发 Lifecycle Manager 以升级系统。 bond_timeout 设置等待时间,以决定如果节点没有响应,何时向下转换所有节点。 [校准@songhuangong]

备注

关于 Lifecycle Manager 参数的更多信息可以在 Lifecycle Manager 的配置指南 中找到 [校准@小鱼]

组成

组合是 ROS 2 中的另一个新概念,它通过将多个节点放在一个进程中来减少内存和 CPU 资源。 在 Nav2 中,Composition 可用于在单个进程中组合所有 Nav2 节点,而不是单独启动它们。 这对于部署在开发人员需要优化资源使用的嵌入式系统上很有用。 [校准@songhuangong]

参见

有关合成的更多信息,请参见 此处[校准@songhuangong]

在以下小节中,我们将举例说明如何将新的 Nav2 服务器(我们在概念上称为``route_server`` )添加到我们的系统。 这可以通过手动合成或动态合成来完成。 [校准@songhuangong]

手动合成 [校准@songhuangong]

对于手动合成,有一个现有的手动合成启动文件,composed_bringup.cpp 在``nav2_bringup``。 您可以通过执行以下步骤将``route_server``添加到此现有手动组合中: [校准@songhuangong]

  1. 将以下内容添加到 composed_bringup.cpp[校准@songhuangong]

    添加 route_server 头文件。 [校准@songhuangong]

    #include "nav2_route_server/route_server.hpp"
    

    创建共享指针 route_node ,并将其添加到 navigation_node_names ,以便通过生命周期管理器 (如果是生命周期节点) 转换。 [校准@songhuangong]

    auto route_node = std::make_shared<nav2_route_server::RouteServer>();
    navigation_node_names.push_back(route_node->get_name());
    

    添加 route_nodethreads 以创建 route_node 的单线程执行器 [校准@songhuangong]

    threads.push_back(create_spin_thread(route_node));
    
  2. 将包含服务器的包作为依赖项添加到您的“package.xml”文件中。 [校准@songhuangong]

    <exec_depend>nav2_route_server</exec_depend>
    
  3. 将包包含在``CMakeLists.txt``文件中。 [校准@songhuangong]

    find_package(nav2_route_server REQUIRED)
    set(dependencies nav2_route_server)
    

动态组合

在动态组合中,我们利用启动文件将不同的服务器组合成一个进程。 该过程由“ComposableNodeContainer”容器建立,该容器通过“ComposableNode”填充了组合节点。 然后可以像任何其他 Nav2 节点一样启动和使用该容器。 [校准@songhuangong]

  1. 在您的启动文件中添加一个新的 ComposableNode() 实例,指向您选择的组件容器。 [校准@songhuangong]

    container = ComposableNodeContainer(
        name='my_container',
        namespace='',
        package='rclcpp_components',
        executable='component_container',
        composable_node_descriptions=[
            ComposableNode(
                package='nav2_route_server',
                plugin='nav2_route_server::RouteServer',
                name='nav2_route_server'),
        ],
        output='screen',
    )
    

    参见

    请参阅组合演示的 composition_demo.launch.py 中的示例。 [校准@songhuangong]

  2. 将包含服务器的包添加到您的 package.xml 文件中。 [校准@songhuangong]

    <exec_depend>nav2_route_server</exec_depend>
    

小结 [校准@songhuangong]

在本指南的这一部分中,我们讨论了生命周期和组合节点,它们是 ROS 2 中新的重要概念。我们还展示了如何使用 Nav2 为新创建的节点/服务器实现生命周期和组合。 这两个概念有助于有效地运行您的系统,因此鼓励在整个 Nav2 中使用。 [校准@songhuangong]