首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >逆运动学:如何计算机械臂的伺服角度,以达到画布中所有可能的点?

逆运动学:如何计算机械臂的伺服角度,以达到画布中所有可能的点?
EN

Stack Overflow用户
提问于 2016-05-03 22:49:34
回答 1查看 757关注 0票数 0

我有一个由2个伺服电机组成的机械臂。我正在尝试计算反向运动学,以便手臂位于画布的中间,并且可以在两个方向(左和右)上移动到所有可能的点。这是系统Image的映像。第一个伺服运动0-180 (逆时针)。第二个伺服运动0-180 (顺时针)。

下面是我的代码:

代码语言:javascript
运行
复制
    int L1 = 170;
    int L2 = 230;
    Vector shoulderV;
    Vector targetV;
    shoulderV = new Vector(0,0);
    targetV = new Vector(0,400);


    Vector difference = Vector.Subtract(targetV, shoulderV);
    double L3 = difference.Length;
    if (L3 > 400) { L3 = 400; }
    if (L3 < 170) { L3 = 170; }

    // a + b is the equivelant of the shoulder angle
    double a = Math.Acos((L1 * L1 + L3 * L3 - L2 * L2) / (2 * L1 * L3));  
    double b = Math.Atan(difference.Y / difference.X);

   // S1 is the shoulder angle
   double S1 = a + b;
  // S2 is the elbow angle
  double S2 = Math.Acos((L1 * L1 + L2 * L2 - L3 * L3) / (2 * L1 * L2));

  int shoulderAngle = Convert.ToInt16(Math.Round(S1 * 180 / Math.PI));
  if (shoulderAngle < 0) { shoulderAngle = 180 - shoulderAngle; }
  if (shoulderAngle > 180) { shoulderAngle = 180; }
  int elbowAngle = Convert.ToInt16(Math.Round(S2 * 180 / Math.PI));

  elbowAngle = 180 - elbowAngle; 

最初,当系统第一次启动时,用shoulder=90拉直手臂,elbow =0。当我给出正的x值时,我会在画布的左侧得到正确的结果。但是,我希望手臂也在右侧移动。当我输入负片时,我得不到正确的值。我做错了什么?我需要一个额外的伺服器才能到达右侧的点吗?

如果解释不好,很抱歉。英语不是我的第一语言。

EN

回答 1

Stack Overflow用户

发布于 2016-07-26 16:11:09

我怀疑您在使用Math.Atan()时丢失了一个符号。我不知道这是什么编程语言或环境,但试着看看你有没有这样的东西:

而不是这一行:

double b = Math.Atan(difference.Y / difference.X);

使用类似如下的内容:

double b = Math.Atan2(difference.Y, difference.X);

difference.Ydifference.X具有相同的符号时,将它们相除得到正值。这阻止了您在既为正又为负的情况下进行区分。例如,在这种情况下,您无法区分30度和210度。

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

https://stackoverflow.com/questions/37007417

复制
相关文章

相似问题

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