Nav2导航概念

Navigation Concepts

        这个页面旨在帮助新的机器人技术人员熟悉移动机器人导航的概念,特别是涉及到理解和参与这个项目所需的概念。

ROS2

        ROS 2是Nav2所使用的核心中间件。如果您对此不熟悉,请在继续之前查阅ROS 2文档。

Action Server        

        就像在ROS中一样,动作服务器是控制长时间运行任务(如导航)的常见方式。这个堆栈更广泛地使用动作,并且在某些情况下,没有一个简单的话题接口。作为ROS 2开发人员,了解动作服务器比在ROS中更为重要。ROS 2文档中可以找到一些简单的CLI示例。

        动作服务器类似于典型的服务器。客户端将请求完成某项任务,但这个任务可能需要很长时间。例如,将挖掘机上的铲子抬起或要求机器人向右移动10米。

        在这种情况下,动作服务器和客户端允许我们在另一个进程或线程中调用长时间运行的任务,并返回其结果的future。此时阻塞直到动作完成是允许的,然而,您可能希望偶尔检查动作是否完成,并继续在客户端线程中处理工作。由于它是长时间运行的,动作服务器还将向其客户端提供反馈。此反馈可以是任何内容,并且在ROS .action文件中与请求和结果类型一起定义。在挖掘机示例中,请求可以是一个角度,反馈可以是剩余移动的角度,结果是成功或失败的布尔值与结束角度。在导航示例中,请求可能是一个位置,反馈可以是导航时间和到目标的距离,结果是成功的布尔值。

        通过在动作客户端中注册回调函数,可以同步收集反馈和结果。也可以通过异步地从共享future对象请求信息来收集。两者都需要旋转客户端节点以处理回调组。

        在这个堆栈中,动作服务器用于通过NavigateToPose动作消息与最高级别的行为树(BT)导航器进行通信。它们还用于BT导航器与后续较小的动作服务器进行通信,以计算计划、控制工作和恢复。它们各自在nav2_msgs中具有自己独特的.action类型,用于与服务器进行交互。

Lifecycle Nodes and Bond

        生命周期(称为“或托管”)节点是ROS 2中独特的概念。更多信息可以在这里找到。它们是包含状态机转换的节点,用于ROS 2服务器的启动和关闭。这有助于在系统启动和关闭时确保ROS系统的确定性行为。它还帮助用户以合理的方式为商业用途和调试结构化其程序

        当节点启动时,它处于未配置状态,仅处理节点的构造函数,该函数不应包含任何ROS网络设置或参数读取。通过启动系统或提供的生命周期管理器,需要将节点通过配置转换为非活动状态。然后可以通过激活阶段激活节点。

这段描述了ROS 2中生命周期节点的状态转换过程。当节点开始运行时,它处于未配置状态。在这个阶段,节点只会执行其构造函数,而不会执行任何涉及ROS网络设置或参数读取的操作。随后,通过启动系统或提供的生命周期管理器,节点需要通过配置转换到非活动状态。一旦完成配置,节点可以进入激活阶段,使节点变为活动状态,从而开始处理信息和任务。这个过程描述了节点在启动过程中经历的几个状态转换,以确保在启动期间不会执行网络设置等操作,直到节点准备好处理信息为止。

        此状态将允许节点处理信息并完全设置为运行。配置阶段将触发 on_configure() 方法,设置所有参数、ROS网络接口,以及对于安全系统来说,所有动态分配的内存。激活阶段将触发 on_activate() 方法,激活ROS网络接口,并设置程序中的任何状态以开始处理信息。

这段描述了节点在配置和激活阶段所经历的情况。当节点处于配置阶段时,会触发 on_configure() 方法,这一阶段用于设置节点的所有参数、ROS网络接口,并且对于安全系统,可能还会涉及到所有动态分配的内存的设置。这个阶段旨在确保节点已经准备好运行并且具备所需的配置和资源。

