Hexapod-робот под управлением ROS


Робот гексапод — это платформа, использующая для передвижения шесть ног. После просмотра множества видео в интернете, стало ясно, что очень интересно наблюдать за передвижением подобных роботов. И тут возникло желание сделать что-то похожее, но с одноплатным компьютером BeagleBone Black (далее BBB) на борту, потому что подобных проектов еще не было. Информацию о таких роботах было найти непросто, особенно, что касается программной составляющей. Некоторое время было непонятно с чего начинать, но вскоре было решено начать с изготовления конструктива робота — шасси и электронной составляющей, а затем заняться программированием того, что получилось.
Изучив на Robocraft.ru некоторые статьи про операционную систему для роботов — ROS — было принято решение построить управление именно на ней, тем более мощности BBB должно было хватить на это. К тому же, ROS очень перспективное направление в робототехнике со множеством инструментов и готовых решений для разработки.
Выбор «железа»
Как отмечено выше, мозгом системы стал BeagleBone Black:

Также BBB поддерживает Ubuntu, но с ядром для ARM архитектуры.
Экспериментальный режим, в котором пока работает ROS для ARM, на процесс работы никак не повлиял, так как были использованы инструменты, стабильно работающие на linux-arm.
Следующая важная часть — это серво-контроллер. BBB обладает несколькими каналами PWM, но их явно не достаточно для 18ти сервоприводов. К тому же управление PWM излишне будет нагружать процессор. Логичнее использовать готовый серво-контроллер с управлением через какой-нибудь интерфейс. Выбор пал на подходящий Mini Maestro 18-Channel USB Servo Controller:

Этот контроллер обладает 18ю каналами для серво, имеет интерфейс UART и USB. Управляется он через «свой» протокол, в который входят установки целевого угла сервопривода, а также его скорости и ускорения, кроме этого обладает удобными средствами калибровки в графической оболочке.
Но быстро подключить Mini Maestro к BBB не получится, так как уровни UART интерфейса у них различные: 5 V и 3.3 V. Пришлось использовать еще дополнительное устройство — конвертер логических уровней, которой преобразует 3.3 V в 5 V и обратно. Такую штуку я заказал со Sparkfaun.com. Это BOB-08745:

Теперь можно без проблем соединить BBB и контроллер, чтобы они общались по UARTу.
Для будущих исследований захотелось IMU, чтобы робот хоть как-то ощущал себя в пространстве. IMU с акселерометром, магнитометром и гироскопом я заказал так же на Pololu:

Это маленькая плата MinIMU-9 v2 с двумя двумя чипами L3GD20 и LSM303DLHC, связывающиеся с периферией по интерфейсу I2C. MiniIMU способна работать от 2.5V до 5.5V, поэтому никаких конвертеров не понадобилось.
На многих видео гексаподы управлялись геймпадом от различных приставок. И не зря. Обладающий множеством кнопок и двумя «аналоговыми» ручками, джойстик становится удобным устройством управления. В ROS нашелся драйвер для стандартного джойстика и я решил не отходить от «традиций» и приобрел оригинальный (чтобы было меньше проблем с подключением) PS3 Dual Shock 3:

Для подключения по Bluetooth, очевидно, необходим был USB адаптер. В итоге их у меня оказалось два, потому что один из них не захотел работать с имеющимся драйвером (об этом далее). А MobileData UBT-206 — заработал.
Для связи BBB с настольным компьютером используется протокол SSH, который в свою очередь использует, к примеру, Ethernet, Ethernet-over-USB (технология, позволяющая эмулировать ethernet-сеть через USB) или Wi-Fi. Подключать каждый раз провода не очень удобно и чтобы избавиться от этого был добавлен еще USB Wi-Fi адаптер. Ознакомившись, какой лучше адаптер подойдет для BBB, стало ясно, что ядро arm-linux поддерживает драйвер rtl8192cu на базе которого работает широкий круг устройств. Был выбран компактный NetGear WNA1000M (на картинке вместе с MobileData UBT-206):


Хотя многие рекомендуют использовать адаптеры с внешней антенной, этот работает довольно стабильно.
Ну и чтобы расширить всего один USB Host разъем BBB, необходим USB концентратор. Понравился вот этот — MobileData HDH-700, потому что у него есть кнопочки-выключатели на каждое из четырех устройств:

Следующим пунктом идет элементы питания всех бортовых устройств. Аккумулятор — Li-Po 2200mAh, состоящий из двух банок. Вместе с ним два стабилизатора напряжения преобразуют напряжение аккумулятора в необходимые 5V (для BBB и серво-контроллера) и 6V (для сервоприводов). Также на аккумулятор установлен сигнализатор низкого заряда, который пронзительно пищит, когда напряжение батареи падает до минимума.

