机器人动力学分析
机器人分析分为牛顿欧拉法、拉格朗日法、高斯法、凯恩方法。

MATLAB 提供的逆动力学采用的是牛顿欧拉法:RNE——Recursive Newton-Euler。
需要三个参数,第一个是给定最终的角度,第二个是速度,第三个是角加速度,返回各个关节所需要的力矩。 可选参数有重力加速度和负载 fext。
牛顿欧拉法
我们的目标是给定机器人的关节位置 q、速度 qd 和加速度 qdd,计算出为了产生这个运动状态,每个关节需要施加多大的驱动力矩。
初学者容易混淆的是,我们之前用力域雅可比解决过每个关节应该分配多大力矩的问题。
'力域雅可比'解决的是一个不同的问题,属于静力学或外力映射范畴,它的目的是将作用在机器人末端执行器上的外力/力矩。
映射到对应的关节空间力矩。
区别就是一个是给定运动状态,计算每个关节为了达到这个运动状态需要多大力; 另一个则是给定末端的力,计算这个力分配在各个关节上是多大。
牛顿欧拉法的精髓在于正推和逆推,我们来看这个过程:
- 正向递推(Forward Recursion):从基座到末端,计算每个连杆的速度、加速度。
- 反向递推(Backward Recursion):从末端到基座,计算每个关节需要提供的力和力矩。
动力学的目的就是计算在某个运动状态下,各个关节应该施加多大的力,因此核心是构建一个**'运动状态 - 力学参数'**的方程,牛顿和欧拉两位大佬就提供了。 我们的核心就变成了如何得到各个关节的'真实速度'。 我们已知各个关节的关节空间的速度、角速度、加速度,如何将前一个坐标系的运动参数传递给下一个坐标系计算呢? 这就用到了正推,构建线速度、线加速度、角速度、角加速度以及质心和端点的速度关系。 这里面最难理解的就是对 Zi 轴的求导,我们把求导拆成先微分再对时间求导,并用红蓝绿坐标系表示了这个过程。 最终得到了运动参数的递推公式。
我们又知道,力的传播是从末端向基座的,因此力的计算就是逆推的过程。 我们先对连杆的相互作用点进行了受力分析,并构建了端点到质心的变换公式,得以计算质心处的合力矩情况。 此时的合力矩指的是 xyz 三方向的合力矩,但是关节电机只能控制绕 z 轴旋转的力矩,因此我们将合力矩中的 Z 方向力矩提取出来,直接用 Z 的方向向量点积即可。 由此,我们就能通过得知各个关节的关节速度、加速度,从而推导出各个关节需要多大的力矩了!
那么构建运动状态和力的关系的等式就显而易见了:
牛顿方程:
用于解决刚体平移的动力学刻画,沟通力与线加速度的关系。
欧拉方程:
用于解决刚体旋转的动力学刻画,沟通力矩与角速度、角加速度的关系。
其中,
是刚体在{C}中的惯性张量。惯性张量矩阵求法可以参考相关资料。
那么要得到连杆质心的力和力矩,就必须要求线加速度、角速度、角加速度了。
由于串联机械臂具有强耦合关系,因此相邻关节之间存在一定递推关系。假设你在旋转肩膀的同时转动胳膊,定义肩膀的角速度ω1,胳膊的角速度ω2,此时,你胳膊的实际角速度并非ω2,而是一个与肩膀角速度相关的函数,意味着当前连杆的运动状态依赖于前一个连杆的运动参数。递推法就是计算当前连杆真实运动状态的方法。
正推
首先对连杆 1 进行计算,然后利用递推式,就能得知连杆 2 的运动状态直至关节 n。
我们只关心相邻连杆的运动状态关系:
旋转运动参数
角速度
对于角速度:

这个式子很好理解,地球自转的同时也绕着太阳公转,因此真实的角速度是公转速度 + 自转速度。在这里,wi 指前一个关节的角速度,即绕太阳的公转速度,第二项是地球绕地轴 Zi+1 的自转速度。
角加速度
对于角加速度:

