Алгоритм поиска пути для робота

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

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

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

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


person mhilmi    schedule 12.04.2009    source источник
comment
...отключает сетевые кабели...   -  person i_am_jorf    schedule 13.04.2009
comment
Подождите, если у вас есть значения перемещения мыши по осям X и Y, разве вы не можете просто вычислить вектор напрямую? Или мышь закреплена в фиксированном положении на роботе (чтобы он регистрировал движение только по одной оси?) Не знаю, правильно ли я понял.   -  person v3.    schedule 13.04.2009
comment
Я тоже не понял вопроса. Можно подробнее?   -  person Hannes Ovrén    schedule 13.04.2009
comment
Трудно понять, что именно вы спрашиваете. Используете ли вы обратную связь от мыши, чтобы свести к минимуму ошибки при выполнении ваших команд? Вы спрашиваете, как это сделать?   -  person ejgottl    schedule 13.04.2009
comment
Проблема в том, что мышь дает только относительные показания, поэтому, вращаясь или двигаясь назад, вы потенциально стираете информацию. Так что да, мне интересно, как вы можете реализовать алгоритм, чтобы он мог постоянно отслеживать изменения, чтобы дать вам кратчайший путь, если вы двигались зигзагами по пути.   -  person mhilmi    schedule 13.04.2009


Ответы (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» (формула будет (дельтакс в дюймах) / (расстояние датчика мыши в дюймах от центра вращения). Кроме того, deltas.Distance будет исходить из «Y ", после того как вы конвертируете его из пикселей в дюймы.

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

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

... etc ...
person FryGuy    schedule 12.04.2009
comment
Да, это то, что я пытаюсь придумать. Спасибо. Трудно объяснить, но я думаю, вы поняли, что я имел в виду. И да, в основном я считываю регистры X и Y мыши в свой микроконтроллер и преобразовываю их значения в дюймы (400 отсчетов = 1 дюйм). - person mhilmi; 13.04.2009

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

person Hannes Ovrén    schedule 12.04.2009
comment
Мы смогли довольно точно откалибровать мышь — мы установили ее близко к полу и убедились, что наша поверхность для соревнований совместима (не стекло или что-то в этом роде). На данный момент робот может довольно точно поворачиваться с точностью до 1 градуса, используя показания мыши по оси Y. - person mhilmi; 13.04.2009
comment
Повезло тебе! У нас было много проблем с неровностями пола, из-за которых показания подскакивали. В любом случае удачи! :) - person Hannes Ovrén; 13.04.2009
comment
В качестве альтернативы, если вы хорошо разбираетесь в механической обработке и оптике, вы можете сделать запасной объектив с большим фокусным расстоянием. - person FryGuy; 14.04.2009

Я знаю, что несколько засоряю эту ветку, но если вам нужно более точное отслеживание углов, идеально подойдут две оптические мыши. По сути, если вы отмените движение в том же направлении, у вас останется движение, которое мыши совершали относительно друг друга. Оттуда будет просто простая математика, чтобы точно определить, как далеко повернулся «бот».

person Squirrel    schedule 08.06.2010
comment
Вы скорее изменили системные ограничения. - person Swapnil; 20.12.2012