接下来是激活阶段,当节点进入此阶段时,会触发 on_activate() 方法。在这个阶段,ROS网络接口会被激活,节点会设置程序中的各种状态,以便开始处理信息。这意味着节点已经准备好接收数据、处理任务并与其他ROS节点通信。因此,配置和激活阶段确保了节点在启动后的正确配置和准备工作。

        要关闭,我们转换为非激活状态,进行清理、关闭,并最终处于已完成状态。在这些阶段中,网络接口被停用并停止处理,释放内存,干净地退出。

        生命周期节点框架在整个项目中广泛使用,所有服务器都在使用它。如果可能的话,对于所有ROS系统来说,最好使用生命周期节点。

        在Nav2中,我们使用 LifecycleNodes 的包装器,nav2_util LifecycleNode。这个包装器为典型应用封装了 LifecycleNodes 的许多复杂性。它还包括一个 bond 连接,用于与生命周期管理器进行连接,确保服务器在转换完成后仍然保持活动状态。如果服务器崩溃,它会告知生命周期管理器,并将系统转换为下线状态,以防止严重故障。详情请参阅 Eloquent 到 Foxy。

Behavior Trees

        行为树(Behavior Trees,BT)在复杂的机器人任务中变得越来越常见。它们是一种任务完成的树状结构。相对于有着数十个状态和数百个转换的有限状态机(FSM),行为树为定义多步骤或多状态应用程序提供了一个更具可扩展性和人类可理解性的框架。例如,一个踢足球的机器人。将足球比赛的逻辑嵌入到有限状态机中可能会面临挑战,并且容易出错,因为可能存在多个状态和规则。此外,像选择从左边、右边或中间射门的建模选择尤其不清晰。使用行为树,可以创建和重用基本原语,如“踢球”、“行走”、“去球”,用于许多不同的行为。更多信息可以在这本书中找到。我强烈推荐阅读第1至第3章,以充分理解术语和工作流程。只需大约30分钟。

        当涉及到像踢足球这样的机器人任务时,使用行为树(Behavior Trees,BT)可以更清晰地定义和管理机器人的行为。在这个例子中,想象一个机器人在足球比赛中。传统的方法是使用有限状态机(FSM)来控制机器人的行为,但是如果将足球比赛的逻辑直接嵌入到有限状态机中,可能会变得非常复杂和难以管理。

        例如,要在有限状态机中表示机器人选择从左边、右边或中间射门,可能需要许多状态和规则。在FSM中,可能需要为机器人的各种状态和行为创建多个状态,比如"移动到左边"、"移动到右边"、"移动到中间"、"准备踢球"、"踢球"等等。同时,必须定义状态之间的转换规则,比如从"移动到左边"状态转换到"准备踢球"状态,然后再到"踢球"状态。这种建模方式可能会导致状态的混乱和复杂性,难以理解和管理。

        然而,使用行为树可以更简单地定义一些基本行为,比如“踢球”、“行走”、“去球”,然后以更模块化、可重用的方式组合这些行为,以完成更复杂的任务,如在足球比赛中踢球。

        行为树的结构使得任务分解和重组更容易,每个节点代表一个基本的行为,比如“踢球”或“前往球”。这些基本行为可以根据需要组合成更复杂的行为序列,比如先移动到球的位置,然后踢球。这种方式更加直观和可扩展,使得机器人的行为可以更灵活地适应不同的情况,而不需要管理大量复杂的状态和规则。

        行为树为导航逻辑提供了正式的结构,可以用于创建复杂系统,并且可以使用先进工具验证和验证其正确性。将应用程序逻辑集中在行为树中,并具有独立的任务服务器(仅通过树通信数据),可以进行正式分析。

        在此项目中,我们使用BehaviorTree CPP V3作为行为树库。我们创建节点插件,可以构建成树,在BT导航器中使用。节点插件加载到BT中,当树的XML文件被解析时,已注册的名称会被关联。此时,我们可以遍历整个行为树来进行导航。

        使用此库的一个原因是其能够加载子树。这意味着Nav2行为树可以加载到另一个更高级别的BT中,以将此项目作为节点插件使用。例如,在踢足球中,可以将Nav2行为树作为“去球”的节点,与球检测一起作为较大任务的一部分。此外,我们还为BT提供了NavigateToPoseAction插件(以及其他插件),因此Nav2堆栈可以通过常规动作接口从客户端应用程序调用。

        其他系统也可以用于设计复杂的自主行为,例如分层有限状态机(HFSM)。选择行为树是因为它在机器人和相关行业中的流行以及用户需求很大。然而,由于Nav2的独立任务服务器性质,未来提供 nav2_hfsm_navigator 软件包并不困难,但取决于兴趣和贡献情况。

