Lego для дорослих, або Як запрограмувати робота

Усім привіт! Я Вероніка Демедецька, Tech Expert & Senior Software Engineer у компанії AMC Bridge, кандидат технічних наук. Працюю в ІТ 11 років і маю досвід роботи із 3D-графікою, CAD-розробкою та робототехнікою. У цій статті я покроково і з власного досвіду розповім, як розробити симулятор промислових роботів. Тому, якщо ви працюєте або хотіли б працювати у цій галузі, моя стаття стане у пригоді.

Що таке промислові роботи? Скажу одразу: це не термінатори. Якщо порівняти з термінатором — це нудні роботи. Втім їхня ціль — замінити людину там, де вимагається висока точність операцій, монотонність і надвисока фізична витривалість.

Вперше я ознайомилася з роботами після того, як на день народження мені подарували робота Lego (набір Lego Mindstorms, де можна зібрати одну з кількох конфігурацій робота, а також є ПЗ для його базового програмування). Це була перша спроба зібрати та розробити програму для робота. Не скажу, що мені вдалося навчити його чогось корисного. Але з функцією лякати мого собаку робот справлявся на 100%.

Уже працюючи в ІТ, я потрапила у проєкт, де потрібно було створити симулятор промислових роботів для одного з виробників. Тоді я почала глибоко вивчати цю тему. Тепер можу сказати точно: якщо ваша мета — створити щось суттєве, доведеться ознайомитися з цілим міксом галузей: механікою, високо- та низькорівневим програмуванням, фізикою, електронікою, алгоритмами, роботою з Big Data тощо. Саме тому я і люблю робототехніку: це завжди стик технологій та нескінченна можливість для розвитку та вивчення нових напрямів.

Ілюстрація створена за допомогою Awesomic

Роботи-симулятори: що це й навіщо

На початку робототехніки тестували роботів з використанням реальних фізичних машин. Але, звісно, коли робот у базовій комплектації коштує від $50К, то будь-яка помилка матиме високу ціну.

Із розвитком технологій стало зрозуміло, що більшість завдань, котрі виконують роботи, можна моделювати за допомогою віртуальних пристроїв. І вже перші експерименти моделювання не цілого процесу, а лише його окремих складових, показали істотне зменшення витраченого часу, грошей та ризиків, якщо порівнювати з роботою із реальними роботами.

Отже, робот-симулятор — це програмне забезпечення, що дає можливість створювати програми для роботів і тестувати їхнє виконання без реальних фізичних машин.

Тепер до технічної частини. Нижче, на прикладі одного з проєктів, над яким я працювала з командою AMC Bridge, я покроково розповім, як розробити симулятор робота. На жаль, NDA не дозволяє додати до цієї статті відео проєкту, тому буду посилатися на аналоги та сподіваюся на вашу уяву.

Крок 1. Моделюємо робота. Геометричні та фізичні складники

Першим кроком у створенні повноцінної системи симуляції є опис усіх елементів, які є на віртуальній сцені: роботів, периферійних пристроїв та будь-яких інших об’єктів.

Спершу розглянемо модель, яку використовують для представлення робота в симуляторі. Нижче ви бачите одну з найбільш поширених конфігурацій — роботизовану руку у вигляді кінематичного ланцюга. Цей ланцюг складається з ланок (links). Їхня кількість не обмежена і може коливатися від однієї до n-кількості.

За ланку беремо модель твердого тіла зі шістьма ступенями свободи. Між собою ланки сполучаються з’єднаннями (joints), які можна поділити на три види: фіксовані, лінійні та шарнірно-поворотні. На кінці роботизованого ланцюга розташований маніпулятор (end effector). Він може мати різні конфігурації, і з ним нерозривно пов’язане ще одне важливе поняття — TCP (Tool Center Point). Це, по суті, початок локальної системи координат маніпулятора, яка повідомляє про його розташування у просторі.

Загалом маніпулятори поділяються на дві групи:

  • Grippers — маніпулятори для захоплення та перенесення об’єктів (pick and place operations).
  • Tools — маніпулятори для виконання певного процесу. Наприклад, зварювання, фарбування, свердління тощо.

