Arduino

технологии

Hexapod CR-6: симуляция в Cyberbotics Webots

Зачем?

Давно хотел разобраться с симулятором роботов. И вот наконец появилось немного времени.

Для чего нужен симулятор роботов:

  • разрабатывать и проверять новый функционал без риска испортить "железо", например, сжечь сервомотор довольно лекго
  • иметь возможность разрабатывать, находясь вдалеке от реального "железа" - в дороге, в поездках и где угодно
  • создавать прототипы роботов и проверять их еще до начала процесса сборки и даже до заказа первых запчастей
  • "поиграться" с дорогостоящими моделями роботов

Выбор симулятора

Робототехнических симуляторов довольно много, сравнительный список можно посмотреть в wikipedia.

Критерии выбора:

  • поддержка C++
  • дешевый/бесплатный
  • кроссплатформенный
  • хорошая документация
  • в нем должен запускаться код для Arduino без сильных переделок

Всем этим критериям отлично соответствует Cyberbotics Webots, я его попробовал, и он мне понравился. Отличная документация, туториал прочитывается за 1-2 дня и после этого вы уже можете разрабатывать что-то свое с нуля.

В примерах есть симуляция робота Hexapod Mantis, что меня очень порадовало:

Чтобы начать - прочитать и выполнить все туториалы, параллельно почитывая остальную часть документации. После этого взять код какого-то готового робота из примеров и расковырять его.

Чего добился на данный момент и что в планах

Во-первых, была сделала 3d-модель hexapod-а. Мелочи и рюшечки не делал не стал, для прототипа это не нужно, а вот размеры всех частей сделал с большой точностью.

Hexapod CR-6 3D-model

Создал прототип Hexapod CR-6 в Webots с использованием этой 3d-модели. Для импорта 3d-модели в использовал плагин от разработчиков симулятора blender-webots-exporter. Для него нужно скачать более старую версию Blender, но найти ее не сложно - ссылки есть на официальном сайте.

Далее - вопрос кода. В первую очередь написал "провайдер", который адаптирует команды для сервомоторов реального робота к командам для сервомоторов прототипа в симуляторе. После этого адаптировал код под Arduino для его компиляции под x86. В основном нужно было добавить конструкции:

#ifdef ARDUINO_PLATFORM
  #include <Arduino.h>
  #include <Streaming.h>
  #include "hardware/LobotServoController.h"
#else
  #include <iostream>
  #define Serial std::cout
  #define endl std::endl
  #define String std::string
  #include "webots/LobotServoControllerFake.h"
  #define Serial1 0
  #define LobotServoController LobotServoControllerFake
#endif

Тут мы подменяем класс String для Arduino на std::string (знал бы заранее - использовал бы только его), еще некоторый мелочи, а также подменяем работу с реальным контроллером сервомоторов LobotServoController на работу с прототипом, реализованную в LobotServoControllerFake.

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

Ну и в планах:

  • доработать также интеграцию симулятора с самодельным пультом управления роботом - это даст возможность полного цикла разработки вдали от дома
  • сейчас я строю гуманоидного робота, писать код буду заранее с поддержкой webots
  • плотнее разобраться с физикой симулятора: настроить правильный вес и свойства материалов моделей
13 марта 2020