- BrainTools - https://www.braintools.ru -

Собака, которой нет: как я учил робота Pin бегать рысью, не купив ни одного сервопривода

У моей собаки Pin двенадцать сервоприводов, десять килограммов веса и ни грамма железа: она живёт в браузере. Тем не менее она трусит рысью со скоростью 35 см/с, держит курс по гироскопу и однажды села на хвост, когда я попробовал научить её прыгать.

Это рассказ о том, как в учебной платформе PinPort появился четвероногий робот, что у него внутри и почему ходить у него получилось раньше, чем бегать.

PinPort.ru умеет сохранять прикольные Gif

PinPort.ru умеет сохранять прикольные Gif

Почему вообще собака

PinPort: эмулятор Arduino и ESP32 в браузере: схема, скетч, кнопка «Запустить», и светодиод мигает. Я делал его, чтобы человек мог учиться электронике, ничего не покупая и ничего не сжигая. Роботы появились потому, что у школьников сейчас тренд на робототехнику, и я не хотел отставать.

Первым я сделал человека. Его зовут Port: 1,75 м, 50 кг, двадцать приводов. И он оказался капризным: две ноги, высокий центр масс, и каждая лишняя сотня граммов в руке меняла походку. Я потратил недели на то, чтобы он вообще пошёл и не упал на втором шаге.

Когда Port наконец зашагал, мне захотелось создать робота, который стоит на четырех ногах. Так появился Pin: четыре опоры вместо двух, низкий центр масс, и никакого трагизма при каждом чихе гироскопа.

Знакомьтесь, Pin

Pin: собака, и она, повторю, не существует. Но паспорт у неё есть, причём подробный:

Параметр

Значение

Масса

10 кг

Приводов

12: по три на лапу (отведение, бедро, колено)

Бедро и голень

по 21 см

Стопа

резиновый шар 2 см с датчиком касания

Высота оси бедра

0,44 м в сборочной позе, 0,28 м при ходьбе

Скорость рыси

около 35 см/с

Схема лап взята у настоящих четвероногих роботов вроде Unitree Go1: три сустава на лапу, колено сгибается назад.

Имя появилось из пары. В PinPort уже был робот Port, робот-человек. Ему нужен был напарник. Port и Pin.

Что у неё внутри

Важное условие, с которым я запускал весь проект: мозги: настоящие. То есть на собаке без всяких хитростей крутится не «программа на JavaScript, похожая на скетч», а обычный скетч на C++, собранный в прошивку для Arduino Uno и исполняемый эмулятором AVR. Тот же файл вы можете прошить в живой плате.

Внутри три части:

  • Arduino Uno: мозг [1]. Никаких подпорок: 2 КБ оперативки и 16 МГц.

  • PCA9685: шестнадцатиканальный шим-контроллер по I2C (адрес 0x40). Двенадцать каналов, двенадцать приводов: 0–2 передняя левая, 3–5 передняя правая, 6–8 задняя левая, 9–11 задняя правая.

  • MPU6050 (0x68): гироскоп. От него зависит, уйдёт ли собака вкось (об этом ниже).

Физику считает движок Rapier 3D, собранный в WebAssembly, с шагом 2 мс.

Самое интересное место скетча: обратная кинематика. Мы не задаём углы суставов, мы говорим, где должна быть стопа: на сколько ниже оси бедра и на сколько вперёд. Дальше тригонометрия двух звеньев по 21 см:

void paw(uint8_t c0, float fh, float fz) {
  float d = sqrt(fh * fh + fz * fz);
  if (d > L1 + L2 - 0.0005) d = L1 + L2 - 0.0005;
  float k = M_PI - acos((L1 * L1 + L2 * L2 - d * d) / (2 * L1 * L2));
  float th = atan2(fz, fh) - acos((L1 * L1 + d * d - L2 * L2) / (2 * L1 * d));
  setJoint(c0 + 0, 0, 0);
  setJoint(c0 + 1, 1, th * R);
  setJoint(c0 + 2, 2, k * R);
}

Здесь fh: сколько метров от оси бедра вниз до стопы, fz: вперёд. Длина «линии от бедра до стопы» d обрезается, если лапа просит дотянуться дальше, чем она всё равно может. Потом теорема косинусов, и на выходе угол колена k и угол бедра th. Отведение для рыси не нужно, оно всегда ноль: лапы ходят в плоскости тела.

