Animation 二维逆运动学实现

Animation 二维逆运动学实现,animation,rotation,robotics,inverse-kinematics,Animation,Rotation,Robotics,Inverse Kinematics,我试图在2D手臂上实现反向运动学(由三根带关节的杆组成)。我能够将最低的手臂旋转到所需的位置。现在,我有一些问题: 如何使上臂与第三个手臂一起移动,使手臂的端点达到所需的点。我是否需要使用这两个旋转矩阵,如果是,有人能给我一些例子或帮助,还有其他可能的;在没有旋转矩阵的情况下,如何做到这一点 最低的手臂只朝一个方向移动。我用谷歌搜索了一下,他们说两个向量的叉积给出了手臂的方向,但这是3D的。我用二维向量和两个二维向量的叉积得到一个标量。那么,我怎样才能确定它的方向呢 请各位帮忙,我们将不胜感激

我试图在2D手臂上实现反向运动学(由三根带关节的杆组成)。我能够将最低的手臂旋转到所需的位置。现在,我有一些问题:

  • 如何使上臂与第三个手臂一起移动,使手臂的端点达到所需的点。我是否需要使用这两个旋转矩阵,如果是,有人能给我一些例子或帮助,还有其他可能的;在没有旋转矩阵的情况下,如何做到这一点

  • 最低的手臂只朝一个方向移动。我用谷歌搜索了一下,他们说两个向量的叉积给出了手臂的方向,但这是3D的。我用二维向量和两个二维向量的叉积得到一个标量。那么,我怎样才能确定它的方向呢

  • 请各位帮忙,我们将不胜感激

    提前谢谢
    维克拉姆

    我会尝试一下,但既然我的机器人技术已经有二十年的历史了,那就不要犹豫了

    按照我的理解,每个关节都是由它自己的旋转矩阵来描述的,相对于它当前的位置和方向来定义。然后将旋转矩阵组合在一起,计算整个手臂端点的坐标

    这完全达到了您想要的效果:您只能移动一个关节(更改其方向),而所有其他关节都会自动跟随

    在这里你不会有太多机会绕过矩阵-事实上,如果你使用齐次坐标,所有的联合计算(旋转和平移)都可以用矩阵乘法建模。这样做的好处是,整个手臂位置可以用一个矩阵(加上手臂的原点)来描述

    使用此变换矩阵,您可以解决运动学逆问题:由于变换矩阵的元素将取决于关节的角度,因此您可以将整个计算“端点=起点x变换”视为一个方程组,并且起点和终点已知,你可以通过求解这个系统来确定未知的角度。这里的困难在于方程可能不可解,或者存在多个解


    不过,我不太明白你的第二个问题——你在找什么?

    在机器人学中,我们通常使用DH参数进行正向和反向运动学。有一个很好的介绍。

    DH(Denavit Hartenberg)符号是解决方案的一部分。它可以帮助您收集一组简洁的值来描述机器人的力学特性,例如连杆长度和关节类型

    从那里可以更容易地计算正向运动学。首先,您必须了解如何将坐标系从一个位置转换到另一个坐标系。例如,给定您的机器人(或其DH表),您必须应用于一个坐标系(例如世界)的旋转和平移集是什么,才能知道机器人手腕坐标系中点(或向量)的位置

    您可能已经知道,齐次变换矩阵对于此类变换非常有用。它们是封装旋转和平移的4x4矩阵。这些矩阵的另一个非常有用的特性是,如果有两个坐标系通过旋转和平移链接和定义,如果将两个矩阵相乘,则只需将变换目标乘以该乘法的乘积

    因此,DH表将帮助您构建该矩阵

    反向运动学稍微复杂一些,这取决于您的应用程序。对于同一个问题有多个解决方案会导致复杂性。自由度的数量越多,解决方案的数量就越多

    想想你的手臂。捏一下你周围的固体。您可以将手臂移动到空间中的多个位置,并且仍然保持挤压向量不变。解决运动学逆问题还需要决定选择哪种解决方案

  • 代替旋转矩阵,旋转可以用角度或a来表示,但实际上是一样的。更重要的是,您需要的表示形式
    T
    ,这样您就可以编写类似
    t1*t2*t3
    的内容来计算第三个链接的位置和方向

  • 使用atan2

  • 正如下面的Python示例所示,这两件事足以构建一个小型IK解算器

    从gameobjects.vector2将vector2导入为V
    从matrix33导入matrix33作为T
    从数学输入sin,cos,atan2,pi
    随机输入
    
    该库没有二维转换,因此您必须自己编写
    matrix33
    。它的界面就像
    gameobjects.matrix44

    为从一个关节到下一个关节的变换定义正向运动学函数。我们假设关节旋转
    角度
    ,然后进行固定变换
    关节

    def fk_关节(关节,角度):返回T旋转(角度)*关节
    
    工具的变换是
    tool==fk(关节,q)
    其中
    joints
    是固定变换,
    q
    是关节角度:

    def fk(关节,q):
    prev=T.identity()
    对于i,枚举中的关节(关节):
    prev=prev*fk_关节(关节,q[i])
    返回上一个
    
    如果臂的底部有偏移,则更换
    T.identity()
    transformation

    OP通过循环坐标下降解决位置的IK问题。其思想是通过一次调整一个关节变量,将工具移近目标位置。假设
    q
    是关节的角度,
    prev
    是关节底部的变换。关节应按照指向工具和目标位置的向量之间的角度旋转:

    def ccd_步骤(q、上一步、工具、目标):
    A.
    
    >>> ccd_demo(3, 7)
    i     Error
    0  1.671521e-03
    1  8.849190e-05
    2  4.704854e-06
    3  2.500868e-07
    4  1.329354e-08
    5  7.066271e-10
    6  3.756145e-11
    >>> ccd_demo(20, 7)
    i     Error
    0  1.504538e-01
    1  1.189107e-04
    2  8.508951e-08
    3  6.089372e-11
    4  4.485040e-14
    5  2.601336e-15
    6  2.504777e-15