Робот гексапод своими руками

Робот гексапод своими руками

Автор: KondorFedor
Опубликовано 11.09.2017
Создано при помощи КотоРед.
Участник Конкурса «Поздравь Кота по-человечески 2017!»

Поздравляю Кота с 12-летием! Желаю много валерьянки, столько же сметаны и любящих хозяев!

Отдыхая летом на берегу Ладожского озера, я сильно интересовался пауками. Даже завел одного в палатке и подбрасывал ему мух и комаров. Наблюдать за его перемещениями под крышей палатки было очень увлекательно, поэтому по возвращению я решил «воссоздать» конструкцию ног паука.

Часть №1: Сервопривода

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

Подвижность ног обеспечивают сервопривода, по три на каждую ногу — два на сгибание ноги, один на поворот. Я рассчитывал взять средние по усилию привода – 3.5 кг/см. Оптимальной кандидатурой являлись привода Tower Pro SG5010, вот фото:

Первым делом я узнал цену у нас в местных магазинах. Покупать здесь тут же расхотелось, ибо цена колебалась от 500 до 750 рублей за привод. Поэтому, не долго думая, я заказал партию приводов в Поднебесной, хоть меня и предупреждали, что мне придет «Кот в мешке». Кот в мешке пришел. Начнем с того, что из 20 заказанных приводов по цене 263 руб. за штуку, 7 оказалось нерабочими. Просто не работала электроника и все! Моторы оказались рабочие. С редукторами вообще отдельная песня – они пришли без стопоров! Если у обычного привода диапазон вращения 180 градусов, то у этих — 360. На фото: редуктор китайского привода, на главной шестеренки отчетливо видно отсутствие стопора.

На этом проблемы не кончились — у шестеренок в редукторах отлетали зубья при малейшей нагрузке и горела электроника, которая тоже отличалась от оригинальной.
Поэтому продавцу была поставлена минимальная оценка и написан отзыв о подделке, а привода были убраны в ЗИП. Но вопрос с сервами решать как-то надо было, поэтому была заказана очередная партия приводов, на этот раз «местного разлива», привода EMAX ES3001. Пришли аккуратно упакованные в коробочки, на каждом был код проверки подлинности. Привода брались по 4 штуки за партию, потому что был риск получить, так же, как и в прошлый раз подделку, но на этот раз все обошлось. Сервы все пришли нормальные, нагрузку держали. Единственный минус — опять же слабые редукторы. Поломанные шестеренки быстро заменялись шестеренками от китайских подделок из ЗИПа, благо их у меня теперь было много.

Часть №2: Механика

Чертежи решено было делать в программе AutoCAD 2011, а детали изготавливать из оргстекла толщиной 4мм методом лазерной резки, спасибо ребятам из ЦЛТ, выручили (ЦЛТ — центр лазерных технологий). Если с чертежами ног и нижней пластины проблем не возникло, то над верхней пластиной пришлось попотеть. В ней предполагалось отверстие для выхода шлейфов на сервы. На первой версии данной детали отверстие получилось ну очень большим, в результате чего конструкция получилась, мягко говоря, ломкая и хрупкая. Фото чертежа первой версии:

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

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

Сервопривода крепились к деталям при помощи таких вот рам:

Соединение, отвечающее за разворот ноги состоит из двух таких деталей. На нижнюю закреплен фланцевый подшипник 3*10*4, тоже заказанный в Китае.

После первых испытаний был выявлен колоссальный люфт каждой ноги (оргстекло очень хорошо гнется, плюс сервы люфтят), из-за которого робот мог ходить только так:

От люфта которого решено было уходить путем установки дополнительных тяг на подшипники 3*10*4 (чертежи тяг те же). Это хорошо видно на фотографии робота спереди:

Часть №3: Электроника и алгоритмы

Изначально управление сервами планировалось сделать на МК Atmega16 но, к сожалению, я не смог реализовать управление сразу 18-ю приводами — не хватило таймеров. Поэтому из загашников была вытащена китайская плата-клон Arduino Mega 2560, очищена от пыли и подключена к компьютеру. Только вот запускаться она ни за что не хотела. Тщательно проанализировав возможные неисправности, была высказана гипотеза о неисправности кварца. Гипотеза оказалась рабочей, кварц перепаял, плата начала определяться и шиться. Фото платы с перепаянным кварцем:

