
Соревнования
Как это происходит в нормальном режиме. Есть АгроВУЗы, являющиеся региональными площадками. Есть команды школьников из сельскохозяйственных регионов. Есть полигон, имитирующий наши необъятные просторы и есть робот на дистанционном управлении. Робот поставляется в виде конструктора и команда перед соревнованиями его собирает. На соревнованиях робот под управлением оператора за определенное время должен выполнить задания на полигоне: перевезти тюки сена, переместить бидоны, посадить картошку, вспахать поле. За выполнение заданий и прохождение участков полигона команда получает баллы, за ошибки штрафы. Соревнования проходят 2 дня. Вот так это выглядело в Белгороде



Робот это радиоуправляемая 6-ти колесная тележка с различными специальными исполнительными механизмами. За основу шасси взята кинематическая схема от марсохода Curiosity. На роботе имеется: схват совмещенный с отвалом, устройство для посадки картофеля и плуг. Детали робота изготовлены лазерной резкой из листа дюраля Д16 толщиной 2мм и 3D печатью ABS пластиком. Робот управляется Arduino совместимым контроллером нашей разработки, в качестве пульта беспроводной геймпад. Назвали мы его Агробот.

Полигон это 35 квадратных ячеек, каждая ячейка размером 800х800мм. На полигоне имитируются разные типы местности и строений: холмы, леса, мосты, эстакады, овраги и т.д. Ячейки полигона произвольно стыкуются друг с другом и, в результате, получатся реконфигурируемый испытательный полигон сельскохозяйственной направленности.

Робот, полигон и соревнования полностью нашей разработки от идеи до воплощения в фанере, металле, электронике, коде и самом мероприятии. Все под ключ! Возможно, будет отдельная статья.
В мае 2019 года мы поставили полигоны и конструкторы в 10 городов и успешно провели соревнования. В мае 2020 года соревнования должны были пройти в 9-ти новых городах: Санкт-Петербург, Москва, Орёл, Барнаул, Уфа, Рязань, Омск, Пермь, Самара. С начала года началась работа по изготовлению 9-ти полигонов и 120-ти конструкторов, с планами провести соревнования во второй половине мая И, как вы, наверное, уже догадались, планы пришлось

Проблема
К марту уже стало понятно, что соревнования переносятся на неопределенный срок: начались перебои с поставками комплектующих и изготовлением деталей полигонов, каникулы в масках и прочая самоизоляция в общем, вам все это известно. Понимая не радужные перспективы, организаторы конкурса АгроНТИ попросили что-то придумать в мае, чтобы ребята не скучали и, при этом, все должно быть дистанционно

В сухом остатке: у нас имеется тестовый полигон и несколько тестовых Агроботов, все это находится в Санкт-Петербурге. Как этим рулить из Уфы или Рязани решительно не ясно. А есть еще и Уссурийск!!!
Но, мы же, вроде, робототехники, 21-й век на дворе!!! Интернет Телеуправление И вот это вот все!
Слабая надежда
В нашей лаборатории имелись наработки по электронике для мобильных роботов на базе Raspberry Pi, в частности, почти готовые платы-шилды для Raspberry Pi в основе которых был микроконтроллер Atmega328p. На плате также расположен драйвер коллекторных двигателей L298P на 2 канала, 4 канала управления сервами, динамик и разъем для подключения OLED дисплея 128х64pix.

С Raspberry Pi плата общается по шине i2c и под плату написана библиотека ПО на языке Python, обеспечивающая программный интерфейс взаимодействия с железом. Все немного сыроватое, но, главное, платы есть. Вот они, бери!
Агробота мы, в свою очередь, проектировали таким образом, чтобы в него можно было поставить Raspberry Pi на место штатной платы Arduino и тут, как вы понимаете, звезды сошлись!
Достали с полки Агробота

