机器人运动规划 1

moveit中包含有多种运动规划器。

  • 基于采样的运动规划器:OMPL
  • 基于搜索的运动规划器:SBPL
  • 基于最优化的运动规划器:CHOMP

每一种运动规划器都在自己的包中,并且以插件的形式集成在moveit中。 接下来学习一下如何将运动规划器集成到我们的规划任务中。

规划接口 Planning Interface

moveit_core中的planning_interface组件提供了一个规划类,这个类为运动规划提供了一个抽象类实现。它提供了两种方法,第一种方法大多数人都在用,将以下作为输入:

  • 规划场景,planning scene。表示机器人所处的环境和机器人的姿态。
  • 运动规划请求, motion plan request。表示用户想让规划器做什么。

并提供以下输出

  • 运动规划响应,motion plan response。即运动规划的结果。

第二种解决方法旨在用于基准测试,并允许运动规划人员返回更详细的响应,包括执行不同规划步骤所需的时间。

运动规划请求The Motion Planning Request

通过一个MotionPlanRequest消息向运动规划器发出请求,消息需要说明以下信息:

  • 工作空间参数,Workspace Parameters。规定了规划师应该在世界范围内工作的整个工作空间的限制。 规划器会一直试图将机器人保持在这个工作区内。
  • 当前机器人状态,Current robot state。这可以是一个增量规范,并将取代从PlanningScene中指定的当前状态派生的联合值。
  • 目标,Goal。这被指定为一组约束。 它可用于指定联合空间目标或笛卡尔目标或两者的组合。
  • 路径约束,Path Constraints。这些是在机器人的规划路径上的每个点上应用的约束。
  • 规划器ID,Planner id。所使用规划器的名字,如果没有名字将使用默认的规划器。
  • 规划组名字,Group name。所要规划的关节组名字。
  • 规划尝试次数,Number of planning attempts。规划器所尝试解决问题的次数,将返回最短路径。
  • 允许规划的时间,Allowed planning time。以秒计时。

计划要求可能看起来非常复杂,令人望而生畏,但不用担心。 创建运动计划请求的首选方法是通过更简单的API来填写请求的大部分必需部分。

运动规划响应The Motion Planning Response

从运动规划器得到的运动规划响应主要包括以下内容:

  • 机器人状态,Robot state。运动规划器工作的机器人当前状态。
  • 组名,Group name。所要规划的机器人关节组名。
  • 机器人轨迹,Robot trajectory。如果找到,则返回得到的机器人轨迹。
  • 规划时间,Planning time。规划器使用的全部时间。
  • 错误码,Error code。如果规划失败则返回失败原因。

规划流程The Planning Pipeline

规划流程实现以下三个功能:

  • 自动实例化一个规划器插件。
  • 自动实例化一组计划请求适配器,允许预先处理计划请求或对计划本身进行后期处理。
  • 将计划者和计划请求适配器以序列化的方式组合在一起。

设置

设置规划流程(Code API)非常简单。 它只需要输入:
- 机器人模型的一个实例
- ROS参数服务器上的参数名称,用于指定要使用的运动规划器
- ROS参数服务器上的参数名称,用于指定要使用的计划适配器的列表
以下是一个代码例子


planning_pipeline::PlanningPipelinePtr planning_pipeline(new planning_pipeline::PlanningPipeline(robot_model, "planning_plugin", "planning_adapters"));  

指明运动规划器

运动计划程序在ROS参数服务器的planning_plugin中指定。 在这里,我们打算在OMPL中使用规划器,以便我们启动文件中需要的行是以下内容


<param name="planning_plugin" value="ompl_interface_ros/OMPLPlanner" />

请注意,此参数必须在规划流程实例化的节点的私有名称空间内定义。参考例子

指明规划请求适配器

计划请求适配器都被指定为一组空格分隔的名称(字符串)。 下面给出了一个例子,我们指定了两个适配器:(1)“AddTimeParameterization”适配器在计划的轨迹上运行,并为其添加时间参数化;(b)“FixStartStateBounds”适配器在运动计划请求的开始状态 并修正可能稍微超出范围的任何联合值。


<param name="planning_adapters" value="default_planner_request_adapters/AddTimeParameterization default_planner_request_adapters/FixStartStateBounds" />

规划


planning_pipeline->generatePlan(planning_scene, req, res);

完整代码https://github.com/ros-planning/moveit_pr2/blob/groovy-devel/pr2_moveit_tutorials/planning/src/planning_pipeline_tutorial.cpp

插件应用程序接口Plugin API

运动规划算法的主要接口是通过插件。 所有类型的规划器都实施常见的Planner interface(如上所述)。 然后使用ROS插件架构在运行时查找并选择规划器。 这样可以在需要时轻松地在运行时切换计划。 由于不涉及网络通信,因此与运动规划器的接口是最有效的接口。 如果用户需要在规划前对规划场景进行更改,则推荐使用这种基于插件的方法。

#ROS API
基于插件接口,通过ROS API定义了另外两种与规划者交互的方式:使用action(首选)和service调用。 ROS API由move_group节点提供。 调用此ROS API的包装器也可在move_group interface中使用。