Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 机器人寻路算法_C_Algorithm_Artificial Intelligence_Robot - Fatal编程技术网

C 机器人寻路算法

C 机器人寻路算法,c,algorithm,artificial-intelligence,robot,C,Algorithm,Artificial Intelligence,Robot,我有一个机器人,它使用一个光学鼠标作为位置跟踪。基本上,当机器人移动时,它能够使用鼠标跟踪X和Y方向的变化。鼠标也会跟踪移动的方向-即负X或正X。这些值被合并到单独的X和Y寄存器中 现在,机器人原地旋转,只向前移动。因此,机器人的运动理想情况下是在特定角度的直线上(尽管如果你转向,鼠标跟踪可以拾取偏差)。机器人的一组特定动作如下所示: A:旋转45度,移动3英寸 B:旋转90度,移动10英寸 C:旋转-110度,移动5英寸 D:旋转10度,移动1英寸 但每次鼠标X和鼠标Y寄存器都会给出您在每个

我有一个机器人,它使用一个光学鼠标作为位置跟踪。基本上,当机器人移动时,它能够使用鼠标跟踪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; // radians
while (true)
{
    deltas = SampleMouseDeltas();
    heading += deltas.Heading;
    currentX += Math.Cos(heading) * deltas.Distance;
    currentY += Math.Sin(heading) * deltas.Distance;
}
你的想法是对的,这并不精确。它被称为“航位推算”是有原因的

您可以根据“X”坐标(公式为(deltax,单位为英寸)/(鼠标传感器距离旋转中心的英寸数)。此外,deltas.distance将来自“Y”传感器,在您将其从像素转换为英寸后

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

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

... etc ...
robot.RotateLeft();
航向=0;
同时(航向<45度)
heading+=SampleMouseDeltas.heading;
机器人。停止旋转left();
等

我知道我在某种程度上破坏了这条线索,但如果你想要更精确的角度跟踪,两个光学鼠标将是理想的选择。基本上,如果你取消了同一方向的运动,你将只剩下鼠标相对的运动。从那里,只需要一些简单的数学就可以准确地确定如何进行机器人已经转动了。

…它断开了网线…等等,如果你有鼠标的X和Y移动值,你不能直接计算矢量吗?或者鼠标安装在机器人的固定位置上(这样它只记录一个轴的移动?)我不知道我是否理解正确。我也不理解这个问题。你能再详细说明一下吗?很难准确理解你在问什么。你是否使用鼠标的反馈来最小化在执行命令时的错误?你是在问如何做到这一点吗?问题是鼠标只给出相对的读数如果你在移动或向后移动,你可能会删除信息。因此,是的,我想知道的是,你如何实现该算法,以便它能够持续跟踪变化,从而在你在途中以之字形移动时为你提供最短路径。是的,这就是我试图想出的。谢谢。很难解释,但我想你明白我的意思。一个d是的,基本上我将鼠标的X和Y寄存器读入我的微控制器,并将其值转换为英寸(400计数=1英寸)。我们已经能够非常准确地校准鼠标-我们将其安装在靠近地板的位置,并确保我们的比赛场地兼容(不是玻璃或其他东西).到目前为止,使用鼠标的Y轴读数,机器人可以非常精确地旋转1度。这对你很好!我们遇到了很多麻烦,地板不平导致读数跳跃。祝你好运!:)或者,如果你擅长加工和光学,你可以换一个焦距更长的镜头。你对系统的限制做了修改。