Moveit2 官方文档(Humble - Chinese)

欢迎使用统一的 MoveIt 文档,其中包括教程、操作指南、核心概念等。

MoveIt 2 是 ROS 2 的机器人操控平台,融合了运动规划、操控、3D 感知、运动学、控制和导航方面的最新进展。MoveIt 2 于 2019 年首次发布;有关 ROS 1 的文档,请参阅 MoveIt 1 教程 。有关商业支持版本,请参阅 MoveIt Pro 教程

目录

教程

通过面向初学者的教程学习 MoveIt 的基础知识,助您创建下一个机器人操控项目。

入门指南

在这里,我们将设置您的环境,以便以最佳方式运行本教程。这将创建一个 Colcon 工作区,下载所有最新的 MoveIt 源代码,并从源代码构建所有内容,以确保您拥有最新的修复和改进。

构建 MoveIt 的全部源代码可能需要 20-30 分钟,具体取决于您计算机的 CPU 速度和可用内存。如果您的系统性能较差,或者只是想快速上手,请查看我们的 Docker 指南

安装 ros 2 和 colcon

MoveIt 2 目前支持多个版本的 ROS。您可以根据需要安装任何版本。我们主要支持安装在 Ubuntu 22.04 或 24.04 上的 ROS,但其他方法和平台也支持,只需对以下说明进行一些小修改即可。如果您是新手,我们建议您在 Ubuntu 24.04 上使用最新稳定版 ROS (Jazzy),以获得最流畅的体验。

在学习 ROS 2 安装教程时,很容易遗漏某些步骤。如果您在接下来的几个步骤中遇到错误,最好先返回并确保您已正确安装 ROS 2。用户经常忘记的一点是获取 ROS 2 安装程序本身。请注意,务必获取您安装的 ROS 版本。

1
source /opt/ros/{DISTRO}/setup.bash

与 ROS 1 安装脚本不同,ROS 2 中的安装脚本不会尝试切换您正在使用的 ROS 版本。这意味着,如果您之前导入了其他版本的 ROS(包括在 .bashrc 文件中导入),您将在构建步骤中遇到错误。要解决此问题,请更改 .bashrc 中的导入内容并启动新的终端。

安装 rosdep 来安装系统依赖项:

1
sudo apt install python3-rosdep

安装 ROS 2 后,请确保您拥有最新的软件包:

1
2
3
4
sudo rosdep init
rosdep update
sudo apt update
sudo apt dist-upgrade

使用 mixin 安装 Colcon ROS 2 构建系统:

1
2
3
4
sudo apt install python3-colcon-common-extensions
sudo apt install python3-colcon-mixin
colcon mixin add default https://raw.githubusercontent.com/colcon/colcon-mixin-repository/master/index.yaml
colcon mixin update default

安装 vcstool

1
sudo apt install python3-vcstool

创建 colcon 工作区并下载教程

对于教程,您将需要设置一个 colcon 工作区。

1
mkdir -p ~/ws_moveit/src

下载 moveit 源代码和教程

进入您的 Colcon 工作区并拉取 MoveIt 教程源,其中 可以是 ROS Humble 的 humble ,也可以是最新版本教程的 main :

1
2
cd ~/ws_moveit2/src
git clone --branch {DISTRO} https://github.com/ros-planning/moveit2_tutorials

接下来我们将下载 MoveIt 其余部分的源代码:

1
vcs import < moveit2_tutorials/moveit2_tutorials.repos

导入命令可能会要求输入你的 GitHub 凭据。你可以直接按 Enter 键继续操作(忽略“身份验证失败”错误)。

构建您的 colcon 工作区

以下步骤将从 Debian 安装您工作区中尚未包含的所有软件包依赖项。此步骤将安装 MoveIt 及其所有依赖项:

1
sudo apt update && rosdep install -r --from-paths . --ignore-src --rosdistro $ROS_DISTRO -y

下一个命令将配置您的 Colcon 工作区:

1
2
cd ~/ws_moveit2
colcon build --mixin release

此构建命令可能需要较长时间(20 分钟以上),具体取决于您的计算机速度和可用 RAM 大小(我们建议使用 32 GB)。如果您的计算机内存不足,或者您的构建过程在您的计算机上难以完成,您可以将参数 –parallel-workers 1 附加到上面的 colcon 命令中。

