写在前面

我的其他两篇博客,分别介绍了外推法内推法,本文将二者汇总起来,形成可复用的算法

参考自craig的《机器人学导论》

算法汇总 (Craig 改进DH版)

为了方便编程实现,以下是完整的算法流程(假设均为旋转关节,重力由 v ˙ 0 \dot{v}_0 v˙0 引入):

初始化
0 ω 0 = 0 , 0 ω ˙ 0 = 0 , 0 v ˙ 0 = g  (例如  [ 0 , 0 , 9.81 ] T  或  [ 0 , 0 , − 9.81 ] T  取决于定义) {}^{0}\omega_0 = 0, \quad {}^{0}\dot{\omega}_0 = 0, \\ \quad {}^{0}\dot{v}_0 = \mathbf{g} \text{ (例如 } [0,0,9.81]^T \text{ 或 } [0,0,-9.81]^T \text{ 取决于定义)} 0ω0=0,0ω˙0=0,0v˙0=g (例如 [0,0,9.81]T  [0,0,9.81]T 取决于定义)
n + 1 f n + 1 = 0 , n + 1 n n + 1 = 0  (若末端无外力) {}^{n+1}f_{n+1} = 0, \quad {}^{n+1}n_{n+1} = 0 \text{ (若末端无外力)} n+1fn+1=0,n+1nn+1=0 (若末端无外力)

步骤 1: 外推 ( i = 1 … n i = 1 \dots n i=1n)

因为公式和外推的博客中说的不完全一致,故再解释一下拆解后的公式

这一步我们只关心运动,不关心力。对于每一个 i i i,我们需要用到上一步算出的 i − 1 i-1 i1 的数据:

  1. 坐标变换: 计算 i − 1 i R {}^{i}_{i-1}R i1iR(将上一帧的数据转到当前帧)。
  2. 角速度/角加速度: 利用 i − 1 ω i − 1 {}^{i-1}\omega_{i-1} i1ωi1 算出 i ω i {}^{i}\omega_i iωi i ω ˙ i {}^{i}\dot{\omega}_i iω˙i
  3. 线加速度: 利用 i − 1 v ˙ i − 1 {}^{i-1}\dot{v}_{i-1} i1v˙i1 算出 i v ˙ i {}^{i}\dot{v}_i iv˙i(原点加速度)。
  4. 质心加速度: 利用 i v ˙ i {}^{i}\dot{v}_i iv˙i 算出 i v ˙ c i {}^{i}\dot{v}_{c_i} iv˙ci
  5. 惯性力/力矩(中间产物): 既然已经有了 i v ˙ c i {}^{i}\dot{v}_{c_i} iv˙ci i ω ˙ i {}^{i}\dot{\omega}_i iω˙i,立即算出该连杆所需的惯性力 i F i {}^{i}F_i iFi 和惯性力矩 i N i {}^{i}N_i iNi
    • i F i = m i i v ˙ c i {}^{i}F_i = m_i {}^{i}\dot{v}_{c_i} iFi=miiv˙ci
    • i N i = c i I i i ω ˙ i + i ω i × ( c i I i i ω i ) {}^{i}N_i = {}^{c_i}I_i {}^{i}\dot{\omega}_i + {}^{i}\omega_i \times ({}^{c_i}I_i {}^{i}\omega_i) iNi=ciIiiω˙i+iωi×(ciIiiωi)

需要明确的是,前四步都是第五步的前置步骤,核心是第五步,内推法需要的也只是第五步的结果
第五步算出的 i F i {}^{i}F_i iFi i N i {}^{i}N_i iNi 被称为达朗贝尔惯性力/力矩(D’Alembert Inertial Forces/Torques),它们是系统运动产生的“负载”

