雷锋网新智造按:运动规划(Motion Planning),有别于轨迹规划(PathPlanning)。一般来说,轨迹规划用于无人车/无人机领域,而运动规划大多数都用在机械臂,类人机器人领域。关于运动规划的具体定义,雷锋网新智造本期公开课特邀请到上海交通大学机械与动力工程学院博士生邱强为我们做详细的讲解。邱强目前研究方向为机械臂运动规划,除了讲解什么是运动规划,还会介绍他做的机器人规划实例。同时,他还会讲解目前关于运动规划都有哪些前沿研究方向。
邱强,上海交通大学机械与动力工程学院博士生,本科毕业于清华大学机械工程系,目前研究方向为机械臂运动规划。运营个人微信公众号Nao (ID: qRobotics),以qqfly(或fly qq)之名撰写过多篇技术文章。
以下内容整理自邱强在雷锋网硬创公开课的分享,由于内容有很多针对图或视频的细节讲解,文中做了删减,完整内容可观看视频。关注雷锋网旗下微信公众号「新智造」,回复「PPT」可获取嘉宾完整PPT。
我们先来看这四个视频。左上角是机器人在抓取桌上的东西,这是我们实验室之前一个博士师兄的课题,主要就是机械臂通过轨迹规划抓取识别到的物体而不碰到障碍物。右上角是蛋白质折叠过程,使用的是我们之后会提到的算法去规划它空间变化。左下角是《帝国时代2》的场景,我们在玩这类游戏的时候只要点击一个目标点,游戏人物就会自行找到可行的路径。最后一个是我们之前做过的一个机器人导航项目,通过激光雷达和算法机器人可在室内找到路径。从这四个视频我们大家可以从中给运动规划得出一个定义:
在给定环境中,指定机器人起点与终点,计算出连接起点与终点,并满足一定约束条件(如避障)的轨迹。
从数学角度上看,移动机器人的路径规划( Path Planning )也属于运动规划的范畴。但由于问题的维度不同,所以使用的算法也不同,大家习惯上将两者区分开。
这是世界银行发布的关于中日两国国内生产总值(GDP)变化曲线图,小图是中日两国的人口结构,能够正常的看到2000年日本和中国2015年的人口结构已经很接近了,所以未来中国劳动力数量会减少,我们一定要提高平均劳动生产力,这样才可以防止GDP的增速减缓。机器人是能解决这样一些问题的。
传统工业机器人主要使用在在汽车行业,而这个行业的特点是一个车型可以生产很多年,同时每台车的利润也会相较较高,但是从目前来看机器人在汽车行业已经基本饱和,所以大家的关注点开始转向3C(Computer、Communication、ConsumerElectronics)行业。
3C产品具备这些特点:更新周期短、款式种类多、单件利润低、整体市场大、劳动力成本增加、对自动化需要加大。
现在我们工业机器人的使用方法通常是示教,即使像右图采用拖动示教这种比较便利的方式,效率还是很低,因为每一台机器人的示教都需要人参与进来,而且示教的路径没办法应对其他一些环境的变化,尤其在3C行业你每次更新一次机型,我们就必须对流水线上所有的机器人重新示教,这样的效率肯定是不够高的。
当然,目前有些机器人应用是加入了机器视觉等技术,就是在检测之后让机器人应对一些变动情况。左边码垛机器人是通过视觉可以抓取东西,但它的路径是人工指定中间点。右边是我做过的类似插秧机器人,原理与前面码垛机器人类似。这类机器人想要在3C行业被灵活运用肯定是不行的,所以如果运动规划研究成熟算法较为稳定的话,就可以用高级编程语言去编程,比如我们的指令让它抓取零件A然后加工零件B的某一面,这种下达指令的方式就不需要每一步都示教了。
然后,我们从最基础的问题入手,也就是2维环境中的点状机器人(point agent),点状机器人是没有实体的。接下来介绍下点状机器人的路径规划算法都有哪些。
前面我们讲的都是2D点状机器人的情况,现在我们想怎么把这样一些问题推广到实际机器人上。实际机器人有两个问题,一个是机器人不再是一个点,需要将机器人的体积考虑在内,另外,机器人的自由度更高,原本的算法是否都还可用?
C 空间拓扑性质与笛卡尔坐标系下的情况不同——二自由度机械臂的C空间是一个圆环面
大部分机构(连续旋转关节、平动关节等)形成的构形空间均是微分流形,任一点的邻域均与欧式空间同态
栅格法:理论上可行;但会计算量太大;对于一个六自由度机械臂,我们按照6°分辨率(已经是很低的分辨率了)划分网格,那么将会产生606 = 4.67 × 1010 个网格,单是对每个网格进行碰撞检测(如果碰撞检测速度为0.1ms),就需要1296小时。
不需要知道 C 空间的详细情况,只对随机采样点进行碰撞检测(判断是否在 C 空间的可行区域内)
理论现状是,从运动学规划角度,给定足够多的时间一定能最优且完备地求解到轨迹。从理论的角度而言,这样的一个问题已经解决了。现在研究方向主要在这两个方面,探索新问题和做一些实用化工作。
这个算是蛮实用的,因为每次规划完执行的过程中会遇到环境变化的问题,这就需要在执行过程中重新规划。重新规划的路线与之前的路线是连接的,而不是中间停下来重新走。上面是RSS在2016年的研究,感兴趣的能了解下。
理想状态下机器人在运动规划下直接端一杯水到一个地方就行了,但真实的情况下这样的一个过程是有动力学在里面,如果不做任何处理,这个杯子会掉。所以,在考虑了动力学之后,重新进行运动规划,这时候杯子才不会掉。这样的一个问题还是最简单的,因为你只需要把它变成一个约束就好了。
因为我没有做这块东西,所以不太清楚它是怎么运作的,但是这样的一个问题是存在的,因为在规划的时候会跟环境接触,例如这个机器人攀爬杆子然后落地,涉及到整个身体动力学跟你身体运动的协调过程,这个工作是MIT计算机科学和AI实验室在2014年的实验。接触动力学比传统的单体动力学复杂很多,因为我们不知道它接触的碰撞摩擦力这些不好建模。
运动规划是指我给你一个大任务,你自动生成一些小任务。这是IROS在2016年的一个工作,它的目标是让机器人到达对面这个点,而它的路径被障碍物挡住了,这样一个时间段把运动规划加进来,从更高一个空间维度去求解这样的一个问题。第一步,它把这个桌子往前推,发现桌子推不动的时候对任务进行重规划,然后规划到去推这个桌子,然后发现执行的效果与预计的不一样,所以它又生成新的任务,然后它拉开桌子之后就走到了对面实现了工作。这只是一个很简单的demo,但实际上生活中会遇到很多这样的问题,比如我想从这个房间到另一个房间,而门是关着的,这样一个时间段就需要把门打开。所以说,不是要给机器人生成很多子任务,而是一个大任务,未来服务机器人想要做好这块是必须要做的。
另外大部分时间大家都用在了实用化上,虽然说只要有足够时间它一定能求解出来,但真实的情况下我们不可能给它无限的时间。另外RRT这些算法生成轨迹很奇怪, 你可以看右边这一个视频,只是让它敲这样的一个东西它要画一大圈,所以这也是一个问题,就是怎么优化它的轨迹。所以要将研究领域好的算法往工业领域推,目前两者之间是存在很大缺口的。
这个工作是想办法把旧的轨迹给用起来,通过人工的方式指定一个运动微元,也就是原始轨迹,等到了新的环境后再进行改变。当然,这个爬楼梯的过程,环境和动作大多数都相同,所以能在这个微元的基础上进行改变。首先,通过变形的工作拉到现在起始点位置,部分起始点会重合,然后对这些新起始点进行重复利用,它会形成一个好的轨迹。这个工作是Hauser et al在2008年发布的论文。现在存在的问题是运动微元必须由人工来指定,所以研究方向是由系统自动生成运动微元。
这是之前做的一个内容,最简单但在相对固定的环境比较好用。大概原理就是根据人工示教的路径,通过高斯混合模型(GMM)对可行C空间进行建模,之后在这个GMM-C空间内进行规划。这样的解决方法有点类似Learning From Demonstration 的工作,但我只用了它们前面一半的步骤,后面一半还是采用采样的方法。
这个是我针对工艺流程做的另一个工作。我们在工业领域用机器人往往期望的不是整个机械臂的动作,而只是末端的动作。假设我要抛光一个面,首先我要对末端进行规划,用CAD模型就可以计算实现;得到路径后发给机器人,之后直接求逆解或者用雅克比迭代过去。当然,这种方法大部分时候够用,但有时候也会遇到奇异点或者碰到障碍物。我就是针对这个七轴的机械臂,利用它的一个冗余自由度进行规划。因为末端是固定的轨迹,这样一个时间段,只要找到冗余自由度对应的C空间流形,我们就可以在这么一个低维(2维)流形内进行很快速的规划,实现末端固定轨迹,且关节避障避奇异。
我个人现在现在最关注的一块,目前还没有实质性的东西出来,在这里就和大家讨论下,我觉得这一块未来会出来不少的研究成果。
假设深度学习做运动规划,那么它进行一次运动规划的时间就是一次网络正向传播时间,这一段时间非常短的,所以只要网络训练好后,运动规划需要耗费很久的问题就没有了。目前这块也有一些这方面的研究,上面左边图是用深度学习玩游戏,Nature上的一篇论文,效果比人还厉害;右上角是谷歌用深度学习来开门;右下角就是AlphaGo下围棋了。这个是很有意思的,它也是运动规划和控制的问题,但它是用网络来做的映射。
我为什么对这方面很感兴趣呢?首先,CNN已经具备强大的环境理解能力,很容易从观测估计状态,观测是图片这类,而状态,如果是物体识别,就是是什么物体,如果是定位,那就是物体在啥地方。也就是说,在给定信息满足系统状态可观性的前提下,CNN环境理解能力是很强大的。
第二个就是RL(强化学习)能够直接进行路径规划,通过 value iteration 等方式建立表格,这个表格纪录的是从状态到动作的映射。不过运动规划的维度这么高不可能用表格来存,所以能通过神经网来解决这一个映射问题。
A:这几个概念在国内的教材里确实比较混乱,所以我按照我的理解大概说一下:①运动规划(Motion Planning)就是我这次说的主要内容;②路径规划(Path Planning)跟运动规划概念是一样的,只是我们习惯上把它放在平面机器人上;③轨迹规划(Trajectory Planning),主要是涉及速度、加速度插值,包括梯形速度曲线等底层的轨迹插值算法。
A:首先是姿态的连续变化问题:因我们是在C空间(也就是关节空间进行的),所以不存在这样的一个问题;如果是对无人机进行规划(在SE(3)里),那就能考虑看看四元数插值的算法。
第二个是角速度、角加速度连续;这个有两种方法,一个是我只规划角度,然后用轨迹规划进行插值;另一个是我同时规划速度和加速度(如优化算法),直接得到一个轨迹。
A:AGV的路径规划,我这边做的不多,而且会根据你具体做的内容而不同(如SLAM、定位、导航等)。就我实验室来说的话,在ROS下效果就不错,可以用gmapping建图、然后navigation导航。当然,如果ROS还是更适合实验室,商用的话我就不太了解了。
A:因为机器人涉及的内容真的很多,如果是做机械臂的话,我依旧是建议把基础的东西完全弄清楚,包括空间运动、正逆解、动力学等。因为这些基础知识里很多细节,如果直接跳过,后面会遇到很多问题。这方面打好基础,后面就会轻松很多的。
Q:机械臂逆运动学推导和雅可比矩阵求解怎么在Ros上结合规划算法来做出仿真?
A:其实我们规划的过程中要一直进行运动学求解等。当然,ROS里面的话,我们大家可以先不关心这个。因为ROS里的KDL、ikFast等都可以帮我们做这些工作。当然了,由于MoveIt采用的是Plugin的形式,如果是你自己算的运动学,那能做成Plugin放进去。之后MoveIt的规划就是基于你的运动学进行计算了。
A:这个有两点,一个是刚才提到的重规划re-plan问题,当环境变化或者任务变化的时候能在执行的过程中重新规划出一个新的轨迹;另外一个则是在规划的过程中考虑动态情况:例如我们对无人车进行规划的时候,就应该同时估计出周围人、车的速度和运动趋势,之后在此基础上进行规划。这样做才能够避开运动的障碍物等。