如果一切顺利,您应该会看到“完成”的消息。如果遇到问题,请尝试重新检查您的 ROS 安装

设置您的 colcon 工作区

获取 Colcon 工作区:

1
source ~/ws_moveit/install/setup.bash

可选:将上一个命令添加到您的 .bashrc 中:

1
echo 'source ~/ws_moveit/install/setup.bash' >> ~/.bashrc

在您的 ~/.bashrc 中自动获取 setup.bash 不是必需的,并且经常被同时使用多个 Colcon 工作区的高级用户跳过,但为了简单起见,我们建议这样做。

rviz 中的 moveit 快速入门

本教程将教您如何使用 RViz 和 MoveIt Display 插件在 MoveIt 中创建运动规划。RViz 是 ROS 中的主要可视化工具,也是调试机器人的实用工具。MoveIt Display 插件允许您设置虚拟环境(规划场景),以交互方式创建机器人的起始状态和目标状态,测试各种运动规划器,并可视化输出。让我们开始吧!

入门指南

如果您还没有这样做,请确保您已完成入门指南Docker 指南中的步骤。截至 2022 年 9 月 26 日,请确保您已按照其中的说明启用 Cyclone DDS。

步骤 1:启动演示并配置插件

启动演示:

1
ros2 launch moveit2_tutorials demo.launch.py rviz_config:=panda_moveit_config_demo_empty.rviz

如果您是第一次执行此操作,您应该在 RViz 中看到一个空的世界,并且必须添加运动规划插件:

  • 您应该在 RViz 中看到一个空的世界:

  • 在 RViz Displays 选项卡中,按 Add :

  • 在 moveit_ros_visualization 文件夹中,选择 MotionPlanning 作为 DisplayType。点击 Ok。

  • 您现在应该在 RViz 中看到 Panda 机器人:

  • 加载运动规划插件后,我们就可以对其进行配置了。在“显示”子窗口的“全局选项”选项卡中,将 Fixed Frame 字段设置为 /panda_link0
  • 现在,您可以开始为您的机器人(本例中为 Panda)配置插件。点击 Display 中的 MotionPlanning
    • 确保机器人描述字段(Robot Description)设置为 robot_description
    • 确保规划场景主题(Planning Scene Topic)字段设置为 /monitored_planning_scene 。点击主题名称即可显示主题名称下拉菜单。
    • 确保计划路径(Planned Path)下的轨迹主题(Trajectory Topic)设置为 /display_planned_path
    • Planning Request 中,将 Planning Group 更改为 panda_arm 。你也可以在左下角的运动规划面板(MotionPlanning panel)中看到这一点

步骤 2:玩转可视化机器人

有四种不同的重叠可视化效果:

  1. /monitored_planning_scene 规划环境中的机器人配置(默认处于活动状态)。
  2. 机器人的规划路径 planned path(默认处于活动状态)。
  3. 绿色:运动规划的起始状态 start state(默认禁用)。
  4. 橙色:运动规划的目标状态 goal state(默认处于活动状态)。

可以使用复选框打开或关闭每个可视化的显示状态:

  1. 规划场景机器人使用场景机器人(Scene Robot)树菜单中的显示机器人视觉(Show Robot Visual)复选框。
  2. 使用计划路径(Planned Path)树菜单中的显示机器人视觉(Show Robot Visual)复选框来规划路径。
  3. 使用规划请求(Planning Request)树菜单中的查询开始状态(Query Start State)复选框的开始状态。
  4. 使用规划请求树菜单中的查询目标状态(Query Goal State)复选框的目标状态。

使用所有这些复选框来打开和关闭不同的可视化效果。

步骤 3:与 panda 交互

对于接下来的步骤,我们只需要场景机器人(scene robot)、起始状态(start state)和目标状态(goal state):

  1. 选中 “规划路径” 树菜单中的 “显示机器人视觉” 复选框
  2. 取消选中 “场景机器人” 树菜单中的 “显示机器人视觉” 复选框
  3. 选中规划请求树菜单中的查询目标状态复选框。
  4. 选中规划请求树菜单中的查询开始状态复选框。