Navigation Servers

        规划器(Planners)和控制器(Controllers)是导航任务的核心。恢复(Recoveries)用于将机器人从困境中解救出来或尝试解决各种问题,使系统具有容错性。平滑器(Smoothers)可以用于进一步提高规划路径的质量。在本节中,将分析它们的一般概念以及它们在该项目中的用途。

Planner, Controller, Smoother and Recovery Servers

        这个项目中有四个动作服务器:规划器(planner)、行为(behavior)、平滑器(smoother)和控制器(controller)。

  1. 规划器(Planner):决定机器人应该移动到哪里。比如,告诉机器人它应该去哪里充电或避开障碍物。
  2. 行为(Behavior):代表机器人的实际行为,例如移动、停止、充电等。
  3. 平滑器(Smoother):调整机器人的移动路径,使其更加平滑和有效。
  4. 控制器(Controller):负责机器人运动的方式,例如根据路径移动或与外部设备交互。

        这些动作服务器用于托管一系列算法插件,以完成各种任务。它们还托管了算法插件所使用的环境表示。

       这些服务器充当宿主,用于容纳各种算法插件,这些插件用于完成不同的任务,比如路径规划、控制、平滑移动等。这些服务器还负责管理这些算法插件所需要的环境表示(environmental representation),这表示了机器人所处环境的信息,可能包括地图数据、障碍物信息等,以便算法插件进行计算和决策。

        规划器、平滑器和控制器服务器将在运行时配置使用的算法名称(别名)和类型。这些类型是已注册的 pluginlib 名称,名称是任务的别名。例如,使用名称 FollowPath 的 DWB 控制器,因为它会沿着参考路径移动。在这种情况下,所有 DWB 的参数将放置在该命名空间下,例如 FollowPath.<param>

在这个项目中,有一些名为规划器(planner)、平滑器(smoother)和控制器(controller)的服务器。它们需要在运行时决定使用哪种算法来完成特定的任务。

比如,有一个控制器叫做 FollowPath,它的作用是让机器人沿着指定的路径移动。当我们使用这个控制器时,它会用到一个叫做 DWB 的算法。这个名为 FollowPath 的控制器会有一些特定的参数,比如速度、转弯半径等等。这些参数被放置在 FollowPath 的命名空间下,以便在运行时对这个控制器进行配置和使用。