Выбор конструкции и сервоприводов
Существует множество конструкций гексаподов, сделанных из различных материалов. Я не буду здесь выкладывать фото, так как их легко найти в интернете. Классический вариант состоит из трех приводов на каждую ногу, что дает достаточную степень свободы. Конечно, можно обойтись и двумя приводами — но движения при этом станут более «дерганными».
Различны материалы и технологии изготовления частей подвески. Это может быть печать на 3d принтере или лазерная резка из листов пластика, фанеры или металла. Так как 3d принтера под рукой не было и прочность напечатанных деталей оставляет желать лучшего, я выбрал конструкцию из металла, а именно из алюминия и дюралюминия. Тем более на работе у меня был доступ к фрезерному станку с ЧПУ, поэтому детали было решено изготовить из листов металла путем фрезеровки.
Главным примером, по образу которого я создавал собственную конструкцию, является Lynxmotion Phoenix:

В создании также очень помогла модель с GrabCAD.
Одной из главных частей робота являются сервоприводы. Они должны обладать достаточным крутящим моментов и, для надежности, редуктор стоит выбрать из металла. Такие сервы от известных фирм Hitec и Futaba стоят порядка $20-$30. Поэтому, вместо «не дешевых» сервоприводов Hitec HS-645/485MG были заказаны китайские, которые в два раза дешевле Turnigy TGY-S901D:

При питании в 6V они способны справляться с максимальной нагрузкой в 12.5 кг/см, чего с запасом хватало для робота с расчетной массой в 2 кг. А запас в китайских сервах необходим, так как качество у них оставляет желать лучшего. Некоторые из них работают с посторонними звуками с самого начала. Также они имеют довольно большой люфт и кривые оси. Но за 10$ за штуку — это приемлемо.
К сервам был куплен алюминиевый дисковый крепеж на вал для повышения прочности и упругости конструкции:

Создание 3d модели в SolidWorks и изготовление деталей
Таким образом, определившись с базовым набором комплектующих деталей, я начал создавать 3d чертеж, используя SolidWorks. Вот рендер того, что получилось (все винтики прорисовывать не стал):

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

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

Следующий пункт — это втулки на противоположной от вала стороне сервы. Через эти втулки сервоприводы крепится в нижней части рамы.

Втулки необходимы для равномерного распределения нагрузки на две пластины рамы, иначе вал сервопривода может изогнуться. Втулки сделаны всё на том же фрезерном станке из капролона — полимера, применяемого в антифрикционных деталях.

И последнее, на чем стоит остановиться — детали на окончаниях ног.

Они напечатаны на 3d принтере из ABS пластика. Далее в их круглые пазы вклеиваются резиновые ножки для приборных корпусов. В итоге получается завершенная деталь, способствующая увеличению трения контакта с поверхностью. Без них, соотношение инерции робота и «цепкости» лапок, ведет к проскальзыванию последних при ходьбе и других действиях на любой ровной поверхности.

Остальные плоские части изготовлены из дюралюминия толщиной 2.2 мм.

Сборка робота
Сборка происходила в несколько этапов. Это связано с отладкой его отдельных частей. Сначала были собраны только шасси с сервоконтроллером, а управление осуществлялось с настольного компьютера amd64 через USB. Затем появился BBB с хабом, и в последнюю очередь — батарея со стабилизаторами и IMU.
На фото — различные этапы сборки и конечный результат.




BeagleBone
На BBB установлена система Ubuntu 13.04 из готового образа. Сегодня уже нет доступной для скачивания этой версии дистрибутива, а есть только последняя и LTS. Версия ядра 3.8.
eMMC прошивалась через microSD карту. Самый простой способ записи образа на флешку — это с помощью программы Image Writer для Windows. Инструкции по прошивке можно найти здесь.
Теперь про инициализацию UART в BBB. Это делается через Device Tree Compiler (DTC) и подробнее об этом можно узнать здесь. Установить на BBB можно таким способом:
wget -c https://raw.github.com/RobertCNelson/tools/master/pkgs/dtc.sh
chmod +x dtc.sh
./dtc.sh

Взято отсюда.
После того как Rx и Tx UART появились на пинах P9_11 и P9_13 (в случае с uart5), можно передавать данные. А для того, чтобы менять битрейт используется утилита stty. Запускается она через скрипт, перед началом работы с серво-контроллером:
stty -F /dev/ttyO4 cs8 115200