现在应该有两个交互式标记。一个对应于橙色手臂的标记将用于设置运动规划的“目标状态”,另一个对应于绿色手臂的标记将用于设置运动规划的“起始状态”。如果您没有看到交互式标记,请在 RViz 的顶部菜单中点击 “交互(interact) ”(注意:某些工具可能被隐藏,请在顶部菜单中点击 “+” 以添加交互工具,如下所示)。

现在你应该可以使用这些标记来拖动手臂并改变其方向了。试试看!

发生碰撞 collision

对于本节,隐藏计划路径和目标状态:

  1. 取消选中 “规划路径” 树菜单中的 “显示机器人视觉” 复选框
  2. 取消选中规划请求树菜单中的查询目标状态复选框。

现在,应该只有起始状态(绿色的手臂)可见。尝试将手臂移动到两个连杆相互碰撞的配置。(如果您觉得这很困难,请确保取消选中 MotionPlanning 插件 “Planning” 选项卡下的 “使用碰撞感知反向运动(Use Collision-Aware IK)” 复选框。)完成后,发生碰撞的连杆将变为红色。

现在,勾选 “使用碰撞感知反向运动(Use Collision-Aware IK)” 复选框,并再次尝试移动两个链接使其相互碰撞。勾选该复选框后,IK 解算器将持续尝试为所需的末端执行器姿势找到无碰撞的解决方案。未勾选该复选框时,解算器将允许在解决方案中发生碰撞。无论复选框的状态如何,发生碰撞的链接始终以红色显示。

移出可访问工作区 reachable workspace

请注意当您尝试将末端执行器移出其可到达的工作空间时会发生什么。

在进入下一部分之前,重新启用计划路径和目标状态:

  1. Check the Show Robot Visual checkbox in the Planned Path tree menu. 选中 “规划路径” 树菜单中的 “显示机器人视觉” 复选框
  2. Check the Query Goal State checkbox in the Planning Request tree menu. 选中规划请求树菜单中的查询目标状态复选框。

移动关节或零空间

您可以使用 “关节(Joints)” 选项卡移动 7 自由度机器人的单关节和冗余关节。尝试移动 “零空间探索(null space exploration)” 滑块,如下方动画所示。

步骤 4:使用 panda 进行运动规划

  • 现在,您可以使用 MoveIt RViz 插件中的 Panda 开始运动规划。
    • 将起始状态移动到所需位置。
    • 将目标状态移动到另一个所需位置。
    • 确保两种状态都不会与机器人本身发生碰撞。
    • 确保规划路径已可视化。同时检查 在计划路径树菜单中显示路径复选框。
  • 在 “运动规划” 窗口的 “规划” 选项卡下,按下 “规划” 按钮。您应该能够看到手臂运动和轨迹的可视化效果。

审视轨迹航点 trajectory waypoints

您可以在 RViz 中逐点直观地检查轨迹

  • Panels 菜单中,选择 Trajectory - Trajectory Slider。您将在 RViz 上看到一个新的滑块面板。
  • 设定你的目标姿势,然后运行 plan。
  • 使用 “Slider” 面板进行播放,例如移动滑块,按 “Play” 按钮。

注意:一旦您将 EEF 放置到新目标,请确保在运行 Play 之前运行 Plan - 否则您将看到上一个目标的航点(如果可用)。

规划笛卡尔运动 cartesian motion

如果激活 “使用笛卡尔路径(Use Cartesian Path)” 复选框,机器人将尝试在笛卡尔空间中线性移动末端执行器。


执行轨迹,调整速度

成功规划后单击 “计划并执行(Plan & Execute)” 或 “执行(Execute)” 将把轨迹发送给机器人 - 在本教程中,由于您使用了 demo.launch ,因此仅模拟了机器人。

初始时,默认速度和加速度会被缩放为机器人最大值的 10%( 0.1 )。您可以在下方显示的 “规划(Planning)” 选项卡中更改这些缩放系数,或者在机器人的 moveit_config 文件(位于 joint_limits.yaml 中)中更改这些默认值。

后续步骤

rviz 可视化工具

许多教程使用 moveit_visual_tools 来逐步演示。在继续学习下一个教程之前,最好先启用 RvizVisualToolsGui

