首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >逆运动学CCD算法的工作原理

逆运动学CCD算法的工作原理
EN

Stack Overflow用户
提问于 2014-06-07 15:57:18
回答 2查看 1.9K关注 0票数 1

假设我有一个机械臂,在3D空间的A,B,C,D点上有关节。设D是末端效应器(最下面的子对象),A是最上面的父对象。设T是空间中任意位置的目标点。其目的是使末端效应器在顶层(父级)中以最小的旋转达到目标。

我最初的想法是:

1)将臂C旋转TCD角。2)然后将臂B旋转新的角度待定。3)然后将手臂A旋转新的角度TAD。

但是在第二步之后,末端执行器似乎指向了目标。我做错了什么,我该如何修复它?

EN

回答 2

Stack Overflow用户

发布于 2014-06-10 15:21:41

在开始使用一些更高级的方法之前,我是这样做的:

代码语言:javascript
运行
复制
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. 如果手臂在顶部驱动比在底部驱动更多 然后尝试反转 i-for 循环
  4. 如果你必须控制效应器正常 那么您必须从 CCD 中排除其旋转轴并将其设置在 CCD 之前
票数 1
EN

Stack Overflow用户

发布于 2014-06-12 12:23:33

很难直接编写代码,但您可以从优化的角度解决这个问题(可以隐含许多最先进的方法来解决这个问题,这些方法可以很容易地在Internet上找到)。设x‘和y’是固定的最高A,x'‘和y'’是目标。那么这个问题可以形式化如下,

其中gamma_i是每个关节的旋转权重(可以简单地设为gamma_i=1),alpha_i是旋转值。您的优化目标是在一些约束条件下获得父对象的最小旋转。x',y',x'',y'‘是常量,其他的是变量。可以添加其他不等式来限制旋转角度。

方程f(x',y',x_1,y_1,alpha_1)=0意味着,随着alpha_1对A的旋转,B点可以重新定位到x_1,y_1。如果你可以指定旋转的细节(例如f是线性的,那么可以实现单纯形法,但看起来f是二次的)。

很抱歉我的英语很差,希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24095107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档