Тепер потрібно обрати формат, що дасть можливість описати і робота, і всі пристрої та об’єкти на сцені. Окрім цього, він повинен підтримувати ієрархічну структуру (щоб можна було вказати ієрархію ланок ланцюга та види з’єднань між ланками).

Є багато готових форматів, які використовують у симуляторі. Також можна розробити власний. Втім одним із найпопулярніших є простий формат URDF (Universal Robot Description Format), що застосовують у ROS та, по суті, є звичайною XML-розміткою. Він є універсальною специфікацією, створеною для опису повноцінних сцен і роботів.

Отже, для опису ланок та з’єднання ланцюга потрібно задати такі параметри.

Для ланок:

  • маса (mass);
  • початок системи координат (origin);
  • інерція (inertia);
  • геометрія (geometry);
  • матеріал (material: color and texture).

Для опису з’єднань:

  • тип з’єднання та обмеження (limits and type: slide/fixed/rotate);
  • ієрархія: батьківська (parent) та дочірня (child) ланки;
  • початок системи координат (origin);
  • вісь обертання (axis).

Додатково потрібно задати параметри, котрі характеризуватимуть динаміку руху робота. Тобто для кожної ланки варто задати:

  • тертя (friction);
  • демпфірування (damping);
  • обмеження швидкості (velocity limits);
  • інші параметри.

Геометрія ланок (links), периферичних пристроїв тощо зазвичай подають у вигляді меж, або breps. І вибір геометричного представлення буде залежати від обраного в’юверу, який вбудуємо в програму для симуляції роботів.

Viewer

Для візуалізації оберемо одну з рендер-бібліотек (render engine), наприклад:

  • OpenGL;
  • Blender Game Engine;
  • HOOPS Visualize;
  • або будь-яке самописне рішення.

Крок 2. Навчаємо робота рухатися

Отже, ми вже можемо описати сцену і самого робота, а також візуалізувати сцену. Але на цьому етапі це лише статична картинка. Натомість для симуляції потрібна динаміка.

Для цього розглянемо таке поняття, як робот-контролер (robot controller). Робот-контролер — це, по суті, мозок робота: програмне забезпечення, котре контролює та координує усі його дії та рухи. Серед його головних складників:

  • робот-програма (robot program);
  • маніпулятор для навчання робота (teaching pendant).

Зазвичай робот-програма — це сукупність адрес, за якими збережені позиції робота. В ній можна опційно вказувати інструкції для маніпулятора. Окрім цього, робот-програма зберігає в собі послідовність дій — адрес, що необхідні для виконання завдання. Робот-контролер може читати цю програму та надсилати відповідні команди та сигнали роботу.

Другим важливим поняттям є навчання (teaching) — це приведення робота та маніпулятора у потрібні позиції та збереження цих позицій за вказаною адресою у робот-програмі. У реальному світі для цього використовують спеціальний пристрій — teaching pendant. Завдяки маніпулятору є змога самостійно виставити потрібне положення робота та зберегти його в робот-програмі.

Цікавий факт, що такі засоби обладнані трипозиційними кнопками (тобто керувати роботом можна лише у проміжному положенні кнопки). Коли кнопка повністю затиснена або відтиснена, робот не рухатиметься. Це зроблено для того, щоб уникнути людської помилки та переконатися, що оператор повністю контролює процес.

Мануальний teaching

У процесі навчання ми використовуємо два поняття: позиція робота та маніпулятора і процедура (інструкція для маніпулятора).

Наприклад, під час виконання стандартного завдання з переміщення об’єкта з точки А в точку В нам потрібно задати 7 адрес:

  1. P1 (basic) — базова позиція або позиція очікування.
  2. Р2 (approaching) — позиція наближення до точки, в якій робот повинен захопити об’єкт.
  3. P3 (grasping) — точка, в якій він захоплює його.
  4. P4 (escaping) — позиція, в яку робот відійде після захоплення.
  5. P5 (approaching 2) — позиція наближення до точки, де відпустить об’єкт.
  6. P6 (releasing) — точка, де робот відпускає об’єкт.
  7. P7 (escaping 2) — позиція відходу після вивільнення об’єкта.

Джерело

Щоб задати роботу потрібне положення, робот-контролер спочатку повинен його розрахувати. Ці розрахунки базуються на двох поняттях: прямої та інверсної кінематики (forward and inverse kinematics).