На контроллере скорость устанавливается через Maestro Control Center.
Чтобы UART «заводился» каждый раз при старте системы, стоит добавить строчку
sudo bash -c "echo enable-uart5 > /sys/devices/bone_capemgr.*/slots"

в rc.local.
Как было описано выше, IMU использует интерфейс I2C. I2C на BBB работает по умолчанию, никаких дополнительных действий для его запуска не требуется. Но прежде чем писать узел ROS для IMU, была полезна проверка правильности подключения интерфейса посредствам утилиты i2c-tools для Linux. Разобраться с I2C еще помогло видео.
Большой проблемой оказалось заставить нормально работать джойстик по bluetooth. Подключить его не составило труда — всё в соответствии с описание узла ps3joy и учебником к нему. Только драйвер для джойстика, начиная с версии ядра 3.5, стал получать события с устройства с низкой частотой: порядка 5Гц. Этого недостаточно для нормального управления. О проблеме как раз говорится здесь. Поэтому, перепробовав кучу других драйверов, нашел один рабочий для arm-linux. Это драйвер sixad. Но чтобы он заработал на BBB, его необходимо собрать вручную. Это было сделано для Raspberry PI и подробно описано здесь. При компиляции у меня почему-то возникла ошибка:
error: ... was not declared in this scope

Она разрешилась добавлением хедера unistd.h в каждый исходный файл драйвера.
После того, как драйвер собран и установлен, геймпад все равно не подключился сразу. Это решилось изменением конфигурации bluetooth:
echo "DisablePlugins = input" >> /etc/bluetooth/main.conf

После этого можно было сделать запуск драйвера как демона и свободно подключать джойстик по нажатию кнопки PS3.
USB Wi-Fi работает из коробки. Чтобы он клиентом подключался к роутеру, нужно изменить в /etc/network/interfaces поля:
wpa-ssid ""
wpa-psk  ""

ROS
Для начала я установил ROS на свой настольный компьютер. Версия дистрибутива Hydro Desktop-Full, установилась без проблем на Ubuntu 13.04. На «большом» компьютере удобно заниматься отладкой написанных узлов и кинематической модели в средствах визуализации ROS. Вдобавок, компиляция идет гораздо быстрее, чем на BBB. Поэтому все разрабатывалось на компьютере, а потом только переносилось на BBB и компилировалось там. К сожалению кросс-компиляция для ROS пока является трудной задачей.
Для визуализации существует удобный инструмент — rviz. Он использовался для просмотра получившейся модели и того, как она ведет себя при управлении. Для этого есть joint_state_publisher — пакет содержащий инструменты настройки и изменения положения «суставов» и robot_state_publisher — пакет транслирующий положение робота в tf. Сама модель содержится в URDF файле. В нем описываются все сегменты (links) и их сочленения (joints), а также их взаимное расположение. Для наглядности прикрепляются 3d модели частей в формате STL. Но так как робот содержит повторяющиеся части (ноги), удобно использовать формат XACRO (XML Macros), который затем преобразуется в URDF. Главные преимущества XACRO: наличие макросов, математических операций и констант. Таким образом, можно минимизировать код, описывающий модель робота. На рисунке структура и визуализация модели в rviz.


При написании основных узлов на С++ использовалась IDE Eclipse Kepler. Про конфигурацию Eclipse можно почитать тут. А вообще перед началом стоит ознакомиться с учебником, roscpp и catkin.
Разработка ПО
В этой статье не будет описываться код узлов, будут представлены только их общая структура и назначение. Подробнее про написание кода — в следующей статье.
Итак, общая схема структуры узлов ROS на BBB (в эллипсах — название узлов, в прямоугольниках — название топиков):