从 “面板(Pannels)” 菜单中,选择 “添加新面板(Add New Panels)”。从菜单中,选择 “RvizVisualToolsGui”,然后点击 OK。您将看到新面板添加到 RViz。


保存您的配置

RViz 允许您在 File->Save Config 下保存配置。您应该在继续学习下一个教程之前执行此操作。如果您选择以新名称保存配置,可以使用 File->Save Config As 并使用以下方式引用您的配置文件:

1
ros2 launch moveit2_tutorials demo.launch.py rviz_config:=your_rviz_config.rviz

your_rviz_config.rviz 替换为您保存到 moveit2_tutorials/doc/tutorials/quickstart_in_rviz/launch/ 的文件的名称,并构建工作区以便可以找到它。

示例

杂项

混合规划

概念

运动学 kinematics

运动学插件

MoveIt 使用插件基础架构,尤其致力于允许用户编写自己的逆运动学算法。正向运动学和雅可比矩阵计算功能集成在 RobotState 类中。MoveIt 的默认逆运动学插件使用基于 KDL 数值雅可比矩阵的求解器进行配置。此插件由 MoveIt 设置助手自动配置。

碰撞检测

MoveIt 中的碰撞检查是在规划场景中使用 CollisionWorld 对象进行配置的。幸运的是,MoveIt 的设置让用户无需担心碰撞检查的具体过程。MoveIt 中的碰撞检查主要使用 FCL 包(MoveIt 的主要碰撞检查库)进行。

碰撞物体

MoveIt 支持不同类型物体的碰撞检查,包括:

  • 网格 Meshes - 您可以使用 .stl (标准三角语言)或 .dae (数字资产交换)格式来描述机器人链接等对象。
  • 原始形状 Primitive Shapes - 例如盒子、圆柱体、圆锥体、球体和平面
  • Octomap - Octomap 对象可直接用于碰撞检查

允许碰撞矩阵 ACM

碰撞检查是一项非常耗时的操作,通常占运动规划计算开销的近 90%。 Allowed Collision Matrix (ACM) 编码了一个二进制值,该值对应于需要检查的刚体对(可以是机器人上的刚体,也可以是现实世界中的刚体)之间的碰撞。如果 ACM 中将两个刚体对应的值设置为 true ,则不会执行这两个刚体之间的碰撞检查。例如,如果两个刚体始终相距甚远,以至于它们永远不会相互碰撞,则无需执行碰撞检查。或者,如果两个刚体默认相互接触,则应在 ACM 中禁用该刚体对的碰撞检测。

运动规划

运动规划插件

MoveIt 通过插件接口与运动规划器配合使用。这使得 MoveIt 能够与多个库中的不同运动规划器进行通信并使用,从而轻松扩展。与运动规划器的接口是通过 ROS 操作或服务(由 move_group 节点提供)实现的。move_group 的默认运动规划器使用 OMPL 进行配置,并通过 MoveIt 设置助手将 MoveIt 接口配置为 OMPL。其他默认可用的规划器包括 Pilz 工业运动规划器和 CHOMP。

运动规划请求

运动规划请求指定了您希望运动规划器执行的操作。通常,您会要求运动规划器将手臂移动到其他位置(在关节空间中),或将末端执行器移动到新的姿势。默认情况下会检查碰撞(包括自碰撞和附着物体碰撞)。您还可以通过 planning_pipelineplanner_id 参数指定规划器,以及运动规划器要检查的约束 – MoveIt 提供的内置约束是 kinematic constraints

  • 位置约束 Position:限制链接的位置位于空间区域内。
  • 方向约束 Orientation:限制链接的方向在指定的滚动、俯仰或偏航范围内。
  • 可见性约束 Visibility:限制链接上的点位于特定传感器的可见性锥体内。
  • 关节约束 Joint:限制关节位于两个值之间。

User-specified constraints: it is also possible to specify your own constraints with a user-defined callback.
用户指定的约束 :也可以使用用户定义的回调指定自己的约束。

运动规划结果

