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, а також звернути увагу, які інструменти використовувалися для створення робота, не вдаючись у подробиці. На початковому етапі було найбільш складним розібратися з чого ж почати і якими засобами при цьому користуватися. Сподіваюся, стаття допоможе зорієнтуватися у виборі шляху розробки.

PS Ісходникі проекту на github

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.