joy_node — готовый пакет, позволяет преобразовывать данные из файла стандартного устройства Linux (/dev/input/js) в сообщения «Joy» и транслировать их в топики ROS. Полезным будет посмотреть в tutorial пакета. Почти всегда в них кроются многие ответы на вопросы.
crab_teleop_joy — узел, который обрабатывает данные с джойстика и преобразует их в сообщения для управления гексаподом. Например, из положения по двум осям «аналоговой» ручки вычисляется угол курса, а удаленность его от центра влияет на длину шага. Эти величины затем используются в генераторе походки. Также строится логика использования определенных комбинаций и последовательностей нажатия кнопок. Полученные сообщения передаются дальше в три топика.
crab_leg_kinematics — узел-сервис. Его назначение — решение задачи инверсной кинематики, то есть на основе координат end-effector'а (в моем случае — это кончики ножек) вычислять углы положения суставов (углы сервоприводов). Запрос сервису формируется в виде шести векторов целевого положения кончиков ног, а ответ приходит в виде 18'ти углов сервоприводов. Написан узел с использованием Kinematics and Dynamics Library (KDL), которая интегрирована в ROS. Клиентами узла являются crab_body_kinematics и crab_gait.
crab_body_kinematics — вычисляет векторы положения концов ног на основе модели робота URDF и данных из сообщения, которое содержит желаемые линейные и угловые отклонения рамы от начального положения, а также радиус раскрытия ног. Также реализованы команды подъема из стартового положения (когда робот лежит на раме, а ноги сложены) и возврат в стартовое положение.
crab_gait — узел, генерирующий векторы положения концов ног для реализации двух типов походки. На входе — сообщения, содержащие команды о типе и состоянии походки (идти/стоять) и величины управления: углы курса и рыска и размер шага. Типы походки следующие — tripod и ripple:

Походка типа tripod быстрее, но при этом нагрузка на центральные ноги больше, чем на передние и задние, что плохо сказывается на продолжительность жизни серв.
Управление осуществляется с помощью двух «аналоговых» ручек джойстика: левый — изменение курса при постоянном рыске (перемещение «крабиком»), правый — изменение курса с изменением рыска (передвижение вперед-назад и влево-вправо).
crab_imu — драйвер MinIMU-9, собран из частей Arduino скетча. Содержит алгоритм расчета углов Эйлера на основе данных с MEMS датчиков. Также содержит простой П-регулятор, формирующий воздействия, компенсирующие отклонения по тангажу и крену. Эти воздействия передаются через топик move_body в crab_body_kinematics для задания нужного положения ног.
crab_maestro_controller — последний узел-драйвер для Mini Maestro. На входе у него 18 угловых положений сервоприводов, которые он преобразует в протокол общения сервоконтроллера по UART.
Структурная схема визуализации незначительно отличается от схемы системы робота. В визуализации всё те же узлы, кроме узла crab_maestro_controller, который заменяют узлы crab_joint_publisher, joint_state_publisher, robot_state_publisher и tf.

О последних было написано выше.
crab_joint_publisher — преобразует сообщения предназначенные для контроллера, в сообщения «JointState», которые подаются на вход joint_state_publisher.
Теперь о некоторых этапах разработки с видео.
Сначала всё управление гексаподом осуществлялось с компьютера. Началом послужило испытание инверсной кинематики с помощью рисования окружности одной из ног:

Затем собраны части управления положением и ориентацией тела:

И воплощение этого на настоящем роботе:

После этого запустил всё это на BBB и испытывал узел IMU:

Потом робот пошел ripple походкой, управляемый с джойстика:

И в конце возможности гексапода на сегодняшний день:

Заключение
Создание гексапода было очень интересным процессом, а возможности ROS и производительность BeagleBone Black позволяют добавлять и совершенствовать программную составляющую робота. В этой статье хотелось показать в первую очередь возможности удобной разработки при помощи ROS, а также обратить внимание, какие инструменты использовались для создания робота, не вдаваясь в подробности. На начальном этапе было наиболее сложным разобраться с чего же начать и какими средствами при этом пользоваться. Надеюсь, статья поможет сориентироваться в выборе пути разработки.
  • +6
  • 26 мая 2014, 19:12
  • tuuzdu

Комментарии (17)

RSS свернуть / развернуть
+
+1
Большое спасибо! Прекрасная работа!
avatar

admin

  • 27 мая 2014, 08:53
+
0
Спасибо!)
avatar

tuuzdu

  • 27 мая 2014, 18:45
+
0
замечательно!!! а можно узнать, во сколько обошлась резка метала для изготовления корпуса и ног? примерная стоимость. Спасибо.
avatar

Pimkin_Dima

  • 27 мая 2014, 10:07
+
+2
По Петербургу лазерная резка стоила бы около 5-10 тыс. руб. Но как я писал выше, я фрезеровал бесплатно у себя на работе.
avatar

tuuzdu

  • 27 мая 2014, 18:47
+
0
Кстати, возник вопрос по быстродействию ROS на BBB — как ощущения?
С какой частотой поток основной обработки работает? (исходники на гитхаб не выложите?)
avatar

admin

  • 28 мая 2014, 09:13
+
+2
BBB не плохо справляется, учитывая работающий wifi и bluetooth.
Рассчитанные значения о положениях 18ти серв поступают драйвер с частотой 25-30 Гц.
Но есть некоторые мысли по увеличению быстродействия) Потому что некоторые узлы неоправданно сильно грузят процессор.
Сегодня-завтра попробую выложить)
avatar