Завдання прямої кінематики — визначити положення маніпулятора за відомим нам положенням елементів ланцюга робота. Нижче ви бачите приклад простого завдання на площині, де потрібно знайти змінні x, y та ɸ, що характеризують положення маніпулятора. При цьому нам відомі довжини ланок L1, L2 та L3 та кути їхнього повороту. Це тривіальне завдання, і ми з легкістю знайдемо x, y та ɸ. Водночас із завданням у просторі все складніше. Щоб визначити положення маніпулятора, потрібно послідовно застосувати матриці трансформацій для кожної з ланок.

Частіше в робототехніці трапляються завдання інверсної кінематики. Вона має протилежні функції, а саме знаходить за відомим положенням маніпулятора положення ланок ланцюга робота. Це зручніше, адже у робот-програмі ми зберігаємо лише координати положення маніпулятора. Таким чином, щоб задати роботу потрібне положення, потрібно для кожної адреси розв’язати завдання інверсної кінематики та зрозуміти, які переміщення потрібно здійснити.

Щоб розібратися, як працює інверсна кінематика, пропоную розглянути просте завдання на площині для дволанцюгового робота, в якому потрібно визначити невідомі кути повороту Т01 та Т02. Застосувавши теорему косинусів і знайшовши внутрішні кути в цьому умовному трикутнику, ми без проблем знайдемо Т01 та Т02. Переважно для просторових завдань аналітичне рішення буде складно знайти, тож доведеться застосовувати численні ітеративні методи для знаходження положень ланок ланцюга.

Чому інверсна кінематика є такою популярною? Тому що тут зберігаються не положення кожного елемента, а лише положення маніпулятора.

Тепер, коли ми вміємо описувати сцену, візуалізувати її, а також навчати робота, зверніть увагу на сам процес навчання, коли за допомогою звичайних маніпулятивних механізмів (handlers) ми виставляємо потрібне положення маніпулятора та зберігаємо його в робот-програмі за необхідною адресою. Згодом, уже під час симуляції, ми зможемо вказувати збережені адреси та відтворювати ті положення робота, котрі були збережені раніше.

Multipoint teaching

Отже, ми вміємо задавати точки, у які має прийти робот, зберігати це у робот-програмі та розраховувати за ними положення робота. Наступним важливим завданням є визначення та знаходження шляху між цими точками. Знайти шлях (motion planning) — одне із найскладніших завдань у робототехніці. В результаті ми повинні знайти такий шлях, який враховував би типи з’єднань між ланками ланцюга робота. Шлях має бути без колізій, тобто робот не має стикатися з іншими об’єктами. Для цього потрібно застосовувати алгоритми collision detection. А ще для знайденого шляху в робототехніці необхідна оптимізація, зазвичай за одним із трьох параметрів:

  • за відстанню;
  • за часом;
  • за кількістю витраченої енергії.

Окрім цього, під час пошуку такого шляху варто уникати сингулярності (в робототехніці це такі положення маніпулятора, при яких ми втрачаємо один або декілька ступенів свободи).

Бібліотеки для Path Planning

Наступний етап — Motion Planning. Це нетривіальне завдання, котре зазвичай вирішують за допомогою інтеграції однієї з бібліотек, що містить Motion Planning алгоритми. Найбільш популярні станом на сьогодні: Robotics Library, OMPL (Open Motion Planning Library) та MoveIt. Часто вони мають вбудований механізм виявлення зіткнень (collision detection).

Крок 3. Враховуємо фізичні характеристики об’єктів

Отже, ми вміємо описувати сцену, візуалізувати її, навчати робота та планувати його рухи. Але цього недостатньо: далі потрібно врахувати фізику процесу. Тому що головне завдання симуляції — отримати реалістичний опис того, що відбувається, і максимально наблизитися до реального світу. Тож маємо врахувати фізичні характеристики робота, пристроїв та усіх інших елементів віртуальної сцени. Це потрібно для оцінення впливу маси, тертя, гравітації руху та для отримання реалістичних результатів. Отже, мінімальний набір параметрів, який маємо врахувати:

  • гравітація;
  • колізії;
  • динаміка твердого тіла.

