设置生命周期和组合节点
在本指南中,我们将讨论 ROS 2 中的两个新概念,即生命周期和组合。在本指南的第一个部分,我们讨论了NAV2中生命线的概念以及如何添加生命周期节点以利用它。在第二部分中,我们讨论了组成的目的以及如何在NAV2中手动和动态实施它。 [校准@songhuangong]
生命周期
ROS 2 中引入了生命周期,以系统地管理机器人操作中涉及的不同节点的启动和关闭。 Lifecycle 节点的使用可确保所有节点在开始执行之前成功实例化,并且如果有任何无响应的节点,Nav2 会关闭这些节点。 [校准@songhuangong]
生命周期节点包含状态机转换,可在ROS 2服务器中实现确定性行为。生命周期节点转换Nav2由 Lifecycle Manager
处理 。生命周期管理器转换生命周期节点的状态,并更好的控制系统状态。 [校准@songhuangong]
生命周期节点的主要状态是``Unconfigured`` 、 Inactive
、 Active
和 Finalized
。生命周期节点在实例化后以“未配置”状态开始。生命周期管理器通过实施``Configurating``转换将节点从``Unconfigured`` 转换为 Inactive
。 Configurating
转换设置所有配置参数并准备任何所需的设置,例如内存分配以及静态发布和订阅主题的设置。处于`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 的另外两个参数是 autostart
和 bond_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]
将以下内容添加到 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_node
到threads
以创建route_node
的单线程执行器 [校准@songhuangong]threads.push_back(create_spin_thread(route_node));
将包含服务器的包作为依赖项添加到您的“package.xml”文件中。 [校准@songhuangong]
<exec_depend>nav2_route_server</exec_depend>
将包包含在``CMakeLists.txt``文件中。 [校准@songhuangong]
find_package(nav2_route_server REQUIRED) set(dependencies nav2_route_server)
动态组合
在动态组合中,我们利用启动文件将不同的服务器组合成一个进程。 该过程由“ComposableNodeContainer”容器建立,该容器通过“ComposableNode”填充了组合节点。 然后可以像任何其他 Nav2 节点一样启动和使用该容器。 [校准@songhuangong]
在您的启动文件中添加一个新的 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]
将包含服务器的包添加到您的
package.xml
文件中。 [校准@songhuangong]<exec_depend>nav2_route_server</exec_depend>
小结 [校准@songhuangong]
在本指南的这一部分中,我们讨论了生命周期和组合节点,它们是 ROS 2 中新的重要概念。我们还展示了如何使用 Nav2 为新创建的节点/服务器实现生命周期和组合。 这两个概念有助于有效地运行您的系统,因此鼓励在整个 Nav2 中使用。 [校准@songhuangong]