机器人寻路算法

问题描述 投票:0回答:3

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

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

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

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

c algorithm artificial-intelligence robotics
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;
}

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

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

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

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

... etc ...

0
投票

这不是你问题的答案,但也许是一个警示故事...... 一年前,我将这种机器人作为学校项目进行了开发。这是一次彻底的失败,尽管我在做的过程中学到了很多东西。 至于使用鼠标来跟踪您行驶了多远:它对我们或任何其他组来说根本不起作用。可能是因为我们需要将鼠标放置在距离地板几毫米的位置,因此鼠标中的摄像头失焦。第二年,没有任何小组进行相同的项目使用这种方法。相反,他们在车轮上做了标记,并使用简单的红外传感器来计算车轮转了多少圈。


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.