< >
Home » ROS2与MoveIt2教程 » ROS2与MoveIt2入门教程-MoveIt2基本概念

ROS2与MoveIt2入门教程-MoveIt2基本概念

说明:

  • 介绍MoveIt2基本概念

基本概念:

  • 本节教程是MoveIt2工作原理的概述。有关更具体的文档和详细信息,请参阅MoveIt2教程或面向开发人员的MoveIt2概念。

MoveIt2系统架构

  • MoveIt2快速高层图解**

    请输入图片描述

  • Move_Group节点
    上图显示了MoveIt2提供的名为move_group的主要节点的高级系统架构。该节点在此充当了集成器:将所有单个组件聚集到一起,以提供一组ROS动作和服务供用户使用
    请输入图片描述

  • 用户接口(User Interface)
    用户可以通过以下三种方式访问由move_group节点提供的各个动作和服务:

    • 在C++中—使用move_group_interface软件包,该软件包为move_group提供了一个易于设置的C++接口

    • 在Python中—使用moveit_commander软件包

    • 通过GUI—使用Rviz(ROS可视化工具)的Motion Planning插件

    • 节点move_group可以使用ROS参数服务器进行配置,而且该节点还会从ROS参数服务器中获取机器人的URDF和SRDF。

  • 配置(Configuration)
    move_group是一个ROS节点。它使用ROS参数服务器来获取以下三类信息:

    • URDF信息—节点move_group会在ROS参数服务器上查找robots_description参数以获取机器人的URDF。

    • SRDF信息—节点move_group会在ROS参数服务器上查找robots_description_semantic参数以获取机器人的SRDF。SRDF通常是由用户使用MoveIt设置助手(Setup Assistant)一次性创建的。

    • MoveIt其它配置信息—节点move_group会在ROS参数服务器上查找特定于MoveIt的其它配置信息,包括关节限制、运动学、运动规划、感知和其它信息。这些组件的配置文件由MoveIt设置助手自动生成,并存储在机器人对应的MoveIt配置软件包的config目录中。

  • 机器人接口(Robot Interface)
    节点move_group通过ROS话题和动作与机器人进行对话。该节点与机器人通信以获取机器人的当前状态信息(关节位置等),从机器人传感器上获取点云和其他传感器数据,并与机器人上的控制器进行对话。

    • 关节状态信息
      节点move_group侦听/joint_states话题以确定当前状态信息,即确定机器人的每个关节位于何处。节点move_group能够同时侦听多个该话题发布者发布的信息,即使这些发布者只发布有关机器人状态的部分信息(例如,单独的发布者可能用于发布机器人的手臂和移动底座的状态信息)。请注意,节点move_group不会设置自己的关节状态发布者—这是必须在每个机器人上实现的任务。
    • 坐标变换信息
      节点move_group使用ROS的TF库监控坐标变换信息。这允许节点获取有关机器人位姿的全局信息(以及其它信息)。例如,ROS 导航堆栈会将机器人的地图坐标系和底座坐标系之间的坐标变换发布到TF上。节点move_group就可以使用TF来计算内部使用的这种坐标变换。注意节点move_group只侦听TF。要从您的机器人发布TF信息,您将需要在您的机器人上运行一个robots_state_publisher节点。
    • 控制器接口
      节点move_group使用FollowJointTrajectoryAction接口与机器人上的控制器进行对话。这是一个ROS 动作接口。机器人上的服务器需要为这个动作提供服务——这个服务器不是由move_group节点本身提供的。节点move_group只会实例化一个客户端来与你机器人上的这个控制器动作服务器进行对话。
  • 规划场景(Planning Scene)

    节点move_group使用规划场景监视器(Planning Scene Monitor)来维护一个规划场景,规划场景是机器人世界和机器人当前状态的表示。机器人状态可以包括连接到机器人(由其携带)的任何物体,这些物体被认为是刚性连接到机器人上的。在下面的规划场景部分将概述有关用于维护和更新规划场景的体系结构的更多详细信息。

  • 可扩展的功能
    节点move_group的结构易于扩展—诸如拾取和放置、运动学、运动规划等单个功能实际上是作为具有一个公共基类的单独插件实现的。这些插件可以使用ROS通过一组ROS yaml参数和通过使用ROS pluginlib库进行配置。大多数用户不必配置move_group插件,因为这些插件是在MoveIt设置助手生成的启动文件中自动配置的。

