суббота, 9 января 2016 г.

Управление роботом

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


Начну с самого простого. Движение по прямой. Для перемещения платформы на некоторое расстояние вперед необходимо, чтобы правый и левый двигатели повернули колеса на одинаковый угол вперед.

Представленная ранее программа позволяет перемещать валы шаговых двигателей установленных в платформе на 3.75 градуса. Диаметр используемых колес составляет 65 миллиметров. Значит длина их окружности составляет 65.0 * 3.14 = 204.1 миллиметра. Так как 3.75 градуса это 360.0 / 3.75 = 96.0 часть окружности, то поворот на 3.75 градуса приведет к перемещению на 204.1 / 96.0 = 2.13 миллиметра.

(65.0 * 3.14) / (360.0 / 3.75) = 2.13 мм

Таким образом с каждой итерацией робот будет перемещаться на 2.13 миллиметра вперед.

При движении назад колеса нужно крутить в другую сторону. А всё остальное абсолютно тоже.

С поворотами всё немного сложнее. Ниже приведено схематичное изображение платформы. Благодаря этой картинке объяснить процесс поворота сильно проще.


Чтобы робот повернуть налево нужно, чтобы правый двигатель повернул правое колесо (R) на некоторый угол вперед, а левый двигатель повернул левое колесо (L) на тот же угол назад. При этом траектория движения колес будет представлять собой окружность (K). Платформа будет поворачиваться вокруг центра этой окружности. На схеме обозначен буквой A. Диаметр окружности K равен расстоянию от центра правого колеса до центра левого колеса. У меня это 135 миллиметров. Длина этой окружности 135.0 * 3.14 = 423.9 миллиметров. Если правое и левое колесо повернется на 3.75 градуса, то робот проедет по окружности K 2.13 миллиметра. А 2.13 миллиметра составляют 423.9 / 2.13 = 199.0 часть окружности K. Таким образом робот повернется на 360.0 / 199.0 = 1.81 градус.

360.0 / ((135.0 * 3.14) / 2.13) = 1.81

Для поворота на 90 градусов потребуется около 50 итераций.

90.0 / (360.0 / ((135.0 * 3.14) / 2.13)) = 49.75

Число не целое. Нужно округлять.

(360.0 / ((135.0 * 3.14) / 2.13)) * 50.0 = 90.45

Ровно 90 градусов не получается, но результат достаточно близок к желаемому.

Для поворота направо необходимо правое колесо крутить назад, а левое - вперед. На этом отличия заканчиваются.

Есть ещё один способ изменения направления движения платформы. В программе он не реализован, но рассказать про него стоит. Всего возможно четыре варианта выполнения этого поворота: вперед налево, назад направо, вперед направо, назад налево. Я подробно расскажу только о выполнении поворота вперед налево. Здесь тоже не обойтись без картиночки.


В данном случае правый двигатель поворачивает правое колесо вперед, а левый двигатель препятствует прокручиванию левого колеса. Теперь только правое колесо будет двигаться по окружности. На схеме эта окружность обозначена буквой K. Центр окружности K совпадает с центром левого колеса. Поворот выполняется вокруг центра левого колеса. Таким образом радиус окружности K равен расстоянию от центра правого колеса до центра левого колеса. Как и раньше это 135 миллиметров. Но диаметр окружности K теперь 135.0 * 2.0 = 270.0 миллиметров. Длина этой окружности равна 270.0 * 3.14 = 847.8 миллиметров. При повороте правого колеса на 3.75 градуса, оно проедет по окружности K 2.13 миллиметра. Это будет 847.8 / 2.13 = 398.0 часть окружности. Робот повернется на 360.0 / 398.0 = 0.9 градуса.

360.0 / ((135.0 * 2.0 * 3.14) / 2.13) = 0.9

Этот способ позволяет с большей точностью управлять платформой, но требует больше свободного пространства.

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

Используемые мной шаговые двигатели имеют шаг в 7.5 градуса. На самом деле длина отдельного шага может быть 7.51 или 7.49 градусов. При этом за 48 шагов вал двигателя повернется на 360 градусов. Не смотря на различную длину шага, ошибка не накапливается. Но в рассматриваемом проекте длина отдельного шага важна.

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

А ещё моя сборка очень далека от идеала. Колеса расположены под небольшим углом. Это очень сильно влияет на движение платформы.

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

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