И тут встал вопрос, как запитывать робота, так как штатно он питался от 2-x Li-Ion
Полигон
Итак, с роботом более-менее понятно, теперь полигон. Решено было разместить полигон недалеко от лаборатории. Уже было понятно, что придется частенько бегать к нему во время проведения соревнований, а это лучше делать сидя в комфортных условиях рабочего места, да и текущую работу никто не отменял! Как раз рядом оказался
Помимо камер на роботе, очевидно, нужны еще камеры на полигоне. Придумано, сделано Заказали IP камеры: одну под потолок над полигоном и две по диагонали. Все камеры с POE, поэтому еще приобрели РОЕ коммутатор, который впоследствии стал коммутатором всей системы, все оборудование бюджетное Hikvision. Благо, что поставщики работали и все было в наличии. Камеры разместили на местах, проложили ethernet-кабели от камер до места установки коммутатора.

Инфраструктура
Настало время прорубать окно в
Итого: робот на полигоне, сервер в серверной, камеры вокруг, все в проводах, но еще не организована связь с роботом и упущен один важный момент: полигон стоит в холле, вокруг люди ходят, работа кипит, обязательно будут зрители и им непонятно что происходит, нужен генеральский интерфейс, по простому телевизор (панель), на который будут выводиться трансляции с камер, а так как трансляции кто-то должен выводить, то нужен компьютер под этот телевизор и этот же компьютер может и быть wi-fi точкой доступа для робота, два в одном! Тут в кусты закинули очередной рояль: cо старого проекта лежал непригодившийся промышленный компьютер с wi-fi и HDMI. Под комп и коммутатор были напечатаны крепления на 3D принтере и все оборудование размещено на стойке под телевизором.

На комп установили ОС Ubuntu 18.04 и собрали утилиту create_ap. С помощью этой утилиты создается точка доступа и мост (brige) между проводным ethernet интерфейсом и wi-fi, причем в одну строчку из командной строки и без бубна! Весчь!!! Роботу прописали в конфигах подключаться к этой точке доступа. Параллельно к месту установки стойки с телевизором, компьютером, коммутатором и полигоном наш отдел АХО протянул ethernet кабель, а IT-отдел соединил все это хозяйство с сетью лаборатории в одну подсеть. Итого: все IP-камеры, робот и компьютер через коммутатор подключены к внутренней сети лаборатории, к которой также подключен сервер смотрящий в Интернет. Все пингуется, пакеты летают, картинки с IP-камер транслируются в VLC, все удаленно по SSH подключается, везде
Ну обо всем по порядку.
Управление роботом
Телеуправление было решено делать на базе протокола UDP, так как система должна работать в реальном масштабе времени и у нас в лаборатории имелись некоторые наработки по этой тематике. В двух словах: программа управления на компьютере участника ловит нажатия клавиш и посылает 10 раз в секунду на робота UDP пакет. В пакете закодированы порядковый номер пакета, значения скоростей на двигатели, положение сервомоторов, уникальный ключ и контрольная сумма, для контроля целостности данных. В свою очередь, на роботе запускается программа, которая открывает UDP порт и принимает пакеты, проверяет контрольную сумму, сверяет ключ и, если все хорошо, задает скорости на моторы и выставляет положения сервоприводов. Программы были написаны на Python. Управление только с клавиатуры, так как она точно есть у всех участников. UDP порт, на котором робот будет принимать пакеты и уникальный ключ генерятся программой случайным образом это такая защита от несанкционированного подключения. На сервере с помощью iptables был настроен проброс пакетов, т.е. UDP пакет пришедший на внешний IP адрес сервера, автоматом пересылался на робота. Программу управления, написанную на Python с помощью PyInstaller преобразовали в исполняемый файл под OC Windows. И все это протестировали на школьнике, сидящем дома в изоляции в соседнем доме. Робот ожил, покатался по лабе, подъехал к блоку питания и