move_group 节点将响应您的运动规划请求,生成所需的轨迹。该轨迹会将手臂(或任何一组关节)移动到所需位置。请注意, move_group 生成的结果是一条轨迹,而不仅仅是一条路径。 move_group 将使用所需的最大速度和加速度(如果指定)来生成遵循关节级速度和加速度约束的轨迹。

运动规划适配器

完整的运动规划流水线将运动规划器与其他称为规划请求适配器的组件链接在一起。规划请求适配器允许预处理运动规划请求,并后处理运动规划响应。预处理在多种情况下非常有用,例如,当机器人的起始状态略微超出机器人指定的关节极限时。其他一些操作也需要后处理,例如,将为机器人生成的路径转换为时间参数化的轨迹。MoveIt 提供了一组默认的运动规划适配器,每个适配器都执行特定的功能。

检查开始状态边界

修复起始状态边界适配器将起始状态修复为在 URDF 中指定的关节限制范围内。当物理机器人的关节限制配置不正确时,就需要使用此适配器。然后,机器人可能会处于这样一种配置:其一个或多个关节略微超出其关节限制。在这种情况下,运动规划器无法进行规划,因为它会认为起始状态超出了关节限制。

“CheckStartStateBounds”规划请求适配器将通过将起始状态移动到关节限制来“修复”起始状态。然而,这显然不是每次都是正确的解决方案 - 例如,当关节确实超出其关节限制很大时。适配器的参数指定关节可以超出其限制多少才能“修复”。

验证工作空间边界

固定工作区边界适配器将指定一个用于规划的默认工作区:一个尺寸为 10 米 x 10 米 x 10 米的立方体。仅当规划器收到的规划请求未填写这些字段时,才会指定此工作区。

检查启动状态碰撞

修复启动状态碰撞适配器将尝试通过对关节值进行少量扰动,在指定配置(碰撞中)附近采样一个新的无碰撞配置。扰动值的量由 jiggle_fraction 参数指定,该参数控制扰动占关节总运动范围的百分比。此适配器的另一个参数指定适配器在放弃之前将采样多少个随机扰动。

添加时间参数化

运动规划器通常会生成“运动路径”,即不遵循任何速度或加速度约束且未进行时间参数化的路径。此适配器将通过应用速度和加速度约束来“时间参数化”运动规划。

解析约束框架

可以使用子框架设置目标约束(例如,框架 cup/handle 中的姿势目标,其中 handle 是对象 cup 上的子框架)。此适配器将约束框架更改为对象或机器人框架(例如 cup )。

开放运动规划库

OMPL(Open Motion Planning Library)是一个开源运动规划库,主要实现随机运动规划器。MoveIt 直接与 OMPL 集成,并使用该库中的运动规划器作为其主要/默认规划器集。OMPL 中的规划器是抽象的;也就是说,OMPL 没有机器人的概念。相反,MoveIt 会配置 OMPL,并为 OMPL 提供后端,以便其处理机器人技术中的问题。

混合规划

MoveIt 的运动规划架构遵循“感知-规划-执行”方法。为了规划和执行运动,首先感知环境和机器人状态(“感知”),然后由规划器计算机器人轨迹(“规划”),最后使用轨迹控制器一次性执行(“执行”)。

虽然该解决方案在众所周知的静态环境中非常适合全局运动规划,但在许多实际应用中,尤其是在不稳定或动态环境中,该方法并不适用。诸如在桌上给某人倒一杯水或在凹凸不平的黑板上书写之类的任务,需要更复杂的方法,以便能够应对不可预测的变化。例如,机器人的环境可能会动态变化,或者任务本身可能存在某些不确定性,例如,用粉笔写字需要调整在黑板上的压力,而粉笔用完后也会变短。

解决这些挑战需要一种方法,能够根据当前情况调整执行的动作,甚至能够在环境发生不可预见的变化时通过重新规划做出反应。混合规划架构尝试通过结合一对循环的全局规划器和局部规划器来解决这个问题。

什么是混合规划

混合规划是指一种运动规划方法,它结合了异构运动规划器,以提供更稳健或更灵敏的解决方案。这种通用方法在导航社区中已经非常成熟,并在 navigation2 等热门项目中成功实施。

MoveIt 的混合规划架构结合了一对全局和本地规划器,它们以不同的规划速度和问题范围并行且循环地运行。

