添加新的 Nav2 任务服务器
nav2 任务服务器由服务器端逻辑组成,用于完成不同类型的请求,通常由自治系统或通过行为树导航器调用。在本指南中,我们将讨论向 Nav2 添加新任务服务器所需的核心组件(例如控制器、行为、平滑器、规划器服务器)。即如何设置新的生命周期组件节点以进行启动和状态管理以及语义上有意义的错误代码的通信(如有必要)。
虽然本教程不介绍如何添加互补的行为树节点以与此新任务服务器交互,但在 编写新的行为树插件 中详细介绍了这一点,因此可以在 BT Navigator 中的 BT 中调用此任务服务器。
如果您创建了一个可能被社区广泛重复使用的新任务服务器,请考虑联系维护人员将其添加到 Nav2 项目中!Nav2 因像您这样的用户的贡献而变得更好!
生命周期节点
生命周期节点是 nav2 任务服务器的第一个关键组件。ROS 2 中引入了生命周期节点,以系统地管理机器人操作中涉及的不同节点的启动和关闭。使用生命周期节点可确保所有节点在开始执行之前都已成功实例化,并且如果有任何无响应的节点,Nav2 将关闭所有节点。
生命周期节点包含状态机转换,可在 ROS 2 服务器中实现确定性行为。Nav2 中的生命周期节点转换由“生命周期管理器”处理。生命周期管理器转换生命周期节点的状态并提供对系统状态的更大控制。
生命周期节点的主要状态是“未配置”、“非活动”、“活动”和“已完成”。生命周期节点在实例化后以“未配置”状态启动。生命周期管理器通过实施“配置中”转换将节点从“未配置”转换为“非活动”。 “配置中”转换设置所有配置参数并准备任何所需的设置,例如内存分配和静态发布和订阅主题的设置。 处于“非活动”状态的节点可以重新配置其参数,但不能执行任何处理。 从“非活动”状态,生命周期管理器实施“激活中”转换状态,将节点从“非活动”转换为“活动”,这是主要状态。 处于“活动”状态的节点可以执行任何处理操作。 如果节点崩溃,生命周期管理器将关闭系统以防止任何严重故障。关闭时,将执行必要的清理操作,并通过“Deactivating”、“CleaningUp”和“ShuttingDown”转换状态将节点转换为“Finalized”状态。
有关生命周期管理的更多信息,请参阅有关“托管节点<https://design.ros2.org/articles/node_lifecycle.html>”的文章。
有关生命周期管理的更多信息,请参阅有关“托管节点<https://design.ros2.org/articles/node_lifecycle.html>”的文章。
lifecycle_nodes = ['sensor_driver',
'controller_server',
'smoother_server',
'planner_server',
'behavior_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
参数设置要由 Lifecycle Manager 处理的节点。node_names
参数接受要通过 Lifecycle 转换启动的节点的有序列表。如代码片段所示,node_names
参数接受 lifecycle_nodes
,其中包含要添加到 Lifecycle Manager 的节点列表。Lifecycle Manager 按顺序逐个实现启动转换(“配置”和“激活”),而关闭转换则按相反顺序处理节点。因此,sensor_driver
列在其他导航服务器之前,以便在激活导航服务器之前可以使用传感器数据。
Lifecycle Manager 的另外两个参数是 autostart
和 bond_timeout
。如果要在启动时将转换节点设置为“活动”状态,请将“autostart”设置为“true”。否则,您将需要手动触发 Lifecycle Manager 来转换系统。如果某个节点没有响应,“bond_timeout”设置等待时间,以决定何时转换所有节点。
有关 Lifecycle Manager 参数的更多信息,请参阅“Lifecycle Manager 配置指南 <https://docs.nav2.org/configuration/packages/configuring-lifecycle.html>”
作品
组合是 nav2 任务服务器的第二个关键组件,通过将多个节点放在一个进程中来减少内存和 CPU 资源。在 Nav2 中,组合可用于在单个进程中组合所有 Nav2 节点,而不是单独启动它们。这对于开发人员需要优化资源利用率的嵌入式系统部署非常有用。
有关 Composition 的更多信息,请参见`此处 <https://docs.ros.org/en/rolling/Tutorials/Intermediate/Composition.html>`_。
在下一节中,我们将举例说明如何将新的 Nav2 服务器(我们名义上称之为 route_server
)添加到我们的系统中。
我们利用启动文件将不同的服务器组合成一个进程。该进程由 ComposableNodeContainer
容器建立,该容器通过 ComposableNode
填充了组合节点。然后可以启动此容器,并将其用作任何其他 Nav2 节点。
在启动文件中添加一个新的“ComposableNode()”实例,指向您选择的组件容器。
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 中的示例。
将包含服务器的包添加到您的“package.xml”文件中。
<exec_depend>nav2_route_server</exec_depend>
错误代码
您的 nav2 任务服务器可能还希望在其操作响应中返回“error_code”(但这不是必需的)。如果您的系统存在语义上有意义且可操作的故障类型,这是一种系统性的方式来传达这些故障,这些故障可能会自动汇总到导航系统对您的应用程序的响应中。
重要的是要注意,0-9999 的错误代码是为内部 nav2 服务器保留的,每个服务器偏移 100,而外部服务器从 10000 开始到 65535 结束。
下表显示了当前服务器以及预期的错误代码结构。
Server Name |
Reserved |
RANGE |
---|---|---|
… |
NONE=0, UNKNOWN=1 |
2-99 |
NONE=0, UNKNOWN=100 |
101-199 |
|
Planner Server (compute_path_to_pose) |
NONE=0, UNKNOWN=200 |
201-299 |
Planner Server (compute_path_through_poses) |
NONE=0, UNKNOWN=300 |
301-399 |
… |
… |
|
NONE=0, UNKNOWN=500 |
501-599 |
|
NONE=0, UNKNOWN=600 |
601-699 |
|
NONE=0 |
701-799 |
|
Coverage Server |
NONE=0, UNKNOWN=800 |
801-899 |
… |
… |
|
Last Nav2 Server |
NONE=0, UNKNOWN=9900 |
9901-9999 |
First External Server |
NONE=0, UNKNOWN=10000 |
10001-10099 |
… |
… |
错误代码附加到操作消息的响应中。下面可以看到路由服务器的示例。请注意,按照惯例,我们将消息定义中的错误代码字段设置为“error_code”。
# Error codes
# Note: The expected priority order of the errors should match the message order
uint16 NONE=0 # 0 is reserved for NONE
uint16 UNKNOWN=10000 # first error code in the sequence is reserved for UNKNOWN
# User Error codes below
int16 INVALID_START=10001
int16 NO_VALID_ROUTE=10002
#goal definition
route_msgs/PoseStamped goal
route_msgs/PoseStamped start
string route_id
---
#result definition
nav_msgs/Route route
builtin_interfaces/Duration route_time
uint16 error_code
---
如消息中所述,错误的优先级顺序应与消息顺序匹配,0 保留为 NONE,序列中的第一个错误代码保留为 UNKNOWN。 由于路由服务器是外部服务器,错误代码从 10000 开始,最高为 10099。
为了将服务器的错误代码传播到系统的其余部分,必须将其添加到 nav2_params.yaml 文件中。 BT Navigator 内部的 error_code_id_names 定义服务器在黑板上查找哪些错误代码。然后返回序列中最低的错误代码 - 而代码枚举在软件堆栈中越往上增加 - 为较低级别的故障提供更高的优先级。
error_code_id_names:
- compute_path_error_code_id
- follow_path_error_code_id
- route_error_code_id
结论
在本指南的这一部分中,我们讨论了生命周期节点、组合和错误代码,这些都是 ROS 2 中新的重要概念。我们还展示了如何使用 Nav2 将生命周期节点、组合和错误代码实现到您新创建的节点/服务器。这三个概念有助于高效运行您的系统,因此鼓励在整个 Nav2 中使用。