Такі розрахунки, звісно, можна реалізувати і самостійно (якщо є бажання, час і теоретична база). Але для більш універсального рішення потрібна інтеграція повноцінного фізичного ядра (бібліотек).

Бібліотека для підтримки фізичної симуляції:

  • ODE (Open Dynamics Engine) — використовують у S.T.A.L.K.E.R., Titan Quest, World of Goo, X-Moto.
  • Bullet (Cars 2, Hot Wheels, Sherlock Holmes, Bolt, How to Train Your Dragon).
  • PhysX (такі ігрові рушії, як Unreal Engine, Unity, Gamebryo, Vision тощо).
  • Vortex (комерційні, військові та академічні проєкти).
  • Newton (Amnesia, Penumbra, SOMA).

Наприклад, нижче зображена симуляція в робот-симуляторі V-REP за допомогою фізичного ядра Bullet. V-REP має інтеграцію як Bullet, так і ODE. І можна обирати, за допомогою якого фізичного ядра симулювати за тих чи інших обставин.

Після інтеграції фізичного ядра процес, що ми симулюємо, буде максимально схожий на реальний світ, а саме в цьому і полягає головна місія робот-симуляції.

Навіщо це потрібно

Можливо, у вас виникло запитання: для чого створювати все з нуля, якщо вже є напрацьовані системи симуляції, котрі добре працюють? Чесно кажучи, це було моє перше питання після ознайомлення з технічною документацією проєкту. І ось відповідь: у світі, за скромними підрахунками, функціонує 3–3,5 млн промислових роботів. І ця кількість швидко зростає. Втім далеко не всі виробники роботів мають свої системи симуляцій (хоч це і парадоксально). Водночас наявні системи далеко не завжди задовільняють усі вимоги клієнтів: через різні умови їм потрібна кастомізація.
Тому, доки роботи не зможуть існувати без програмного забезпечення, буде потреба створювати з нуля.

АI та Robot Teaching

Очевидно, для багатьох складників робот-симуляції можна застосувати концепцію Machine Learning. Один із таких напрямів — Motion Planning (планування траєкторії руху робота). Якщо ми натренуємо наш алгоритм на історичних даних (попередніх траєкторіях, що ми згенерували), то прискоримо процес розрахунку та оптимізації нових траєкторій, які відкидатимуть зіткнення і враховуватимуть усі потрібні обмеження. Також Machine Learning використовують для алгоритмів самонавчання робота.

Крок 4. Навчаємо робота рухати предмети

3D vision, віртуальна камера та object recognition

Наше наступне завдання — переміщення об’єктів (pick and place operation). Його ми розглянемо на конкретному прикладі (увага на маленьку коробочку зверху). Це і є 3D vision система, що є «очима робота»: сканує частину простору та отримує зображення, за яким відбувається object recognition, в результаті чого генерується інструкція роботу про те, який об’єкт і в якій точці потрібно захопити.

Щоб симулювати таку поведінку у віртуальному світі, потрібно реалізувати об’єкт віртуальної камери: задати всі необхідні параметри (field of view, clippings, origin, resolution), тобто виставити точку, з якої дивитимемося на нашу сцену, і визначити, що потрапляє у поле видимості.

Ще потрібно запустити систему сповіщень між об’єктом нашої камери та робот-контролером. Після цього згенеруємо зображення, що матиме глибину (для цього робимо raycast, тобто кидаємо промені зі встановленої нами віртуальної камери). В результаті отримуємо хмару точок (point cloud), в якій треба розпізнати об’єкти, що пересуває робот. Після цього згенеруємо інструкції (визначити положення робота). Часто це потрібно робити ще й у реальному часі, що накладає додаткові вимоги на роботу алгоритмів.

AI та 3D vision

Machine Learning можна застосовувати і в завданнях розпізнавання об’єктів — 3D vision системи. Маючи історичні дані та розпізнані об’єкти, ми тренуємо алгоритм швидше і якісніше їх розпізнавати. Також Machine Learning використовують у завданнях із класифікації об’єктів.

Крок 5. Симулюємо периферійні пристрої

