Как-то раз мы сидели с другом и подумали: а что, если попробовать управлять вещами реального мира из мира виртуального?! Например, роботами. Мысль не новая, и в том или ином воплощении она широко распространена, например, в области IoT.
Немного забегая вперёд: в результате мы разработали роботов и систему удалённого управления. Один из видеороликов рабочих тестов системы заметили на телеканале НТВ, и нас пригласили на съёмки телепередачи «Чудо техники», которые прошли в Сколково, в Институте науки и технологий.
А теперь и вы можете сыграть в наш робохоккей — первый матч состоится 23 мая в 18:40 по московскому времени.
Но обо всём по порядку…
🏒 Не хочу ничего читать — хочу записаться на робохоккей!
Мысль начала лихорадочно работать и сложилась следующая концепция: небольшие роботы на базе известного микроконтроллера esp32. Почему именно он? На наш взгляд, сейчас это один из самых простых способов для оживления вещи и выведения её в онлайн.
Да, некоторые могут сказать про Arduino Ethernet со встроенным разъёмом RJ-45, однако хотелось бы большей мобильности, поэтому будем рассматривать исключительно беспроводные системы. К тому же, в 2023 году это было бы странно — строить проводной вариант (понимаю, что для некоторых применений, например, для каких-нибудь ЧПУ-станков это приемлемо). Плюс нам хотелось именно мобильных, движущихся устройств, управляемых дистанционно, чему провода никак не способствуют.
В ходе обсуждения концепции устройства мы остановились на самом простом и, соответственно, надёжном варианте — двухколёсной платформе без специальной рулевой системы.
Изменение направления движения в этом варианте осуществляется с помощью изменения скоростей вращения колёс. Кроме того, подобная конструкция даёт ещё один существенный плюс: разворот на месте (в этом случае одно колесо крутится в одну сторону с максимальной скоростью, а другое колесо в другую сторону, также с максимальной скоростью).
В процессе дальнейшей проработки появилась идея, как использовать этот разворот на месте с дополнительной выгодой: навесить на платформу клюшку и превратить робота в хоккеиста! Таким образом, резко разворачиваясь на месте вокруг своей оси робот может нанести мощный удар клюшкой по шайбе.
Если же необходимо двигаться прямо вперёд или прямо назад, необходимо каким-то образом выровнять скорости вращения обоих двигателей, так как с завода двигатели не вращаются с одинаковой скоростью. И необходимо постоянно отслеживать скорость вращения каждого двигателя и корректировать её относительно скорости вращения соседнего двигателя. Для этого были использованы инфракрасные датчики, которые мы установили рядом с каждым колесом.
Так как обод колеса имеет ярко-белый цвет, то инфракрасный датчик находится постоянно в положении «обнаружен сигнал», так как луч сразу отражается в приёмник датчика от белой поверхности.
Чтобы устранить это, на 3D-принтере в каждый обод колеса была распечатана вставка из чёрного ABS-пластика таким образом, чтобы обод колеса стал представлять собой, с точки зрения датчика, чередование белых и чёрных секторов, где от чёрных луч не отражается. Таким образом, мы получили энкодер, встроенный в каждое колесо, обладающий 12 отдельными белыми секторами, на которых срабатывает датчик (детектируется отражённый луч).
Если сказать ещё проще: на каждый оборот колеса программа 12 раз сверяет скорости вращения обоих колёс и пытается их выровнять.
В момент появления белого сектора выполнение программы останавливается, выполнение уходит как бы в боковое ответвление, где исполняются необходимые действия для выравнивания скоростей, после чего управление возвращается основному потоку программы (прошивку робота для просмотра и изучения, к сожалению, выложить не могу, так как там много разных интересных наработок). Реализовано это через применение функций attachInterrupt и detachIterrupt.
Чтобы не просто прибавлять/убавлять скорость, был использован алгоритм PID-регулятора.
Кстати сказать, в конечном итоге всё равно не удалось до конца победить прямолинейное движение, так как, насколько удалось выяснить, недостаточно просто выровнять скорости вращения колёс. Для прямолинейного движения необходима ещё и правильная развесовка корпуса, абсолютно идентичное расположение двигателей по высоте и т. д.
Хотели применить ещё и дополнительное выравнивание с помощью установки на каждого робота модуля гироскопа/акселерометра, но потом отбросили эту затею. Почему: это было бы рационально для обычных роботов или автоматизированных машин, просто движущихся по траектории. В нашем же случае робот будет постоянно испытывать воздействие ударов, толчков, вращений, что будет существенно усложнять работу гироскопа. Поэтому пока решили оставить как есть, так как в рамках небольшого хоккейного поля, разработанного специально для этого случая, не совсем точная работа системы выравнивания для прямолинейного движения не является критической. Кроме того, роботы могут подруливать в процессе езды: то есть они движутся не только прямо вперёд/назад/влево/право, а могут ещё и плавно подруливать в процессе движения, собственно, как и обычные автомобили. Эта их особенность практически на корню устраняет недостатки системы автоматического выравнивания при прямолинейном движении.
Сама платформа и все компоненты были распечатаны на 3D-принтере с использованием ABS-пластика:
Это позволило создать компактную конструкцию, помещающуюся на ладони.
Недавно проапгрейдили систему питания, и на фото ещё показан старый вариант на одном аккумуляторе. Сейчас установлены 2 (иначе слишком быстро садится)
Кстати, о хоккейном поле: оно было изготовлено из обычной школьной доски, представляющей собой металлическую поверхность, покрытую порошковой краской в зелёный цвет.
Чтобы это поле стало более похожим на хоккейное, на нём был установлен по периметру О-образный алюминиевый бортик высотой в 50 мм.
Ворота были изготовлены из стальных нержавеющих труб, обработанных на токарном станке. Боковины распечатаны на 3D-принтере, после чего обшиты мелкой сеткой, валявшейся под рукой.
В качестве шайбы была взята идея, подсмотренная авторами ещё в начале 90-х, кажется, в журнале «Юный Техник». Там предлагалось сделать самодельную шайбу для игры летом на асфальте, если разрезать её пополам и внутрь поместить ряд крупных стальных шарикоподшипников. В настоящее время эта идея получила «второе дыхание» и была разработана и распечатана на 3D-принтере. Половинки шайбы стянуты болтиком:
Правда в последующем решили использовать всё-таки шарик для пинг-понга, так как он гораздо живее шайбы:-)
Возвращаясь к роботам и системе удалённого управления ими: было решено использовать систему управления через MQTT-протокол и, соответственно, MQTT-брокер. Для чего это было сделано: чтобы устранить проблему «с проходом через роутер». То есть, так как все роботы построены на базе esp32, и они по Wi-Fi подключаются к беспроводному роутеру, находящемуся в локальной сети, то при каждой перезагрузке робота, если их в сети находится более одного (даже если это специальный роутер, предназначенный только для роботов и в этой подсети нет больше других устройств, подключённых к роутеру), то у робота сменится ip-адрес. Если мы стучимся к нему снаружи, то нам необходимо сообщить внешнему клиенту, новый, актуальный IP робота.
Да, можно было бы поступить по-другому, например, получить белый IP у провайдера Интернета, после чего привязать MAC-адрес Wi-Fi-модема робота к определённому IP-адресу, выдаваемому роутером (другими словами, роутер всегда будет выдавать этот IP-адрес роботу, имеющему именно этот MAC-адрес). Но решили так не заморачиваться, так как белый IP — это всё-таки потеря безопасности, да и не хотелось городить нечто новое, когда уже возможно создать на базе существующего MQTT-протокола. К тому же, это интересно само по себе, — испытать управление через MQTT.
Некоторые люди высказывали сомнения, что это в принципе возможно, так как будет присутствовать большая задержка. На практике всё оказалось вполне себе неплохо: задержка прохождения управляющих команд во время тестов составляла 100 миллисекунд и менее, что субъективно человеком воспринимается как «практически мгновенно» (тем более, задержка видеопотока составляет большую величину).
▍ Как всё работает
Для управления роботами была разработана специальная веб-система. Работает она следующим образом:
- Админ создаёт игру в специальном Telegram-боте, и все желающие могут встать в очередь на эту игру, так как роботов только шесть.
- После того, как админ запустит игру, всем зарегистрированным приходят логин и пароль для управления роботами из браузера.
- Когда человек получает свой логин и пароль, он логинится в системе управления, для чего открывает её в браузере по ссылке, которую мы дадим.
- На экране он видит картинку, транслирующуюся с камеры, установленной рядом с игровым полем, с помощью которой и управляет своими роботом.
Веб-страница, на которой он находится, ведёт захват нажатий клавиш с полноразмерной компьютерной клавиатуры (планшеты и смартфоны не подойдут).
Управляющие команды, генерирующиеся веб-страницей, отправляются MQTT-брокеру в ряд специальных топиков, которые постоянно мониторит и забирает/исполняет их оттуда соответствующий робот.
Маленькое пояснение, для тех, кто не в курсе, как работает протокол: веб-сайт пишет как бы в специальные «чаты», для соответствующего робота сообщения: «Слушай, езжай вперёд. А нет, стой! Езжай назад! Вот теперь езжай вправо… и т. д.». Робот постоянно мониторит эти чаты, ждёт, когда ему что-то напишут и выполняет эти команды в соответствии с логикой, которая определена у него в прошивке. Таким образом, мы избавляемся от необходимости из внешнего интернета стучаться к роботу, узнавать его IP и т. д. и т. п. Вместо этого, робот сам выходит изнутри-наружу, смотрит, что ему пишут, и выполняет…
Каждый пилот может управлять своим роботом в течение времени, которое определяется админом до игры. После того, как время пилота закончено, сайт отключает его от системы управления и в игру запускается следующая партия пилотов…
Обычные зрители (не пилоты роботов) могут наблюдать за игрой со страницы общедоступной трансляции.
Кстати говоря, сейчас как раз идёт Чемпионат мира по хоккею (12-28 мая), но наше состязание даёт возможность не просто смотреть на спортсменов, а и самому попробовать побороться с командой соперников! Роботы будут двух цветов — жёлтого и зелёного, так что намечается нехилая заруба всех одного цвета против всех другого…
Система работает в режиме бета-теста, поэтому возможны различные накладки, за что заранее просим прощения.
И в конце, когда ты знаешь, как всё устроено, зададим главный вопрос — итак, поехали? ;-)
Записаться на игру можно через бота, а следить за датами и временем заездов — в Telegram-канале.
Прямая трансляция будет доступна на моём твич канале.
Алгоритм игры будем следующим:
- Доступно 144 места, роботов будет 6 штук.
- Участники будут впускаться системой автоматически по 6 человек на 5 минут.
- Игра будет идти с 18:40 до 20:40 по Москве.
- В текущий момент учёт очков не ведётся (доделаем позже этот момент), поэтому считайте сами, кто сколько забил ;-)
- В 18:30 144 человека, вставшие в очередь, должны быть на связи, так как мы запустим регистрацию уже на саму игру и вам придёт уведомление в Телеграм-бот. На уведомление нужно отреагировать в течение 3 минут — нажать «Готов».
- В 18:40 админ запустит игру и все, кто нажал «Готов» на предыдущем шаге, получат логины и пароли в Телеграм-боте.
- Мы выложим картинку-план в наш Телеграм-канал, кто (какой логин) и в какое время играет. Найдите там свой и узнайте время, когда вам нужно войти в игру.
- С полученным логином и паролем нужно будет войти в означенное время в систему управления роботами по ссылке, которая будет в телеграм-боте.
- Начать играть! :-)
Возможность встать в очередь на игру (в Телеграм-боте) будет доступна с момента выхода статьи. Но нужно поторопиться — есть всего 144 места ;-).
UPD:
Запись на игру окончена. Прямая трансляция доступна на моём твич канале. Завтра будет запись на новую игру. Новости опубликуем позже в телеграм-канале RUVDS.
Автор:
DAN_SEA