Видеотрансляция
На момент начала этой эпопеи, мы плотно работали с gstreamer, то есть, могли слать видео точка-точка, а вот как реализовывать видео трансляции точка-много браузеров, понятия не было никакого. Ну, как говорится,
На просторах гитхаба обнаружили проект v4l2rtspserver, который без проблем собрался на Raspberry Pi и при запуске из командной строки создал RTSP сервер, подключившись к которому из VLC, мы увидели картинку с курсовой камеры робота! Настроив проброс пакетов на сервере, удалось увидеть картинку с робота и на компьютере коллеги, находящегося далеко за пределами Санкт-Петербурга. Но при подключениях одновременно с разных компьютеров начинала расти загрузка ЦП Raspberry Pi и стало понятно, что при реальных нагрузках в десятки человек Raspberry Pi не выдержит, да и IP-камеры позволяют отдавать не более 6 потоков. Продолжаем гуглить в Яндексе И внезапно, нахожу статью на Хабре Встраиваем WebRTC плеер для живых трансляций с вебкамер и IP камер Так вот же оно!!!

Все уже придумано! Захожу на сайт flashphoner.com. То что нужно, бинго! К сожалению, продукт платный, но наверняка же есть и другие. Снова гуглеж, который меня выводит на проект webrtc-streamer. Ссылка показалась подозрительно знакомой ну, конечно, это же еще один проект того же автора, что и v4l2rtspserver, он был всего в паре кликов! Качаю, собираю проект на сервере, в конфигурационном json файле прописываю ссылки на RTSP стримы с камер, запускаю из командной строки и получаю веб-сервер с готовой страницей с трансляциями со всех камер. Отправляю все данные
I am sorry if I not really answer to this question that was debated many times.Опенсорс, который мы заслужили! После были попытки собрать и установить другие решения, но все тщетно, только терял время.
Итак возвращаюсь к WebCallServer от компании Flashphoner.
Скачал, установил, получил и активировал Trial лицензию на месяц, все прошло без проблем. Скачал и установил веб-сервер apache. Коллега по разработке написал пробную версию страницы с трансляцией с камер, все заработало, задержки в видео были на приемлемом уровне. Бубен, конечно, местами был нужен, но, в целом, работает! Документация у WebCallServer мое почтение, на форуме техподдержка оперативно отвечает на вопросы. К этому времени IT-отдел организовал доменное имя agro-online.rtc.ru и на него получили SSL сертификат от LetsEncrypt. Всю систему перевели на HTTPS и допилили страницу с трансляцией и генеральским интерфейсом. Система трансляций заработала, загрузка сервера не выходила за разумные пределы. Перед соревнованиями оплатили лицензию WebCallServer на 2 месяца и её активировали. В целом решением на базе WCS остался доволен. Что в результате видит участник:

Тесты, грабли и продакшн
Робот постепенно из состояния чучело валенка начал обретать финальный вид, распечатанные на 3D принтере детали занимали свои места.

Начались полноценные тестовые заезды уже из регионов, которые выявили недоработки в конфигурации полигона, что было оперативно поправлено. От кабеля питания на роботе отказались очень сильно затруднял движение, наматывался на колеса и 5 Ампер блока питания не хватало при пиковых нагрузках, Raspberry Pi банально улетал в перезагрузку. Робота перевели на Li-Po АКБ с емкостью 6 Ампер*час, хватает на полдня активной работы и добавили индикатор заряда батареи. С трансляцией оказалось не все гладко: трансляция с камер на роботе при активной езде периодически падает, помогает перезагрузка страницы, правда, не сразу. И вылезла бага со схватом: он периодически непроизвольно разжимался. Времени искать причины уже не было, надо было начинать соревнования. Поэтому было объявлено, что это не баг, а фича и описано в инструкции к роботу
Пришли камеры из Китая, но доставка Aliexpress перепутала наклейки на пакеты и мне пришел пакет адресованный гражданке из Нидерландов, а там скажем так это не совсем те камеры, что я заказывал. Смешно получилось. Выручили ребята из соседнего отдела, за что им спасибо!
Организация соревнований
Оставалось дело за малым все организовать! Была разработана документация соревнований: регламент, инструкция для робота, памятка по балльной системе и протокол заезда. Вместе с ПО управления роботом, документацию выложили на сайте для свободного скачивания участниками. Технически мы могли пропустить
Проведение
День сурка существует! С утра поставить на робота свежую АКБ, включить комп и телевизор, на компе открыть страницу с генеральским интерфейсом, на рабочем месте зайти в терминал, запустить точку доступа на компе, дождаться подключения робота к ней. На роботе, также через терминал, запустить трансляции с камер. Убедиться, что есть картинка. Привести полигон в порядок: разложить тюки и бидон по своим местам, зарядить в робота картофан, расставить коров. Параллельно в региональной группе поинтересоваться, о готовности участников и все ли понимают, что тут вообще происходит.
Перед стартом, в группе спросить очередного участника готов ли он, по готовности и достижении на часах времени старта запустить в терминале программу на роботе, указав в параметрах программы имя, фамилию и город участника. После запуска программа выдает сгенерированные порт и ключ, их копирую в буфер обмена и отправляю в личном сообщении участнику.

