导航相关概念
本节旨在帮助学习机器人的新手熟悉移动机器人导航的概念,尤其是了解和使用Nav2 项目所需的概念。 [校准@haisenzeng]
ROS 2
Nav2使用ROS2作为核心中间件。如果您对此不熟悉,请在继续阅读本文档前访问 ROS2文档 , 对于国内用户推荐看看小鱼的 动手学ROS2课程文档 。 [校准@小鱼]
动作服务器(Action Server)
动作服务器就像在ROS中一样是控制导航等长时间运行任务的常见方式。Nav2软件堆栈更广泛地使用动作(通信机制),并且在某些情况下会缺乏简单的话题接口。作为ROS 2的开发人员,了解动作服务器尤为重要。一些简单的机器人命令(CLI)示例可以在 ROS 2 documementation 中找到。 [校准@haisenzeng]
这个Action服务器类似于服务通信中的Service。客户端会要求服务端完成一些任务,但此任务可能需要很长时间。比如说:移动推土机的铲子或者让机器人向右移动10米。 [校准@小鱼]
在这种情况下,动作服务器和客户端允许我们在另一个进程或线程中调用长时间运行的任务,并为其结果返回一个future对象。此时允许阻塞线程直到动作完成,但是,用户可能希望偶尔检查动作是否完成并继续在客户端线程中处理工作。由于是长时间运行的,动作服务器也会向其客户端提供反馈。该反馈可以是任何东西,并且在ROS中使用具有请求和结果类型的.action文件定义。在推土机示例中,请求可以是一个角度,反馈可以是要移动的剩余角度,而结果则是以结束角度表示的成功或失败的布尔值。在导航示例中,请求可能是一个位姿,反馈可能是已导航的时间和到达目标位姿的距离,而结果则是以成功或失败表示的布尔值。 [校准@haisenzeng]
通过向Action客户端注册回调函数,可以同步的收到反馈和结果。它们也可以通过无意识地从shared future对象中的require信息来获取。两者都需要对客户端节点进行spin来处理回调组。 [校准@小鱼]
在Nav2软件堆栈中使用动作服务器通过 NavigateToPose
动作消息与最高级别的行为树BT导航仪(Navigator)进行通信。它们还用于行为树BT导航仪与后续较小的动作服务器通信,以计算路径规划、控制工作和恢复。每个动作服务器都有自己独特的 nav2_msgs
格式的 .action
类型,用于与服务器进行交互。 [校准@haisenzeng]
生命周期节点和绑定
生命周期 (或被管理的,更正确的) 节点是ROS 2独有的。更多信息可以是 在这里 。它们是包含状态机转换的用于加载和卸载ROS 2服务器的节点。这有助于确定ROS系统启动和关闭的状态是否正常。它还帮助用户根据实际用途(商业或调试)以合理的方式构建他们的程序, [校准@小鱼]
当一个节点启动时,它处于未配置状态,只处理节点的构造函数,该构造函数不应包含任何 ROS 网络设置或参数读取。通过启动系统或提供的生命周期管理器,需要通过配置将节点转换为非活动状态。之后,可以通过激活阶段的转换来激活节点。 [校准@haisenzeng]
这种状态将允许节点处理信息,并完全设置为运行状态。在配置阶段,触发 on_configure()
方法,将设置所有参数、ROS网络接口,以及安全系统,所有动态内存的分配。在激活阶段、触发 on_activate()
方法的将激活ROS网络接口,并设置程序中的任何状态以开始处理信息。 [校准@小鱼]
要关闭(该节点)即过渡到停用需要清理、关闭,并以最终状态结束。网络接口分别在这些阶段被停用并停止处理、释放内存、干净地退出。 [校准@haisenzeng]
生命周期节点框架在整个项目中被广泛使用,所有服务器都使用它。如果可能的话,所有ROS系统最好使用生命周期节点。 [校准@小鱼]
在Nav2中,我们使用 nav2_util LifecycleNode
的包装器。这种包装包装了典型应用的生命周期节点的许多复杂性。它还包括生命周期管理器的连接 bond
,以确保服务器转换后,它也保持活动状态。如果服务器崩溃,它会让生命周期管理器知道并向下过渡系统,以防止严重故障。详见 Eloquent到Foxy [校准@小鱼] 。 [校准@haisenzeng]
行为树
行为树 (BT) 在复杂的机器人任务中变得越来越普遍。它们是待完成任务的树形结构。行为树为定义多步或多状态应用程序创建了一个更具可扩展性和人类可理解性的框架。这与有限状态机 (FSM) 相反,后者可能有几十个状态和数百个状态过渡。一个例子就是踢足球机器人。将足球比赛的逻辑嵌入FSM将具有挑战性,且容易出错因为有许多可能的状态和规则。此外,像从左侧、右侧或中间射门这样的建模选择尤其不清楚。使用行为树则可以为许多行为创建和重用基本原语,像 "kick" "walk" "go to ball" 。更多信息可以在 这本书 找到。强烈建议阅读第1-3章,以更好地理解术语和工作流程。大约需要30分钟。 [校准@小鱼]
Nav2项目使用 BehaviorTree CPP V3 作为行为树库。在 BT Navigator
中,创建了可以构建为行为树的节点插件。将节点插件加载到BT中,并且在解析该行为树的XML文件时,将关联注册的名称。此时,我们可以通过该行为树进行导航。 [校准@haisenzeng]
使用此库的一个原因是它能够加载子树。这意味着可以将Nav2行为树加载到另一个更高级别的BT中,以将此项目用作节点插件。一个例子是在足球比赛中,使用Nav2行为树作为 "go to ball" 节点,将足球检测作为更大任务的一部分。此外,为BT提供了一个 NavigateToPoseAction
插件,因此可以从客户端应用程序通过通常的动作接口调用Nav2软件堆栈。 [校准@haisenzeng]
导航服务器
规划器和控制器是导航任务的核心。恢复器用于使机器人摆脱不良状态或尝试处理各种形式的问题,以使系统具有容错能力。在本节中,将分析有关它们的一般概念及其在Nav2项目中的用途。 [校准@haisenzeng]
规划器,控制器和恢复服务器 [校准@haisenzeng]
该项目中的三个动作服务器是规划器、恢复器和控制器服务器。这些动作服务器用于托管一个地图算法插件,以完成各种任务。它们还托管由该算法插件使用的环境表达,以计算其输出。 [校准@haisenzeng]
这个规划器和控制器服务器将在运行时配置名称 (别名) 和要使用的算法类型。这些类型是已注册的插件库名称,这些名称是任务的别名。一个例子是使用名称为 FollowPath
的DWB控制器,因为它遵循参考路径。在这种情况下,DWB的所有参数都将放置在该命名空间中,例如 FollowPath.<param>
。 [校准@haisenzeng]
然后,这两个服务器会公开与其任务相对应的操作接口。当行为树勾选相应的BT节点时,它将调用操作服务器来处理其任务。该服务器内部的动作服务器回调将通过映射到特定算法的名称 (例如 FollowPath
) 来调用所选算法。这允许用户将行为树中使用的算法抽象为算法类。例如,你可以让 N
插件控制器跟随路径,与充电器对接,避开动态障碍物,或与某个工具进行交互。在同一服务器中拥有所有这些插件允许用户使用单个环境表达对象,因为该对象的复制成本很高。 [校准@haisenzeng]
对于恢复服务器,每个恢复也包含自己的名称,但是,每个插件也将公开其自己的特殊操作服务器。这样做是因为可以创建的各种恢复动作无法共享单个简单的接口。恢复器服务器还包含一个订阅本地成本地图的成本地图订阅者节点,该节点会从控制器服务器接收实时更新以计算其任务。这样做是为了避免为本地成本地图创建多个实例,因为复制本地成本地图在计算上是昂贵的。 [校准@haisenzeng]
或者,由于BT节点是调用操作的简单插件,因此可以创建新的BT节点来调用具有其他操作类型的其他动作服务器。如果可能的话,建议始终使用提供的服务器。如果由于插件或动作接口的原因,需要一个新的服务器,则可以通过该框架来维持。类似于提供的服务器,新服务器应使用新类型和插件接口。需要创建一个新的BT节点插件来调用新的操作服务器 -- 然而,通过广泛使用服务器和插件,Nav2存储库本身不需要分叉或修改。 [校准@haisenzeng]
如果您发现需要一个新的插件库定义或动作类型接口,请提交工单,看看我们是否可以在相同的接口中纠正它。 [校准@haisenzeng]
Planners
规划器的任务是计算完成一些目标函数的路径。根据所选的命名法和算法,该路径也可以称为路线。两个典型示例是计算一个到达目标位姿的规划(例如从当前位置到达一个目标位姿)或者完全覆盖(例如覆盖所有空闲空间的规划)。规划器可以访问全局环境表达和缓存在其中的传感器数据。规划器可以被编写为具有以下功能的工具: [校准@haisenzeng]
计算最短路径
计算完整覆盖路径 [待校准@34]
沿稀疏或预定义路线计算路径 [校准@haisenzeng]
Nav2中规划器的一般任务是计算从当前位置到达目标位姿的一个有效且可能是最佳的路径。但是,有许多受支持的规划类和路线类。 [校准@haisenzeng]
Controllers
控制器,在ROS 1中也被称为局部规划器,是我们跟随全局计算路径或完成局部任务的方法。控制器有权访问局部环境表达,以尝试计算要跟随的基准路径的可行控制工作。许多控制器会将机器人向前投射到空间中,并在每次更新迭代时计算局部可行路径。控制器可以被编写为具有以下功能的工具: [校准@haisenzeng]
跟随路径 [校准@haisenzeng]
使用里程作为与充电桩对接时的参考数据 [校准@小鱼]
登上电梯
与某个工具的接口 [校准@haisenzeng]
在Nav2中,控制器的一般任务是计算一个有效的控制工作以跟随全局规划路径。然而,有多个控制器类和局部规划器类。Nav2项目的目标就是所有控制器算法都可以作为此服务器中的插件,以用于一般研究和产业任务中。 [校准@haisenzeng]
恢复器 [校准@haisenzeng]
恢复器是容错系统的支柱。恢复器的目标是处理系统的未知状况或故障状况并自主处理这些状况。例子包括感知系统中会导致环境表达充满假障碍物的故障。这样就会触发清除成本地图恢复以允许机器人移动。 [校准@haisenzeng]
另一个例子就是机器人由于动态障碍物或控制不佳而卡住。在允许的情况下,倒退或原地旋转会允许机器人从卡住的位置移动到可以成功进行导航的自由空间中。 [校准@haisenzeng]
最后,在完全故障的情况下,可以实施恢复以引起操作员的注意以寻求帮助。这可以通过电子邮件、短信、Slack、Matrix等来完成。 [校准@小鱼]
航点跟随 [校准@haisenzeng]
航点跟随是导航系统的基本功能之一。它会告知系统如何使用导航程序到达多个目的地。 [校准@haisenzeng]
nav2_waypoint_follower
软件包含一个航路点跟踪程序,该程序具有特定任务执行程序的插件接口。如果需要让机器人前往给定位姿并完成像拍照、捡起盒子或等待用户输入之类的特定任务,这会非常有用。这是一个用于展示如何在示例应用程序中使用Nav2的不错的演示应用程序。 [校准@haisenzeng]
但是,该软件包不仅可以用于示例应用程序。关于机器人队管理器/调度器有两种思想流派:哑机器人+智能集中式调度器;智能机器人+哑集中式调度器。 [校准@haisenzeng]
在第一种思想中, nav2_waypoint_follower
软件包足以创造一个产品级的机器人解决方案。由于自主系统/调度器在分配任务时会考虑机器人的姿势、电池电量、当前任务等因素,机器人上的应用程序只需要关心手头的任务,而不用关心完成系统要求任务的其他复杂因素。在这种情况下,应该将发送至航点跟随者的请求视为1个工作单元(例如,仓库中的1次拣货、1个安全巡逻循环、1个过道等)来执行任务,然后返回给调度器以进行下一个任务或者要求充电。在这种思想流派中,航点跟随应用程序只是导航软件堆栈之上和系统自主应用程序之下的一个步骤。 [校准@haisenzeng]
在第二种思想中, nav2_waypoint_follower
软件包是一个不错的示例应用程序/概念证明,但确实需要机器人上的航点跟踪/自主系统来承担更多任务以制定健壮的解决方案。在这种情况下,应该使用 nav2_behavior_tree
软件包创建自定义应用程序级别的行为树,以使用导航来完成任务。这可以包含子树,例如在任务中检查充电状态以返回停泊坞,或者在更复杂的任务中处理1个以上的工作单元。很快,将会有一个 nav2_bt_waypoint_follower
(名称有待调整),它将允许用户更容易地创建此应用程序。在这个思想流派中,航点跟随应用程序与自主系统的联系更加紧密,或者在很多情况下,航点跟随应用程序就是自主系统本身。 [校准@haisenzeng]
这两种思想流派并不能简单地说谁比谁更好,谁更好很大程度上取决于机器人正在完成何种任务、处于何种类型的环境中以及有何种可用的云资源。通常,对于既定的业务案例,这种区别非常明显。 [校准@haisenzeng]
状态估计
根据ROS社区标准,在导航项目中,需要提供两个主要的坐标转换。 map
到 odom
的坐标变换由定位系统 (定位,建图,SLAM)提供, odom
到 base_link
的坐标转换由里程计系统提供。 [校准@haisenzeng]
备注
无需在机器人上使用LIDAR即可使用导航系统。不需要使用基于激光雷达的防撞、定位或SLAM系统。但是,Nav2确实可以提供说明和支持使用激光雷达对这些系统进行尝试和真实实现。使用基于视觉或深度传感器的定位系统和使用其他传感器来避免碰撞可以同样成功。唯一的要求就是在选择具体实现方式时遵循以下标准。 [校准@haisenzeng]
标准
REP 105 定义了导航和更大的ROS生态系统所需的框架和约定。应始终遵循这些约定,以利用社区中丰富的定位、里程计和SLAM项目。 [校准@haisenzeng]
简而言之,REP-105至少必须为机器人建造一个包含``map`` -> odom
-> base_link
-> [sensor frames]
的完整 的TF树。TF2是 ROS 2中的时变坐标变换库,Nav2使用TF2来表达和获取时间同步的坐标变换。全球定位系统 (GPS、SLAM、动作捕捉Motion Capture) 的工作是至少要提供 map
-> odom
的坐标转换。然后,里程计系统的作用是提供 odom
-> base_link
的坐标转化。关于 base_link
的其余坐标转换应该是静态的,并应在 URDF 中定义。 [校准@haisenzeng]
全局定位: 定位与SLAM
全局定位系统 (GPS、SLAM、运动捕捉) 的工作是至少提供 map
-> odom
的坐标转换。Nav2项目提供的 amcl
是一种基于粒子过滤器的自适应蒙特卡罗定位技术,用于静态地图的定位。Nav2还提供用于定位和生成静态映射的SLAM工具箱作为默认的SLAM算法。 [校准@haisenzeng]
这些方法还可能产生其他输出,包括位置话题、地图或其他元数据,但它们必须提供该转换才能有效。使用机器人定位可以将多种定位方法融合在一起,下面将详细讨论。 [校准@小鱼]
里程计
里程计系统的作用是提供 odom
-> base_link
的坐标转换。里程计可以来自许多数据源,包括激光雷达、车轮编码器、VIO和IMUs。里程计的目标是提供基于机器人运动的平滑和连续的局部坐标系。全局定位系统会相对全局坐标的坐标变换进行更新,以解决里程计的漂移问题。 [校准@haisenzeng]
这个 Robot Localization 通常用于这种融合。它将采用各种类型的 N
个传感器,并为TF和话题提供连续平滑的里程计。一个典型的移动机器人装置可能有来自车轮编码器或IMUs的里程计以及融合在这个工作区内的视觉。 [校准@haisenzeng]
这样平滑输出就可用于精确运动的航行位置推算和在全局位置更新之间准确地更新机器人的位置。 [校准@haisenzeng]
环境表达
环境表征是机器人感知环境的方式。它还充当各种算法和数据源的中心定位工具,以将它们的信息组合到一个空间中。这样,控制器、规划器和恢复器就可以使用该空间来安全有效地计算它们的任务。 [校准@haisenzeng]
成本地图和图层
当前的环境表达是一个代价地图。代价地图是包含来自未知、空闲、占用或膨胀成本的单元格的规则2D单元格网格。然后该代价地图被寻找以计算全局计划或采样以计算局部控制工作。 [校准@BruceXing]
各种成本地图图层被实现为pluginlib插件,以将信息缓冲到成本地图中。这包括来自LIDAR、RADAR、声纳、深度传感器、图像传感器等的信息。最好在传感器数据输入到层本地图之前进行处理,但这取决于开发人员。 [校准@haisenzeng]
可以使用相机或深度传感器创建代价地图层来检测和跟踪场景中的障碍物,以避免碰撞。此外,可以创建层来基于一些规则或启发式算法来改变基础成本图。最后,它们可用于将实时数据缓冲到2D或3D世界中,以进行障碍物的二值化标记。 [校准@haisenzeng]
成本地图过滤器
想象一下,您正在注释地图文件 (或任何图像文件),以便根据注释地图中的位置执行特定操作。记/注释的示例可以是将某些区域排除在外以避免在这些区域内进行路径规划,或者让某些像素属于标记区域中的最大速度。这种带注释的地图被称为 "filter mask" 。就像覆盖在某个表面上的掩码一样,过滤器掩码的大小、位置和比例尺可以与主地图相同,也可以不同。过滤器掩码的主要目标是提供在地图上进行标记的能力,以标记具有某些附加功能或行为变化的区域。 [校准@haisenzeng]
代价地图过滤器是基于成本地图图层的方法,可以将过滤器掩码中注释的空间相关行为变化应用到Nav2软件堆栈中。代价地图过滤器是作为成本地图插件实现的。这些插件之所以被称为 "filters" ,是因为它们会通过过滤器掩码上标记的空间注释对代价地图进行过滤。为了制作过滤后的成本地图并改变机器人在注释区域的行为,过滤器插件会读取来自过滤器掩码的数据。该数据在过滤器空间中被线性变换为特征图。有了这个变换后的特征图以及地图/代价地图、任何传感器数据和机器人当前坐标,过滤器就可以更新底层代价地图,并根据机器人的位置改变机器人的行为。例如,通过使用代价地图过滤器可以实现以下功能: [校准@albert]
机器人永远不会进入的禁区域/安全区域。 [校准@小鱼]
Speed restriction areas. Maximum speed of robots going inside those areas will be limited.
机器人在工业环境和仓库中移动的首选通道。 [校准@haisenzeng]
Other Forms
存在各种其他形式的环境表征。包括: [校准@haisenzeng]
梯度图,类似于成本地图,但梯度图会表达表面梯度以检查可穿越性 [校准@haisenzeng]
3D代价地图,以3D形式表示空间,但这样就也需要3D规划和碰撞检测 [校准@小鱼]
网格图,类似于梯度图,但具有多个角度的表面网格 [校准@haisenzeng]
"Vector space" ,接收传感器信息并使用机器学习算法来检测要跟踪的单个物品和位置,而不是对离散点进行缓冲区计算。。 [校准@haisenzeng]