Проекты · галерея роботов · робот-человек · робот-собака

Физика сцен с роботами

Робот в окне «Робот» — не анимация. Это трёхмерная модель с массами, шарнирами и трением, и считает её физический движок. Скетч не задаёт позу робота: он, как настоящая плата, шлёт импульсы приводам и читает датчики. Встанет робот, пойдёт или упадёт — решает физика.

Движок

Rapier 3D (@dimforge/rapier3d-deterministic-compat 0.21) — физический движок с открытым кодом, собранный в WebAssembly. Взята сборка deterministic: одни и те же входные данные дают одинаковый результат до последнего бита на любом компьютере и в любом браузере. Файл весит около 4 МБ и загружается только на страницах, где в схеме есть робот.

Один и тот же код считает робота в трёх местах: в браузере (в фоновом потоке, рядом с эмулятором платы), в node (тесты) и на сервере (проверка уроков). Поэтому урок, пройденный в браузере, засчитывает и сервер.

Время: плата и физика идут в ногу

эмулятор платы                         физика (Rapier)
──────────────                         ────────────────
прошивка исполняется 2 мс  ──импульсы приводов, каналы PCA9685──►  один шаг мира 2 мс
                           ◄──MPU6050, касание стоп, дальномер───
прошивка исполняется 2 мс  ──…──►                                  ещё шаг
…

Тела и шарниры

Привод (сервомашинка)

Как и у настоящей сервомашинки, вход — длина импульса: 500–2500 мкс задают угол 0–180°. Каждый шаг модель делает следующее:

  1. Цель. Импульс переводится в угол и сдвигается на «прямо» этого сустава, затем ограничивается ходом шарнира.
  2. Скорость. Внутренняя цель догоняет заданный угол не быстрее предельной скорости привода: 6 рад/с (≈ 340°/с) у ног и рук.
  3. Мотор. Мотор шарнира тянет к цели со скоростью, пропорциональной рассогласованию (коэффициент 60 1/с), но не быстрее предельной скорости. Момент при этом не больше предельного: например, бедро 220 Н·м, колено 200 Н·м, плечо 40 Н·м.
  4. Обратной связи нет, как и у настоящего привода. Если момента не хватает, угол не достигается, и прошивка об этом не узнает. В окне привод с отставанием больше 6,5° помечается как перегруженный.

Подключение: по каналу драйвера PCA9685 (регистры LEDn_OFF, частота 50 Гц) или прямо с вывода платы (Servo; модель меряет длину импульса по фронтам).

Контакт и трение

ЧтоТрениеУпругость
Пол, ступени, стены1,00
Подошвы и лапы1,00
Остальные звенья робота0,60
Предметы (кубик, мяч)0,80,1

Трение сухое (по Кулону): стопа держится, пока сила вбок не больше трения. Робот не подпрыгивает от удара о пол (упругость 0). Предметы сталкиваются со всем, в том числе друг с другом.

Датчики

ДатчикОткуда берётсяЧто видит скетч
MPU6050 (0x68)Скорость и поворот тела, к которому прикреплён датчик (торс). Акселерометр — изменение скорости за шаг минус тяжесть, в осях датчика. Гироскоп — угловая скорость тела.Регистры MPU6050 как у настоящего; по умолчанию ±2 g (16384 на 1 g) и ±250°/с (131 на 1°/с), диапазоны переключаются регистрами. Шума и смещения нуля нет.
Касание стопЕсть ли контакт подошвы или лапы с миром ближе 2 мм.Вывод тянется к LOW, пока стопа на опоре. Вход платы — INPUT_PULLUP.
Дальномер HC-SR04 (голова робота-человека)Луч из лица по направлению головы (приводы 18 и 19) до первого препятствия, предмета или пола. Сам робот лучу не мешает. Дальность до 4 м.Импульс ECHO длиной ~58 мкс на сантиметр в ответ на TRIG (pulseIn).

Упрощения

Площадки

Площадка выбирается в свойствах детали-робота: ровный пол, лестница (четыре ступени по 8 см), препятствия, полка с кубиком, мяч, стена в 2 м, столб на пути. Препятствия неподвижны, предметы — свободные тела.