Энергообеспечение осуществляется с помощью аккумулятора на 6 В 4500 мА*ч, купленный также в Китае. Аккумулятор Ni-Mh поэтому заряжаю его от обычного блока питания.Теперь об алгоритмах. Мне было бы лень в программе постоянно задавать углы для 18-ти серв, поэтому я решил написать алгоритм, в который я забиваю координаты точки, в которую должен переместиться конец ноги. Все углы алгоритм должен рассчитывать сам, исходя из того, что точка начала координат — точка крепления ноги к туловищу робота, то есть, решать задачу инверсной кинематики — ко координатам рассчитывать углы. Системы координат каждой ноги прикрепляю на фото:

Алгоритм был написан, не выходя за пределы школьного уровня алгебры и геометрии и оформлен в целую библиотеку. В программе создается новый объект класса Leg, функцией attach(int, int, int, bool, bool) сервы ноги прикрепляются к портам контроллера (сначала — серво, отвечающий за поворот, потом — за «бедро», последний — «за колено»), а также указывается, находится ли нога на левом борту относительно движения. Последний параметр необязателен — он указывает, является ли нога передней или задней. Это нужно для расчета координат выдвижения ноги в системе координат туловища. Сия функция еще сильно сырая, рекомендую ей не пользоваться. Далее функцией set(float x, float y, float z) задается точка отсчета координат ноги (эту функцию написал, чтобы можно было легко изменять клиренс — задал новый — и продолжай прописывать те же координаты для ходьбы, ничего менять не надо, удобно до жути). И, наконец, функцией move( float x, float y, float z, bool) мы задаем, координаты конечной точки нашей ноги. Bool, по большому счету, не нужен, его можно не указывать. Я использовал его для расчета координат выдвижения ноги в системе координат туловища. Библиотеку прикреплю к статье. Тест алгоритма на одной ноге, которая выполняет скребущие движения по столу:

Тест алгоритма на двух ногах (ползем по полу+изменение клиренса):

Алгоритм ходьбы и поворота основан на том, что робот может одновременно оторвать от земли три ноги из шести. Ходьба робота представляет из себя поочередное передвижение «троек» ног. Цифрой 1 отмечены те ноги, которые перемещаются в первую очередь, цифрой 2 — во вторую очередь.

Часть №4: Дистанционное управление

Робота решено было научить управляться с пульта через Wi-Fi. Для этих целей управление роботом было разделено на два блока — контроллер низкого уровня (Arduino), в обязанности которого входило рассчитывать кинематику и управлять сервами, и контроллер высокого уровня — Raspberry Pi с установленной на нем ОС Ubuntu Mate 16.04. На убунте была также установлена ROS — робототехническая операционная система, предлагающая огромное количество разных библиотек и драйверов. Главным плюсом было то, что уже разработана библиотека для общения ардуины и ROS. Вкратце о сути ROS: в этой системе одновременно может выполняться множество программ, или, как их называют, узлов. Каждый узел может публиковать и принимать сообщения на определенную тему (топик). Сообщения могут содержать что угодно — хоть числа, хоть строки, хоть изображения.
Итак, возвращаемся к нашим баранам. Для управления роботом был выбран джойстик от PS3,

который должен был подключаться напрямую по bluetooth к Raspberry Pi, но частота получаемых данных с джойстика была всего лишь 5 Гц, чего просто не хватало для нормального управления. Поэтому джойстик был прикошачен к ПК по USB. К слову, на ПК тоже Ubuntu 16.04 и ROS Kinetic. Далее на роутере была создана Wi-Fi сеть, через которую по ssh были подключены оба компьютера (ПК и Raspberry Pi), на ПК был запущен мастер ROS, узел джойстика и обработчик команд джойстика. На Raspberry Pi был экспортирован адрес мастера ROS и запущен узел связи через последовательный порт с ардуиной, на которой, в свою очередь, были запущены узлы приема управляющих команд (Подробную инструкцию по запуску приложу к статье вместе с узлом обработчика команд джойстика). Вот так выглядит список узлов из программы rqt-graph:

