逆运动学CCD算法的研究

时间:2014-06-07 07:57:18

标签: algorithm 3d vector-graphics robotics inverse-kinematics

让我们说一个机器人手臂在3D空间中的A,B,C,D点处有关节。设D是最终效应器(最底层的子),A是最顶层的父。设T为空间中的任何目标点。目的是使末端效应器在顶层(父母)中以最小的旋转达到目标。

我最初的想法:

1)将臂C旋转角度TCD。 2)然后以新角度TBD旋转臂B. 3)然后以新角度TAD旋转臂A.

但是在第2步之后,最终效应器似乎远离了目标。我做错了什么,我该如何解决?

2 个答案:

答案 0 :(得分:0)

在我开始使用一些更高级的方法之前,我这样做了:

pe=desired_new_position;

for (i=0;i<number_of_actuators;i++)
 {
 // choose better direction
                   p=direct_kinematics(); d =|p-pe|; // actual step
 actuator(i)--;  p=direct_kinematics(); d0=|p-pe|; // previous step
 actuator(i)+=2; p=direct_kinematics(); d1=|p-pe|; // next step
 actuator(i)--;  dir=0; d0=d;
      if ((d0<d)&&(d0<d1)) dir=-1;
 else if ((d1<d)&&(d1<d0)) dir=+1;
 else continue;

 for (;;)
  {
  actuator(i)+=dir; p=direct_kinematics(); d =|p-pe|;
  if (d>d0) { actuator(i)-=dir; break; }
  if (actuator(i) on the edge limit) break;
  }

 }

[注释]

  1. 您可以通过一些步骤而不是1

    将其修改为inc / dec执行器位置

    如果差异超过零则停止,然后以较小的步骤重新开始,直到step == 1这将提高性能,但对于大多数应用来说,step=1足够{1}}因为新位置通常接近最后一个。

    < / LI>
  2. 请注意,这可能会卡在本地min / max

    如果输出卡住(效应器位置不变),则随机化执行器并再试一次。发生这种情况取决于运动学的复杂性和你想要使用的路径类型

  3. 如果手臂在顶部然后在底部被驱动更多

    然后尝试反转i-for循环

  4. 如果你必须控制效应器正常

    然后你必须从CCD中排除它的旋转轴并在CCD

  5. 之前设置它

答案 1 :(得分:0)

很难直接对此进行编码,但您可以从优化的角度来解决这个问题(并且可以隐含许多最先进的方法来解决这个问题,这可以在互联网上轻松找到)。设x'和y'是固定的最顶端A,x''和y''是目标。那么这个问题可以形式化如下,

enter image description here

其中gamma_i是每个关节的旋转权重(您可以简单地让gamma_i = 1),alpha_i是旋转值。您的优化目标是在受到一些限制的情况下获得父母的最小轮换。 x',y',x'',y''是常数,另一个是变量。可以添加其他不等式来限制旋转角度。

公式f(x',y',x_1,y_1,alpha_1)= 0表示通过alpha_1的A旋转,点B可以重新定位到x_1,y_1。如果你可以指定旋转的细节(例如f是线性的,那么可以实现单纯形法,但似乎f是二次的)。

对不起我的英语不好,希望这可以提供帮助:p