全局规划器的任务是解决全局运动规划问题,这与“感知-规划-行动”应用中使用的规划器非常相似。所使用的规划器算法应为完备的,因此在计算时间方面被认为相对较慢。此外,全局规划器无需实时安全,这意味着无法保证其在特定期限内找到解决方案。根据规划器的实现方式,全局规划器在执行过程中可能会生成一个初始解或迭代优化的解。

局部规划器在执行过程中持续运行,并生成用于跟踪全局轨迹的迭代机器人命令。某种程度上,局部规划器类似于控制器,只是其架构允许解决更复杂的问题和约束。其核心思想是,规划器能够推理世界并拥有内部状态。这一特性使其用途广泛,可用于解决任意局部规划问题的组合,例如:

  • 展开、混合或拼接后续全局参考轨迹
  • 遵循全局路径的同时动态避免近距离碰撞
  • 使整体轨迹适应局部约束(例如,在不平坦表面上所需的力压力,根据视觉反馈重新调整工具)
  • 局部轨迹优化和时间参数化(在局部环境中优化轨迹在计算上更便宜、更快捷)

为了解决这些局部问题,局部规划器必须快速响应,能够对传感器反馈做出反应,并且在许多情况下能够实时安全。此外,它还应具有确定性,以避免出现不稳定或不可预测的运动。

一般来说,局部规划器依赖于全局规划器生成的参考轨迹,以避免陷入局部最小值。由于局部最小值有时仍然无法排除,因此可能需要触发全局规划器进行重新规划,以便仍然能够达到预期目标。这种行为需要某种方式来传达规划器事件并进行相应的处理。为此,混合规划架构允许实现基于事件的逻辑,该逻辑可根据特定用例和规划器类型进行定制。

Global Planner Local Planner
- 求解全局解轨迹
- 优化轨迹路径(持续)
- 遵循全局参考轨迹
- 解决局部问题约束
- 可以处理传感器输入
- 本地优化解决方案
- 计算控制器命令
- 完全的
- 不受计算时间限制
- 不实时安全
- 不一定是确定性的
- 可能陷入局部最小值
- 计算时间短
- 实时安全(取决于求解器)
- 确定性
- OMPL 规划器
- STOMP
- TrajOpt
- 笛卡尔运动规划器
- Pilz 工业运动规划器
- MTC
- IK 解算器、雅可比矩阵
- 潜在领域规划师
- 轨迹优化算法
- 模型预测控制(MPC)
- 基于传感器的最优控制

混合规划适用于多种用例。大多数应用可以归为以下三种场景。

  • 在线运动规划 :全局规划器创建初始全局解决方案并持续优化。同时,局部规划器执行参考轨迹,并将更新后的轨迹段融入其中。
  • 反应运动 :全局规划器用于修复无效的解决方案(重新规划),而局部规划器在碰撞前减速或停止
  • 自适应运动 :局部规划器用于使全局解决方案适应动态条件,例如保持工具与不平坦表面的稳定接触

混合规划架构

下图描述了构成混合规划架构的基本插件类型和 ROS 接口。

该架构由三个 ROS 组件节点组成:

  • Hybrid Planning Manager
    • Provides a ROS action for Hybrid Planning requests
    • Runs the planning logic and coordinates the planners
  • Global Planner
    • Solves the global planning problem and publishes the solution trajectory
  • Local Planner
    • Processes incoming global trajectory updates
    • Solves the local planning problem based on robot state, world and reference trajectory
    • Sends position/velocity commands to the robot driver

该架构组件设计为通用且高度可定制。由于组件仅通过 ROS 2 消息接口进行交互,因此可以轻松替换架构中每个组件或插件的实现。插件接口设计精简,并尽可能地从实际算法实现中抽象出来。这使得开发人员能够完全专注于独立的逻辑或求解器,而无需实现任何基础架构部分。这也允许将相同的组件重复用于不同的设置或规划问题。

混合规划管理器

该组件是架构的“大脑”。其主要目的是处理 HybridPlanner 的操作请求,并基于规划逻辑插件协调运动规划和执行过程。规划逻辑在 PlanningLogic 插件中实现,并设计为事件驱动。事件由字符串标识符定义,可以触发针对全局或局部规划器的操作调用或取消。下图显示了一个简单规划逻辑的事件日志示例:

