假设我有一个机械臂,在3D空间的A,B,C,D点上有关节。设D是末端效应器(最下面的子对象),A是最上面的父对象。设T是空间中任意位置的目标点。其目的是使末端效应器在顶层(父级)中以最小的旋转达到目标。
我最初的想法是:
1)将臂C旋转TCD角。2)然后将臂B旋转新的角度待定。3)然后将手臂A旋转新的角度TAD。
但是在第二步之后,末端执行器似乎指向了目标。我做错了什么,我该如何修复它?
发布于 2014-06-10 15:21:41
在开始使用一些更高级的方法之前,我是这样做的:
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;
}
}
备注
step == 1
这将提高性能,但对于大多数应用程序来说step == 1
就足够了,因为新位置通常靠近最后一个位置。
发布于 2014-06-12 12:23:33
很难直接编写代码,但您可以从优化的角度解决这个问题(可以隐含许多最先进的方法来解决这个问题,这些方法可以很容易地在Internet上找到)。设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是二次的)。
很抱歉我的英语很差,希望这能有所帮助。
https://stackoverflow.com/questions/24095107
复制相似问题