假设我有一个机械臂,其关节位于 3D 空间中的 A、B、C、D 点。令 D 为末端执行器(最底层的子节点),A 为最顶层的父节点。令 T 为空间中任意位置的目标点。目的是使末端执行器在顶层(父级)中以最小的旋转到达目标。
我最初的想法:
1) 将臂 C 旋转角度 TCD。 2) 然后将臂 B 旋转新的角度 TBD。 3) 然后将臂A旋转新的角度TAD。
但是在第 2 步之后末端执行器似乎指向远离目标。我做错了什么,我该如何解决?
最佳答案
在我开始使用一些更高级的方法之前,我是这样做的(使用简单的CCD 循环坐标下降):
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
就足够了,因为新位置是通常在最后一个附近。注意这可能会卡在局部最小值/最大值
如果输出卡住(效应器位置不变),则随机化执行器并重试。这种情况的发生取决于运动学的复杂性和您要使用的路径类型
如果 ARM 更多地被驱动到顶部而不是底部
然后尝试反转 i-for 循环
如果要控制效应器正常
那你就得把它的旋转轴排除在CCD之外,设置在CCD之前
关于algorithm - 逆向运动学的CCD算法的工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24095107/