总的来说,这些服务器根据任务名称来配置并使用不同的算法,并且在特定的命名空间下管理相关参数。

        这三个服务器会公开与其任务对应的动作接口。当行为树执行相应的 BT(Behavior Tree)节点时,它将调用动作服务器来处理其任务。服务器内部的动作服务器回调将根据其名称(例如 FollowPath)调用选择的算法,该名称映射到特定的算法。这允许用户将用于行为树中的算法抽象成算法类别。例如,您可以有 N 个插件控制器来跟随路径、对接充电器、避开动态障碍物或与工具进行交互。在同一个服务器中拥有所有这些插件,使用户能够使用单个环境表示对象,避免了昂贵的重复对象。

        这段描述涉及行为树(Behavior Tree)与动作服务器之间的交互。在这个项目中,规划器、平滑器和控制器这三个服务器会公开特定任务对应的动作接口。

        当行为树执行相应的行为树节点时,它会调用相应的动作服务器来处理特定的任务。例如,假设有一个名为 FollowPath 的行为树节点,它需要让机器人按照特定路径移动。这个节点会调用控制器服务器中的动作接口,比如可能会调用名为 FollowPath 的动作接口。这个名为 FollowPath 的动作接口会映射到一个特定的算法,用于处理机器人按照路径移动的任务。

         这种设计允许用户将用于行为树的各种任务抽象成不同的算法类别。比如,可以有多个插件控制器,用于不同的任务,比如路径跟随、与充电器对接、避开动态障碍物等。将这些插件控制器放置在同一个服务器中有利于用户使用单一的环境表示对象,并避免了重复创建昂贵的对象。

        对于行为服务器,每个行为还包含其自己的名称,但每个插件还将公开其自己的特殊动作服务器。这是因为可能会创建多种不同行为动作,这些动作无法共享单个简单接口。行为服务器还包含一个成本地图订阅器,接收来自控制器服务器的实时更新,以计算其任务。我们这样做是为了避免多个实例的局部成本地图,这些成本地图在计算上复杂且昂贵。

        另外,由于 BT 节点是调用动作的简单插件,可以创建新的 BT 节点来调用其他具有不同动作类型的动作服务器。建议在可能的情况下始终使用提供的服务器。如果由于插件或动作接口的原因需要新的服务器,框架可以支持。新服务器应使用新的类型和插件接口,类似于提供的服务器。需要创建一个新的 BT 节点插件来调用新的动作服务器,但是通过充分利用服务器和插件,无需在 Nav2 存储库本身进行分支或修改。

        如果您发现需要新的接口来定义 pluginlib 或动作类型,请提交一个工单,并查看是否可以在相同的接口中进行更正。

        动作服务器:在Nav2中有四种动作服务器,例如规划器、平滑器和行为服务器都是动作服务器的例子。它们提供了动作接口,用于处理特定任务的请求

        控制器服务器:控制器服务器负责机器人执行任务的方式,它通常会使用特定的算法来指导机器人执行特定的动作或行为。在Nav2中,控制器服务器可能会调用动作服务器来获取特定任务的执行方式,比如使用 FollowPath 控制器来指导机器人按照路径移动。

Planners规划器

        规划器的任务是计算一条路径以完成某个目标函数。根据所选的命名法和算法,这条路径也可以被称为路线。两个典型的例子是计算到达目标的路径(例如,从当前位置到目标位置)或完成区域的覆盖(例如,规划覆盖所有自由空间的路径)。规划器可以编写用于:

  • 计算最短路径
  • 计算完整覆盖路径
  • 沿着稀疏或预定义路线计算路径

        在Nav2中,规划器的一般任务是从当前姿势到目标姿势计算出一条有效且可能是最优的路径。然而,支持许多类别的计划和路线存在。规划器利用全局环境表示和传感器数据来计算路径,以支持机器人在不同任务和场景下的移动和操作。

Controllers控制器

        控制器,也在ROS 1中被称为局部规划器,是用于跟随全局计算路径或完成局部任务的方式(用于机器人遵循全局规划路径或完成特定局部任务的组件,控制器是导航系统的一部分,它负责根据全局规划器提供的路径,在机器人运动过程中实时计算出执行动作的方式)。控制器将会访问局部环境表示,以尝试计算基座遵循的可行控制努力(控制器利用局部环境信息计算机器人实际执行的控制动作,以满足全局规划的要求)。许多控制器会在每次更新迭代时将机器人在空间中投影,并计算局部可行路径。控制器可以被设计用于:

  • 跟随路径
  • 利用里程计框架中的检测器与充电站对接
  • 上电梯
  • 与工具进行接口交互

        在Nav2中,控制器的一般任务是计算有效的控制努力,以遵循全局规划。(在Nav2项目中,控制器的任务是计算适合的控制动作,让机器人按照全局规划的路径行动)然而,存在许多种类的控制器和局部规划器。该项目的目标是,所有控制器算法都可以作为这个服务器的插件(就像积木一样可以灵活组合和替换。这些控制器代表着不同的机器人行为,比如遵循路径、对接充电站或执行其他任务),用于常见的研究和工业任务。

