Вопрос

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

Теперь робот вращается на месте и движется только вперед.Таким образом, движение робота в идеале происходит по прямым линиям (хотя отслеживание мыши может обнаруживать отклонения, если вы отклоняетесь) под определенными углами.Конкретный набор движений робота будет таким:
А:Поворот на 45 градусов, перемещение на 3 дюйма
Б:Поворот на 90 градусов, перемещение на 10 дюймов
С:Поворот на -110 градусов, перемещение на 5 дюймов.
Д:Поворот на 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» (формула будет (дельтакс в дюймах) / (расстояние датчика мыши в дюймах от центра вращения).Кроме того, значение deltas.Distance будет получено от датчика «Y» после преобразования его из пикселей в дюймы.

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

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

... etc ...

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top