让我们说一个机器人手臂在3D空间中的A,B,C,D点处有关节。设D是最终效应器(最底层的子),A是最顶层的父。设T为空间中的任何目标点。目的是使末端效应器在顶层(父母)中以最小的旋转达到目标。
我最初的想法:
1)将臂C旋转角度TCD。 2)然后以新角度TBD旋转臂B. 3)然后以新角度TAD旋转臂A.
但是在第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
将其修改为inc / dec执行器位置如果差异超过零则停止,然后以较小的步骤重新开始,直到step == 1
这将提高性能,但对于大多数应用来说,step=1
足够{1}}因为新位置通常接近最后一个。
请注意,这可能会卡在本地min / max
中如果输出卡住(效应器位置不变),则随机化执行器并再试一次。发生这种情况取决于运动学的复杂性和你想要使用的路径类型
如果手臂在顶部然后在底部被驱动更多
然后尝试反转i-for循环
如果你必须控制效应器正常
然后你必须从CCD中排除它的旋转轴并在CCD
答案 1 :(得分:0)
很难直接对此进行编码,但您可以从优化的角度来解决这个问题(并且可以隐含许多最先进的方法来解决这个问题,这可以在互联网上轻松找到)。设x'和y'是固定的最顶端A,x''和y''是目标。那么这个问题可以形式化如下,
其中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