我有一个机器人,它使用光电鼠标作为位置跟踪。基本上,当机器人移动时,它能够使用鼠标跟踪 X 和 Y 方向的变化。鼠标还可以跟踪您移动的方向——即负 X 或正 X。这些值被加总到单独的 X 和 Y 寄存器中。
现在,机器人原地旋转并仅向前移动。因此,机器人的运动理想情况下是直线(尽管如果偏离方向,鼠标跟踪可以捕捉到偏差),以特定的角度运动。机器人的一组特定运动可能如下所示:
A:旋转 45 度,移动 3 英寸
B:旋转 90 度,移动 10 英寸
C:旋转 -110 度,移动 5 英寸
D:旋转 10 度,移动 1 英寸
但每次鼠标 X 和鼠标 Y 寄存器都会给出您在每个方向上移动的实际距离。
现在,如果我只想重复从 A 到 D 的运动序列,我如何利用我已经收集到的信息来做到这一点呢?我知道我基本上可以对所有角度和距离进行求和,但这如果在每个运动指令中存在较大误差,将被证明是不准确的。我该如何使用鼠标的原始信息呢?一个朋友提出了一个想法,我可以连续对鼠标值进行正弦和余弦运算并计算最终向量,但我不太确定这会如何工作。
问题在于鼠标只提供相对读数,因此旋转或向后移动可能会擦除信息。所以是的,我想知道的是如何实现该算法,使其可以持续跟踪变化,以便在您最初以锯齿形移动到达那里时,为您提供最短路径。
回答:
我认为你需要做的基本算法是这样的:
currentX = currentY = 0;heading = 0; // radianswhile (true){ deltas = SampleMouseDeltas(); heading += deltas.Heading; currentX += Math.Cos(heading) * deltas.Distance; currentY += Math.Sin(heading) * deltas.Distance;}
你的想法是对的,这不会很精确。它被称为“航位推算”是有原因的。
你可以根据“X”坐标获得你的 deltas.Heading(公式将是(deltax,单位为英寸)/(鼠标传感器距离旋转中心,单位为英寸))。此外,deltas.Distance 将来自“Y”传感器,在将其从像素转换为英寸后。
然后,要执行这些步骤,你可以这样做:
robot.RotateLeft();heading = 0;while (heading < 45 degrees) heading += SampleMouseDeltas.Heading;robot.StopRotateLeft();... etc ...