Как-то раз мы сидели с другом и подумали: а что, если попробовать управлять вещами реального мира из мира виртуального?! Например, роботами. Мысль не новая, и в том или ином воплощении она широко распространена, например, в области IoT.
Немного забегая вперёд: в результате мы разработали роботов и систему удалённого управления. Один из видеороликов рабочих тестов системы заметили на телеканале НТВ, и нас пригласили на съёмки телепередачи "Чудо техники", которые прошли в Сколково, в Институте науки и технологий.
Но обо всём по порядку…
Мысль начала лихорадочно работать и сложилась следующая концепция: небольшие роботы на базе известного микроконтроллера esp32. Почему именно он? На наш взгляд, сейчас это один из самых простых способов для оживления вещи и выведения её в онлайн.
Да, некоторые могут сказать про Arduino Ethernet со встроенным разъёмом RJ-45, однако хотелось бы большей мобильности, поэтому будем рассматривать исключительно беспроводные системы. К тому же, в 2023 году это было бы странно — строить проводной вариант (понимаю, что для некоторых применений, например, для каких-нибудь ЧПУ-станков это приемлемо). Плюс нам хотелось именно мобильных, движущихся устройств, управляемых дистанционно, чему провода никак не способствуют.
В ходе обсуждения концепции устройства мы остановились на самом простом и, соответственно, надёжном варианте — двухколёсной платформе без специальной рулевой системы.
Изменение направления движения в этом варианте осуществляется с помощью изменения скоростей вращения колёс. Кроме того, подобная конструкция даёт ещё один существенный плюс: разворот на месте (в этом случае одно колесо крутится в одну сторону с максимальной скоростью, а другое колесо в другую сторону, также с максимальной скоростью).
В процессе дальнейшей проработки появилась идея, как использовать этот разворот на месте с дополнительной выгодой: навесить на платформу клюшку и превратить робота в хоккеиста! Таким образом, резко разворачиваясь на месте вокруг своей оси робот может нанести мощный удар клюшкой по шайбе.
Если же необходимо двигаться прямо вперёд или прямо назад, необходимо каким-то образом выровнять скорости вращения обоих двигателей, так как с завода двигатели не вращаются с одинаковой скоростью. И необходимо постоянно отслеживать скорость вращения каждого двигателя и корректировать её относительно скорости вращения соседнего двигателя. Для этого были использованы инфракрасные датчики, которые мы установили рядом с каждым колесом.
Так как обод колеса имеет ярко-белый цвет, то инфракрасный датчик находится постоянно в положении «обнаружен сигнал», так как луч сразу отражается в приёмник датчика от белой поверхности.
Чтобы устранить это, на 3D-принтере в каждый обод колеса была распечатана вставка из чёрного ABS-пластика таким образом, чтобы обод колеса стал представлять собой, с точки зрения датчика, чередование белых и чёрных секторов, где от чёрных луч не отражается. Таким образом, мы получили энкодер, встроенный в каждое колесо, обладающий 12 отдельными белыми секторами, на которых срабатывает датчик (детектируется отражённый луч).
Если сказать ещё проще: на каждый оборот колеса программа 12 раз сверяет скорости вращения обоих колёс и пытается их выровнять.
В момент появления белого сектора выполнение программы останавливается, выполнение уходит как бы в боковое ответвление, где исполняются необходимые действия для выравнивания скоростей, после чего управление возвращается основному потоку программы (прошивку робота для просмотра и изучения, к сожалению, выложить не могу, так как там много разных интересных наработок). Реализовано это через применение функций attachInterrupt и detachIterrupt.
Чтобы не просто прибавлять/убавлять скорость, был использован алгоритм PID-регулятора.
Кстати сказать, в конечном итоге всё равно не удалось до конца победить прямолинейное движение, так как, насколько удалось выяснить, недостаточно просто выровнять скорости вращения колёс. Для прямолинейного движения необходима ещё и правильная развесовка корпуса, абсолютно идентичное расположение двигателей по высоте и т. д.
Хотели применить ещё и дополнительное выравнивание с помощью установки на каждого робота модуля гироскопа/акселерометра, но потом отбросили эту затею. Почему: это было бы рационально для обычных роботов или автоматизированных машин, просто движущихся по траектории. В нашем же случае робот будет постоянно испытывать воздействие ударов, толчков, вращений, что будет существенно усложнять работу гироскопа. Поэтому пока решили оставить как есть, так как в рамках небольшого хоккейного поля, разработанного специально для этого случая, не совсем точная работа системы выравнивания для прямолинейного движения не является критической. Кроме того, роботы могут подруливать в процессе езды: то есть они движутся не только прямо вперёд/назад/влево/право, а могут ещё и плавно подруливать в процессе движения, собственно, как и обычные автомобили. Эта их особенность практически на корню устраняет недостатки системы автоматического выравнивания при прямолинейном движении.
Сама платформа и все компоненты были распечатаны на 3D-принтере с использованием ABS-пластика:
Это позволило создать компактную конструкцию, помещающуюся на ладони.
Недавно проапгрейдили систему питания, и на фото ещё показан старый вариант на одном аккумуляторе. Сейчас установлены 2 (иначе слишком быстро садится)
Кстати, о хоккейном поле: оно было изготовлено из обычной школьной доски, представляющей собой металлическую поверхность, покрытую порошковой краской в зелёный цвет.
Чтобы это поле стало более похожим на хоккейное, на нём был установлен по периметру О-образный алюминиевый бортик высотой в 50 мм.
Ворота были изготовлены из стальных нержавеющих труб, обработанных на токарном станке. Боковины распечатаны на 3D-принтере, после чего обшиты мелкой сеткой, валявшейся под рукой.
В качестве шайбы была взята идея, подсмотренная авторами ещё в начале 90-х, кажется, в журнале «Юный Техник». Там предлагалось сделать самодельную шайбу для игры летом на асфальте, если разрезать её пополам и внутрь поместить ряд крупных стальных шарикоподшипников. В настоящее время эта идея получила «второе дыхание» и была разработана и распечатана на 3D-принтере. Половинки шайбы стянуты болтиком:
Правда в последующем решили использовать всё-таки шарик для пинг-понга, так как он гораздо живее шайбы:-)
Возвращаясь к роботам и системе удалённого управления ими: было решено использовать систему управления через MQTT-протокол и, соответственно, MQTT-брокер. Для чего это было сделано: чтобы устранить проблему «с проходом через роутер».
Некоторые люди высказывали сомнения, что это в принципе возможно (использовать для этих целей MQTT), так как будет присутствовать большая задержка. На практике всё оказалось вполне себе неплохо: задержка прохождения управляющих команд во время тестов составляла 100 миллисекунд и менее, что субъективно человеком воспринимается как «практически мгновенно» (тем более, задержка видеопотока составляет большую величину).
Больше фотографий можно посмотреть здесь:
▍ Как всё работает
Для управления роботами была разработана специальная веб-система. Работает она следующим образом:
- Админ создаёт игру в специальном Telegram-боте, и все желающие могут встать в очередь на эту игру, так как роботов только шесть.
- После того, как админ запустит игру, всем зарегистрированным приходят логин и пароль для управления роботами из браузера.
- Когда человек получает свой логин и пароль, он логинится в системе управления, для чего открывает её в браузере по ссылке, которую мы дадим.
- На экране он видит картинку, транслирующуюся с камеры, установленной рядом с игровым полем, с помощью которой и управляет своими роботом.
Веб-страница, на которой он находится, ведёт захват нажатий клавиш с полноразмерной компьютерной клавиатуры (планшеты и смартфоны не подойдут).
Управляющие команды, генерирующиеся веб-страницей, отправляются MQTT-брокеру в ряд специальных топиков, которые постоянно мониторит и забирает/исполняет их оттуда соответствующий робот.
Маленькое пояснение, для тех, кто не в курсе, как работает протокол: веб-сайт пишет как бы в специальные «чаты», для соответствующего робота сообщения: «Слушай, езжай вперёд. А нет, стой! Езжай назад! Вот теперь езжай вправо… и т. д.». Робот постоянно мониторит эти чаты, ждёт, когда ему что-то напишут и выполняет эти команды в соответствии с логикой, которая определена у него в прошивке. Таким образом, мы избавляемся от необходимости из внешнего интернета стучаться к роботу, узнавать его IP и т. д. и т. п. Вместо этого, робот сам выходит изнутри-наружу, смотрит, что ему пишут, и выполняет…
Каждый пилот может управлять своим роботом в течение времени, которое определяется админом до игры. После того, как время пилота закончено, сайт отключает его от системы управления и в игру запускается следующая партия пилотов…
Обычные зрители (не пилоты роботов) могут наблюдать за игрой со страницы общедоступной трансляции.
Кстати говоря, сейчас как раз идёт Чемпионат мира по хоккею (12-28 мая), но наше состязание даёт возможность не просто смотреть на спортсменов, а и самому попробовать побороться с командой соперников! Роботы будут двух цветов — жёлтого и зелёного, так что намечается нехилая заруба всех одного цвета против всех другого…
Система работает в режиме бета-теста, поэтому возможны различные накладки, за что заранее просим прощения.
И в конце, когда ты знаешь, как всё устроено, зададим главный вопрос — итак, поехали? ;-)
UPD:
Заезды для читателей завершены. Кто знает, возможно мы ещё вернёмся с улучшенной версией.
Telegram-канал с розыгрышами призов, новостями IT и постами о ретроиграх ????️
Комментарии (29)
VanaEestlane
23.05.2023 13:16+3Вам стоит пообщаться с человеком, который сможет вам объяснить, как устроена сеть. А то у вас путаница в тексте.
piton369
23.05.2023 13:16+2А ещё игры будут?
editor_ruvds
23.05.2023 13:16+3Да. Мы планируем провести как минимум еще два заезда 24 и 25 числа. Следите за новостями и обновлениями в этом посте или в нашем телеграм-канале.
PitAlex
23.05.2023 13:16+1еще бы и время более позднее
editor_ruvds
23.05.2023 13:16Мы как раз сейчас оценим в первый день степень интереса и на следующий день поменяем график в случае чего. Возможно поставим старт на попозже.
editor_ruvds
23.05.2023 13:16+1Мы немного обновили алгоритм. Вы можете до 20:40 записываться в очередь в любое время. Постараемся покатать всех :)
piton369
23.05.2023 13:16+4Мне понравилось)) Спасибо за проделанную работу)) Управление немного непривычное, ожидал, что сейчас там буду всех обыгрывать, а по ощущениям учился заново ходить)) Просьба перевесить камеру наверх, потому что иногда не попадаешь, потому что не получается определить местоположение и дистанцию. Может быть ещё получится что-то сделать с задержкой видео и фризами, иногда улетал на другую часть стола или промахивался. И большая просьба выровнять стол, чтобы не было автогола жёлтым и автовратаря зелёным)) Ну и успехов! Буду участвовать ещё))
rudoorrateus
23.05.2023 13:16А что значит: Твой номер в очереди 3 из 132? С какого края?
art1fact
23.05.2023 13:16Вы видимо уже на следующую очередь пытаетесь записаться :)
Анонс для второй записи будет завтра.
DIMooo
23.05.2023 13:16+1Интересно. Почему бы не забить на аккумуляторы и просто со стола брать заряд, пример - детские машинки в старых парках развлечений железный пол и сетка вверху, ещё и искры красивые у хоккеистов будут :)
А вот тут - "прошивку робота ... выложить не могу, так как там много разных интересных наработок" обидно стало.
DAN_SEA Автор
23.05.2023 13:16Была такая мысль — брать напругу с штанги и стола. Но это надо сетку металлическую над столом вешать, которая будет закрывать роботов от камеры. Этот вариант прокатит в случае FPV-управления, но у нас не так.
Есть мысль сделать беспроводную передачу электричества- катушка под всем столом. Но это пока в чисто теоретических измышлениях...
Plesser
23.05.2023 13:16+1Был похожий проект, вот https://habr.com/ru/articles/460751/ и вот https://habr.com/ru/articles/460925/
editor_ruvds
23.05.2023 13:16+2Запись на вторую игру открыта! Заезды начнутся в 18:40. Записаться можно уже сейчас через нашего Telegram-бота.
editor_ruvds
23.05.2023 13:16Игра началась!
Небольшое нововведение: если вам понравится заезд, то вы сможете встать в очередь прямо во время игры. Если останется время, мы дадим вам возможность покататься повторно ????Также в целом в очередь могут вставать все желающие.
Трансляция заезда доступна здесь.
editor_ruvds
23.05.2023 13:16+3Запись на третью (и последнюю) игру открыта! Заезды начнутся в 18:40. Записаться можно уже сейчас через нашего Telegram-бота.
raamid
Очень интересно. А можно видео процесса игры выложить?
editor_ruvds
Да! Мы планируем прямую трансляцию для зрителей. Ближе к старту игры напишем, куда заходить.
art1fact
Прямая трансляция доступна с канала одного из создателей роботов вот здесь.