机器人寻路算法

我有一个机器人,它使用光电鼠标作为位置跟踪。基本上,当机器人移动时,它能够使用鼠标跟踪 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 ...

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注