c - 机器人寻路算法

标签 c algorithm artificial-intelligence robot

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

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

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

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

最佳答案

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

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以英寸为单位)/(鼠标传感器距旋转中心的距离以英寸为单位)。此外,deltas.Distance将来自“Y”传感器,将其从像素转换为英寸后。

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

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

... etc ...

关于c - 机器人寻路算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/742369/

相关文章:

algorithm - 内容检测算法

c++ - 为什么skb_transport_header计算不正确?

c - 将动态 3D 矩阵传递给函数

java - 如何在 Java 中为 2D 游戏构建 Tiled map ?

c# - 国际象棋 negamax 算法来回移动棋子。怎么了?

java - 2d自上而下平滑寻路libGDX

neural-network - 什么是 NEAT(增强拓扑的神经进化)?

代码仅显示最后一行

c - "realloc(): invalid next size"

string - 在文本中查找字典字符串的最快方法