我有一个具有4个旋转关节的机械手,但有一些运动限制。因此,当我应用逆向运动学时,我得到的结果超出了限制。请向我提供一种考虑关节限制的实现逆运动学的算法。

#1 楼

4个关节仅给您4个自由度。因此,如果您在完整的6个自由度上使用逆运动学,则并非所有位置都具有解,并且如果有解,则通常只有一个唯一的解。只是试图固定一些位置,例如x,y和z坐标,而不是固定末端执行器的方向(3个旋转轴)。

这是一个非线性系统但是,您可以随时将其线性化。应用的逆运动学可能已经使问题线性化并执行某种类型的梯度下降。

要更改解,您可以找到线性化方程组的零空间,然后使用该矢量,以朝着关节极限修改您的解。

为此,您只需对方程组进行微分以获得线性化,例如,您将得到:

$ \ Delta \ alpha \ vec {a} + \ Delta \ beta \ vec {b} + \ Delta \ gamma \ vec {c} + \ Delta \ delta \ vec {d} =
\ left [\ begin {matrix} \ vec {a}&\ vec {b}&\ vec {c}&\ vec {d} \ end {matrix} \ right]
\ left [\ begin {matrix} \ Delta \ alpha \\\ Delta \ beta \\\ Delta \ gamma \\\ Delta \ delta \ end {matrix} \ right]
=
\ left [\ begin {matrix} \ Delta x \\\ Delta y \\\ Delta z \ end {matrix} \ right] $,其中$ \ alpha $,$ \ beta $,$ \ gamma $,$ \ delta $是旋转关节的角度,具有适当的系数。

查找空空间意味着找到$ \ Delta \ alpha $,$ \ Delta \ beta $,$ \ Delta \ gamma $,$ \ Delta \ delta $这样$ \ Delta x,\ Delta y,\ Delta z = 0 $。您可以轻松地做到这一点(选择高斯消除,矩阵除法等)。

如果在多次迭代中以零倍的零空间矢量修改角度,则最终应该进入关节约束(如果可能)。您只需要确定方向即可(检查每个角度,如果不在范围内,则应提供适当的角度)。

如果您的逆运动学算法/代码从初始关节角度开始,则可以将新的关节角度放回此处,以使x,y和z位置不会偏离所需位置。这还使您可以对零空间向量采取更大的步骤(否则,这会使跟踪的位置开始变得不太准确)。

在某些情况下,零空间可能包含多个一个向量。如果您只想固定两个自由度,则会发生这种情况。在这种情况下,在每次迭代中,您只能使用一个或两个向量进行修改。可以应用类似的逻辑来获取约束内的角度-通过检查每个旋转关节角度是否在约束内来确定应用每个矢量的方向,否则,将为您提供应用矢量的方向。

#2 楼

迭代IK解算器能够处理多种约束。我已经在之前的答案中讨论过这种求解器。

基本算法如下所示:

Move each joint to it's halfway position

loop while arm is far from target
{
    calculate gradient vector
    add gradient vector to arm position vector
    if any joints are beyond their range, move them back into their range.
}


迭代求解器的优点是它还可以处理“软”约束。例如,您可能希望人形手臂尽可能保持舒适的外观姿势。或者,您可能更希望使关节远离端点。在这种情况下,您可以将这些约束简单地添加到循环中。在这种情况下,舒适矢量是移动所有关节的方向,以便手臂看起来更舒适。

对此的更完整说明可以在我的旧网站上找到:美观的纹理光源产生的弹力有趣而灵活的页面。