具体公式如下:

  1. 计算坐标系变换 i − 1 i R {}^{i}_{i-1}R i1iR i − 1 P i {}^{i-1}P_i i1Pi,它们取决于机械结构和当前姿态
  2. i ω i = i − 1 i R   i − 1 ω i − 1 + θ ˙ i Z ^ i {}^{i}\omega_i = {}^{i}_{i-1}R \, {}^{i-1}\omega_{i-1} + \dot{\theta}_i \hat{Z}_i iωi=i1iRi1ωi1+θ˙iZ^i
    i ω ˙ i = i − 1 i R   i − 1 ω ˙ i − 1 + i − 1 i R   i − 1 ω i − 1 × θ ˙ i Z ^ i + θ ¨ i Z ^ i {}^{i}\dot{\omega}_i = {}^{i}_{i-1}R \, {}^{i-1}\dot{\omega}_{i-1} + {}^{i}_{i-1}R \, {}^{i-1}\omega_{i-1} \times \dot{\theta}_i \hat{Z}_i + \ddot{\theta}_i \hat{Z}_i iω˙i=i1iRi1ω˙i1+i1iRi1ωi1×θ˙iZ^i+θ¨iZ^i
  3. i v ˙ i = i − 1 i R ( i − 1 v ˙ i − 1 + i − 1 ω ˙ i − 1 × i − 1 P i + i − 1 ω i − 1 × ( i − 1 ω i − 1 × i − 1 P i ) ) {}^{i}\dot{v}_i = {}^{i}_{i-1}R ({}^{i-1}\dot{v}_{i-1} + {}^{i-1}\dot{\omega}_{i-1} \times {}^{i-1}P_i + {}^{i-1}\omega_{i-1} \times ({}^{i-1}\omega_{i-1} \times {}^{i-1}P_i)) iv˙i=i1iR(i1v˙i1+i1ω˙i1×i1Pi+i1ωi1×(i1ωi1×i1Pi))
  4. i v ˙ c i = i v ˙ i + i ω ˙ i × i P c i + i ω i × ( i ω i × i P c i ) {}^{i}\dot{v}_{c_i} = {}^{i}\dot{v}_i + {}^{i}\dot{\omega}_i \times {}^{i}P_{c_i} + {}^{i}\omega_i \times ({}^{i}\omega_i \times {}^{i}P_{c_i}) iv˙ci=iv˙i+iω˙i×iPci+iωi×(iωi×iPci)
  5. i F i = m i   i v ˙ c i {}^{i}F_i = m_i \, {}^{i}\dot{v}_{c_i} iFi=miiv˙ci
    i N i = c i I i   i ω ˙ i + i ω i × ( c i I i   i ω i ) {}^{i}N_i = {}^{c_i}I_i \, {}^{i}\dot{\omega}_i + {}^{i}\omega_i \times ({}^{c_i}I_i \, {}^{i}\omega_i) iNi=ciIiiω˙i+iωi×(ciIiiωi)

步骤 2: 内推 ( i = n … 1 i = n \dots 1 i=n1)

这里没啥好说的,公式和内推博客中的完全一致

  1. i f i = i + 1 i R   i + 1 f i + 1 + i F i {}^{i}f_i = {}^{i}_{i+1}R \, {}^{i+1}f_{i+1} + {}^{i}F_i ifi=i+1iRi+1fi+1+iFi
  2. i n i = i N i + i + 1 i R   i + 1 n i + 1 + i P c i × i F i + i P i + 1 × ( i + 1 i R   i + 1 f i + 1 ) {}^{i}n_i = {}^{i}N_i + {}^{i}_{i+1}R \, {}^{i+1}n_{i+1} + {}^{i}P_{c_i} \times {}^{i}F_i + {}^{i}P_{i+1} \times ({}^{i}_{i+1}R \, {}^{i+1}f_{i+1}) ini=iNi+i+1iRi+1ni+1+iPci×iFi+iPi+1×(i+1iRi+1fi+1)
  3. τ i = i n i T Z ^ i \tau_i = {}^{i}n_i^T \hat{Z}_i τi=iniTZ^i

关键点

  1. 重力处理: 通过设定基座向上加速 v ˙ 0 = − g \dot{v}_0 = -g v˙0=g (或者根据坐标系方向设定),可以自动在所有连杆上产生重力项,无需在 F i F_i Fi 中显式加 m i g m_i g mig
  2. 坐标系一致性: 所有运算(加法、叉乘)必须在同一个坐标系下进行。上述公式中,所有量左上标均为 i i i,表示都在当前连杆坐标系 { i } \{i\} {i} 下运算。
  3. Craig MDH 特性: 最核心的区别在于关节 i i i 的速度 θ ˙ i \dot{\theta}_i θ˙i 直接加在坐标系 i i i Z Z Z 轴上,而在标准DH中,关节 i i i 通常关联坐标系 i − 1 i-1 i1 Z Z Z 轴。
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