Как-то раз мы сидели с другом и подумали: а что, если попробовать управлять вещами реального мира из мира виртуального?! Например, роботами. Мысль не новая, и в том или ином воплощении она широко распространена, например, в области 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 миллисекунд и менее, что субъективно человеком воспринимается как «практически мгновенно» (тем более, задержка видеопотока составляет большую величину).

Больше фотографий можно посмотреть здесь:
image

image

image

image

image

▍ Как всё работает


Для управления роботами была разработана специальная веб-система. Работает она следующим образом:

  1. Админ создаёт игру в специальном Telegram-боте, и все желающие могут встать в очередь на эту игру, так как роботов только шесть.
  2. После того, как админ запустит игру, всем зарегистрированным приходят логин и пароль для управления роботами из браузера.
  3. Когда человек получает свой логин и пароль, он логинится в системе управления, для чего открывает её в браузере по ссылке, которую мы дадим.
  4. На экране он видит картинку, транслирующуюся с камеры, установленной рядом с игровым полем, с помощью которой и управляет своими роботом.

Веб-страница, на которой он находится, ведёт захват нажатий клавиш с полноразмерной компьютерной клавиатуры (планшеты и смартфоны не подойдут).

Управляющие команды, генерирующиеся веб-страницей, отправляются MQTT-брокеру в ряд специальных топиков, которые постоянно мониторит и забирает/исполняет их оттуда соответствующий робот.

Маленькое пояснение, для тех, кто не в курсе, как работает протокол: веб-сайт пишет как бы в специальные «чаты», для соответствующего робота сообщения: «Слушай, езжай вперёд. А нет, стой! Езжай назад! Вот теперь езжай вправо… и т. д.». Робот постоянно мониторит эти чаты, ждёт, когда ему что-то напишут и выполняет эти команды в соответствии с логикой, которая определена у него в прошивке. Таким образом, мы избавляемся от необходимости из внешнего интернета стучаться к роботу, узнавать его IP и т. д. и т. п. Вместо этого, робот сам выходит изнутри-наружу, смотрит, что ему пишут, и выполняет…

Каждый пилот может управлять своим роботом в течение времени, которое определяется админом до игры. После того, как время пилота закончено, сайт отключает его от системы управления и в игру запускается следующая партия пилотов…

Обычные зрители (не пилоты роботов) могут наблюдать за игрой со страницы общедоступной трансляции.

Кстати говоря, сейчас как раз идёт Чемпионат мира по хоккею (12-28 мая), но наше состязание даёт возможность не просто смотреть на спортсменов, а и самому попробовать побороться с командой соперников! Роботы будут двух цветов — жёлтого и зелёного, так что намечается нехилая заруба всех одного цвета против всех другого…

Система работает в режиме бета-теста, поэтому возможны различные накладки, за что заранее просим прощения.

И в конце, когда ты знаешь, как всё устроено, зададим главный вопрос — итак, поехали? ;-)

UPD:

Заезды для читателей завершены. Кто знает, возможно мы ещё вернёмся с улучшенной версией.

Telegram-канал с розыгрышами призов, новостями IT и постами о ретроиграх ????️