动规划

  • 运动规划插件
    MoveIt2通过插件界面与运动规划器协同工作。这允许MoveIt2与来自多个库的不同运动规划器进行通信并使用这些运动规划器,从而使MoveIt2易于扩展。通过ROS动作或服务(由move_group节点提供)与运动规划器建立接口。节点move_group的默认运动规划器是由MoveIt设置助手使用OMPL及MoveIt与OMPL的接口进行配置的。默认情况下可用的其他规划器是Pilz工业运动规划器和CHOMP。

  • 运动规划请求
    运动规划请求指定您希望运动规划器执行什么操作。通常,您会要求运动规划器将手臂移动到不同的位置(在关节空间中)或将末端执行器移动到一个新的位姿。默认情况下会进行碰撞检测(包括自碰撞和连接物体碰撞检测)。您还可以通过Planning_pipeline和planner_id参数指定运动规划器以及运动规划器要检查的约束—由MoveIt2提供的下列内置约束都是运动学约束:

    • 位置约束—将某个链接的位置限制在一个空间区域内

    • 方位约束—将某个链接的方位限制在指定的横滚角、俯仰角或偏航角极限范围内

    • 可见性约束—将某个链接上的一个点限制在位于特定传感器的可见性视锥内

    • 关节约束—将某个关节限制在两个值之间

    • 用户指定的约束—您还可以使用用户定义的回调函数指定自己的约束。

  • 运动规划结果
    节点move_group将根据您的运动规划请求生成一条期望的轨迹。该轨迹会将手臂(或任何关节组)移动到期望的位置。请注意,来自move_group节点的运动规划结果是一条轨迹,而不仅仅是一条路径—_move_group*会使用期望的最大速度和加速度(如果指定了的话)来生成一条服从关节级别的速度和加速度约束的轨迹。

  • 运动规划管道(Pipeline):运动规划器和规划请求适配器
    请输入图片描述
    完整的运动规划管道将运动规划器与称为规划请求适配器的其它组件链接在一起。规划请求适配器允许预处理运动规划请求和后处理运动规划响应。预处理在多种情况下很有用,例如当机器人的启动状态稍微超出机器人的指定关节限制时。其他几个操作则需要后处理,例如将为机器人生成的路径转换为时间参数化的轨迹。MoveIt2提供了一组默认的运动规划适配器,每个适配器执行一个很具体的功能

    • FixStartStateBounds适配器
      修复起始状态边界适配器可以将起始状态修复到URDF中指定的关节极限范围内。在未正确配置物理机器人的关节极限的情况下会需要这个适配器。这样机器人的配置可能最终会导致其中一个或多个关节略微超出其关节极限。在这种情况下,运动规划器将无法进行规划,因为它会认为起始状态超出了关节极限。“FixStartStateBounds”规划请求适配器会通过将其移动到关节极限范围内来“修复”该起始状态。但是,这显然不是每次都正确的解决方案—例如关节实际上大大超出了其关节极限。该适配器的一个参数用于指定“可修复”关节可以超出其关节极限的程度。

    • FixWorkspaceBounds适配器
      修复工作空间边界适配器会为规划指定一个默认的工作空间:一个尺寸为10m×10m×10m的立方体。仅当向规划器提出的规划请求未填写这些字段时,才会指定此工作空间。

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

    • FixStartStatePathConstraints适配器
      当运动规划的起始状态不遵守指定的路径约束时,将会应用此适配器。该适配器会尝试在机器人的当前配置和遵守路径约束的新位置之间规划一条路径。新位置将作为规划的起始状态。

    • AddTimeParameterization适配器
      运动规划器通常会生成“运动学路径”,即不服从任何速度或加速度约束并且没有时间参数化的路径。此适配器会通过应用速度和加速度约束来“时间参数化”运动规划。

    • ResolveConstraintFrames适配器
      可以使用子坐标系设置目标约束(例如,杯/手柄cup/handle坐标系中的某个位姿目标,其中手柄handle是物体杯子cup的子坐标系)。此适配器会将约束坐标系更改为某个物体或机器人坐标系(例如杯子)。