Behaviors行为服务器

        恢复行为是容错系统的重要组成部分。恢复的目标是处理系统中的未知或故障条件,并自主处理这些条件。例如,感知系统故障导致环境表示充满虚假障碍物,这时清空代价地图恢复行为会被触发,让机器人能够移动。

        另一个例子是,如果机器人因为动态障碍物或控制不良而被卡住,如果允许的话,可以进行后退或原地旋转,让机器人从困难的位置移动到自由空间中,以便成功导航。

        最后,在系统完全失败的情况下,可能会实现一个恢复行为来请求操作人员的帮助。这可以通过电子邮件、短信、Slack、Matrix等方式进行。

        需要注意的是,行为服务器可以保存任何行为来共享对昂贵资源(如代价地图或TF缓冲区)的访问权限,不仅限于恢复行为。每种行为可能都有自己的API接口。

        这句话指出行为服务器的作用不仅限于存储恢复行为,还可以存储其他行为,这些行为可能需要共享对于昂贵资源(比如代价地图或变换缓存)的访问权限。每个不同的行为可能都有自己独特的应用程序编程接口(API)。

        这意味着行为服务器在Nav2项目中是一个通用的容器,可以存储和管理各种类型的行为。这些行为不仅限于恢复行为,还可以包括例如路径跟随、避障、导航等各种行为。行为服务器提供了对共享资源的访问控制和管理,使得不同的行为能够有效地共享和利用这些资源,以便机器人能够更好地执行其任务。

Smoothers

        路径搜索器搜索出的路径通常在优化标准上与实际相比存在一定程度的降低,因此额外的路径优化通常会带来好处。平滑器被引入用于此目的,通常负责减少路径的不平整和平滑突然的旋转,同时也能增加与障碍物和高成本区域的距离(使其更远离障碍物和高成本区域,以提高路径的安全性和效率),因为平滑器可以访问全局环境表示。

        当结合不同具有不同平滑器的规划器或需要特定的平滑控制时,使用单独的平滑器而不是作为规划器一部分的平滑器(“作为规划器的一部分”指的是在规划器本身内部包含了平滑路径的功能或模块。有些规划器可能会包含路径平滑的功能,但有些则可能不包含,而是使用单独的平滑器来对路径进行处理)是有利的,比如仅对路径的特定部分进行平滑。

        Nav2中平滑器的一般任务是接收路径并返回其改进版本。然而,对于不同的输入路径,存在不同的改进标准和获取方法,因此可以注册多种平滑器在此服务器中。

Robot Footprints机器人占地面积

        这个描述在讨论成本地图(cost maps)时提到,我们可以将机器人的占地面积设置为一个半径为机器人半径(robot_radius)的圆形,或者是一个表示任意多边形的点集向量(footprint),如果机器人的形状是非圆形的话。这个占地面积可以通过成本地图的 ~/footprint 主题进行动态调整,随着机器人状态的变化而更新,比如附加装置的移动、提起货物托盘或其他调整机器人形状的动作。这个多边形随后会自动被规划器和控制器使用(这对规划器和控制器是很重要的,因为它们需要考虑机器人的实际形状来规划路径或者避障)。

Waypoint Following航点跟随

航点跟随是导航系统的基本功能之一。它告诉系统如何使用导航到达多个目的地。

nav2_waypoint_follower 包含一个航点跟随程序,具有针对特定任务执行者的插件接口。这对于需要到达指定位置并完成特定任务,比如拍照、拾取货物或等待用户输入,非常有用。它是一个演示应用程序,展示了如何在示例应用中使用 Nav2。

nav2_waypoint_follower 这个软件包,其中包含了一个用于航点跟随的程序。它具有一种针对特定任务执行者的插件接口,可以实现到达特定位置并执行特定任务的功能,例如拍照、拾取货物或等待用户输入。

然而,它不仅仅是一个示例应用。在舰队管理者/调度者中有两种思路:

  1. 愚蠢的机器人;聪明的集中式调度器
  2. 聪明的机器人;愚蠢的集中式调度器

