2

我有一个使用光学鼠标作为位置跟踪的机器人。基本上,随着机器人的移动,它能够使用鼠标跟踪 X 和 Y 方向的变化。鼠标还跟踪您正在移动的方向 - 即负 X 或正 X。这些值被汇总到单独的 X 和 Y 寄存器中。

现在,机器人在原地旋转并仅向前移动。因此,理想情况下,机器人的运动是在特定角度以直线运动(尽管如果您偏离方向,鼠标跟踪可以拾取偏差)。机器人的一组特定运动如下:
A:旋转 45 度,移动 3 英寸
B:旋转 90 度,移动 10 英寸
C:旋转 -110 度,移动 5 英寸
D:旋转 10 度,移动 1 英寸
但是每次鼠标 X 和鼠标 Y 寄存器都会给出您在每个方向上移动的实际距离。

现在,如果我只想重复从 A 到 D 的运动集,我该如何使用我已经收集的信息来做到这一点。我知道我基本上可以总结我已经输入的所有角度和距离,但是如果每个移动命令中存在很大的错误,这将被证明是不准确的。如何使用鼠标中的原始信息?一位朋友提供了一个想法,即我可以连续地对鼠标值进行正弦和余弦运算并计算最终向量,但我不确定这将如何工作。

问题是鼠标只给出相对读数,因此旋转或向后移动,您可能会擦除信息。所以,是的,我想知道的是如何实现该算法,以便它可以持续跟踪变化,如果您最初以之字形移动到达那里,它可以为您提供最短路径。

4

3 回答 3

3

我认为你需要做的基本算法是这样的:

currentX = currentY = 0;
heading = 0; // radians
while (true)
{
    deltas = SampleMouseDeltas();
    heading += deltas.Heading;
    currentX += Math.Cos(heading) * deltas.Distance;
    currentY += Math.Sin(heading) * deltas.Distance;
}

你的想法是对的,这并不精确。它被称为“航位推算”是有原因的。

您可以在哪里获得 deltas.Heading 基于“X”坐标(公式将是(deltax in inches)/(鼠标传感器距离旋转中心的英寸)。此外,deltas.Distance 将来自“Y " 传感器,在您将其从像素转换为英寸之后。

然后要执行这些步骤,您可以执行以下操作:

robot.RotateLeft();
heading = 0;
while (heading < 45 degrees)
    heading += SampleMouseDeltas.Heading;
robot.StopRotateLeft();

... etc ...
于 2009-04-12T21:39:56.947 回答
0

不是你的问题的答案,但也许是一个警示故事......我在一年前作为一个学校项目做了这种机器人。这是一个彻底的失败,虽然我在做的过程中学到了很多东西。至于使用鼠标来追踪你的驾驶距离:它根本不适合我们,或者任何其他团体。可能是因为我们需要将鼠标放在离地面几毫米的地方,所以鼠标中的摄像头没有对焦。次年,没有一个做相同项目的小组使用这种方法。他们改为在轮子上做标记,并使用一个简单的红外传感器来计算轮子转了多少圈。

于 2009-04-12T21:24:44.770 回答
-1

我知道我在某种程度上破坏了这个线程,但如果你想要更准确的角度跟踪,两个光学鼠标将是理想的。基本上,如果你取消了相同方向的运动,你就会留下老鼠相对于彼此的运动。从那里开始,只需进行一些简单的数学运算即可准确确定“机器人”已经转动了多远。

于 2010-06-08T18:23:52.873 回答