递归牛顿欧拉(逆)动力学算法

  在前面的文章《递归牛顿欧拉(正)动力学仿真》中,我们介绍了正动力学的计算过程,也就是给定力矩后计算机械臂的运动。本文介绍逆动力学,也就是在机器人的运动已知的情况下反求所需的关节力矩。算法同样来自于论文《Lie Group Formulation of Articulated Rigid Body Dynamics》(下图中画红线的是错误的地方)。这篇论文使用了李群等高等数学知识,如果你感到陌生可以阅读《A Mathematical Introduction to Robotic Manipulation》,该书恰好缺少递归牛顿欧拉动力学的介绍。如果有了前面的数学基础知识,读懂下面的公式其实并不难。


  每步逆动力学计算过程包含两个递归子过程:1. 前向计算速度和加速度;2. 反向计算力矩。这要比正动力学相对简单一些。你是不是好奇:为什么逆动力学包含这两步,为什么不是反过来:反向计算速度及加速度和前向计算力矩?其实仔细一思考你就能理解,原因很简单(需要一点点理论力学的知识):逆动力学的输入是机械臂的运动(包括关节的速度和加速度)。由于基座的速度和加速度是已知的(永远是零),而后一个连杆的速度显然依赖前一个连杆的速度,这是因为机械臂的关节角度是相对于上一个连杆定义的,所以,从基座出发一直向前,直到机械臂末端的连杆,所有连杆质心的速度和加速度都可以算出来。至于力矩嘛,如果我们选择中间任何一个连杆,它两侧的受力(也就是和它相连的连杆对它的反作用力)都是未知的。唯独末端的连杆,它一侧的受力是已知的(为零或者给定)。前向过程已经计算出来了加速度,我们可以借助单刚体的牛顿-欧拉方程求出它另一侧的受力。因为每两个相邻的连杆受到大小相等,方向相反的相互作用力,我们就知道了它前一个连杆一侧的受力。依次向基座的方向(反向)计算,我们可以求出后面所有连杆的受力。所以,力矩的递归是反向的。

具体实现(Mathematica代码)

time = 2000; dt = 0.001;
Table[mass[i] = 1; Gravity[i] = grav*mass[i]*{0, 0, -1, 0, 0, 0}, {i, 0, n, 1}];
Table[g[i, i + 1, 0] = RPToH[Id[3], {0, 0, (La[i] + La[i + 1])/2}], {i, 0, n - 1, 1}];
q = dq = ddq = ConstantArray[0, n];
q[[1]] = -3 Pi/4;
Table[V[i] = dV[i] = ConstantArray[0, 6], {i, 0, n, 1}];
Table[M[i] = Id[6]; \[Tau][i] = 0, {i, n}];
F[n + 1] = ConstantArray[0, 6];
g[n, n + 1] = g[0, 0] = Id[4];
qList = gList = \[Tau]List = {};
dq = ConstantArray[-0.6, n];
Table[
  qList = {qList, q};
  gList = {gList, g[0, n]};
  \[Tau]List = {\[Tau]List, Array[\[Tau], n]};
  q = q + dq*dt;
  (*Forward*)
  For[i = 1, i <= n, i++,
   g[i - 1, i] = TwistExp[\[Xi]r[i], q[[i]]].g[i - 1, i, 0];
   g[0, i] = g[0, i - 1].g[i - 1, i];
   V[i] = Ad[Iv[g[i - 1, i]]].V[i - 1] + \[Xi]s[i]*dq[[i]];
   dV[i] = Ad[Iv[g[i - 1, i]]].dV[i - 1] + ad[V[i] - \[Xi]s[i]*dq[[i]]].\[Xi]s[i]*dq[[i]] + \[Xi]s[i]*ddq[[i]];
   ];
  (*Backward*)
  For[i = n, i >= 1, i--,
   Fext[i] = T[Ad[RPToH[R[g[0, i]], {0, 0, 0}]]].Gravity[i];
   F[i] = M[i].dV[i] - T[ad[V[i]]].M[i].V[i] + T[Ad[Iv[g[i, i + 1]]]].F[i + 1] - Fext[i];
   \[Tau][i] = \[Xi]s[i].F[i];
   ];
  , {t, time}];

仿真结果

  我们选择6个连杆进行仿真试验,连杆之间用转动关节连接,所有关节的速度都设为常数-0.6 rad/s。给定关节速度下,机器人的运动如下图左所示(显示了Y-Z平面)。逆动力学求得的关节力矩如下图右所示。

  

正确性验证

  为了验证逆动力学算法的正确性,我们借助前面得到的正动力学:将逆动力学求得的力矩带入正动力学进行仿真,看看机器人的运动与我们设定的运动是否相同,整个过程就是一个闭环,如下图:


  正动力学仿真的结果如下图所示。可以看到结果与我们给定的运动一模一样,这证明我们的逆动力学是正确的。


猜你喜欢

转载自blog.csdn.net/robinvista/article/details/55798632