Перемістити Черепаху (TurtleSim)
Проект Увімкнено GitLab & GitHub
Анотація
Move Turtle є простим скриптом ROS на Python, який переміщує черепаху в TurtleSim ROS до вказаних координат (точок). Цей проект розпочався як класний проект для CSCI473 у Colorado School of Mines (CSOM) і згодом перетворився на проект, який я використав, щоб навчитися створювати замкнуті системи, знання з яких я застосував у своїй роботі в лабораторії Human Center Robotics (HCR) CSOM.
Контекст
Для деякого контексту, ROS означає Robot Operating Systems. ROS — це відкритий програмний комплекс для робототехніки, зазвичай використовується разом з операційною системою Ubuntu, який допомагає краще керувати програмними компонентами/кластерами робототехнічної системи. Ви можете дізнатися більше про використання ROS у офіційній wiki. Код, який ви пишете в ROS, написаний або на C++, або на Python.
TurtleSim — це простий 2‑D симулятор робота, який використовується як вступ до ROS та ROS‑пакетів для нових користувачів ROS. TurtleSim просто відкриває простий 2‑D дисплей з черепахою. Ця черепаха діє як «робот», і ви можете надсилати повідомлення цьому «роботу», щоб переміщати його та/або обертати. При цьому TurtleSim генерує деяку випадкову помилку, щоб у простий спосіб імітувати фізику реального світу.
Знаючи, що таке ROS і TurtleSim, чому я їх використовую? У весняному семестрі 2020 року я проходив курс «Human Centered Robotics» у Colorado School of Mines у рамках мого бакалаврського навантаження з інформатики. Курс викладав доктор Хао Чжан. Курс складався з трьох проєктів, і перший проєкт передбачав налаштування ROS, вивчення його використання та реалізацію алгоритму (відкритого або замкнутого циклу), який змусив би черепаху в TurtleSim намалювати букву M. Опис оригінального проєкту можна переглянути ТУТ.
Під час проходження курсу я реалізував цей проєкт, використовуючи алгоритм відкритого циклу. Це рішення працювало, але було дуже поганим і намалювало букву A, яка була «досить хорошою», проте далеко не «відмінною». Після подачі проєкту приблизно в середині лютого 2020 року я забув про нього до наступного року, коли знову зайнявся ним у лютому 2021 року.
Виклик
У лютому 2021 року мене прийняли на посаду дослідницького асистента в лабораторії Human Centered Robotics (HCR) у Colorado School of Mines, де я працював під керівництвом доктора Хао Чжана. Мета лабораторії — дослідження «довготривалої колаборативної автономії з метою дозволити роботам працювати та адаптуватися протягом тривалих періодів часу». Станом на 1 вересня 2022 року лабораторія переїхала з Colorado School of Mines до University of Massachusetts Amherst. Однак, коли я там працював, вона ще знаходилася в Колорадо.
У лабораторії HCR мені було доручено роботу над проєктом Triton. Проєкт Triton складався з багатьох, десятків, роботів під назвою Triton. Triton‑и були трикутними наземними роботами з omni wheel, які виглядали так:
Разом з Triton‑ами було розташовано вісім IR‑камер від OptiTrack у «октагональному порядку» на кілька футів над землею. Використовуючи ці камери, програмне забезпечення OptiTrack — Motive, ПК з Windows 10 та ROS, створювався простір розміром 2 м × 2 м × 2 м (x, y, z), у якому можна було визначити точне реальне положення об’єктів з motion capture markers.
Моє перше завдання в проєкті Triton полягало у створенні скриптів, які змушували робот Triton переміщатися до конкретної реальної позиції. На той момент я не був впевнений, як це досягти, проте згадав перший проєкт CSCI473, у якому мені було представлено ідею замкнутої системи, і почав активно досліджувати замкнуті та, відповідно, зворотні системи.
Дослідження
Під час досліджень я натрапив на чудове відео від AerospaceControlsLab:
У цьому відео мені було продемонстровано та пояснено ідею PID‑системи. PID‑система — це замкнутий, контрольний контур, який генерує певні вихідні сигнали на основі даних з реального світу. У простих термінах це зворотна система, яка коригує свій вихід, спираючись на різницю між бажаним значенням і виміряним. Формула PID‑контролера:
$$ u(t) = K_p e(t) + K_i \int e(t) dt + K_d \frac{de(t)}{dt} $$
- $u(t)$ — це сигнал керування.
- $K_p$, $K_i$, $K_d$ — це відповідно пропорційні, інтегральні та диференціальні підсилення.
- $e(t)$ — це сигнал помилки (різниця між бажаним і фактичним виходом).
- $\int e(t) dt$ — це інтеграл помилки за часом.
- $\frac{de(t)}{dt}$ — це похідна помилки.
Щоб дізнатися більше, перегляньте відео AerospaceControlsLab або цю чудову статтю у Wikipedia, звідки взята формула.
Після досліджень і отримання допомоги від розумних друзів та професорів я вирішив, що найкращим варіантом буде використання пропорційного контролера (P‑контролера) для досягнення потрібної координати Triton‑а.
Оскільки Triton — наземний робот, мене цікавлять лише координати X та Y. Знаючи це, я мав визначити, які бажані та виміряні значення слід вимірювати і обробляти у P‑контролері. У своїх дослідженнях я знайшов чудову статтю у ROS‑wiki під назвою Go to Goal, де розглядаються такі помилки:
- Помилка відстані: різниця у відстані між бажаною позицією (X, Y) та поточною позицією (X, Y).
- Помилка кута: різниця між бажаною орієнтацією та поточною орієнтацією.
Запропоноване рішення
Знаючи все це, рішенням для переміщення Triton‑а до конкретної реальної координати є використання пропорційного контролера для помилки відстані та помилки кута щодо цільової координати та поточної координати робота. Проте перед впровадженням у фізичну систему я хотів протестувати ідею у симуляції, і на той момент вважав, що використання TurtleSim як симулятора — найкращий вибір.
Тестування у симуляції
Маючи теоретичне рішення, я спочатку вирішив перевірити його у симуляції, а не у реальному світі. Реальний світ часто заповнений шумом, який може спотворити ефективність рішення та змусити займатися нерелевантними проблемами. Усвідомивши це, я повернувся до свого проєкту CSCI473 і адаптував його як тестову площадку для теоретичного рішення.
Після оновлення старого коду з ROS Melodic до ROS Noetic та кількох ітерацій удосконалення, я отримав робоче рішення у TurtleSim. Демонстрації його функціональності з різними шляхами цільових координат можна знайти в кінці цього блогу. Весь код доступний за посиланням ТУТ.
Висновок
Підсумовуючи, завдяки цьому проєкту черепаха у TurtleSim ефективно переміщується до заданих координат за допомогою замкнутої системи, значно перевершуючи мою початкову систему відкритого циклу 2020 р. Після успішного тестування я впровадив це рішення у роботах Triton. Однак шум реального світу спричинив непередбачені проблеми, які вимагали тижнів налагодження та тестування у реальному середовищі. Після цих тижнів я нарешті змусив Triton досягти конкретних реальних координат, використовуючи саме те рішення, яке тестував у TurtleSim. Ось демонстрація переміщення Triton до конкретних реальних координат за методом, протестованим у TurtleSim:
З огляду назад, я шкодую, що не використав симулятор, який краще імітує фізику реального світу. TurtleSim чудовий для навчання, але не підходить для тестування реальних робототехнічних ідей. У той час я вважав, що його достатньо для мого простого випадку, проте згодом це довелося спростувати.
Головна мета цього блогу — описати створення замкнутої системи, що дозволяє черепасі у TurtleSim, а згодом і роботам Triton, точно орієнтуватися у заданих цільових позиціях (X, Y). Я вважаю, що цю мету досягнуто, і це, можливо, викликало інтерес до моєї роботи в лабораторії HCR. Знаючи це, я планую писати більше блог‑постів про свій досвід роботи в HCR Lab…
Демо Переміщення Черепахи (TurtleSim)
Це відео містить наступні демонстрації:
- Cayley Nodal: Простий дизайн Cayley Nodal
- Circles: Дизайн у вигляді павутини
- Inner Circles: Дизайн “кола всередині кіл”
- M: Дуже простий дизайн букви M