Комментарии (29)


  1. raamid
    23.05.2023 13:16
    +5

    Очень интересно. А можно видео процесса игры выложить?


    1. editor_ruvds
      23.05.2023 13:16
      +3

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


    1. art1fact
      23.05.2023 13:16

      Прямая трансляция доступна с канала одного из создателей роботов вот здесь.


  1. ahllgov
    23.05.2023 13:16
    +4

    Интересная статья! Спасибо!


  1. dlinyj
    23.05.2023 13:16
    +3

    Интересно что получилось. Хотелось бы взглянуть.


    1. dlinyj
      23.05.2023 13:16
      +2

      К сожалению у меня были проблемы с получением трансляции видео. Но полагаю, что проблема была на моей стороне и поиграть не удалось. Значит в другой раз.


  1. VanaEestlane
    23.05.2023 13:16
    +3

    Вам стоит пообщаться с человеком, который сможет вам объяснить, как устроена сеть. А то у вас путаница в тексте.


  1. piton369
    23.05.2023 13:16
    +2

    А ещё игры будут?


    1. editor_ruvds
      23.05.2023 13:16
      +3

      Да. Мы планируем провести как минимум еще два заезда 24 и 25 числа. Следите за новостями и обновлениями в этом посте или в нашем телеграм-канале.


      1. PitAlex
        23.05.2023 13:16
        +1

        еще бы и время более позднее


        1. editor_ruvds
          23.05.2023 13:16

          Мы как раз сейчас оценим в первый день степень интереса и на следующий день поменяем график в случае чего. Возможно поставим старт на попозже.


        1. editor_ruvds
          23.05.2023 13:16
          +1

          Мы немного обновили алгоритм. Вы можете до 20:40 записываться в очередь в любое время. Постараемся покатать всех :)


  1. piton369
    23.05.2023 13:16
    +4

    Мне понравилось)) Спасибо за проделанную работу)) Управление немного непривычное, ожидал, что сейчас там буду всех обыгрывать, а по ощущениям учился заново ходить)) Просьба перевесить камеру наверх, потому что иногда не попадаешь, потому что не получается определить местоположение и дистанцию. Может быть ещё получится что-то сделать с задержкой видео и фризами, иногда улетал на другую часть стола или промахивался. И большая просьба выровнять стол, чтобы не было автогола жёлтым и автовратаря зелёным)) Ну и успехов! Буду участвовать ещё))


  1. rudoorrateus
    23.05.2023 13:16

    А что значит: Твой номер в очереди 3 из 132? С какого края?


    1. DAN_SEA Автор
      23.05.2023 13:16
      +1

      С начала.


    1. art1fact
      23.05.2023 13:16

      Вы видимо уже на следующую очередь пытаетесь записаться :)

      Анонс для второй записи будет завтра.


  1. DIMooo
    23.05.2023 13:16
    +1

    Интересно. Почему бы не забить на аккумуляторы и просто со стола брать заряд, пример - детские машинки в старых парках развлечений железный пол и сетка вверху, ещё и искры красивые у хоккеистов будут :)

    А вот тут - "прошивку робота ... выложить не могу, так как там много разных интересных наработок" обидно стало.


    1. DAN_SEA Автор
      23.05.2023 13:16

      Была такая мысль — брать напругу с штанги и стола. Но это надо сетку металлическую над столом вешать, которая будет закрывать роботов от камеры. Этот вариант прокатит в случае FPV-управления, но у нас не так.
      Есть мысль сделать беспроводную передачу электричества- катушка под всем столом. Но это пока в чисто теоретических измышлениях...


      1. Didimus
        23.05.2023 13:16

        Беспроводную зарядку под стол положить


        1. vassabi
          23.05.2023 13:16

          эээ ... а сколько их туда положить? одну ?


          1. Didimus
            23.05.2023 13:16

            Самим сделать. Несложно, вроде. Не надо же генератор отключать


  1. Plesser
    23.05.2023 13:16
    +1

    Был похожий проект, вот https://habr.com/ru/articles/460751/ и вот https://habr.com/ru/articles/460925/


  1. editor_ruvds
    23.05.2023 13:16
    +2

    Запись на вторую игру открыта! Заезды начнутся в 18:40. Записаться можно уже сейчас через нашего Telegram-бота.


    1. editor_ruvds
      23.05.2023 13:16

      Игра началась!

      Небольшое нововведение: если вам понравится заезд, то вы сможете встать в очередь прямо во время игры. Если останется время, мы дадим вам возможность покататься повторно ????

      Также в целом в очередь могут вставать все желающие.

      Трансляция заезда доступна здесь.


  1. boenu
    23.05.2023 13:16
    +1

    Погодите-ка, я уже видел эту статью чуть ли не год назад...


    1. art1fact
      23.05.2023 13:16

      Точно? Ссылочку бы посмотреть


      1. boenu
        23.05.2023 13:16

        1. art1fact
          23.05.2023 13:16

          Ну так ведь не эта же. Проект как раз с тех пор развился до вот такой стадии :)


  1. editor_ruvds
    23.05.2023 13:16
    +3

    Запись на третью (и последнюю) игру открыта! Заезды начнутся в 18:40. Записаться можно уже сейчас через нашего Telegram-бота.