Есть одна мелочь, которая легко сбивает с толку: колено у настоящей собаки гнётся «назад», то есть голень уходит вперёд, и прямой ноге соответствует write(90) на бедре, но write(0) на колене. Поэтому в скетче массив ZERO = {90, 90, 0}: «ноль» у трёх суставов одной лапы разный.

Рысь

Для первого шага я выбрал рысь. Если лапы двигать по диагоналям, передняя левая вместе с задней правой, потом передняя правая с задней левой, то в каждый момент на земле стоит минимум одна пара, а центр масс оказывается над прямой между ними. Баланс почти бесплатный. Не придуманный мной трюк, а то, как ходят собаки, лошади и большинство четвероногих роботов.

В скетче это умещается в одну строку: массив «кто в какой паре»:

const uint8_t pair[4] = {0, 1, 1, 0};  // ПЛ, ПП, ЗЛ, ЗП

Каждая пара сначала переносится вперёд по дуге, потом стоит и толкает корпус, а пока она толкает, другая переносится. Время дуги: T_STEP, 0,25 с, шаг STEP: 10 см, подъём лапы LIFT: 5 см. Работает так: при включении собака стоит на почти прямых лапах, за секунду приседает на рабочую высоту 0,28 м, ещё полторы секунды стоит и начинает шагать, плавно нарастивая длину шага. Итог на Uno: около 35 см/с, наклон корпуса до 4°.

Но самое ценное в рыси: гироскоп. Без него собака «идёт прямо», пока левые и правые лапы не стали чуть по-разному проскальзывать по полу, и она потихоньку заворачивает. Скетч читает угловую скорость по оси Z у MPU6050, интегрирует её в курс и корректирует разницу шага левых и правых лап:

float diff = TURN != 0 ? TURN : constrain(-K_HEAD * heading, -0.03, 0.03);

Увело влево, шагаем почти вправо. Тот же параметр TURN даёт поворот «как у танка»: с STEP = 0 и TURN = 0,05 собака разворачивается на месте на угол около 180° за 10 секунд. В итоге курс уходит всего на 1° за 10 секунд.

Ещё одно наблюдение, которое меня порадовало: собака намного устойчивее человека. Port опрокидывается, если его толкнуть по-настоящему: ему нужна обратная связь по крену. У Pin опор четыре и центр масс низко, и она держит боковой толчок 8–10 Н·с вообще без какой-либо стабилизации. Как настоящая собака на прогулке: толкнули, постояла на четырёх, пошла дальше.

Бег и галоп, которого не вышло

Рысь на 35 см/с: это прогулочный шаг, а хотелось бежать. Тот же скетч, только T_STEP = 0,15 с и STEP = 0,22 м, и Pin пробегает около 1,25 м/с. Наклон корпуса доходит до 10°, а курс уходит до 4°: вбок сносит до метра на десять метров, она бежит чуть «крабом».

Теперь честная часть. Если смотреть на запись, фазы полёта почти нет: все четыре лапы в воздухе около 2 % времени. Строго говоря, это быстрая рысь, а не бег в том смысле, в каком бегает настоящая собака.

Собака, которой нет: как я учил робота Pin бегать рысью, не купив ни одного сервопривода - 2

Я пробовал сделать настоящий полёт: опору короче половины цикла и сильный толчок лапой. С полётом около 20 % времени собака начинает рыскать и в конце концов опрокидывается. Я пробовал добавить обратную связь по наклону через высоту лап, и она не помогла. Галоп и рысь с полётом остаются задачей, которая у меня не решена. Я оставил это в документации в таком же виде: «пробовал, не получилось».

И мне кажется, это правильное место, чтобы остановиться и сказать вслух: симулятор тут не виноват. Если бы собака бегала легко, я бы не поверил ни ей, ни себе.

Прыжок и собака, севшая на хвост

Прыжок: второй скетч, dog_jump.ino. Алгоритм прост и ясен: присесть (ось бедра на 0,20 м), отвести лапы назад, резко выпрямиться до 0,41 м, в воздухе поджать лапы до 0,30 м и приземлиться. Раз в три секунды повторить и написать в порт «прыжок N».

Собака, которой нет: как я учил робота Pin бегать рысью, не купив ни одного сервопривода - 3

