本文转载自微信公众号ROBOTICS
这是ROBOTICS干货系列机器人学入门的一篇过渡文章:一方面,我觉得很有必要把之前讲过的东西串起来过一遍;另一方面,在我们开始啃机械臂的动力学(dynamics)这块硬骨头之前,我们也很有必要弄明白“为什么需要研究机械臂的动力学?”这样一个问题。
我们来看一个现实中的机器人,为了赏心悦目的需要,CC选中了机械臂界的颜值担当UR5。
从上图可以看到,UR5有六个R(旋转)关节,其中基座两个,肘部一个,腕部三个。现在给你这个机器人,要求你写一段程序完成两个任务:一个是把位于A点的物体捡起来并移动到B点;一个是在空中以一定的速度画圆。假设你能读取并准确控制每个关节的位置,你应该怎么做?
我们要做的第一件事,就是确定关节零位,求正运动学解。为什么呢?因为这是你把机械臂数字化、可编程化的第一步。这一步,我们可以采用传统的DH参数法(嗯,不然我们为什么要学这个)。关于采用DH参数法如何确定坐标系(frame attachment),请查看《干货 | 机械臂的坐标与数学模型:传说中的DH参数》一文。总之,在确定原点、确定Z轴、确定X轴等一系列锻炼头脑空间思考能力的步骤之后,你会得到类似下图的关节坐标系。(hint: RGB/红绿蓝对应XYZ)
如果你还记得DH参数定义中关节角度θ的定义,当θ为0时,一个关节的X轴与上一个关节的X轴应该平行——上图正是如此。
下面这张图可以帮助你唤起一些记忆:
我们也可以在机械臂的结构示意图上标出部分参数:
最后可以得到一张DH参数表:
a和d是怎么来的?通常来讲,它们是机械设计的时候确认的设计参数,机械臂的生产产家会告诉你这些数值。还有一个方法,就是你自己在机械臂上量出来……
实际使用中,机械臂的制造商通常会给你完整的DH参数表;实在没有,也有一些算法,通过控制关节运动的同时用外部装置准确测量end effector的位姿,解算出DH参数表。有时候,由于制造过程不可避免的误差、或长时间使用后机械结构的磨损,会导致原有DH参数表不够准确;这个时候也可以用类似的方法重新标定机械臂的DH参数。这部分内容如果你感兴趣,可以查一下机械臂的Kinematics Model Identification或Kinematics Calibration。
现在回到开头说的第一个任务:把一个物体从A点移动到B点。对于这样一个任务,我们只需要机械臂在A点的时候能在对的位置以对的角度拿到物体、在B点以对的位置对的角度放下物体就行了。所以,一个比较合适的思路是:
1、计算A点和B点end effector理想位姿的逆运动学解(可以直接用解析大法几何大法等等)qa,qb
2、从qa到qb求出关节的运动轨迹
3、根据求出的轨迹,控制关节运动
是不是很简单?这样简单的”Pick and Place”应用,大概就是机械臂在工业上最早甚至也是最广泛的应用了。
这里简单地讲一下关节空间的轨迹生成(Trajectory Generation)。需要注意的是,trajectory并不仅仅是空间中的一条线,它是物体位姿对于时间的函数,包含了物体每个时刻的位置、速度、加速度等信息。
假设我们要求从A点运动到B点用时为t’,在A点和B点时end effector均为静止,那我们的轨迹q(t)应当满足这样的要求:
这个函数需要满足上面四个等式,则它至少需要有四个未知数;因此最直接的思路就是用一个三阶多项式来拟合:
关节空间的轨迹生成比起操作空间的轨迹生成简单许多,主要是可以方便地避免超出关节可运动范围或奇异状态等问题。以后有机会,我们再仔细讲讲trajectory generation这个话题。
现在来看开头说的第二个任务:在空中以一定速度画圆。这个任务本身已经规定了end effector的轨迹,而我们的任务是通过控制关节的运动让end effector能够跟随(track)这条轨迹。这样看来,我们很难再采用类似第一个任务那样的办法。
因为我们的任务是让end effector跟随一个圆形轨迹,也就是说,每一个时刻你都知道你要的end effector位姿xd。我们说过,每时每刻都把逆运动学解直接求出来是不太现实的——这个时候,雅可比矩阵求逆法应该自然而然进入你的脑海:
对于这个方法不是很清楚的,请回去看《干货 | “逆运动学”——从操作空间到关节空间》一文。
这个任务相比“Pick and Place”难度提升了一些,但在工业应用中,加工、切割、喷涂等等,类似的应用也非常广泛。
根据任务的不同,我们需要采用不同的解决方法。那么现在的问题是,什么样的任务只靠运动学无法解决好,而需要动力学加入呢?
要回答这个问题,首先要明确动力学研究什么。机械臂的运动学,研究的是关节位置或位置变化与末端执行器位姿或位姿变化的关系,这里面只有“运动”,不涉及任何“动力”;由此可以想见,机械臂的动力学研究的必然与“动力”有关。所谓“动力”,指的是机械臂各部分受到的力或扭矩(我们以后统一用“力”指代“力或扭矩”)。机械臂的动力学,则是要研究下面几个问题:
· 机械臂在运动过程中受到什么样的内力和外力?
· 这些力怎样改变机械臂的运动状态?
· 关节受力与末端执行器的受力有什么关系?
因为研究的是力,所以我们对机械臂的了解,在“关节的运动如何改变末端执行器的运动”以外又深入了一层,进入了“关节驱动器(actuator)产生的力如何改变关节的运动、从而改变end effector的运动”这个层面。也因此,我们将要控制的变量,也从关节的位置或速度,变成了关节的力。
如果你有准确的动力学模型,你就能够准确控制关节的加速度,从而准确控制end effector的加速度。我们知道,位置是加速度对时间的两次积分,这意味着,直接控制加速度允许你对轨迹做更精确快速的跟踪。
对上面所说的第二个任务,如果要求画圆的速度很快,雅可比矩阵求逆法dx不能过大的要求马上就不能满足了。即使忽略这个限制,关节位置控制器由于对它所要控制的对象的动力学一无所知,也很难快速地跟上end effector圆形轨迹需要的关节轨迹。结果是什么呢?机械臂可能会抖得很厉害、画出来的圆会比实际的小且不那么圆、甚至end effector只能在原地振动。
如果你看不太明白上面这一段话也没有关系,我们以后会详细讲机械臂的各种控制方法。但是可以理解的一点是,动力学的引入允许我们更快、更精确地跟随需要的轨迹。
给大家看看舵机做的只用逆运动学的机械臂和工业级的用于做精确激光切割的机械臂画圆的区别——
这个机械臂长这样噢:
现在,我们有最后一个任务,让end effector去打磨一个零件——拿一把锉刀靠近零件然后来回运动并不足够,你还需要能够控制锉刀对零件施加一定的力。很明显,涉及到接触力,单纯用运动学也是无法解决的。动力学的引入让我们有可能控制机械臂与外界的相互作用力。
这篇文章没有太多新的知识,这可能也是任何课本都不会有的章节;但我觉得它很重要。首先,在学完了逆运动学之后,你已经可以尽情地去用Arduino和舵机等等DIY自己的机械臂,尝试不同的逆运动学算法,让它完成搬东西、画画等各种好玩的任务。然而你也要明白,在Robotics的世界里,这只是入门的一步。没有动力学加入控制回路的机器人能做的事情非常有限,它们速度无法做到很快、负载不能做很重、如果功率很大会非常危险。明白了这些,我们才不会在学习复杂的机械臂动力学时不知所以然。