机器人手臂的正向运动学很容易解决。我们可以使用Denavit-Hartenberg变换矩阵表示每个关节。例如,如果$ i ^ {th} $关节是线性致动器,则它可能具有变换矩阵:

$ T_i = \ left [\ begin {matrix}
1&0&0&0 \\
0&1&0&0 \\
0&0&1&d_i \\
\ end {matrix} \ right] $
,其中扩展长度由$ d_i $

定义,而旋转链接可能是:

$ T_i = \ left [\ begin {矩阵}
1&0&0&L \\
0&\ cos \ alpha_i&-\ sin \ alpha_i&0 \\
0&0&0&1
\ end {matrix} \ right] $其中$ \ alpha $是角度,而$ L $是链接的长度。

然后我们可以通过乘以找出末端执行器的位置和方向所有转换矩阵:$ \ prod {T_i} $。

问题是,我们如何解决反问题?

从数学上讲,对于所需的末端执行器位置$ M $,找到参数$ d_i $,$ \ alpha_i $,使得$ \ prod {T_i} = M $。有什么方法可以求解该方程式?

#1 楼

过去,当我学习时,随着学习的进行,我使用了简单的渐变跟踪来解决IK问题。

在模型中,您尝试将每个关节的每个关节旋转一个很小的角度数量,看对终点位置误差有多大的影响。完成此操作后,然后将每个关节旋转与其所产生的收益成比例的量。然后,一遍又一遍地进行操作,直到足够接近为止。

通常,这称为梯度跟踪或山峰跟踪。想象一下一个具有两个自由度的机械臂:



旋转关节A稍微移动了端点沿方向a。旋转关节B一点点即可使端点沿方向b移动。这两个都使我们靠近目标的距离大约相等,因此我们应该以相同的速度旋转两个关节。

如果要绘制到目标与关节的距离图角度,如下所示:



我在某些轮廓上进行了着色只是为了帮助。我们可以看到该算法采用的路径。您会注意到,在关节空间中,所采取的路径看起来并不是最佳的。它需要一条曲线。但是,在实际空间中,您会看到终点与目标之间的直线相当。您还可以看到实际上有两种解决方案,而该算法刚刚找到了最接近的解决方案。当然,这也不是最好的方法。



概念上很简单,如果您只是学习它,那就太好了。即使实现了Denavit-Hartenberg变换矩阵的视线也可以吓到您。
它非常通用,允许您使用各种关节:旋转,线性和其他关节,只要您可以估计它们的位置即可导致端点移动。
即使解决方案的数量为零或无限,它也能很好地应对。

缺点:


很慢,需要很多次迭代才能找到解决方案。但是,如果您可以让真实的手臂跟随算法的进行计算就很好了。
它可能会卡在局部最小值中。即如果找到了足够好的解决方案,它可能找不到最佳解决方案。弹性页面。

#2 楼

对于这个问题,有许多解决方案都围绕着雅可比矩阵。此幻灯片显示了Jacobian方法,还提到了我不熟悉的循环坐标下降法。

关于这个主题有很多资源-如果您向google请求“逆运动学Jacobian”。入门机器人课程。

#3 楼

有两种广泛的方法:给定末端执行器姿势的解析解直接计算关节坐标。通常,解决方案不是唯一的,因此您可以计算一组可能的关节坐标。有些可能会导致机器人撞击其环境(或自身)内的东西,或者您的任务可能会帮助您选择特定的解决方案,即。您可能更希望肘部向上(或向下),或者机器人将手臂放在躯干的左侧(或右侧)。通常,在获得解析解方面存在一些限制,对于6轴机器人,假定球形手腕(所有轴相交)。数十年来,已经计算出了许多不同类型的机器人的解析解,您可能会找到为您的机器人提供解法的论文。如其他答案所述,数值解使用一种优化方法进行调整。关节坐标,直到正向运动学给出正确的解决方案为止。同样,关于这方面的文献很多,并且有很多软件。

使用我的MATLAB机器人工具箱,我使用Denavit-Hartenberg参数创建了一个著名的六轴机器人模型。

>> mdl_puma560
>> p560

p560 = 

Puma 560 [Unimation]:: 6 axis, RRRRRR, stdDH, fastRNE            
 - viscous friction; params of 8/95;                             
+---+-----------+-----------+-----------+-----------+-----------+
| j |     theta |         d |         a |     alpha |    offset |
+---+-----------+-----------+-----------+-----------+-----------+
|  1|         q1|          0|          0|     1.5708|          0|
|  2|         q2|          0|     0.4318|          0|          0|
|  3|         q3|    0.15005|     0.0203|    -1.5708|          0|
|  4|         q4|     0.4318|          0|     1.5708|          0|
|  5|         q5|          0|          0|    -1.5708|          0|
|  6|         q6|          0|          0|          0|          0|
+---+-----------+-----------+-----------+-----------+-----------+


然后选择一个随机关节坐标

>> q = rand(1,6)
q =
    0.7922    0.9595    0.6557    0.0357    0.8491    0.9340


然后计算正向运动学

>> T = p560.fkine(q)
T = 
   -0.9065    0.0311   -0.4210  -0.02271
    0.2451    0.8507   -0.4649   -0.2367
    0.3437   -0.5247   -0.7788    0.3547
         0         0         0         1


现在,我们可以使用已发布的解析解决方案来计算逆运动学,该解析解决方案用于具有6个关节和球形腕的机器人

>> p560.ikine6s(T)
ans =
    0.7922    0.9595    0.6557    0.0357    0.8491    0.9340


和瞧,我们具有原始的关节坐标。

数值解

>> p560.ikine(T)
Warning: ikine: rejected-step limit 100 exceeded (pose 1), final err 0.63042 
> In SerialLink/ikine (line 244) 
Warning: failed to converge: try a different initial value of joint coordinates 
> In SerialLink/ikine (line 273) 

ans =

     []


失败了,这是一个常见的问题,因为它们通常需要初始解决方案。让我们尝试

>> p560.ikine(T, 'q0', [1 1 0 0 0 0])
ans =
    0.7922    0.9595    0.6557    0.0357    0.8491    0.9340


现在可以给出答案,但是它与解析解不同。没关系,因为针对IK问题有多种解决方案。我们可以通过计算正向运动学来验证我们的解决方案是正确的。

>> p560.fkine(ans)
ans = 
   -0.9065    0.0311   -0.4210  -0.02271
    0.2451    0.8507   -0.4649   -0.2367
    0.3437   -0.5247   -0.7788    0.3547
         0         0         0         1


并检查它是否与我们开始时使用的转换相同。

其他资源:


免费视频讲座此主题,请在机器人学院搜索运动学


第7章,机器人学,视觉与控制(2e),Corke,Springer,2017年。