Немного об управлении: левым джойстиком задается направление движения гексапода (вперед-назад, боком (еще не реализовано до конца)), правым джойстиком робот разворачивается на месте влево и вправо, кнопки L2 и R2 отвечают за изменение клиренса робота. Крестиком включается однократное исполнение «позы атакующего тарантула» (об этом далее). Итоговое видео работы робота (не вошло изменение клиренса и «поза атакующего тарантула»:

«Поза атакующего тарантула» — алгоритм, во время исполнения которого гексапод перемещает свой вес на заднюю часть корпуса и поднимает передние лапы а-ля атакующий тарантул:

Вообще-то изначально это писалось для освобождения передних конечностей и использования их в качестве манипулятора. Но это пока что в перспективах, быть может, будет продолжение статьи с доделанным агрегатом. Видео демонстрации «позы тарантула»:

Часть №5: Выводы и перспективы

Для себя хочу отметить, что процесс создания этого робота был для меня познавательным и захватывающим, но, безусловно, есть куда стремиться. Так, например, будет добавлена трансляция видео с робота на компьютер, захват передними лапами предметов, ходьба по ступенькам. Надеюсь, что моя статья будет полезна тем, кто решит создать нечто похожее.
И, напоследок, мой помощник – эксперт по членистоногим, инженер-бионик Лилу Мурзиковна (очень уж она любит жрать пауков, которые у нас в изобилии за шкафом водятся).

Источник

Собираем и заставляем бегать бюджетного гексапода

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

Опуская росказни о том, как именно я пришел к мысли построить гексапода (это были тонны видео на ютубе), перейду сразу к процессу выбора деталек. Это был январь 2012-го. Я сразу знал, чего я хочу от своего робота, а чего — нет. Я хотел:

    чтобы каждая нога имела 3 степени свободы — 3dof (3 dimensions of freedom), потому что более простой вариант 2dof — не дает такого ощущения насекомого, а 4dof — излишний, 3dof и так позволяет свободно перемещать кончик ноги в 3д пространстве;

6 ног. Снова-таки, это уже не 4 (тогда робот неуклюже скачет), но еще и не 8, как у пауков, что уже чрезмерно;

дешевый по себестоимости;

  • с минимумом плат и соединений.
  • Шаг 1. Первым делом, конечно, нужно было выбирать motherboard для крохи. Много как хорошего так и плохого успел почитать к тому времени об Arduino. Но именно на него и смотрел, как на основной вариант. Паять контроллеры самому — времени не было, а брать более продвинутые платы с ARM cpu, например — дорого, да и разбираться, как их программить, как работать с ШИМ выводами и т.п — долго. А ардуина: IDE запустил, код напедалил, upload нажал — и привет, оно тебе уже моргает. Красота! 😉

    Сначала я начал смотреть на arduino mega и клонов, т.к. кол-во ШИМ выходов, которыми можно рулить сервами у них было предостаточно. Напомню, что для 3dof гексапода нужно 3*6 = 18 сервов, и раздельных каналов управления ими. Но потом я нашел настоящий Яззь среди arduino mega, это плата от Dagu, звать которую Red Back Spider Controller. Вот она на ebay.

    Она предлагает все свои выходы в виде готовых 3-х штырьков (земля, питание, сигнал), и развязку по питанию. Питание самого контроллера стабилизировано, а на разъемы двиглов идет как есть (UPD: не как есть, а тоже стабилизированные 5 вольт. И по-видимому развязано с питанием контроллера, т.к. помех в работу контроллера 18 одновременно работающих сервов не вносят). Это позволяет просто подать на клемму питания 7-30 вольт достаточной мощности (питальника от eee pc 901 на 12В и 3А — оказалось достаточно для жужжания всеми 18 сервами) и не морочить голову с раздельным питанием логики и двиглов. Также это позволит в будущем легко посадить все это чудище на пачку Li-Po аккумуляторов на 7.4 вольт. И при всем этом, с программной точки зрения — это обычная ардуино мега, совместимая с софтом и либами, да и железом (кроме шилдов, устанавливающихся прямо на оригинальную mega — они не покатят). Правда цена еще выше чем даже оригинальная мега, но все остальные плюсы перевесили это.

    Шаг 2. Далее сервоприводы. На ebay по запросу micro servo их много разных. Я взял самые мощные из самых маленьких и дешевых, весом 9 грамм, пластмассовыми редукторами. Если брать лоты где их пачками шлют — выходит дешевле. Я брал 3 пачки по 6 кажется, и вышло меньше $2 штука. Забегая вперед, скажу, что жалею что не потратил больше и не взял сервы с металлическими шестернями и шариковыми подшипниками. У этих пластмассовых оказались довольно заметные люфты, и характерный хруст при чрезмерном усилии когда шестерни проскакивают. Из-за люфтов — кинематику довольно тяжело настроить точно (да это вообще самое тяжелое оказалось).

    Вот собственно и все что я заказал, с доставкой это вышло примерно $100. Батарейки и передатчики/приемники для контроля и радиоуправляемости — оставил на потом. Потому что радиоуправляемая машинка у меня есть и не интересна, а что меня действительно интересовало — это ноги! Видео плавно ходящих гексаподов на ютубе — завораживало, я смотрел его, пересматривал, и каждый раз слезы катились по щекам, и я сдавлено хрипел «хочу!». Хочу не заказать такую готовую штуку, а хочу сделать самому что-нибудь такое!

    Пока ждал заказа, читал, как же просвещенные люди оживляют свои творения. Конечно сразу же всплыла инверсная кинематика. Если сказать просто и сразу про шарнитные «конечности», то прямая кинематика — это когда на вход подаются углы шарниров, а на выходе мы имеем модель конечности в пространстве, и координаты крайней точки конечности. Обратная же кинематика — очевидно работает наоборот — на вход поступают координаты крайней точки конечности, куда нам надо дотянуться, а на выходе мы получаем углы, на которые нужно повернуть шарниры, чтобы это осуществить. Сервоприводы как раз получают на вход угловое положение, в которое им нужно повернуться (по одному сигнальному проводу, закодированное ШИМ / PWM).

    Шаг 3. Начал с того, о чем читал: продумывать реализацию ИК. Но быстро пришло ощущение, что для моего случая он чрезмерно сложен. Причем как громоздок в реализации, так и вычислительно очень сложен — расчет идет итеративно. А у меня 6 ног, для каждой из которых нужно считать ИК, и всего 16Мгц не самой шустрой архитектуры AVR. Но и всего 3 степени свободы. И несложно догадаться, что до произвольной точки в «области дотягивания» можно дотянуться только одним способом. Решение уже созрело в голове.

    Но тут пришел февраль и посылки — одна из Китая, другая из UK. Первым делом я конечно просто поигрался с платой ардуино — поморгал светодиодом и попиликал в подключеный туда динамик. Потом занялся реализацией собственно ИК, уже в железе. Для чего соорудил прототип ноги из подручных материалов (довольно мягкая пластмасска, которую легко резать ножницами, шурупы и насадки — все из комплектов сервоприводов). Эту ногу терминатора закрепил прямо на плату ардуины. Можно рассмотреть, как бюджетно выполнены сочленения.

    Полюбовался на это дело, и помечтал, что если я на основе этого робота в будущем спаяю терминатора, который объявит войну человечеству, то потом Джон Коннор со Шварцнеггером вернутся ко мне сюда в прошлое, и отберут этот прототип и расплавят его в Ородруине. Но никто не вернулся, ничего не отобрал, и я спокойно продолжил.

    Шаг 4. Оказалось, что ИК совсем не нужно бояться, в моем случае все свелось к банальной геометрии-тригонометрии. Чтобы проще было обращаться к суставам, обратился к википедии и почитал про насекомых. У них есть специальные названия для элементов конечности:

    На русском тоже есть свои и очень интересные названия для этого, но «тазик», «вертлуг», «голень» и т.п., находясь в коде, не давали бы мне заснуть. Потому я 3-х конечностям и соответствующим сервам оставил названия Coxa, Femur, Tibia. Из прототипа ноги выше видно, что у меня для coxa даже нет отдельной детали. Это просто два серва, скрепленных резинками. Femur — реализован полоской пластика, к которой с обоих сторон крепятся рычаги сервов. Таким образом, последний оставшийся серводвижок — является началом tibia, для удлинения которой к нему прикручен еще кусок пластика.

    Шаг 5. Запустил редактор, не мудствуя создал файл Leg.h, И в нем класс Leg. Ну и кучу вспомогательной мути. Пускай в пространстве есть точка A(ax, ay, az), к которой нужно дотянуться. Тогда вид сверху выглядит так:

    На рисунке я сразу показал и способ вычисления первого угла — это угол поворота серва, управляющего Coxa, вращающего всю конечность в горизонтальной плоскости. На схеме красным сразу обозначены переменные, используемые в коде (далеко не все). Не очень математично, зато удобно. Видно, что интересующий нас угол находится элементарно. Сначала primaryCoxaAngle — находится просто углом (0;A) к оси X (что эквивалентно углу точки A в полярных координатах). Но на схеме видно, что при этом сама нога — не распаложена под этим углом. Причина в том, что ось вращения coxa не находится на «линии ноги» — не знаю как это правильно сказать. Не находится в плоскости, в которой вращаются остальные 2 сустава и находится кончик ноги, вот. Это можно легко компенсировать, посчитав additionalCoxaAngle (как его считать — даже не утруждаюсь останавливаться, ну ведь все же были в школе, правда?).

    Итого, у нас есть первый кусочек кода, это внутренности метода reach(Point& dest):

    Здесь dest — это точка, куда нажо тянуться, _cStart — координаты точки крепления (и центра вращения) coxa, в hDist считаем расстояние от _cStart до dest в горизонтальной плоскости. DONT_MOVE — это просто флаг, означающий что coxa не нужно никуда вращать, а оставить в текущем положении (т.к. dest — где-то прямо на оси вращения coxa — редко, но бывает). Вот cAngle — это уже тот угол, на который нужно будет отклониться сервоприводу от его начального угла (который находится в середине его рабочего диапазона). Видно что также юзается _cStartAngle — это угол в пространстве, на который повернут серво по деволту, при монтаже. Про _thirdQuarterFix расскажу позже, если не забуду.

    Шаг 6. Дальше все становится еще проще. Нам просто нужно взглянуть на упомянутую выше плоскость «линии ноги»:

    При этом, задача внезапно сведется к поиску точки пересечения 2-х окружностей. Одна — в точке, откуда «растет» наша femur, вторая — точка, куда нам надо дотянуться (с уже локальным 2d координатами). Радиусы окружностей — длины femur и tibia соответственно. Если окружности пересекаются — то в одной из 2х точек можно расположить сустав. Мы всегда выбираем верхнюю, чтобы «колени» у чудища были выгнуты вверх, а не вниз. Если не пересекаются — то мы не дотянемся до целевой точки. Еще немного кода, переход в плоскость производится элементарно, только пара подводных камней еще учтена и задокументирована в коментарии, чтобы я не ломал голову потом, разбирая код. Для простоты, в этой локальной координатной «плоскости ноги» я выбрал началом координат точку, откуда растет femur:

    Шаг 7. Теперь localDestX и localDestY — это координаты целевой точки. Все что осталось — найти точку пересечения окружностей с центрами в (0,0) и (localDestX, localDestY), и радиусами _fLength и _tLength (соответственно длина femur и длина tibia). С этим тоже школьник справится, но тут я допускал довольно много ошибок, потому для проверки себя и вообще чтобы любой мог проверить, что это за стремные формулы, оставил ссылки на источники, где ясно и понятно разжована эта элементарная геометрическая задача:

    Все, осталось еще чуть-чуть — по полученным координатам вычислить собственно углы для femur и tibia сервов:

    Шаг 8. Опять элементарщина — угловые координаты и всё. Я надеюсь, именование переменных уже должно быть понятным, к примеру, _fStartAngle — это femur start angle, угол на который femur направлен по дефолту. И последняя строчка метода reach() (он сказал поехали, и махнул рукой):

    Метод move уже непосредственно отдает команды сервам. На самом деле, в нем еще потом пришлось добавить всякие штуки для защиты от нехороших углов (на которые серво повернуться не может, но будет пытаться), а также для других ног, которые заркально расположены и/или направлены в другие стороны. Но пока же мы работаем с одной только лапой.

    Шаг 9. Эти куски — это уже финальный код, который далек от совершенства, и наверняка его можно значительно улучшить. Но он работает! Ни разу не выйдя за школьный курс геометрии-тригонометрии, мы реализовали полнофункционалную инверсную кинематику для 3dof ноги! Да еще и получаем решение сразу, за одну итерацию. Чтобы это все работало, ногу нужно было тщательно измерить, и сконфигурировать класс полученными данными. в том числе угловыми, которые сложнее всего измерять на готовом изделии. Может если проектировать в автокаде и наделать красивых рендеров — было бы легче с измерением углов, но у меня не было ни времени, ни желания заниматься этим пафосом.

    Февраль только начался, а видео с ногой было уже готово. Для проверки ИК, я заставлял ногу описывать всякие фигуры в пространстве (для этого нужно было последовательно вызывать reach, обходя точки на прямоугольнике, или окружности, код скучен и уныл, потому не привожу (а закончив эксперименты с обведением примитивов, я его вообще выпилил)):

    Шаг 10. Дальше нужно было заканчивать играться с этой поделкой, на одной ноге далеко не упрыгаешь (хотя такой робот вышел бы действительно интересным). Но мне нужен гексапод. Отправился на ближайшую барахолку искать оргстекло. Нашел 2 отличных куска — один 3 мм толщиной (как раз для туловища, подумал я), другой 2 мм и синий (отличные конечности, в тон сервоприводам). Еще через пару недель я выкроил вечер, чтобы что-нибудь сделать из этого. Сделал наброски на бумаге. примерил — вроде все ок, дальше дело за ножовкой.

    Источник

    Читайте также:  Цветок клевер своими руками
    Оцените статью