Зачем?
Давно хотел разобраться с симулятором роботов. И вот наконец появилось немного времени.
Для чего нужен симулятор роботов:
- разрабатывать и проверять новый функционал без риска испортить "железо", например, сжечь сервомотор довольно лекго
- иметь возможность разрабатывать, находясь вдалеке от реального "железа" - в дороге, в поездках и где угодно
- создавать прототипы роботов и проверять их еще до начала процесса сборки и даже до заказа первых запчастей
- "поиграться" с дорогостоящими моделями роботов
Выбор симулятора
Робототехнических симуляторов довольно много, сравнительный список можно посмотреть в wikipedia.
Критерии выбора:
- поддержка C++
- дешевый/бесплатный
- кроссплатформенный
- хорошая документация
- в нем должен запускаться код для Arduino без сильных переделок
Всем этим критериям отлично соответствует Cyberbotics Webots, я его попробовал, и он мне понравился. Отличная документация, туториал прочитывается за 1-2 дня и после этого вы уже можете разрабатывать что-то свое с нуля.
В примерах есть симуляция робота Hexapod Mantis, что меня очень порадовало:
Чтобы начать - прочитать и выполнить все туториалы, параллельно почитывая остальную часть документации. После этого взять код какого-то готового робота из примеров и расковырять его.
Чего добился на данный момент и что в планах
Во-первых, была сделала 3d-модель hexapod-а. Мелочи и рюшечки не делал не стал, для прототипа это не нужно, а вот размеры всех частей сделал с большой точностью.

Создал прототип 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
- плотнее разобраться с физикой симулятора: настроить правильный вес и свойства материалов моделей