我有一个使用光学鼠标作为位置轨迹的机器人。基本上,当机器人移动时,它能够使用鼠标跟踪X和Y方向的变化。鼠标还会跟踪您正在移动的方向 - 即负X或正X.这些值汇总到单独的X和Y寄存器中。
现在,机器人旋转到位并仅向前移动。因此,在特定角度下,机器人的运动理想情况下是直线(尽管鼠标跟踪可以在偏离时拾取偏差)。机器人的一组特定动作如下:
答:旋转45度,移动3英寸
B:旋转90度,移动10英寸
C:旋转-110度,移动5英寸
D:旋转10度,移动1英寸
但是每次鼠标X和鼠标Y寄存器都会给出您在每个方向上移动的真实距离。
现在,如果我想重复从A到D的移动设置,我怎么能使用我已经收集的信息来做到这一点。我知道我基本上可以将我所加入的所有角度和距离相加,但如果每个移动顺序中存在大的错误,这将被证明是不准确的。如何使用鼠标中的原始信息?一位朋友提出了一个想法,即我可以不断地对鼠标值进行正弦和余弦化并计算最终向量,但我不确定这是如何工作的。
问题是鼠标只提供相对读数,因此旋转或向后移动,您可能会删除信息。所以,是的,我想知道你是如何实现算法的,这样它就可以不断跟踪变化,如果你以曲折的方式移动到最初的位置,就会给你一条最短的路径。
答案 0 :(得分: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”坐标(公式将是(deltax以英寸为单位)/(鼠标传感器距离,以英寸为中心的旋转)。此外,增量。距离将来自“Y”传感器,将其从像素转换为英寸后。
然后执行这些步骤,您可以执行以下操作:
robot.RotateLeft();
heading = 0;
while (heading < 45 degrees)
heading += SampleMouseDeltas.Heading;
robot.StopRotateLeft();
... etc ...
答案 1 :(得分:0)
不是你问题的答案,但也许是一个警示故事...... 一年前我做过这种机器人作为学校项目。尽管我在做这件事时学到了很多东西,但这完全失败了。 至于使用鼠标来跟踪你的驾驶距离:它根本不适用于我们或任何其他组。可能是因为鼠标中的相机没有聚焦,因为我们需要将鼠标放在地板上方几毫米处。第二年,没有一个小组在做同一个项目时使用了这个方法。他们在标记上加上标记,并使用一个简单的红外传感器来计算车轮的转数。
答案 2 :(得分:-1)
我知道我对这个线程有些不确定,但是如果你想要更精确的角度跟踪,两个光学鼠标将是理想的。基本上,如果你以相同的方向取消了动作,你将留下老鼠相对于彼此做出的动作。从那里开始,只需要一些简单的数学计算就可以准确地确定'机器人已经转向了多远。