事情也很简单,就是比如说现在你有一个机械臂,最开始末端在A点,你想去B点,怎么计算出来机械臂的这些关节应该怎么转才能达到这个效果呢?
其实也挺简单的,首先我们拿最经典的六轴机器人举例子,先建立模型。
首先这六个关节都能转,所以说有六个运动参数 \(\theta_i\)。
然后还有一些静态参数,描述每个关节到底朝哪个方向转,关节之间间距多少之类的,这个用绝对坐标不好描述,因为后一个关节的位置和朝向受到前一个的影响,所以我们对每一个关节都建一个坐标系 \(i\)。具体就是 \(z_i\) 轴落在 i 号关节的旋转轴/伸缩轴的轴线上,\(x_i\) 就落在 \(z_i\) 和 \(z_{i+1}\) 的公垂线上,这样原点和 y 轴也能得到了。
接下来再去看有哪些静态参数,你看这个机械臂,一个关节本质上只有空间位置和朝向两个参量,但是我们递推的时候,考虑当前关节转动对下一个关节的影响,哪些会变哪些不会变?那就很显然了,我们给当前关节和下一个关节连一个矢量,这个长度不会变,方向只会随着轴转,而下一个关节的朝向(即旋转轴)和这个矢量的相对方向也不变,这些不变量就是固定参数了,把矢量分别投影到xoy和z上面能得到连杆长度a和连杆偏距d。再看朝向,再记录一个两个关节轴的夹角 alpha 就行了。
为什么要把这个矢量投影成俩呢?一个是好算,另一个是关节的空间位置位置其实并不是良定义的,因为有的情况下把关节看成一个点是失真的,比如一个万向轴,你要拆成xyz三个方向的关节,可能就会涉及到关节内部的情况了,这样不保证正确。关节最本质的东西只有那个旋转轴,而我们反过来用建立的坐标系(利用了相邻关节的位置关系,换句话说其实是轴的位置关系)来用坐标原点”公理化地“定义了关节的空间位置。这一点挺深刻的其实。
这个东西就是所谓的 Denavit–Hartenberg 参数法。
那运动也就很简单了,就是按照定义一步步来,先绕着 \(z_{i-1}\) 轴旋转 \(\theta _i\),再沿着 \(z_{i-1}\) 轴平移 \(d_i\) ,再沿着 \(x_i\) 轴平移 \(a_i\),再绕 \(x_i\) 轴旋转 \(\alpha _i\)。为了让平移齐次化,我们用齐次坐标表示,这样一次变换的矩阵就是:
总变换也就是 $$^0T_n = ^0T_1 \cdot ^1T_2 \cdot ^2T_3 \dots ^{n-1}T_n$$ 。
那么假如说我们期望运动到点 \(x\),要反过来求 \(\theta\) 怎么办呢?
一般的 DH 参数法反解逆运动利用了六轴机器人本身的一些性质:后三轴交于一点。这样可以根据末状态参量求腕心,再用分析方法硬去解各个参数。
不过这么解有两个局限性,一个是它利用了一般六轴机器人的良好结构,一旦我们设计的不是那么巧妙,这个方程的一般形式又不是齐次的(甚至不是分离参数的),很可能解不出来;另一方面是现在末端空间坐标和姿态是六个参数,刚好满秩,如果再多一些自由度,这种解析的方法要面临一个在高维解空间里取点的问题,如果这个空间的解系很难写,要选一个特解,这种分析法就有些困难了。
为了应对上述两个问题,我们对更一般的机械臂也可以通过一些数值方法处理逆运动。
为了强调未知数,我们把$$^0T_n$$ 直接记作 \(^0T_n(\theta)\),其中 \(\theta\) 是一个 \(n\) 维向量,表示各个关节角。我们就是要求 \(\theta\) 使得 \(^0T_n(\theta)\approx T_d\),即末状态。
现在我们手里有正运动学公式,在推出来的4*4齐次坐标矩阵里面能够提取出来一个包含了位置和姿态的六维向量,拿这个六维向量和期待的六维状态向量做差能够得到误差函数,后面就有很多种办法做了,有我们熟悉的梯度下降法,当然在这里用不上那一套,用数值雅可比法就可以了,也就是牛顿法在向量函数上的推广。
我们有没有稍微不数值一点的方法,或者更本质一点的方法分析一下一般机械臂该怎么动呢?
回顾一下整个机械臂的变换过程,显然这个变换是属于三维刚体位姿群 \(SE(3)\) 的,显然这是一个李群,我们可以去求他的李代数,在李群单位元处求正切空间。
对于每个转动关节,我们需要对应一个运动旋量 \((\omega,v)^T\),其中 \(v=-\omega\times q\)。也就是做了个简单的线速度角速度分解。
把运动旋量写成矩阵形式直接可以对应到李代数元素了,然后做指数映射可以化作指数积公式,后面再说。