角加速度无非是对角速度求时间的微分。 第一项求导很正常。 第二项求导要注意,是乘积求导法则。对于速度
求导没问题,重点在于如何对
求导。


为了简化计算,我们不妨设
和
互相垂直,那么根据下图,此时的
表示
离原来偏移了多少,就可以用
与
叉积表示了!
前 X
的结果就是最大的红色箭头。假设经过 dt 后
从(前)变到(后),此时
正好与叉积结果平行!
叉积就是乘以 sin,于是有:
对于 dt 求导
这就是第三项的来源!

接着,由于我们是根据 i 系的运动状态计算 i+1 系的运动参数,因此要把所有参数转入{i+1}系中: 同时利用旋转矩阵({i}系与{i+1}系的旋转矩阵)将所有参数的上下标统一:

平移运动参数
线速度
线速度不仅会由前一个连杆传递(即便前一个连杆不存在平移,也可能继承了前前个平移关节的线速度); 如果前一个连杆是旋转关节,由于存在连杆长度 R,必然会产生由旋转而产生的线速度
也就是 角速度X半径:

这个
是指{i}系原点指向{i+1}系原点的向量,也就是连杆长度。
线加速度
同理,求加速度就是对速度求时间的微分。 第一项求导很正常。 第二项求导要注意,是乘积求导法则。

是显然的线速度就是 角速度X半径 嘛
把
替换进求导的式子,得到上式。
接着,先将各参数转入{i}参考系,再用{i}系与{i+1}系的旋转矩阵
将运动参数转入{i+1}系中。

从质心到关节的变换
上面我们刻画了质心的运动参数递推关系,但是在实际控制中,我们肯定控制的是关节,因此还需要将质心处的参数变换到关节上:

线速度
规定关节坐标系原点指向质心的向量为
,那么这显然是一个类似'平移'的操作,因此套用线速度的递推公式:

线加速度
同理求导,下式关系显然满足(旋转引起的线速度=角速度 X 半径)。

因此求导可得:

同理,将其转入{i+1}系:

这就是书上这几个不给推导/引用链比你还长的式子的简要理解:


注:
书上的推导是严谨的,但是深邃难懂。此外,从三系变换到 i、i+1 系变换过于突兀,极其不易理解。 因此给出这个浅显易懂的推导。
汇总
总而言之,我们已经掌握了线速度、线角速度、角速度、角加速度的递推公式:

同时,牛顿和欧拉两位大佬也给我们提供了力和力矩的递推公式:

至此,我们就完成了正推公式的推导和理解,我们已经能借助前一个连杆的运动参数计算当前连杆的运动参数了。
知道运动参数后,我们就可以通过从第 n 连杆往回推各关节需要的力矩了。
反推
反推就是通过力、力矩和运动参数构成的方程,输入运动参数,获得各关节的力矩。
我们采用改进 DH 参数建模,在改进 DH 建模方式中,最大的区别就是第 i 连杆在第 i 关节的后面。
每一个关节都独立产生控制力矩,我们对第 i 连杆受力分析: 杆 i 会受到杆 (i-1) 的作用力
,也会受到杆 (i-1) 的反作用力
。
因此列出牛二:
其中 F 是该连杆质心处的合力,
、
是作用在两侧关节的力。

统一到{i}坐标系中:

接下来,我们对连杆{i}受力分析:
假设连杆{i}存在前后两段连杆{i-1}{i+1}: 我们的目的是分析连杆{i}质心处的受力情况

看这张抽象图: 假设所有关节的 z 旋转轴平行,且垂直纸面向外,这意味逆时针旋转为正向。 首先,**关节{i-1}逆时针旋转,因此会给杆{i}**一个向左上的力
。 **关节{i}也逆时针旋转,因此会给杆{i}**一个向右上的力
,自身会受到**杆{i+1}**的反作用力
。 **杆{i-1}对杆{i}**施加 fi 的力,力臂为 r1,那么根据右手法则,四指由 f 指向 r,得到力矩 N 的方向朝下(纸内); **杆{i}对杆{i+1}施加 f1+1 的力,力臂为 ri+1,那么杆{i+1}**同样会施加给它一个反作用力-fi+1,于是四指由 f 指向 r,得到力矩 N 的方向朝上(纸外);
我们的目标是要计算质心处和合力矩。目前已经得到两端相邻连杆对杆{i}的作用力矩了,还要将其转换到质心处:

