Алгоритм поиска пути для робота - PullRequest
2 голосов
/ 13 апреля 2009

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 13 апреля 2009

Я думаю, что основной алгоритм, который вам нужно сделать, это:

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

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

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

... etc ...
0 голосов
/ 08 июня 2010

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

0 голосов
/ 13 апреля 2009

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

...