algorithm - 逆向运动学的CCD算法的工作

标签 algorithm 3d vector-graphics robotics inverse-kinematics

假设我有一个机械臂,其关节位于 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. 您可以通过一些步骤而不是 1 将其修改为 inc/dec 执行器位置

    如果差异越过零则停止,然后以较小的步长重新开始,直到 step == 1 这将提高性能,但对于大多数应用程序来说 step=1 就足够了,因为新位置是通常在最后一个附近。

  2. 注意这可能会卡在局部最小值/最大值

    如果输出卡住(效应器位置不变),则随机化执行器并重试。这种情况的发生取决于运动学的复杂性和您要使用的路径类型

  3. 如果 ARM 更多地被驱动到顶部而不是底部

    然后尝试反转 i-for 循环

  4. 如果要控制效应器正常

    那你就得把它的旋转轴排除在CCD之外,设置在CCD之前

关于algorithm - 逆向运动学的CCD算法的工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24095107/

相关文章:

c# - 通过 3D 投影从图像中获取纹理

c - 如何在双指针数组中使用realloc?

algorithm - 分词最有效的算法?

android - 在 iOS 和 Android 上将(非交互式)动画(使用 Maya 制作)加载到 OpenGL ES 的推荐方法

java - 如何显示 SVG 图形的子部分或 "slice"?

android - 以编程方式将边框/描边设置为矢量可绘制对象

mysql - 我应该将 MySQL 地理空间数据类型用于矢量图形吗

algorithm - 将数组拆分为 2 个子数组并递归求解它们仍然是 O(log(n))?

algorithm - 图中最大化值的最佳路径

algorithm - 估计物体围绕三个任意轴的倾斜角