tuuzdu

  • 28 мая 2014, 09:34
+
0
Спасибо! 25 Гц — вполне :)
avatar

admin

  • 28 мая 2014, 09:47
+
0
там есть 2 PRU: mythopoeic.org/bbb-pru-minimal/
можно задействовать их чтобы разгрузить процессор.
avatar

Nemo

  • 11 июня 2014, 09:33
+
+1
https://github.com/tuuzdu/crab_project
avatar

tuuzdu

  • 28 мая 2014, 19:23
+
0
Спасибо!
avatar

admin

  • 28 мая 2014, 19:56
+
0
Очень крутой проект и интересный! Спасибо за подробное описание!

Хотел бы поделиться опытом для вашей дальнейшией работы. «Неприятная» технология в вашем проекте — это все-таки WiFi. Сейчас занимаюсь комм. устройством на RPi и WiFi себя показал довольно жутко. Были выявлены следующие проблемы:
1. Медленный коннект к сетям с DHCP (ну это норма).
2. Донгл, чем меньше размер имеет, тем больше греется — в рабочем режиме имел температуру порядка 60 градусов, тем самым нагревая корпус как USB-порта, так и все что было по близости.
3. Использование менеджеров подключений по типу wicd — зло. Во первых, если Wi-Fi сеть поднята по принципу сот и есть передача эстафеты соседней соте, то wicd с этим не справится — он подключается к точке доступа не по SSID, а по MAC. Редко с таким сталкивался. А реконнект — вообще песня — список сетей обновляется раз 2 минуты и плюс еще время на подключение — получаются огромные простои. Кроме того, он не всегда ожидаемо и стабильно отрабатывает. Выход — только конфигурирование интерфейса /etc/network/interfaces и писанием скрипта для автореконнекта при дропе (на баше к примеру).
4. Ну и энергопотребление тоже не в плюс WiFi=))
avatar

danil_borchevkin

  • 28 мая 2014, 09:57
+
+1
Про wifi на BBB и его нестабильную работу очень много написано в группе на google groups. Но насколько я знаю, в новых версиях ядра эти проблемы решаются.
А я использую wifi только для подключения по ssh и к интернету, а обычно он просто выключен) Отваливается бывает при компиляции, видимо как то связано с загрузкой процессора, а так работает волне нормально, хотя ядро у меня не самое последнее.
avatar

tuuzdu

  • 28 мая 2014, 18:43
+
0
У меня BeagleBone Black. подключен блок питания и wi-fi, Ångström Linux Всё работает!
avatar

Nemo

  • 11 июня 2014, 09:27
+
0
Здравствуйте!
Помогите разобраться. Не запускается rviz. Появляется иконка rviz и всё… Окна программы нет. Ниже терминал.

sergey@sergey-desktop:~$ roscore &
[1] 2959
sergey@sergey-desktop:~$… logging to /home/sergey/.ros/log/4f803ad6-2884-11e4-b56c-f07d68b8b243/roslaunch-sergey-desktop-2959.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server sergey-desktop:45741/
ros_comm version 1.11.8

SUMMARY
========

PARAMETERS
* /rosdistro: indigo
* /rosversion: 1.11.8

NODES

auto-starting new master
process[master]: started with pid [2971]
ROS_MASTER_URI=http://sergey-desktop:11311/

setting /run_id to 4f803ad6-2884-11e4-b56c-f07d68b8b243
process[rosout-1]: started with pid [2984]
started core service [/rosout]
rosrun rviz rviz
[ INFO] [1408550966.026639037]: rviz version 1.11.3
[ INFO] [1408550966.026864837]: compiled against OGRE version 1.8.1 (Byatis)
[ INFO] [1408550967.455705369]: Stereo is NOT SUPPORTED
[ INFO] [1408550967.456005038]: OpenGl version: 3 (GLSL 1.3).
avatar

I_Sergey

  • 20 августа 2014, 18:12
+
0
Обалденная работа!
Подскажите пожалуйста как Вы подготавливали файл формата STEP для загрузки в ЧПУ.
avatar

Shmit

  • 15 декабря 2014, 17:02
+
0
Наш станок удобнее всего запускать из CorelDraw, и для этого я сохранял контуры деталей в DWG. А STEP можно сделать точно из КОМПАСа и из SW скорее всего тоже.
avatar

tuuzdu

  • 15 декабря 2014, 17:47

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.