Далее необходимо посмотреть вывод логов, пошли ли корректные UDP пакеты на робота. Можно идти на полигон следить за заездом, в случае чего помочь участнику либо советом, либо делом. Если робот перевернулся, то поставить его на колеса. Во время заезда в зачет, за роботом следит судья непосредственно на полигоне и фиксирует все в протоколе. После заезда надо привести полигон в порядок и подготовить робота. После заездов протоколы фотографируются и выкладываются в региональную группу в WhatsApp. Общие результаты заездов выкладываются судьей в гугл таблицу.
И так каждый заезд и каждый день, пока не пройдут все участники всех регионов. На фото судья за работой

Что так и не заработало или заработало, но как то не так
- Как уже упоминал ранее это кабель для питания робота, свисающий с потолка. От него отказались на этапе тестирования и робота переделали на Li-Po аккумулятор. Решение изначально было ошибочным.
- Не удалось получить звук с микрофона камеры в браузере. WebCallServer не понимал поток со звуком идущий от v4l2rtspserver видео без звука работает, а вот то же самое видео, но со звуком увы нет.
- И имеются серьезные нарекания к стабильной работе v4l2rtspserver победить падения трансляций не удалось. Они конечно со временем восстанавливались, но к этому моменту оператор робота имел стертый палец от нажатий на клавишу F5, из-за тщетных попыток реанимировать трансляцию курсовой камеры.
По всей видимости от v4l2rtspserver будем отказываться и искать другое решение.
Ну и классика жанра за месяц соревнований все моторы на роботе были поменяны минимум по разу. Жгли их участники не щадя наших нервов!

Итог
Из оборудования и материалов были закуплены:
- IP-камеры HikVision 3шт
- POE коммутатор HikVision 1шт
- USB OEM камера на робота ELP 2шт
- Стенки на полигон -16шт
- Трос и крепеж 1шт
- Лицензия на WebCallServer на 2 месяца 1шт
Все остальные материалы имелись в наличии. Пластиковые детали для робота изготавливались на 3D принтере, существующее железо нещадно правилось напильником. На все ушло 3 месяца было задействовано 3 человека, двое из них студенты. Два месяца на разработку и месяц на проведение. Разработкой железа и софта занимались 2 человека, причем один удаленно и в лаборатории не появлялся. Проведение соревнований 2 человека: один техническое сопровождение и один судейство. Все в условиях изоляции, масок и прочих связанных с этим ограничений. Также хочу отметить, что были задействованы IT-отдел, хозяйственный отдел и информационно аналитический отдел, с их стороны все вопросы решались четко и вовремя.
В основном региональные представители и участники проявили высокую организованность, если участник по каким-либо причинам не мог стартовать, то представитель от региона оперативно разыскивали нового участника и у нас практически не получалось простоев, все время заездов было использовано.
В общей сложности в соревнованиях приняли участие 110 школьников из 19 городов от Санкт-Петербурга до Уссурийска. Можно сказать, что охватили всю Россию.

Получен бесценный опыт и опробован новый формат соревнований. У нас все получилось!!!











Используемое в данном проекте ПО
WebCallServer WebRTC сервер от компании Flashphoner, платная лицензия
create_ap Удобное создание точки доступа и сетевого моста
v4l2rtspserver RTSP сервер
webrtc-streamer WebRTC сервер, работает, но крайне нестабильно при нагрузках. В проекте не задействован.