在第一种情况下,nav2_waypoint_follower 完全足够创建一个成熟的在机器人上运行的解决方案。因为自主系统/调度器会考虑机器人的姿态、电池电量、当前任务等因素来分配任务,机器人上的应用只需要关注当前任务而不是系统中的其他复杂性。在这种情况下,你可以将航点跟随应用视为 1 个工作单元(例如仓库中的 1 个拾取任务、1 次巡逻、1 个通道等),完成一个任务然后返回给调度器处理下一个任务或充电请求。在这个思路中,航点跟随应用程序位于导航之上和系统自主性应用之下。

将航点跟随应用视为执行一个单一任务的单元,比如在仓库中执行一个拾取任务、巡逻一次、或者沿着一个通道移动。当完成一个任务后,应用会将结果返回给调度器,然后等待下一个任务或充电请求。在这种理念下,航点跟随应用程序相当于处于导航系统之上,但低于系统自主性应用的层级。也就是说,它不涉及对机器人的完全自主决策,而是将机器人引导至预定目的地并执行特定任务,然后将结果报告给更高级别的系统。

在第二种情况下,nav2_waypoint_follower 是一个不错的示例应用程序/概念验证,但是你真的需要在机器人上的航点跟随/自主系统更具权威性,以实现更稳健的解决方案。在这种情况下,你应该使用 nav2_behavior_tree 包,使用导航创建一个自定义的应用级行为树来完成任务。这可能包括子树,比如在任务执行过程中检查充电状态以返回充电站,或者处理更复杂的多个工作单元。很快,将会有一个 nav2_bt_waypoint_follower(名称可能会调整)来更轻松地创建这个应用程序。在这个思路中,航点跟随应用程序更密切地与系统自主性相关,或者在许多情况下,就是系统自主性。

  1. 愚蠢的机器人;聪明的集中式调度器:这种方法下,机器人本身的智能较低,主要的智能决策集中在中央调度器上。nav2_waypoint_follower 在这里可以作为一个成熟的、适用于生产环境的解决方案。因为调度器已经考虑了机器人的状态、电量、当前任务等因素,所以机器人只需专注于当前的任务,而不需要处理系统中其他复杂性。航点跟随应用被视为一个任务单位,完成任务后返回给调度器处理下一个任务或充电请求。在这种思路中,航点跟随应用处于导航之上,但低于系统自主性应用。

  2. 聪明的机器人;愚蠢的集中式调度器:这种方法中,机器人本身具有更多的智能和决策能力,而集中式调度器的作用较小。nav2_waypoint_follower 在这里被视为一个示例应用/概念验证,机器人上的自主性/航点跟随系统承担更大的责任以实现更强大的解决方案。机器人上使用 nav2_behavior_tree 包来创建自定义的应用级行为树,使用导航系统完成任务,包括诸如在任务执行过程中检查充电状态、处理更复杂的多个工作单元等功能。

两者都没有优劣之分,而是高度依赖于机器人完成的任务类型、环境类型以及可用的云资源。对于特定的业务情况,通常这种区分非常明显。

