运动规划 (Motion Planning): MoveIt! 与 OMPL

原文地址:http://www.roswiki.com/read.php?tid=402


最近有不少人询问有关MoveIt!与OMPL相关的话题,但是大部分问题都集中于XXX功能怎么实现,XXX错误怎么解决。表面上看,解决这些问题的方法就是提供正确的代码,正确的编译方法,正确的运行步骤。

然而,这种解决方法只能解决这个特定的问题,而且解决之后我们也无法学到一些实际的东西。要想彻底明白,需要从源头入手,也就是说,不要问“MoveIt! 怎么把机械手从空间一个点移到另一个点?“而是要问”MoveIt! 为什么能把机械手从空间一个点移到另一个点?“ 这一点明白之后,遇到类似的问题,才能从容应对。同理,这不仅适用于MoveIt,也同样适用于其他任何ROS功能。

所以,下文中我们会见到一些具体的例子,但整体上,更倾向于宏观的概念和一些基础的方法,希望对大家能有所帮助。这里的帮助指的是增强对运动规划和Moveit, OMPL的整体理解,而非局限于完成某一个功能,编译运行某一个文件。


我尝试用最简单,最通俗的表达方式来解释这些问题,其中不免会有一些学术上的错误用词和解释,请专业的朋友们见谅,也欢迎指出错误。



一. 基础概念


首先,我们要了解一些基础的概念,了解各个名词的意义和区别。


1.1. 运动规划 (Motion Planning)
我们这里讲的运动规划,有别于轨迹规划 (Path Planning)。一般来说,path planning用于无人车/无人机领域,而motion planning主要用于机械臂,类人机器人领域。当然了,这两者没有本质的区别,理论上说MoveIt!和OMPL同样可以用于无人车无人机的规划,但不免有些杀鸡用牛刀的感觉。两者规划的空间维度不同,导致他们的难易程度不同。举例说明,如果不考虑速度加速度,只考虑位置的话,无人车轨迹规划维度是3 (x,y,和角度), 无人机是6 (x,y,z,和另外3个量确定空间的旋转角度)。确定3D空间的一个姿势(pose)需要6个变量,而对于关节数大于6的机械臂结构,它的规划空间维度就大于6,成为冗余系统(redundant system),从而使规划问题变得更为复杂。所谓冗余系统,就是说,存在多种关节角度配置能够使得终端达到相同的位姿,存在无数的解。这是达到的最终姿势有无数个解,那么如何到达这个最终姿势,整个运动的轨迹,更是存在无数个解。


既然存在无数的解,那么问题来了。很明显,存在两种不同的方向,一种是找到最好的那个解,另一种是快速的找到一个有效的解。前者,大部分算法使用最优规划 (Optimization-based Planning),后者使用采样规划 (Sampling-based Planning)。具体的区别和算法,不在这里赘述。


1.2. 开源运动规划库 (OMPL).
接上文,而OMPL (Open Motion Planning Library), 开源运动规划库,就是一个运动规划的C++库,其包含了很多运动规划领域的前沿算法。虽然OMPL里面提到了最优规划,但总体来说OMPL还是一个采样规划算法库。而采样规划算法中,最出名的莫过于 Rapidly-exploring Random Trees (RRT) 和 Probabilistic Roadmap (PRM)了, 当然,这两个是比较老的,还有很多其他新算法。

  • OMPL能做什么? 简单说,就是提供一个运动轨迹。给定一个机器人结构(假设有N个关节),给定一个目标(比如终端移到xyz),给定一个环境,那么OMPL会提供给你一个轨迹,包含M个数组,每一个数组长度是N,也就是一个完整的关节位置。沿着这个轨迹依次移动关节,就可以最终把终端移到xyz,当然,这个轨迹应当不与环境中的任何障碍发生碰撞。
  • 为什么用OMPL? 运动规划的软件库和算法有很多,而OMPL由于其模块化的设计和稳定的更新,成为最流行的规划软件库之一。很多新算法都在OMPL开发。很多其他软件(包括ROS/MoveIt)都使用OMPL做运动规划。

1.3. 逆运动学 (Inverse Kinematics)
  • 什么是逆运动学(IK)?简单说,就是把终端位姿变成关节角度,q=IK(p)。p是终端位姿(xyz),q是关节角度。
  • 为什么要用IK?OMPL是采样算法,也就是要在关节空间采样。 这与无人车的规划有一个最明显的区别,无人车的目标就是在采样空间, e.g. 目标是(x,y), 采样空间也是(x,y). 但是对于机械臂,目标是终端空间位置(xyz), 但采样空间却是关节空间(q0,q1,...qN)。有了IK之后,我们就可以把三维空间的目标p转化为关节空间的目标q。那么这样就会让采样算法能算的更快,具体方法不赘述,这样的算法有RRT-Connect,BKPIECE等等双向采样算法。


1.4. MoveIt!
问:我不想看也看不懂OMPL和各种算法,但是我想让机械臂动起来,怎么办?
答:那这正是MoveIt!的设计初衷。Move It!让它动起来!
OMPL是运动规划的“规划”部分,而MoveIt!是OMPL的ROS接口。当然这不完全准确,OMPL有单独的ROS接口,但依旧很繁杂,而MoveIt是OMPL ROS接口的接口。。。而且MoveIt!还结合了其他一些功能,总之MoveIt!就是个大接口。。
  • MoveIt!能做什么?一句话,MoveIt!就是一个模块化的接口,让你在最短时间内,不用自己写太多代码,就能配置出一个ROS Package来为你的机械臂做运动规划。

其余具体略。


你可能感兴趣的:(运动规划 (Motion Planning): MoveIt! 与 OMPL)