开源运动规划库OMPL
OMPL(Open Motion Planning Library)是一个开源运动规划库,该库主要实现了随机运动规划器。MoveIt2直接与OMPL集成,并使用该库中的各个运动规划器作为其主要/默认规划器集。OMPL中的规划器是抽象的;即OMPL没有机器人的概念。而MoveIt2会对OMPL进行配置,并为OMPL提供后端以处理机器人问题

  • 规划场景(Planning Scene)
    请输入图片描述
    规划场景(Planning Scene)用于表示机器人周边的世界,也存储机器人本身的状态。它由move_group节点内的规划场景监视器(Planning Scene Monitor)维护。规划场景监视器会侦听以下消息:

    • 状态信息:在joint_states话题上侦听此消息

    • 传感器信息:使用下面描述的世界几何监视器侦听此消息

    • 世界几何信息:在planning_scene话题上的用户输入(作为规划场景的一个差分)。

    • 世界几何监视器(World Geometry Monitor)

      世界几何监视器使用来自机器人传感器和用户输入的信息构建世界几何体。它使用下面描述的占用地图监视器(occupancy map monitor)来构建机器人周边环境的3D表示,并使用旨在添加对象信息的planning_scene话题上的信息来增强该3D表示。

    • 3D感知

      请输入图片描述
      MoveIt2中的3D感知是由占用地图监视器来处理的。占用地图监视器使用插件架构来处理不同类型的传感器输入,如上图所示。具体来说,MoveIt2内置支持以下两种输入数据的处理:

    点云:由点云占用地图更新器(point cloud occupancy map updater)插件处理

    深度图像:由深度图像占用地图更新器(depth image occupancy map updater)插件处理

    请注意,用户可以将自己类型的更新器作为插件添加到占用地图监视器中。

  • Octomap
    占用地图监视器使用Octomap来维护环境的占用地图。Octomap 实际上可以编码有关单个单元格的概率信息,尽管此信息当前还未在MoveIt2中使用。Octomap可以直接传递到MoveIt2使用的碰撞检测库FCL中。

  • 深度图像占用地图更新器

    深度图像占用地图更新器包括它自己的自过滤器self-filter,即它会从深度图像地图中删除机器人的可见部分。它使用有关机器人的当前信息(机器人状态)来执行此操作。

运动学(Kinematics)

  • 运动学插件

    MoveIt2使用插件基础设施,其特别目标在于允许用户编写自己的逆运动学算法。正运动学和寻找雅可比函数集成在RobotState类本身中。MoveIt2的默认逆运动学插件是使用基于KDL数值雅可比解算器进行配置的。此插件是由MoveIt设置助手自动配置的。

  • IKFast插件

    通常,用户可能会选择实现他们自己的运动学解算器,例如PR2机器人有其自己的运动学解算器。实现此类解算器的一种流行方法就是使用IKFast软件包来生成用于用户特定机器人所需的C++代码

碰撞检测

MoveIt2中的碰撞检测是使用CollisionWorld对象在规划场景中进行配置的。幸运的是,MoveIt2的设置使用户永远不必担心碰撞检测是如何发生的。MoveIt2中的碰撞检测主要使用FCL软件包来执行——该软件包是MoveIt2的主要CC库。

  • 碰撞对象

    MoveIt2支持对不同类型的对象进行碰撞检测,包括:

    网格(Meshes)

    基本形状—例如方盒、圆柱体、圆锥体、球体和平面

    Octomap—Octomap对象可以直接用于碰撞检测

  • 允许碰撞矩阵(ACM)

    碰撞检测是一项非常昂贵的操作,通常在运动规划期间占用计算费用的近90%。允许碰撞矩阵(Allowed Collision Matrix或ACM)会编码一个二进制值,对应于是否需要对一对物体(可能是在机器人身上或在机器人世界中的物体)之间的碰撞进行碰撞检测。如果在ACM中将两个物体对应的值设置为 1,则表示不需要对这两个物体之间的碰撞进行检测。例如,如果两个物体总是相距很远,以至于它们永远不会相互碰撞,就会出现这种情况。

轨迹处理

  • 时间参数化

    运动规划器通常只会生成“路径”,即没有与该路径相关联的时间信息。MoveIt2包括一个轨迹处理程序(trajectory processing routine),可以应用于这些路径上来生成轨迹,这些轨迹为施加在各个关节上的最大速度和加速度限制进行了适当的时间参数化。这些限制是从为每个机器人指定的具体joint_limits.yaml文件中读取的。

参考英语原文地址:https://moveit.ros.org/documentation/concepts/

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros2与moveit2入门教程