BalanceBall. Самобалансирующая платформа от А до Я

BalanceBall. Самобалансирующая платформа от А до Я

348
ПОДЕЛИТЬСЯ

Я студент Физтеха, факультета радиотехники и кибернетики, и как положено всем второкурсникам , в весеннем семестре нужно сделать проект по информатике и микроконтроллерам. Я решил уничтожить 2-ух зайцев одним выстрелом и объединил два проекта в один.

Позже я случаем наткнулся на это видео и сходу зажегся идеей воплотить что-то схожее. Из идей была игра, схожая на Guitar Hero, но контроллером были твои руки, настукивающие барабанные биты по столу. Также думал над созданием светодиодной матрицы, управляемой по Bluetooth с компа, со своим простым скриптовым языком для написания анимаций. Вот что у меня вышло в итоге: Задумки были увлекательными, но я все равно казались чем-то не тем. Долго выбирал тему проекта.

Кому увлекателен процесс сотворения данной платформы от проектирования деталей до написания компьютерного зрения, прошу под кат.

Принципиальная схема
Несколько дней обдумывал, из каких компонентов обязано состоять это устройство, и как они должны меж собой взаимодействовать. В конце концов пришел к таковой схеме:

1. Интернет камера передает изображение на ноутбук
2. По изображению определяются координаты шарика
Координаты подаются на вход PID регуляторов (2 независящих регулятора по X и по Y), и регуляторы считают углы, на которые должны повернуться сервоприводы 3.
Углы передаются на Arduino и выставляются на сервоприводах 4.

Изобразить это можно так:

Проектирование механики платформы
На Youtube можно отыскать много видео с реализацией данной платформы. Просмотрев все и прочитав пару публикаций на данную тему, решил, что платформа будет закреплена на шаровой опоре, наклоняться будет с помощью 2-х сервоприводов, закрепленных на дощечке, на которой будет держаться вся конструкция. В самом начале видео видна реализация механики платформы. 1-ое, что нужно было решить — это как платформа будет смотреться и двигаться.

Сервоприводы решил брать сильнее, чтоб быть уверенным, что они сумеют наклонить платформу. Тормознул на TOWER PRO MG996R, с моментом 9.4 кг/см.

Вот несколько фото процесса сотворения: Проектировал все в SolidWorks. Снизу на платформу было решено прикрепить крестовину, чтоб уже на нее крепить и шаровую опору, и угловые крепления для тяг. Платформу, тяги, некие крепления решено было вырезать из орг стекла на лазерном резаке (благо он есть у нас в институте).

Отыскать пригодную было достаточно трудно, и притом стоили они недешево. Купил карданчик, большой болт (на нем все держится) и гайки. Мне подсказали, что заместо шаровой можно применять карданчик, как на ключах. Начал находить шаровые опоры. Вот что вышло: К карданчику приварил гайку.

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

Из фанеры вырезал квадратную площадку, на которую все крепил. Вот так смотрелась платформа в собранном виде:

Крепления для камеры решил сделать позднее, чтоб точно знать высоту на которую ее нужно поднять.

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

1-ый опыт
Опосля полной сборки написал простой скетч для Arduino, который наклонял платформу на некие углы.

Все вроде бы работало, и было трудно в это поверить.

Незначительно поигравшись с устройством, определил углы, когда платформа параллельна полу, определил наибольший и малый углы (±13 градусов). Настало время писать код.

Написание кода
Опосля долгого обдумывания структуры программы я поделил ее на 4 модуля:

Компьютерное зрение 1.
Реализация PID регулятора 2.
Общение с Arduino по serial порту 3.
Скетч для Arduino 4.

Весь код можно поглядеть в этом репозитории. Все писал на C++.

Компьютерное зрение
Метод детектирования объекта можно разложить на несколько шагов: Употреблял OpenCV. Детектирование объекта решил делать по цвету. Во многом мне посодействовала эта статья.

Получение кадра с камеры 1.
2. Конвертация из RGB в HSV
Пропускание через маску некого цвета (в моем случае белоснежного) 3.
4. Расчет моментов изображения
5. Расчет координат шарика по моментам

Реализация PID-регулятора
Прочитав на Википедии про PID регуляторы и посмотрев несколько уже готовых реализаций на github, мне не составило труда воплотить его на C++. На Хабре я лицезрел много статей про PID-регуляторы, потому на нем останавливаться не буду.

Общение с Arduino по serial-порту
Чтоб отослать эту строку, я просто писал в файл вида "/dev/tty.usbmodem1421". Углы на Arduino я посылал в виде строки "[ANGLE_X]:[ANGLE_Y]$", где ANGLE_X и ANGLE_Y отвечали соответственно за наклон по собственной оси и изменялись в пределах от -100 до 100 (углы в процентах). Весь код я писал и запускал на OSX, потому заморочек с общением по serial порту не было.

Скетч для Arduino
Схема подключения смотрелась так:

Arduino получала по serial порту строку, парсила ее и опосля выставляла на сервоприводах нужные углы.

Заключение
На создание BalanceBall я издержал приблизительно 2 месяца. PID настраивал экспериментально. В планах создание математической модели платформы и теоретический расчет коэффициентов PID-регуляторов. Самым сложным оказалась реализация механики.

Всем спасибо за внимание!

Ссылки
Репозиторий проекта: github.com/karfly/balanceball
Папка с материалами: goo.gl/bmkexm

ПИД-регулятор
Дискретный ПИД регулятор
Color Detection & Object Tracking habrahabr.ru