2009-04-12 2 views
2

У меня есть робот, который использует оптическую мышь в качестве дорожки положения. В принципе, по мере перемещения робота он может отслеживать изменение в направлениях X и Y с помощью мыши. Мышь также отслеживает, какое направление вы двигаетесь, то есть отрицательное X или положительное X. Эти значения суммируются в отдельные регистры X и Y.
Алгоритм Pathfinding для робота

Теперь робот вращается на месте и движется только вперед. Таким образом, движение робота идеально по прямой линии (хотя отслеживание мыши может отклоняться от отклонения, если вы отклоняетесь) под конкретными углами. Конкретный набор движений робота будет, как:
A: Поворот на 45 градусов, двигаться 3 дюйма
Б: Поворот на 90 градусов, двигаться 10 дюймов
C: Поворот -110 градусов, двигаться 5 дюймов
D : Поворот на 10 градусов, перемещение 1 дюйм
Но каждый раз, когда мыши X и мыши Y регистры дают реальные расстояния, которые вы перемещали в каждом направлении.

Теперь, если я хочу повторить набор движения, идущий только от А до D, как я могу это сделать, используя информацию, которую я уже собрал. Я знаю, что могу в принципе суммировать все углы и расстояния, которые я им кормлю, но это оказалось бы неточным, если бы были большие ошибки в каждом заказе движения. Как я могу использовать исходную информацию с помощью мыши? Друг привёл идею о том, что я могу постоянно синировать и косинировать значения мыши и вычислять конечный вектор, но я не уверен, как это будет работать.

Проблема заключается в том, что мышь дает только относительные показания, вращающиеся или движущиеся назад, вы потенциально удаляете информацию. Так что да, мне интересно, как вы можете реализовать алгоритм, чтобы он мог постоянно отслеживать изменения, чтобы дать вам кратчайший путь, если вы переместились в зигзагах, чтобы добраться туда изначально.

+0

перемещается ...? что? – dmeister

+0

... отсоединяет сетевые кабели ... –

+0

После удара «submit» – tstenner

ответ

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; 
} 

Вы правы в своей идее, что это не будет точно. Это называется «мертвым расчетом» по какой-то причине.

Где вы можете получить свой deltas.Heading, основанный на координате «X» (формула будет (deltax в дюймах)/(расстояние между датчиками мыши в дюймах от центра вращения). Также придет дельта. от датчика «Y», после преобразования его из пикселей в дюймы

Затем выполнить шаги, вы могли бы сделать что-то вроде:.

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

... etc ... 
+0

Да, это то, что я пытаюсь придумать. Благодарю. Трудно объяснить, но я думаю, вы поняли, что я имел в виду. И да, в основном я читал регистры X и Y мыши в своем микроконтроллере и преобразовывал их значения в дюймы (400 отсчетов = 1 дюйм). – mhilmi

0

Не ответ на ваш вопрос, но, возможно, предостерегающий рассказ ... Я сделал именно этот вид робота в качестве школьного проекта год назад. Это был полный провал, хотя я многому научился, когда я это делал. Что касается использования мыши для отслеживания того, как далеко вы двинулись: это не сработало для нас вообще или для любой другой группы. Вероятно, потому, что камера в мыши была не в фокусе из-за того, что мы должны были иметь мышь на несколько мм над уровнем пола. В следующем году ни одна группа, выполняющая тот же проект, не использовала этот метод. Вместо этого они устанавливали маркировку на скатах и ​​использовали простой ir-sensor для расчета количества оборотов, производимых колесами.

+0

Мы смогли довольно точно откалибровать мышь - мы установили ее близко к полу и убедились, что наша поверхность соревнований совместима (не стекло или что-то еще). Пока робот может вращаться довольно точно до 1 градуса, используя показания оси Y мыши. – mhilmi

+0

Хорошо для вас! У нас было много неприятностей с неровностью в полу, из-за чего показания прыгали. Удачи в любом случае! :) –

+0

Альтернативно, если вы умеете обрабатывать и оптика, вы можете сделать объектив с более длинным фокусным расстоянием. – FryGuy

-1

Я знаю, что я несколько necroing эту тему, но если бы вы хотели более точного отслеживания угла, то две оптические мыши были бы идеальными. В принципе, если бы вы отменили движение в том же направлении, вы останетесь с движением t он сделал мышей по отношению друг к другу. Оттуда просто будет простая математика, чтобы точно определить, как далеко повернулся бот.

+0

Вы скорее изменили системные ограничения. – Swapnil

Смежные вопросы