Результат скромный: полёт около 0,18 с, центр масс поднимается самое большое на 4 см, наклон корпуса до 13°. Всё упирается в приводы: 10 рад/с и 20 Н·м: именно таковы быстрые сервоприводы, которые можно купить. Я проверил для любопытства 30 рад/с: корпус взлетал вдвое выше, но собака тут же опрокидывалась. Такой прыжок нужно настраивать отдельно, а таких сервоприводов в наборе всё равно нет.

А теперь самое смешное, и заодно поучительное. В первом прыжке я поставил задние лапы прямо под бедро, как бы логично [2]: пусть толкаются прямо вверх. У меня это превратилось в сцену мультфильма: задний толчок задирал нос вверх, и Pin садилась на хвост с наклоном 50–60°.

Почему так? Видно, если представить рычаг. Лапа толкает вверх только заднюю часть, центр масс есть посредине тела, и сила проходит не через него, а мимо. Решение оказалось простым: отвести передние лапы на 4 см назад от оси плеча, а задние на 8 см, тогда толчок проходит через центр масс. Ничего нового для человека, знающего механику, но я дошёл до этого не из учебника, а из того, что увидел собаку, сидящую на хвосте. Так мне кажется, для этого и нужен симулятор: ошибка [3] здесь стоит не поломанный сервопривод, а перезапуск.

Что можно попробовать самому

Запустить собаку можно за пару кликов, ставить ничего не нужно:

Если захотите повозиться, в скетче вверху есть три константы, которые стоит покрутить:

  • STEP: длина шага. Добавьте длины, увидите, как растёт наклон корпуса.

  • T_STEP: время полушага. Чем меньше, тем быстрее; значение 0,15 уже делает из рыси быстрый бег.

  • TURN: разница шага левых и правых лап. С нулём держит курс гироскоп, с ненулевым поворачивает.

Если спросите себя «а насколько быстро можно?», ваш путь, скорее всего, повторит мой: до 1,25 м/с собака ещё держится, а дальше нужны уже не параметры, а новые идеи.

Собака, которой нет: как я учил робота Pin бегать рысью, не купив ни одного сервопривода - 4

Чего в Pin нет

Список небольшой, но я хочу, чтобы он был в статье, а не только в документации:

  • Нет настоящего бега и галопа. Есть быстрая рысь, фаза полёта около 2 % времени.

  • Нет высокого прыжка. Центр масс поднимается примерно на 4 см. Более быстрые приводы подбросят выше, но собака начнёт опрокидываться.

  • Нет ходьбы по неровностям. Пол ровный, лестницу осилил только Port, и то не во всех сочетаниях параметров.

  • Нет зрения [8] и нет слуха [9]. Датчики у Pin: гироскоп, четыре датчика касания на стопах и значения углов самих приводов. Всё.

  • Нет гарантии, что на железе будет так же. Физика всего лишь приближение: шаг 2 мс, упрощённый привод, трение шара о пол. Сервы из «набора» ведут себя не как идеальная модель, и я не буду уверять, что скетч сразу заработает на настоящей собаке.

Последний пункт, пожалуй, главный. Симулятор не заменяет железо. Он отвечает на вопрос «стоит ли вообще пробовать» дешевле, чем сломанный привод.

Автор: b_vova

Источник [10]


Сайт-источник BrainTools: https://www.braintools.ru

Путь до страницы источника: https://www.braintools.ru/article/36657

URLs in this post:

[1] мозг: http://www.braintools.ru/parts-of-the-brain

[2] логично: http://www.braintools.ru/article/7640

[3] ошибка: http://www.braintools.ru/article/4192

[4] Паспорт Pin: https://pinport.ru/robot/dog

[5] Все роботы в галерее: https://pinport.ru/gallery/robots

[6] Pin идёт рысью: https://pinport.ru/p/ex-robot-pin-walk

[7] Pin прыгает: https://pinport.ru/p/ex-robot-pin-jump

[8] зрения: http://www.braintools.ru/article/6238

[9] слуха: http://www.braintools.ru/article/6251

[10] Источник: https://habr.com/ru/articles/1091762/?utm_campaign=1091762&utm_source=habrahabr&utm_medium=rss

www.BrainTools.ru

Rambler's Top100