Логічно, що для симуляції повноцінної роботи (наприклад, виробничої лінії на заводі) потрібна не лише симуляція робота, а й навколишніх приладів. Розглянемо це на прикладі одного з найбільш поширених кейсів — лінії конвеєра. Здавалося б, це проста логіка, що не потребуватиме багато зусиль. Але це не так.

Звісно, якщо наша мета — лише симуляція заради симуляції, ми можемо зробити такий собі вічний двигун — конвеєр, що буде рухатися безперервно з постійно заданою швидкістю. Але в реальному житті все складніше, і наш конвеєр обладнаний великою кількістю сенсорів, пускачів і контролерів. Інпут від сенсорів надходить у блок управління (PLC), який керує приводами. Отже, якщо ми хочемо симулювати роботу саме такої системи, то треба зрозуміти, як взаємодіяти з реальним PLC конвеєра.

Почнемо з того, що як і контролер робота, PLC виконує конкретну програму, яку потрібно вивчити, щоб симулятор міг коректно взаємодіяти з PLC. Існує п’ять мов, які є частиною стандарту IEC (Міжнародна електротехнічна комісія) розділу 61131-3. Цей стандарт дає можливість виконувати основні правила, які стандартизують PLC та їхні мови. Отже, для створення програм використовують одну з нижчезазначених мов:

  1. Ladder Diagram (LD)
  2. Sequential Function Charts (SFC)
  3. Function Block Diagram (FBD)
  4. Structured Text (ST)
  5. Instruction List (IL)

Перші три є графічними мовами, дві останні — скриптові. Одна з найпростіших — Ladder logic (або Ladder diagram) — була побудована з логіки для реле (що використовувала фізичні пристрої, такі як комутатори) та механічних реле (для управління процесами). Ladder logic використовує внутрішню логіку для заміни всіх пристроїв, крім фізичних, яким для активації потрібен електричний сигнал.

Проста програма для вмикання і вимикання світла матиме перемикачі on/off:

Кожен input, відповідно як і output, пов’язаний з бітом у пам’яті, що зберігає сигнал.

Сама програма тоді може мати такий вигляд:

Тепер, щойно натиснути перемикач, контакт NO I0.0 перетворюється на NC і запускається відповідна логіка. У результаті вихідна котушка Q0.0 підводиться до напруги, і лампа вмикається. Якщо ж ми хочемо вимкнути лампочку, перемикач знову натискається, і I0.0 стає NO-контактом, що, своєю чергою, вимикає лампу.

Гаразд, але як прив’язати це до нашого симулятора? Для цього знадобиться сам PLC, що запускає програму, або ж його віртуальна копія. Ми взяли OpenPLC-імплементацію, що дає змогу запускати програми та отримувати сигнали від PLC у симуляторі через протокол Modbus, що є одним із найбільш вживаних поряд с TCP.

Висновки

Звісно, це дуже поверховий опис, основна мета якого — ознайомити вас із головними компонентами програм для симуляції роботів. Повна ж розробка концепту потребуватиме багато часу та широкого спектра навичок від розробника. Та й навряд чи це те, чим ви захочете/зможете займатися наодинці. Розробляючи софт для симуляції, ви найімовірніше працюватимете над конкретною вузькою логікою, що потребуватиме ґрунтовного поглиблення в предметну галузь. Проте завжди треба мати глобальне бачення продукту та розуміння того, як кожна окрема частина (модуль) стикуватиметься з іншою, та, зрештою, навіщо це.

Якщо тема буде для вас цікавою, наступного разу приділю увагу конкретному модулю. Наприклад, симуляції роботи девайсів на базі OpenPLC. Тоді розглянемо цей напрям докладно та на прикладах.

Дякую!

Підписуйтеся на Telegram-канал редакції DOU, щоб не пропустити найважливіші статті.

👍НравитсяПонравилось20
В избранноеВ избранном11
Подписаться на автора
LinkedIn



Підписуйтесь: Soundcloud | Google Podcast | YouTube


3 комментария

Подписаться на комментарииОтписаться от комментариев Комментарии могут оставлять только пользователи с подтвержденными аккаунтами.

Дуже подобається, коли автор розбирається в темі і пропонує ком’юніті не загальновідому інфу з переливанням пустого в порожнє, а дійсно розповідає про цікаві й актуальні теми. дякую

Вероника, благодарю за статью.

Подписаться на комментарии