事件由混合规划操作请求以及全局和局部规划器的操作反馈消息触发。在本例中,混合规划管理器在收到混合规划请求后启动全局规划器。全局轨迹到达后,局部规划器启动;局部规划器完成后,混合规划管理器返回混合规划响应。

规划逻辑插件的自定义实现支持将通用事件映射到架构提供的可用操作,例如“启动全局规划”、“停止轨迹执行”或“切换到局部规划器约束 x”。由此,运动规划行为变得高度可定制且适应性强。

全局规划器

全局规划器是该架构中最简单的组件。它提供了一个动作服务器来处理全局规划器请求。这些请求包括常见的 MotionPlanRequests,由全局规划器插件处理。默认情况下,这只是 MoveIt 的规划管道,但从技术上讲,任何类型的规划器,甚至 MTC 都可以在这里使用。规划结果通过动作反馈进行报告,解决方案轨迹将发布到本地规划器以供进一步处理。

本地规划器

本地规划器还运行一个操作服务器,用于处理来自混合规划管理器的请求。该操作用于启动和停止执行,还可以配置运行时参数,例如约束或求解器类型。

本地规划器实现基于两个插件:

  • 轨迹操作器 :该插件维护全局参考轨迹,处理来自全局规划器的轨迹更新,并监控当前机器人状态的进程。
  • 局部约束求解器 :此插件实现了迭代求解器算法,该算法基于参考轨迹和局部约束生成机器人指令。它可能包含用于动态处理传感器输入或事件更新的附加接口。

下图显示了混合规划管理器采取行动请求时本地规划器的示例循环周期:

每次迭代,局部规划器都会请求当前规划场景,并将机器人的当前状态与参考轨迹进行匹配。如果达到目标,则局部规划操作成功完成。否则,将根据当前机器人状态识别当前的局部规划问题,并随后进行求解。最后,将生成的控制命令发布给机器人控制器。

它是如何工作的

通过绘制可视化不同组件的通信渠道和事件的工作流图,可以最好地理解混合规划器的运行时行为。

下面是显示成功执行轨迹的运行时逻辑的图表。

规划器由混合规划请求调用,这也是混合规划管理器响应的第一个事件。在此示例中,规划器逻辑只是按顺序运行两个规划器。在初始混合规划请求之后,混合规划管理器调用全局规划器。全局规划器计算并发布轨迹,该轨迹由混合规划管理器和本地规划器组件接收。需要注意的是,本地规划器组件仅处理新轨迹,直到被混合规划管理器调用后才开始执行。一旦收到混合规划管理器的请求,本地规划器组件就会开始展开参考轨迹,并在达到最终状态时成功返回操作响应。之后,混合规划管理器返回成功的 HybridPlanningResponse。

现在让我们考虑一个更复杂的场景,其中混合规划器被设计为通过重新规划来避开执行过程中的障碍物。下面的动画展示了一个简单的运动,由于碰撞对象的变化,该运动在运行时被固定下来。

此时,全局规划过程中存在的碰撞对象在全局轨迹计算完成后消失。取而代之的是两个新的碰撞对象,使初始全局轨迹失效。局部规划器检测到即将发生的碰撞,并暂停执行,直到全局规划器提供更新的无碰撞轨迹。

下面您可以看到所描述行为的工作流程。

启动过程与第一个示例相同,但在展开参考轨迹期间,局部规划器检测到碰撞。此时,规划器逻辑会通过重新调用全局规划器做出反应。在计算新的全局解决方案期间,局部规划器必须防止机器人与碰撞物体发生碰撞,即保持其当前位置。全局规划器完成计算后,新的全局解决方案将发布给局部规划器,局部规划器的轨迹算子插件会将更新后的方案与参考轨迹融合。之后,局部规划器组件将继续遵循参考轨迹,因为更新后的方案使其能够绕过碰撞物体。

如果您想在应用程序中使用混合规划或只是想尝试一下,请查看混合规划示例教程

操作指南

配追和使用 moveit

开发和记录 moveit

操作指南

如何在本地生成 api doxygen 参考

如何在 ubuntu 中设置 moveit 2 docker 容器