Skip to content

运动规划

MoveIt 通过**插件接口(plugin interface)**与运动规划器(motion planner)协同工作。 这使得 MoveIt 可以使用来自多个库的不同运动规划器,从而具备良好的可扩展性。与运动规划器的接口由 move_group 节点通过 ROS action 或 service 提供。 默认运动规划器由 MoveIt Setup Assistant 使用 OMPL 及其与 MoveIt 的接口进行配置。 其他默认可用的规划器包括 Pilz 工业运动规划器和 CHOMP。

运动规划请求(motion plan request)用于指定运动规划器的任务目标。 通常,你会要求运动规划器将机械臂移动到另一个位置(在关节空间中),或将末端执行器移动到新的位姿。 默认情况下会进行碰撞检查(包括自碰撞和附着物体)。 你还可以通过 planning_pipeline 和 planner_id 参数指定规划器,以及设定运动规划器需要满足的约束。MoveIt 内置的运动学约束(kinematic constraints)包括:

  • 位置约束(Position constraints):限制某个连杆(link)的位置位于空间的某个区域内。

  • 姿态约束(Orientation constraints):限制某个连杆的姿态在指定的 roll、pitch 或 yaw 范围内。

  • 可见性约束(Visibility constraints):限制连杆上的某个点位于特定传感器的可见锥(visibility cone)内。

  • 关节约束(Joint constraints):限制某个关节的角度在两个值之间。

  • 用户自定义约束(User-specified constraints):也可以通过用户定义的回调函数(callback)来指定自定义约束。

move_group 节点会响应运动规划请求,生成一条期望轨迹,将机械臂(或任何关节组)移动到目标位置。 需要注意的是,move_group 输出的结果是轨迹(trajectory)而非仅仅是路径(path)。 move_group 会使用设定的最大速度和加速度(如果指定了的话),生成一条在关节层面满足速度和加速度约束的轨迹。

完整的运动规划流水线(pipeline)将运动规划器与一组称为**规划请求适配器(planning request adapters)**的组件串联在一起。 规划请求适配器可以对运动规划请求进行预处理(pre-processing),也可以对运动规划响应进行后处理(post-processing)。 预处理在多种情况下很有用,例如当机器人的起始状态略微超出关节限位时。 后处理则用于其他操作,例如将生成的路径转换为时间参数化(time-parameterized)的轨迹。 MoveIt 提供了一组默认的运动规划适配器,每个适配器执行特定的功能。

CheckStartStateBounds(检查起始状态边界)

Section titled “CheckStartStateBounds(检查起始状态边界)”

修复起始状态边界适配器(fix start state bounds adapter)会将起始状态修正到 URDF 中指定的关节限位之内。 该适配器的适用场景是:当物理机器人的关节限位配置不当时,机器人可能最终处于一个或多个关节略微超出限位的构型。 此时运动规划器将无法规划,因为它会认为起始状态超出了关节限位。 CheckStartStateBounds 适配器通过将起始状态移回关节限位范围内来”修复”起始状态。 不过,这显然并非每次都是正确的解决方案——例如当关节大幅超出限位时。 该适配器提供一个参数,指定关节可以超出限位的容许幅度,在此幅度内的状态才是”可修复的”。

ValidateWorkspaceBounds(校验工作空间边界)

Section titled “ValidateWorkspaceBounds(校验工作空间边界)”

修复工作空间边界适配器(fix workspace bounds adapter)会为规划指定一个默认工作空间:一个 10 m × 10 m × 10 m 的立方体。 仅当发送给规划器的规划请求未填写这些字段时,才会使用该默认值。

CheckStartStateCollision(检查起始状态碰撞)

Section titled “CheckStartStateCollision(检查起始状态碰撞)”

修复起始状态碰撞适配器(fix start state collision adapter)会通过小幅扰动关节值,尝试在当前处于碰撞的构型附近采样一个新的无碰撞构型。 扰动量由 jiggle_fraction 参数控制,该参数以关节总运动范围的百分比来设定扰动幅度。 该适配器的另一个参数指定了在放弃之前采样的随机扰动次数上限。

AddTimeParameterization(添加时间参数化)

Section titled “AddTimeParameterization(添加时间参数化)”

运动规划器通常生成的是”运动学路径”(kinematic paths),即不满足任何速度或加速度约束、也未经时间参数化的路径。 该适配器会施加速度与加速度约束,对运动规划进行”时间参数化”(time parameterize)处理。

ResolveConstraintFrames(解析约束坐标系)

Section titled “ResolveConstraintFrames(解析约束坐标系)”

目标约束可以使用子坐标系(subframe)来设置——例如,在 cup/handle 坐标系中设置位姿目标,其中 handle 是物体 cup 上的一个子坐标系。 该适配器会将约束的坐标系转换为物体或机器人坐标系(例如 cup)。

OMPL(Open Motion Planning Library,开源运动规划库)主要实现随机化运动规划器。 MoveIt 直接与 OMPL 集成,将该库中的运动规划器作为其主要/默认的规划器集合。 OMPL 中的规划器是抽象的,也就是说 OMPL 本身没有机器人的概念。 相反,MoveIt 负责配置 OMPL,并为 OMPL 处理机器人学(Robotics)领域的问题提供后端(back-end)支持。