nav2_waypoint_follower 还支持 GPS 航点跟随,当机器人本地化由 robot_localization 使用 navsat_transform 节点提供时,但也可以由 Fuse 或其他许多来源提供。nav2_waypoint_follower 内部有一个名为 /follow_gps_waypoints 的动作服务器,可以直接接收用 GPS 坐标表示的目标,在全局坐标系中将其转换为笛卡尔坐标系下的目标点,并执行这些笛卡尔坐标系下的航点。(允许直接使用 GPS 坐标来指定目标点,并执行这些目标点的航行任务

State Estimation

        在导航项目中,根据社区标准,需要提供两个主要的转换。地图到里程计(map to odom)的转换由定位系统(定位、制图、SLAM)提供,而里程计到基础链接(odom to base_link)由里程计系统提供。

使用导航系统并不需要在机器人上使用激光雷达(LIDAR)。也没有要求使用基于激光雷达的避障、定位或SLAM。但是,我们提供了使用激光雷达的已验证实践的说明和支持。同样可以使用视觉或基于深度的定位系统,并利用其他传感器进行避障,取得同样的成功。唯一的要求是使用你选择的实现方式遵循下面的标准。

Standards

        REP 105定义了导航和ROS生态系统所需的坐标系和约定。在整个社区提供的丰富定位、里程计和SLAM项目中,应始终遵循这些约定。

        简而言之,REP-105要求至少构建一个TF树,其中包含机器人的完整的map -> odom -> base_link -> [传感器坐标系]。TF2是ROS 2中用于表示和获取时间同步变换的时变转换库。全局定位系统(GPS、SLAM、运动捕捉)的最低要求是提供 map -> odom 转换。然后里程计系统负责提供 odom -> base_link 转换。相对于 base_link 的其余转换应该是静态的,并在您的URDF中定义。

Global Positioning: Localization and SLAM全球定位系统

        全球定位系统(GPS、SLAM、运动捕捉)的最低要求是提供 map -> odom 转换。我们提供了基于粒子滤波的自适应蒙特卡洛定位技术(amcl)用于在静态地图中进行定位。我们还提供 SLAM 工具包作为默认的 SLAM 算法,用于定位和生成静态地图。

        这些方法可能会产生其他输出,包括位置话题、地图或其他元数据,但它们必须提供该转换才能被视为有效。可以使用机器人定位将多个定位方法融合在一起,下面会更详细地讨论这个话题。

Odometry

        里程计系统的角色是提供 odom -> base_link 转换。里程计可以来自多个来源,包括激光雷达、雷达、轮式编码器、视觉惯性里程计(VIO)和惯性测量单元(IMU)。里程计的目标是提供基于机器人运动的平滑连续的局部坐标系全球定位系统会更新相对于全局坐标系的变换,以校正里程计的漂移

        通常使用机器人定位进行这种融合。它将接收多种类型的 N 个传感器,并提供连续平滑的里程计给 TF 和一个话题。典型的移动机器人设置可能通过这种方式融合来自轮式编码器、IMU 和视觉的里程计信息。

        然后,这个平滑的输出可以用于推算精确的运动和在全局位置更新之间准确地更新机器人的位置。

Environmental Representation

        环境表示是机器人感知其环境的方式。它还充当着各种算法和数据源集成信息的中心定位点,将它们整合到一个单一的空间中。这个空间随后被控制器、规划器和恢复模块使用,以安全有效的方式计算它们的任务。

        它允许机器人整合和处理来自不同传感器和算法的信息,为控制、规划和恢复等任务提供必要的数据和环境信息。这个表示对机器人执行任务非常重要,因为它提供了关于周围环境的关键信息。

Costmaps and Layers成本地图和层

        当前的环境表示是成本地图。成本地图是一个常规的二维单元格网格,其中包含未知、自由、占用或膨胀成本。然后搜索这个成本地图以计算全局路径,或者对其进行采样以计算局部控制努力。

        各种成本地图层被实现为 pluginlib 插件,用于将信息缓冲到成本地图中。这包括来自激光雷达、雷达、声纳、深度图像等的信息。在将数据输入成本地图层之前对传感器数据进行处理可能是明智的,但这取决于开发人员。

        成本地图层可以被创建用于使用摄像头或深度传感器检测和跟踪场景中的障碍物以进行避障。此外,可以根据某些规则或启发式算法来创建层,从而算法性地更改底层的成本地图。最后,它们可以用于将实时数据缓冲到二维或三维世界中进行二进制障碍物标记。

        它们可以针对避障,利用摄像头或深度传感器来侦测和追踪场景中的障碍物。另外,这些层可以根据特定规则或启发式算法来修改底层成本地图,也可以用于将实时数据缓冲到二维或三维地图中进行二进制障碍物标记。

Costmap Filters成本地图过滤器

        假设你正在为地图文件(或任何图像文件)进行标注,以便根据标注地点发生特定的动作(可以在地图上标注出特定区域,并将这些区域内机器人的移动速度限制为某个预先设定的最高速度)。标注/注释的示例可能是禁止区域,以避免规划路径,或者将像素标记为特定区域的最高速度。这些被注释的地图被称为“过滤器蒙版”。就像将蒙版覆盖在表面上一样,它可以与主地图大小、位置和比例相同,也可以不同。过滤器蒙版的主要目标是能够在地图上标记出一些附加功能或行为变化的区域。

        成本地图过滤器是一种基于成本地图层的方法(用于在导航系统中处理与空间相关的行为变化),可以将空间相关的行为变化(在过滤器蒙版上进行了标记)应用到 Nav2 栈中。成本地图过滤器被实现为成本地图插件。这些插件称为“过滤器”,因为它们根据过滤器蒙版上的空间标注对成本地图进行过滤。为了创建一个经过过滤的成本地图并且在被标注区域内改变机器人的行为,过滤器插件读取来自过滤器蒙版的数据。这些数据线性转换成为一个特征图在过滤器空间中。有了这个转换后的特征图,再加上地图/成本地图、任何传感器数据和当前机器人坐标,过滤器可以更新底层成本地图,并根据机器人所处位置改变其行为。例如,通过使用成本地图过滤器可以实现以下功能:

        禁止区/安全区,机器人永远不会进入这些区域。

        速度限制区域,进入这些区域的机器人的最高速度会受到限制。

        工业环境和仓库中机器人移动的优选车道。

        举例来说,利用成本地图过滤器,可以实现一些功能,比如标记特定区域为禁止区域,限制机器人在这些区域内的移动,或者标记一些区域为特定的速度限制区域,控制机器人在这些区域内的移动速度。

        过滤器通过处理过滤器蒙版中的信息,能够对原始的成本地图进行更新。过滤器蒙版包含了关于地图特定区域的信息,例如限制区域、禁止区域或者其他特定行为或属性的标记。过滤器使用这些信息来修改成本地图,使其包含额外的特征或行为。这种更新后的成本地图会考虑到蒙版上标注的特定空间信息,并且会影响机器人在这些区域的行为

Other Forms其他形式

存在各种其他形式的环境表示。其中包括:

梯度地图,类似于成本地图,但表示表面梯度以检查可通过性。(其主要目的是表示地表或环境表面的梯度变化情况。梯度是指在空间中变化最快的方向和速率。在梯度地图中,每个位置的值反映了表面梯度的方向和大小。这种表示可以用于评估路径的可通过性,因为它提供了有关表面上不同区域的倾斜度和可行性的信息。

3D 成本地图,表示三维空间,但同时需要进行三维规划和碰撞检查。

网格地图,类似于梯度地图,但包含多个角度的表面网格。

“向量空间”,接收传感器信息并使用机器学习来检测单个项目和位置以进行跟踪,而不是缓冲离散点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity NavMesh 是 Unity 引擎中的一个强大的导航系统,它负责处理场景中的角色移动和寻路。它的源码是 Unity 引擎内部实现导航系统的一部分,主要包含了寻路算法和相关的数据结构。 NavMesh 源码通过 C++ 编写,提供了一系列函数和数据结构来实现导航功能。在源码中,我们可以看到一些重要的概念,例如 NavMeshAgent、NavMeshPath 和 NavMeshObstacle。NavMeshAgent 是一个代表角色的类,它通过 NavMeshPath 计算寻路路径并自动移动,NavMeshObstacle 则用于处理障碍物的逻辑。 NavMesh 源码主要涉及到导航网格的创建、路径计算和角色移动等核心功能。它使用了一些经典的寻路算法,如 A* 算法和 Dijkstra 算法,以及一些优化技术,如三角化和节点合并等,来提高寻路的效率和质量。 在 NavMesh 源码中,我们还可以看到一些与导航相关的数据结构,例如 NavMeshData、NavMeshDataInstance 和 NavMeshLinkData。这些数据结构用于存储导航网格的信息,包括顶点、边和面等。 此外,NavMesh 源码还提供了一些接口和回调函数,方便开发者对导航系统进行自定义和扩展。开发者可以根据自己的需求,修改和扩展 NavMesh 源码,以满足特定的导航需求。 总之,NavMesh 源码是 Unity 引擎导航系统的实现部分,包含了寻路算法和相关数据结构,通过对源码的分析和理解,开发者可以深入了解导航系统的原理和实现细节,以更好地应用和扩展导航功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值