假设质心 Ci 向杆{i}坐标系原点的向量是
,那么质心 Ci 向杆{i+1}坐标系原点的向量就是
。 对于作用于两端的力矩就可以通过这个公式合成到质心处:得到
就是质心处的合力矩。

那么关节 i 应该施加的力可以通过移项得到
,观察公式,显然是和
相关的,因此,要计算前一个关节的力矩,就必须得知后一个关节的力矩。
这就是为什么计算力矩的过程叫做'逆推'!
而至于为什么要引入质心,就是为了构建上面的等式,构建前后关节的力矩关系,从而递推,他就是个中间变量。
我们继续,
实际上,
并不是最终的关节力矩,而是中间计算过程中的一个变量——惯性力矩。
那它和真正的'关节力矩'是什么关系呢?
惯性力矩考虑了当前杆件和相邻杆件的惯性力矩、外力和重力的影响。 但是,我们的关节只能产生绕 z 轴旋转的力,至于重力或负载给的压力,它根本无法影响,换句话说,重力、压力、等非绕 z 轴的力无法被关节控制。
因此我们还需要提取与绕 Z 轴相关的力矩,这很简单,直接用 Z 轴的方向向量点积即可提取出这个方向上作用的力:

如图,
是一个考虑了 xyz 三个方向和合力矩,但我们只想要 z 轴方向的力矩,因此乘以了
。
至此为止,你就完全掌握了正逆推的过程!!!
我们快速总结一下:
动力学的目的就是计算在某个运动状态下,各个关节应该施加多大的力,因此核心是构建一个'运动状态 - 力学参数'的方程,牛顿和欧拉两位大佬就提供了。 我们的核心就变成了如何得到各个关节的'真实速度'。 我们已知各个关节的关节空间的速度、角速度、加速度,如何将前一个坐标系的运动参数传递给下一个坐标系计算呢? 这就用到了正推,构建线速度、线加速度、角速度、角加速度以及质心和端点的速度关系。 这里面最难理解的就是对 Zi 轴的求导,我们把求导拆成先微分再对时间求导,并用红蓝绿坐标系表示了这个过程。 最终得到了运动参数的递推公式。 我们又知道,力的传播是从末端向基座的,因此力的计算就是逆推的过程。 我们先对连杆的相互作用点进行了受力分析,并构建了端点到质心的变换公式,得以计算质心处的合力矩情况。 此时的合力矩指的是 xyz 三方向的合力矩,但是关节电机只能控制绕 z 轴旋转的力矩,因此我们将合力矩中的 Z 方向力矩提取出来,直接用 Z 的方向向量点积即可。 由此,我们就能通过得知各个关节的关节速度、加速度,从而推导出各个关节需要多大的力矩了!
静力学分析
特别地,当机械臂的速度加速度均为零时,也就是静止时,上面的式子可以得到简化: 下式就刻画了静止时各关节力和力矩的计算方式,它可以分析静态下机械臂的负载能力。

这就是 MATLAB 机器人工具箱的 rne 的实现逻辑。
为什么选择牛顿欧拉法?
时间复杂度最低——仅 O(n)
相对而言,拉格朗日法接近 O(n^3)
| 方法 | 原理 | 计算效率 |
|---|---|---|
| 牛顿 - 欧拉法 | 牛顿第二定律 + 欧拉方程 | ⭐⭐⭐⭐⭐ O(n) |
| 拉格朗日法 | 能量法 | ⭐⭐ O(n³) |
| 高斯法 | 最小约束原理 | ⭐⭐ |
| 凯恩法 | 广义达朗贝尔原理 | ⭐⭐⭐ |
当然 RNE 也有缺点:
- 推导过程繁琐,依赖递归顺序。
- 不易直接得到显式动力学模型。


