NXT绘图仪代码 – 数学模型

理解代码的关键在于数学模型。如上图。实线表示两个臂。长度都是L。电机可以控制的是∠a与∠b。问题就变成了,在已知坐标(x,y)的情况下,如果计算出(a,b)。在上一篇文章里,函数getDegrees就是用来做这件事情的。解释完这个函数,代码也就很清楚了。

看上图,首先计算目标点(x,y)距离原点的距离D。容易得出:

D = sqrt(x*x+y*y)
接下来是∠d
∠d = atan2(y, x)
然后是∠d’
∠d’ = acos(D/2/L)

好啦,我们就可以得出∠a了:
∠a = ∠d – ∠d’
同样,很容易得到∠b’:
∠b’ = 180 – d’ * 2
可以得到∠b:
∠b = 90 – ∠b’ = d’ * 2 – 90

解决了上面这个模型的问题,我们就可以继续了。在程序开始前,让两个臂垂直,∠b为0。同时让底座相连的后臂转到合适的位置,认为∠a为0。此时程序开始运行,把电机的角度计数器清零。模型跟程序就对上了。

当得到一个坐标(x,y)时,我们只要控制电机转到计算所得的∠a和∠b,笔就刚好停在(x,y)上。需要注意的是,由于我们使用了涡轮驱动24齿和56齿的齿轮,所以需要乘以/除以这两个系数。

当然这只是第一步。在两个点之间移动画笔的时候,如果直接驱动电机转到所需的角度,画出来的线也不是直的。我们需要把两个点之间的线段细分,一步步来画。这就是函数getNextPoint的作用。通过传入当前坐标和目标坐标,还有步进值,这个函数会返回下一个绘制点的坐标。这样,当我们需要移动画笔到指定点(x,y)时,只要反复调用getNextPoint并驱动电机移动到指定的位置,直到返回值等于(x,y)就可以了。

之前的代码直接使用onFwd来驱动电机,并不停的检查转角,其实是不精确的。下一篇文章继续分析如何控制电机。

此条目发表在LEGO, MOC, Technic & NXT分类目录,贴了, , , , , , 标签。将固定链接加入收藏夹。

NXT绘图仪代码 – 数学模型》有 4 条评论

  1. Robin说:

    高人,佩服。受益匪浅!

  2. komatsu说:

    Great job! I guess you are a IT engineer, is it right? Can you tell me how to be an engineer like you? I’m going to learn Computer Science in collage but what and how should I learn that?

    • easonke说:

      I don’t think I am ready for this kind of question :-) Talk with your teachers/parents I believe they could provide better answers.
      And yep I am an IT engineer. You may want to discuss technical issues with me :D

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>