Проекты · галерея роботов · робот-человек · робот-собака
Физика сцен с роботами
Робот в окне «Робот» — не анимация. Это трёхмерная модель с массами, шарнирами и трением, и считает её физический движок. Скетч не задаёт позу робота: он, как настоящая плата, шлёт импульсы приводам и читает датчики. Встанет робот, пойдёт или упадёт — решает физика.
Движок
Rapier 3D (@dimforge/rapier3d-deterministic-compat 0.21) — физический движок с открытым кодом, собранный в WebAssembly. Взята сборка deterministic: одни и те же входные данные дают одинаковый результат до последнего бита на любом компьютере и в любом браузере. Файл весит около 4 МБ и загружается только на страницах, где в схеме есть робот.
Один и тот же код считает робота в трёх местах: в браузере (в фоновом потоке, рядом с эмулятором платы), в node (тесты) и на сервере (проверка уроков). Поэтому урок, пройденный в браузере, засчитывает и сервер.
Время: плата и физика идут в ногу
эмулятор платы физика (Rapier)
────────────── ────────────────
прошивка исполняется 2 мс ──импульсы приводов, каналы PCA9685──► один шаг мира 2 мс
◄──MPU6050, касание стоп, дальномер───
прошивка исполняется 2 мс ──…──► ещё шаг
…
- Шаг физики фиксирован: 2 мс модельного времени, 500 шагов на секунду.
- Время модельное — это время прошивки (
millis(),micros()), а не часы компьютера. Медленный компьютер покажет движение медленнее, но то же самое. - Случайных чисел и шума нет. Один скетч на одной площадке даёт одно движение: падение можно повторить и разобрать по кадрам.
Тела и шарниры
- Робот состоит из твёрдых тел: торс, звенья ног и рук, стопы. У каждого тела есть масса и форма для столкновений — коробка или шар, у некоторых тел их несколько. Красивая обшивка в окне рисуется отдельно и на физику не влияет. Как физика видит робота, показывает слой «коллайдеры».
- Тела соединены вращательными шарнирами: одна ось, пределы хода. Звенья робота друг с другом не сталкиваются (как у настоящего робота, где этого не допускает конструкция), только с полом, препятствиями и предметами.
- Оси мира: Y — вверх, Z — вперёд, X — влево. Единицы — СИ: метры, килограммы, секунды, ньютон-метры. Тяжесть — 9,81 м/с².
- Решатель: 20 итераций на шаг, допуск проникновения 0,3 мм. При допуске 5 мм (значение по умолчанию у Rapier) стопа проседала краем в пол и опрокидывалась.
Привод (сервомашинка)
Как и у настоящей сервомашинки, вход — длина импульса: 500–2500 мкс задают угол 0–180°. Каждый шаг модель делает следующее:
- Цель. Импульс переводится в угол и сдвигается на «прямо» этого сустава, затем ограничивается ходом шарнира.
- Скорость. Внутренняя цель догоняет заданный угол не быстрее предельной скорости привода: 6 рад/с (≈ 340°/с) у ног и рук.
- Мотор. Мотор шарнира тянет к цели со скоростью, пропорциональной рассогласованию (коэффициент 60 1/с), но не быстрее предельной скорости. Момент при этом не больше предельного: например, бедро 220 Н·м, колено 200 Н·м, плечо 40 Н·м.
- Обратной связи нет, как и у настоящего привода. Если момента не хватает, угол не достигается, и прошивка об этом не узнает. В окне привод с отставанием больше 6,5° помечается как перегруженный.
Подключение: по каналу драйвера PCA9685 (регистры LEDn_OFF, частота 50 Гц) или прямо с вывода платы (Servo; модель меряет длину импульса по фронтам).
Контакт и трение
| Что | Трение | Упругость |
|---|---|---|
| Пол, ступени, стены | 1,0 | 0 |
| Подошвы и лапы | 1,0 | 0 |
| Остальные звенья робота | 0,6 | 0 |
| Предметы (кубик, мяч) | 0,8 | 0,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). |
Упрощения
- Голова и пальцы робота-человека — приводы без шарниров физики. Их угол идёт к цели со скоростью привода и рисуется в окне, но масса головы входит в торс, а пальцы предметы не трогают.
- Хват. Если кисть сжата (угол привода больше 60°), а предмет у ладони (ближе 8 см), он крепится к кисти жёстко. Предмет отпускается, когда кисть разжата (угол меньше 30°).
- Модель привода идеальна: нет люфта, нагрева, падения напряжения и тока батареи.
- Подошва жёсткая, без резины, которая сминается. Звенья абсолютно твёрдые и не гнутся.
- Значения моментов и скоростей приводов — исходные. Их нужно сверить с приводами, которые вы выберете для настоящего робота.
Площадки
Площадка выбирается в свойствах детали-робота: ровный пол, лестница (четыре ступени по 8 см), препятствия, полка с кубиком, мяч, стена в 2 м, столб на пути. Препятствия неподвижны, предметы — свободные тела.