设置导航插件
在本指南的这部分中,我们将讨论如何利用不同的规划器和控制器算法来完成导航任务。我们将根据机器人类型和环境讨论一些可用的算法插件。
规划器和控制器服务器
导航算法通过在ROS动作服务器上运行的插件在Nav2中实现-规划器、控制器和行为服务器(等等)。在本节中,我们讨论规划器和控制器服务器,它们是导航堆栈的核心。这些服务器可以实现一个或多个算法插件,每个插件都有自己的配置,针对特定的动作或机器人状态进行调整。本指南将根据机器人的类型和部署环境突出显示不同的算法。本指南不涉及行为、平滑器等方面,因为这些取决于应用程序而不是硬件/环境,无法提供一般化的建议。
规划器服务器负责实现计算机器人路径的算法。例如,一个插件可以配置为计算两个相对较近位置之间的简单最短路径,而另一个插件则可以计算覆盖整个机器人环境的路径。
控制器服务器生成机器人在其局部环境中完成任务所需的适当控制力。这些任务包括但不限于:按照规划器服务器生成的路径行驶,避开路径上的动态障碍物,甚至在充电站充电。
如前所述,规划器和控制器服务器托管了一个或多个插件的地图,在特定环境、场景或任务中将使用特定的插件。例如,控制器服务器可以有一个插件,用于在长走廊中遵循路径以保持在过道中间,然后另一个插件用于在拥挤的场所避免动态障碍物。根据机器人的任务选择要执行的规划算法可以通过导航系统或应用服务器的行为树来完成。
参见
如果想深入讨论导航服务器,我们建议查看导航概念类别下的“导航服务器 <https://navigation.ros.org/concepts/index.html#navigation-servers>`_”部分。
选择算法插件
在本节中,我们将讨论规划器和控制器服务器的一些可用算法插件。我们还将讨论每个算法的目的,以及推荐为哪种类型的机器人使用。最后,我们展示一些示例的 YAML 配置,指定每个服务器要使用的插件。
注解
你可以使用的算法插件不仅限于本节中提到的插件。你也可以创建自定义插件,并且Nav2会定期添加新的插件。关于如何编写自己的插件的教程,请参阅“编写新的规划器插件”和“编写新的控制器插件”。所有可用的Nav2插件及其描述列表可以在“导航插件部分”中找到。
规划器服务器
规划器服务器的算法插件使用机器人不同传感器捕捉到的环境表示来找到机器人的路径。其中一些算法通过搜索环境的网格空间来运行,而其他算法则通过考虑路径的可行性来扩展机器人的可能状态。
如前所述,规划器服务器可以使用在网格空间上工作的插件,例如“NavFn规划器”、“Smac 2D规划器”和“Theta Star规划器”。NavFn规划器是一个导航函数规划器,它可以使用Dijkstra或A*算法。接下来,Smac 2D规划器使用4或8个相邻点的A*算法,在查询过程中具有更平滑和多分辨率的特点。最后,Theta Star规划器是Theta*算法的一个实现,可以使用视线来创建非离散定向的路径段。
使用在网格空间上工作的算法时可能会遇到一个问题,即不能保证能够为任何类型的机器人生成可行的路径。例如,不能保证``NavFn Planner``能够为紧凑空间中的非圆形机器人规划出可行的路径,因为它使用机器人的圆形足迹(通过估计机器人的最大横截面半径)并检查每个代价地图网格单元的碰撞情况。此外,这些算法也不适用于阿克曼(ackermann)和腿式机器人,因为它们具有转向约束。也就是说,这些插件最适用于可以任意方向行
另一个规划器插件是Smac Hybrid-A*规划器,它支持任意形状的Ackermann和Legged机器人。它是一个高度优化且完全可配置的Hybrid-A*算法实现,支持Dubin和Reeds-Shepp运动模型。该算法在考虑机器人的最小转弯半径约束和机器人的完整足迹以避免碰撞的同时,扩展机器人的候选路径。因此,该插件适用于需要进行完整足迹碰撞检查的任意形状机器人。它还可用于需要小心导航以避免翻车、打滑或高速时倾倒的高速机器人。
还有基于状态格的``Smac Lattice planner``插件。该插件通过扩展机器人状态空间,确保路径符合机器人的运动约束。该算法提供了最小控制集,使其能够支持**微分、全向和阿克曼**型车辆的任何形状和尺寸,并且最小程度上需要重新配置。
总结
插件名称 |
支持的机器人类型 |
---|---|
NavFn规划器 |
圆形差分,圆形全向 |
Smac 2D规划器 |
|
Theta Star Planner |
|
Smac混合A*规划器 |
非圆形或圆形阿克曼,非圆形或圆形腿式 |
Smac格栅规划器 |
非圆形差动,非圆形全向 |
示例配置
planner_server:
ros__parameters:
planner_plugins: ['GridBased']
GridBased:
plugin: 'nav2_navfn_planner/NavfnPlanner'
上面显示了规划器服务器的一个示例配置。'planner_plugins'参数接受一个映射的规划器插件名称列表。对于在'planner_plugins'中定义的每个插件命名空间(例如我们的示例中的'GridBased'),我们在'plugin'参数中指定要加载的插件类型。然后,必须在此命名空间中根据要使用的算法指定其他配置。有关更多详细信息,请参阅“配置指南”
控制器服务器
默认的控制器插件是`DWB controller <https://navigation.ros.org/configuration/packages/configuring-dwb-controller.html>`_。它实现了一种改进的动态窗口方法(DWA)算法,通过可配置的插件计算机器人的控制命令。该控制器使用一个生成可能轨迹集的``Trajectory Generator插件``。然后,这些轨迹由一个或多个``Critic插件``进行评估,每个插件根据其配置给出不同的评分。这些``Critic插件``的评分之和确定了轨迹的整体评分。评分最高的轨迹确定了输出的命令速度。
DWB控制器``可以用于**圆形或非圆形差动和全向**机器人。如果给它一个产生考虑到机器人最小曲率约束的可能轨迹集的``轨迹生成插件
,它还可以配置为**阿克曼和腿式**机器人。
另一个控制器服务器插件的例子是`TEB controller <https://github.com/rst-tu-dortmund/teb_local_planner>`_,它是一种MPC最优控制器。它实现了基于执行时间、障碍物距离和符合机器人运动约束的时间弹性带(TEB)方法来优化机器人的轨迹。该控制器可以用于**微分、全向、阿克曼和腿式**机器人。
本节的最后一个示例是 `Regulated Pure Pursuit控制器(RPP)<https://navigation.ros.org/configuration/packages/configuring-regulated-pp.html>`_ 。该控制器实现了一种变体的纯追踪算法,并添加了调节启发式函数来管理碰撞和速度约束。此变体是为满足服务或工业机器人的需求而实现的,并适用于**差动、阿克曼和腿式**机器人。
总结
插件名称 |
支持的机器人类型 |
任务 |
---|---|---|
DWB控制器 |
差动、全向 |
动态障碍物避免 |
TEB 控制器 |
差动、全向、阿克曼、腿式 |
|
RPP 控制器 |
差动、阿克曼、腿式 |
精确路径跟随 |
所有这些算法都适用于圆形和非圆形机器人。
示例配置
controller_server:
ros__parameters:
controller_plugins: ["FollowPath"]
FollowPath:
plugin: "dwb_core::DWBLocalPlanner"
上图显示了控制器服务器的一个示例基本配置。控制器插件的映射名称列表在``controller_plugins``参数中定义。与规划器服务器类似,controller_plugins``中定义的每个命名空间(在我们的示例中为``FollowPath
)必须在``plugin``参数中定义它将使用的插件类型。还必须对命名空间中选择的算法进行其他配置。有关详细信息,请参阅`配置指南<https://navigation.ros.org/configuration/index.html>`_。
注解
规划器和控制器服务器以及Nav2的其他服务器通过生命周期节点在ROS 2中启动。生命周期节点可以更轻松地启动和关闭服务器。生命周期节点管理将在下一个教程中讨论。
结论
在本教程中,我们讨论了Nav2规划器和控制器服务器的角色和配置。总结一下,这些服务器托管一个或多个算法插件的地图,选择插件取决于您的机器人结构和周围环境。我们还描述了一些可用于规划器和控制器服务器的插件,以帮助您确定哪些插件适合您的机器人。最后,我们还提供了一些简单的配置示例,以展示这些插件如何在服务器上实例化。有关所选算法插件的配置参数的详细信息,请参阅其配置指南。