Краткий туториал по созданию робота для соревнования автономных роботов Eurobot 2025 от студентов МИФИ с учётом опыта прошлого года.
Содержание:
I. Введение
II. Конструкция
III. Электроника
IV. Верхнеуровневое программирование
V. СИМы
I. Введение
Основной задачей в этом году была автономная сборка многоуровневых трибун из стройматериалов, расставленных в определенных зонах на игровом поле. Опыт прошлогоднего участия показал, что без хорошо подготовленного полигона для тестирования сделать, а главное — отладить, робота практически невозможно, потому сперва решили воссоздать поле из регламента в лаборатории инженерного кружка НИЯУ МИФИ.



Любое соревнование это в первую очередь стратегия. На выбор участникам предлагалось строить трибуны из одного, двух и трех ярусов, каждый из которых оценивался соответствующим количеством очков. Хоть нашей целью и была победа, но все же рисковать солидным количеством баллов из-за долгой и точной постройки трехъярусного варианта мы не стали, а выбрали быстрое сооружение двух двухъярусных трибун.
Так, с первыми вводными наши конструкторы приступили к работе над первым макетом.
II. Конструкция
Колесная схема
Неудачный опыт использования четырех Omni-колес в прошлом году показал свою несостоятельность, поэтому в этом сезоне мы остановились на хорошо зарекомендовавшей себя и в соревновательной сфере, и в промышленной робототехнике дифференциальной колесной схеме с двумя ведущими колесами.

Момент на колеса передается с двух бесколлекторных мотор-редукторов JGB37-3550 посредством ременной передачи (без редукции) с целью сместить тяжелые моторы в заднюю часть робота. Для поддержания устойчивости платформы под днищем также предусмотрена шаровая опора. Так как пятна контакта невелики, остро встает вопрос о качестве сцепления с поверхностью.
Были перепробованы несколько вариантов шин: просто пластиковый диск из PLA, синяя изолента, канцелярские резинки, шина из гибкого филамента BFGummy, силиконовые браслеты. Наилучшим образом себя показал силикон, поэтому было решено предусмотреть в диске место под вклейку двух силиконовых браслетов общей шириной 20 мм. Забегая вперед, стоит сказать, что данное решение не является идеальным, на рынке имеются более надежные варианты в виде готовых колес от Jsumo. В следующий раз мы хотим сохранить 3D-печатными диски, но попробовать отлить шины из жидкого силикона. По итогу в финальной версии ROCKHLYA клиренс составил ~10 мм при диаметре колеса 65 мм, линейная скорость робота была ограничена 0,3 м/с.
Укладчик
Укладчик – основной исполнительный механизм ROCKHLYA, обеспечивающий как сбор стройматериалов, так и постройку трибун. Преимуществом конструкции является возможность алгоритмизации постройки путем сведения ее к конечному набору простых поступательных движений. Также “Укладчик” позволяет за один наезд собрать все необходимые стройматериалы для одной двухъярусной трибуны, что сильно экономит время постройки.

Однако желание сразу собрать большую трибуну повлекло за собой множество проблем: Как взять столько банок и не уронить? Как разделить две доски между собой? Как обеспечить нужный вертикальный ход портала “Укладчика”? Как сохранить пассивный (≤ 1200 мм) и активный (≤ 1400 мм) периметры робота?…
В общем было много почвы для размышлений, но мы справились. В итоге получился механизм, обладающий 4-мя степенями свободы и 4-мя магнитными захватами. Укладчик способен вертикально перемещаться благодаря двум трапецеидальным винтам, интегрированным сразу в шаговый двигатель nema 17. Непосредственно в самом “Укладчике” расположены 3 сервопривода Waveshare ST3215.
Также к нему присоединены 4 магнитомеханических захвата, приводимых в действие сервоприводами MG90S 180 град с металлическим редуктором, при этом магнит помещается в центральную часть шестерни. Мы пробовали использовать парные электромагниты, но они не показали той же силы притяжения, что неодимовые при тех же габаритах. К тому же они сильно грелись спустя 20-30 с работы. Для разделения досок между собой был предусмотрен прижим в виде лопатки и толкатель на линейный подшипниках для выдвижения нижней дощечки.
Дверца

Разместить электронику решили вертикально для обеспечения беспрепятственного доступа к ней. С этой целью спроектирована откидывающаяся дверца с подвижным фиксатором, который перемещался внутри профиля V-slot.Также был распечатан защитный корпус для силовой платы.
Система локализации
Для точного планирования маршрута и следования роботу нужно сперва знать, где он находится. Одним из источников, с помощью которых это можно узнать, является камера, подвешенная к вертикальной стойке за пределами поля, которая отслеживает ArUco маркеры на роботе и передает их фотографии в центральный вычислитель. В соответствии с регламентом на робота обязательно крепится сверху один ArUco маркер с помощью липучки Velcro, id-номер которого связан с цветом команды. Но, поскольку в кадре этот маркер может периодически пропадать, например, из-за бликов от внешних источников, решили снабдить робота дополнительной группой из 2 неподвижных больших и 4 съемных маленьких ArUco маркеров. Такое решение обеспечило непрерывное получение позы робота в любом его положении на поле.

Также в верхней части робота под мачтой (куб с ArUco маркерами) расположен LiDAR S3. Поскольку данный LiDAR имеет угол обзора в 360°, требовалось максимально сократить количество заслоняющих элементов, поэтому мачту установили на две резьбовые шпильки M5 с дополнительным упором на верхнюю крышку LiDAR.
Общий вид
По большей части конструкция робота состоит из вырезанных на лазерном станке фанерных деталей толщиной от 4 до 8 мм, множества 3D-печатных деталей из PETG и PLA и алюминиевого профиля V-slot 20x20, служащего рамой робота. Все детали были спроектированы в отечественном САПР КОМПАС-3D, рендеры подготовлены в Autodesk Inventor. 3D модель робота ROCKHLYA.

III. Электроника
Для обеспечения высокого качества и стабильной работы робота сквозной цикл разработки электрической схемы был разбит на 10 основных этапов:
Подбор электронных компонентов (ЭКБ)
Первичная проверка ЭКБ и тестирование
Разработка эскиза электрической схемы
Проектирование печатных плат
Верификация правил проектирования DRC, LVS
Тестирование изготовленных печатных плат
Комплексная сборка всех электронных модулей
Тестирование на статический пробой ESD
Испытания на электромагнитную совместимость
Финальное тестирование системы
1. Подбор электронно-компонентной базы
Разработка электрической схемы робота начинается с тщательного подбора электронно-компонентной базы. Ключевыми требованиями при формировании элементной базы стали:
Гибкая интеграция электронных узлов
Эргономика монтажа
Оптимальный баланс стоимости и качества
Надежность
Быстродействие
Масштабируемость
Блок удаленных вычислений
В качестве устройства, которое должно было взять на себя вычислительную нагрузку был выбран Mini PC GenMachine AMD Ryzen 9 6900HX. Для экономии средств ОЗУ(16 Гб) и SSD(512 Гб) диск мы покупали отдельно.
Силовая электроника
Система электропитания построена на базе высокоемкого литий-полимерного аккумулятора Tattu 10000 мАч 22,2В (6S) 30C. Для распределения питания по электронным узлам была реализована многоуровневая архитектура с четырьмя независимыми линиями, формируемыми понижающими DC-DC преобразователями, что гарантировало стабильные параметры питания для каждого модуля. Выходная цепь аккумулятора была оснащена безыскровым переключателем.
Для формирования стабильного 5-ти вольтового питания в системе использовалась плата распределения питания Matek PDB 5V/12V, обеспечивающая опорное напряжение с минимальными пульсациями ±2%. Данная линия питания задавала опорное 5-ти вольтовое напряжение для схем аналого-цифрового преобразования и резервных пинов.
Стабилизатор напряжения Matek BEC 12S-PRO формировал 12-ти вольтовое стабилизированное питание для высокоточного сервопривода ST3215 Waveshare. Данное решение обеспечило сервоприводу номинальный крутящий момент и высокую точность позиционирования, а также защиту от перепадов входного напряжения.
Для питания сервоприводов MG90 использовался понижающий преобразователь постоянного напряжения LM2596, выходное напряжение которого составляло 6В. Данное решение полностью соответствовало требованиям системы, поскольку сервоприводы MG90 не нуждались в высокой точности позиционирования и могли корректно работать при допустимых колебаниях питающего напряжения ±5%.
Для коммутации силовых цепей питания робота использовалось электромеханическое реле R2G2CH012, обеспечивающее надежное замыкание/размыкание цепей с током до 10А и постоянным напряжением до 30В. Благодаря механической конструкции контактной группы, реле обеспечивает нулевое падение напряжения в рабочем состоянии и гальваническую развязку между управляющей и силовой цепями.
Для точного управления движением подъемника использовались двухфазные шаговые двигатели Nema 17 с драйвером TMC2160, обеспечивающие высокую точность позиционирования и плавность хода. Данная сборка позволяет достигать точности перемещения ±0,05 мм при сохранении стабильного крутящего момента до 50 Н·см, обеспечивая при этом энергоэффективную и бесшумную работу системы с защитой от перегрузок и возможностью адаптивного управления током
Приводная система робота построена на базе высокомоментных бесколлекторных мотор-редукторов JGB37-3550 с питанием 24 В, обеспечивающих высокий крутящий момент при компактных размерах. Управление скоростью вращения реализовано через 3,3-вольтовый ШИМ-сигнал, генерируемый микроконтроллером Raspberry Pi Pico, что позволяет плавно регулировать обороты двигателей с высокой точностью.
Подвижные механизмы подъемника приводились в движение тремя высокоточными сервоприводами ST3215 Servo Waveshare (30 кг·см, точность 0,1°), управляемыми через цифровой драйвер Serial Bus Servo Driver Board, что обеспечило плавное позиционирование с возможностью тонкой настройки параметров движения и интеграцией в систему верхнего уровня через UART-интерфейс.
Привод захватов реализован на четырёх сервоприводах MG90S. Для увеличения нагрузочной способности каждого из сервоприводов подаваемое напряжение составляло 6В, что являлось выше номинального (5В). Управление осуществлялось через два буферизированных ШИМ-канала с Raspberry Pi Pico 2, гарантируя точное позиционирование и синхронную работу всех сервоприводов.
Низковольтная электроника
Основным вычислительным модулем робота служил одноплатный микрокомпьютер Raspberry Pi 4, оснащенный 64-разрядным четырехъядерным процессором ARM Cortex-A72 с тактовой частотой до 1,5 ГГц и оперативной памятью объёмом 8 ГБ LPDDR4. Для стабильного энергоснабжения системы использовался резервированный источник питания (100 Вт Power Bank) с опорным напряжением, что обеспечивало бесперебойную работу даже в условиях колебаний основного питания. Данная конфигурация позволила достичь высокой производительности при компактных размерах и низком энергопотреблении.
Связь между микроконтроллером и Raspberry Pi 4 организовывалась по Micro ROS благодаря имеющемуся прошлогоднему опыту, а также удобству интеграции в ROS2. Список МК, поддерживающих Micro ROS, можно найти на официальном сайте. Заметим, что реально Micro ROS можно установить на большее количество МК – практически на все STM, у которых хватит RAM – об этом можно почитать здесь. В прошлый раз выбор пал на недорогой и относительно мощный Raspberry Pi Pico. Однако в 2024 году Raspberry выпустили улучшенный вариант своего МК на базе RP2350. От своего предшественника он отличается прежде всего увеличенной тактовой частотой и наличием модуля FPU, благодаря чему производительность его сильно возросла. Поэтому в этот раз мы выбрали Raspberry Pi Pico 2. Ниже представлена сравнительная таблица наиболее распространённых микроконтроллеров.
Отладочная плата |
Raspberry Pi Pico 2 |
Raspberry Pi Pico |
STM32H562 |
STM32F411CEU6 |
Микроконтроллер |
RP2350 |
RP2040 |
STM32H562 |
STM32F411CE |
Архитектура |
Dual Core Arm Cortex-M33 |
ARM Cortex-M0+ dual-core |
Arm Cortex-M33 |
ARM Cortex-M4 |
Частота ядра |
150 МГц |
133 МГц |
250 МГц |
100 МГц |
Оперативная память (RAM) |
520 КБ |
264 КБ |
640 КБ |
128 КБ |
Встроенная память (Flash) |
4 МБ |
2 МБ |
1 МБ |
512 КБ |
GPIO |
26 |
26 |
45 |
16 |
SPI |
2 |
2 |
6 |
3 |
I2C |
2 |
2 |
4 |
2 |
UART |
2 |
2 |
12 |
3 |
Питание Raspberry Pi Pico 2 осуществлялось через USB-интерфейс Raspberry Pi 4, что обеспечивало стабильное энергоснабжение и упрощало общую схему электропитания системы.
Одним из ключевых средств локализации робота выступал лазерный лидар SLAMTEC RPLIDAR S3, обеспечивающий сканирование окружающего пространства в радиусе до 40 метров и точностью позиционирования ±30 мм. Для корректной работы системы использовались реперные маяки, установленные по периметру рабочего поля. Лидар подключался к Raspberry Pi 4, который не только управлял его работой, но и обеспечивал его питание, что упрощало интеграцию в общую систему и снижало потребность в дополнительных источниках.
Для точного позиционирования робота в пространстве применялся 10-осевой ROS IMU, датчик построенный на базе 32-битного процессора ARM DSP. При помощи комплектного usb-uart преобразователя данный датчик может быть напрямую подключен к микрокомпьютеру Raspberry Pi 4, что в целом увеличивает стабильность системы.
Цветной дисплей TFT LCD ST7735S использовался в качестве визуализации динамического подсчёта очков с выводом соответствующих значений на экран. Дисплей получал питание 5V от платы распределения Matek PDB, обеспечивая стабильную работу без перегрузки основной системы. Управление и передача данных осуществлялись по SPI-интерфейсу через Raspberry Pi Pico 2.
Для задания крайнего верхнего и нижнего положения подъемника использовались микровыключатели которые через резистивный делитель на плате были подключены к дежурной 5-ти вольтовой линии питания. Таким образом, с “концевиков” снималось напряжение 3,3 В, которое в виде цифрового импульса подавалось на последующую обработку микроконтроллером.
2. Первичная проверка ЭКБ и тестирование

По мере поступления всех электронных компонентов параллельно конструкционной сборке робота проводилось тестирование всех электронных модулей с последующей сборкой в единые функциональные узлы. Первые испытания начались с отладки колесной базы.

Второй этап – тестирования лидарной системы.

Третьим и наиболее ответственным и технически сложным этапом стало тестирование подъемного механизма и системы захвата. В ходе испытаний выявилась недостаточная мощность стандартных сервоприводов MG90 для обеспечения надежного удержания при захвате. Для решения проблемы было принято решение о повышении питающего напряжения до 6В (при номинальных 5В), что потребовало тщательного контроля за температурным режимом и нагрузкой.
На основании комплексных испытаний всех функциональных узлов подтвердилась целесообразность использования выбранной электронно-компонентной базы в окончательной конструкции робота. Полученные результаты тестирования, продемонстрировавшие стабильную работу системы в различных режимах, позволили сделать вывод о готовности перехода к следующему этапу разработки.
3. Разработка эскиза электрической схемы
Проектирование электрической схемы велось в среде Altium Designer. Финальная схема была разбита на 8 блоков, каждый из которых представляет собой законченный электронный узел робота. Ключевая идея работы схемы заключается в создании 4 независимых линий питания:
Основная силовая шина 24 В для питания ходовых двигателей, подключенная напрямую к аккумуляторной батарее
Линия 12 В для высокомоментных сервоприводов ST3215
Стабилизированная 6 В линия для сервоприводов захвата
Вся управляющая логика записывалась от 5 В линии.
Такое разделение питающих напряжений позволило обеспечить оптимальные рабочие параметры для каждого типа нагрузки, минимизировать взаимные помехи между силовыми и управляющими цепями, повысить общую энергоэффективность системы и упростить диагностику и обслуживание отдельных узлов.
В системе управления питанием робота были использованы электромеханические реле R2G2CH012, обеспечивающие централизованное включение/отключение всех линий питания (24В, 12В, 6В и 5В) через концевой переключатель, расположенный в верхней части корпуса робота для удобства экстренного обесточивания.
В целях максимально эффективного использования свободной площади платы и повышения отказоустойчивости системы, конструкция включала резервные интерфейсные выводы для критических сигнальных линий, а также реализовывала статическую коммутацию цепей питания посредством джамперов, что обеспечило как компактность топологии печатной платы, так и гибкость конфигурации при отладке.

4. Проектирование печатных плат
После проработки полной схемотехники мы разделили общую схему на две печатные платы: питания и управления. Для каждой из плат были созданы специализированные библиотеки, включающие как символьные обозначения (принципиальные схемы), так и точные топологические модели (посадочные места и трассировку) всех используемых компонентов.
Плата управления

Плата управления представляет собой центральный узел робота, интегрирующий все ключевые компоненты: функциональные микроконтроллеры, управляющие датчики, исполнительные устройства, а также интерфейсы для связи с периферией. Для лучшей электромагнитной устойчивости платы одна из сторон была полностью залита полигоном земли. Для минимизации обратных токов и нежелательных наводок со стороны моторов, на плату были смонтированы сглаживающие конденсаторы и диоды Шоттки. Кроме того, силовые линии с высоким токопотреблением выполнены в виде широких полигонов, что снижает их импеданс, уменьшает нагрев и повышает общую надёжность системы.

На плате управления реализованы все необходимые силовые и сигнальные выводы, обеспечивающие гибкость подключения и масштабируемость системы. Подготовлен 3D вид разработанной платы со всеми функциональными разъёмами и управляющими устройствами.
Плата питания

Плата питания была разработана с целью разделения силовых и управляющих цепей, обеспечивая их пространственную изоляцию. Плата содержит все описанные выше стабилизаторы напряжения, разъём XT60 для подключения аккумулятора, а также набор предохранителей для предотвращения перегрузки. Дополнительные контактные площадки обеспечивают паечное соединение с полигонами платы.
5. Верификация правил проектирования LVS, DRC
Перед передачей технологического файла в производство успешно пройдена комплексная верификация проекта, включающая проверку соответствия топологии печатной платы исходной электрической схеме (LVS-анализ), а также тщательный контроль соблюдения производственных норм и технологических ограничений фабрики через проверку проектных правил (DRC).
6. Тестирование изготовленных печатных плат
Изготовленные печатные платы успешно прошли первичное тестирование, подтвердив полное соответствие всем проектным требованиям, включая критически важные параметры минимального и максимального тока. После завершения монтажа электронных компонентов была проведена финальная проверка качества сборки: тесты на отсутствие короткого замыкания, надежность паяных соединений и целостность контактных площадок. Результаты испытаний подтвердили высокое качество изготовления, что гарантировало стабильную работу устройства в соответствии с заявленными характеристиками.

7. Комплексная сборка всех электронных модулей

На фото запечатлен этап комплексного тестирования: проверяется взаимодействие всех электронных модулей, включая силовые цепи, управляющую логику и периферийные устройства, чтобы гарантировать корректную работу системы перед вводом в работу.
8. Тестирование на статический пробой ESD
Для повышения надежности системы и защиты от статических разрядов обе платы были подключены к общему шасси робота и заземлены через специальный металлический контакт, расположенный в нижней части корпуса. Дополнительно выполнено заземление силовых цепей моторов, что исключило потенциальные пробои и наводки.
9. Испытания на электромагнитную совместимость
Для подавления паразитных наводок и электромагнитных помех все сигнальные линии были выполнены в виде витых пар, что значительно снизило уровень перекрестных наводок. В критичных узлах системы была применена оптимизация рабочих частот - снижение тактовой частоты отдельных устройств до минимально допустимых значений, не влияющих на общую производительность системы. Особое внимание уделено защите аналоговых трактов: на особо чувствительные входные цепи установлены буферные усилители с высоким входным сопротивлением и защитой от перегрузки.
10. Финальное тестирование системы

Во время первого тестового заезда в лаборатории, робот ROCKHLYA уверенно выполнил базовые операции, подтвердив корректность всех инженерных решений.
IV. Верхнеуровневое программирование
Архитектура
Опираясь на опыт прошлого года, были сделаны следующие изменения в архитектуре проекта:
Docker контейнеризация. Для решения проблемы с совместимостью частей кода. Также данное решение удобнее масштабировать и запускать.Стоит отметить, что для ускорения разработки в нашем решении мы отошли от концепции “один контейнер - одна программа/нода”.
Makefile. С его помощью можно делать запуск всего стека одной командой, при этом оставив возможность быстро запускать некоторые его части. Также в нем прописаны основные параметры, которые могут меняться в зависимости от условий запуска - карта, цвет команды, пути до файлов.
Для запуска части кода на RPi4 использовался отдельный shell-скрипт, который автоматически запускается при подаче питания.
Общий пайплайн

В начальный момент времени запускается предварительная карта, которая была построена эмпирически вручную. Далее с помощью камеры происходит локализация робота на карте. Для вычисления одометрии используется фильтр Калмана, который на вход получает данные с колес и IMU, а также с камеры и лидара.
Поскольку каждый датчик пространственно разделен на роботе, то для вычисления данных относительно одного base-фрейма используется URDF модель робота, которая публикует статичные трансформы между разными фреймами.

Движение робота из точки в точку работает на Nav2 - мощном пакете навигации и планирования движения для различных роботов. Он имеет достаточно большой выбор различных плагинов, но конкретно в нашем проекте мы использовали только глобальный планировщик(global planner), контроллер движения по траектории(controller server), планировщик траектории до цели(pathplanner). В процессе работы каждый из них выполняет следующие функции:
Глобальный планировщик на основе той карты которая была загружена изначально с учетом габаритов робота(его footprint) строит весовую карту(costmap).
Опираясь на весовую карту планировщик траектории строит, используя алгоритм А* путь до указанной точки на карте.
Контроллер движения отвечает за перемещение робота по карте на основании кинематической модели робота. Основную сложность настройки в нем представляет прописывание “критиков”, которые описывают характер движения - насколько сильно робот будет придерживаться траектории, штрафы за пересечение более “дорогих” областей весовой карты и то, в какой момент робот будет считать, что заданная конечная точка пути достигнута. На основании “критиков” будет считаться вектор скорости отправляться на драйвер колес. В нашем решении мы использовали сразу два контроллера - MPPIController и ThetaStarPlanner.
MPPIController был выбран, так как позволял гибко балансировать избегание препятствий и скорость передвижения по карте. ThetaStarPlanner позволял перестраивать маршрут в реальном времени, учитывая обновления карты, что было важно для избегания противника.
Параллельно работе плагина Nav2 работает еще две ноды:
1) Нода антистолкновений по 2D LiDAR.
2) Нода обновления карты, которая по запросу обновляет объекты на карте. Также данная нода в реальном времени наносила footprint робота противника по данным с камеры.
Последняя, самая “верхнеуровневая” нода, это менеджер стратегии. Она выдает команды в определенном порядке - координаты, куда следует ехать роботу в тот или иной момент времени, когда делать захват банок, постройку трибуны или обновление карты, а также ведет подсчет очков и контроль за временем матча.
Стратегия
При выборе стратегии мы ориентировались на стабильность, поэтому алгоритм поведения робота во время матча был достаточно простым.

Опускание плаката, публикация на экране 20 баллов.
Движение к первому набору банок (цифра 1).
Захват банок.
Движение к месту выгрузки первого набора банок.
Сборка трибуны, публикация на экране + 12 баллов.
Движение ко второму набору банок (цифра 2).
Движение к месту выгрузки второго набора банок(цифра 3).
Сборка трибуны, публикация на экране + 12 баллов.
Движение к месту ожидания(цифра 4).
Движение к месту финиша после 90-й секунды, чтобы СИМы успели доехать до сцены(цифра 5).
Отдельно рассмотрены случаи, когда робот не успевает по темпу выполнить какой-то шаг. В таком случае шаг пропускается и робот движется к следующему приоритетному шагу. В случае если робот замешкался, то после - 90-й секунды он бросает вообще все дела и мчится на финиш.
Логика захвата
Для взаимодействия Rasberry Pi Pico и Pi 4 использовался micro_ros_raspberrypi_pico_sdk.
Общий сценарий взаимодействия:
- Pi 4 отправляет в топик request один байт – номер команды и ждёт ответа в топике answer.


Настройка работы датчиков
Настройка камеры. Локализация по камере.
Калибровка камеры проводилась с использованием ArUco board. В свободном доступе есть достаточно примеров настройки данным способом.
Для локализации робота на поле мы установили один маркер на мачте, но при больших углах между оптической осью объектива и нормалью метки, данные о позе робота были очень шумными и были непригодными для ориентирования по ним при езде. Затем были испробованы различные методы постобработки изображения, в надежде на то, что шум можно будет исправить, повысив "читаемость" меток при схожем угле, но в конечном итоге, был использован только перевод в серый цвет, так как остальные методы давали какие-либо значимые результаты только после тонкой настройки параметров, что в условиях постоянно меняющейся среды было достаточно рискованно.
Поэтому решили использовать несколько маркеров, закрепленных на каждой стороне робота, так, у нас в поле зрения оказывался хотя бы один маркер, нормаль которого смотрела прямо в нашу камеру. Но после установки маркеров на робота возник вопрос о том, как объединять данные с нескольких камер. Были испробованы различные варианты, в рамках которых позиции каждого маркера устанавливался какой-то вес в зависимости от его площади и угла между нормалью и оптической осью, но ни к чему хорошему это не привело.
Тогда был опробован алгоритм projection error: расположение маркеров относительно друг друга определялось заранее, а потом наблюдаемое расположение точек в кадре подгонялось под заданную конфигурацию.
Итоговая статическая погрешность определения координаты - 2 сантиметра, позы - 3 градуса.
Настройка IMU
Особенность IMU состоит в том, что в состоянии покоя данные “плывут”. Для устранения дрейфа применялся следующий способ калибровки - робот оставался в состоянии покоя на 5 - 10 минут. В течение этого времени записывались данные с IMU. Далее вычислялось среднее квадратичное отклонение (все данные с IMU, кроме оси Z должны равняться нулю). Полученную ошибку в дальнейшей работе робота просто вычитали из текущих получаемых значений.
Настройка 2D LiDAR
Одним из основных факторов при выборе лидара на робота было наличие его интеграции в ROS2. Выбор пал на RP LiDAR S3. Из-за особенностей регламента и, как следствие, особенностей конструкции робота, часть обзора лидара пришлось ограничить. Поэтому локализация по лидару работала не всегда, в некоторые моменты времени робот не видел всех трех маяков. Чтобы не нарушать частоту публикаций, данные о лидарной локализации просто подменялись данными с камер.
Связующее ПО (Middleware)
Поскольку в нашем проекте мы используем, хоть и не большое количество датчиков, тем не менее, нам критически важно, чтобы данные с них приходили в реальном времени с постоянной частотой и минимальными задержками.
ROS 2 построен на основе DDS/RTPS в качестве промежуточного (middleware) программного обеспечения, которое обеспечивает обнаружение, сериализацию и транспортировку.
Вот встроенные реализации RWM:
- eProsima Fast DDS - используется по умолчанию
- Eclipse Cyclone DDS
- RTI Connext DDS
- GurumNetworks GurumDDS
Мы в качестве “Middleware” использовали Cyclone DDS, который настраивается с помощью файла cyclonedds.xml. Помимо этого настраиваются для разных топиков QoS(Quality of services). Подробнее о настройках можно прочитать тут.
Система антистолкновения
Система антистолкновения реализована на 2 вариантах - по камере(основной) и по LiDAR.
Помимо “нашего” робота камера также отслеживает ARUco маркер робота противника, и наносит его на весовую карту в качестве непреодолимого препятствия. Препятствие представляет собой окружность с радиусом, максимально допустимым регламентом. Таким образом, планировщик просто перестраивал траекторию, воспринимая робота противника как препятствие.
Второй вариант проще, он запасной. Если какая-то область лидарного скана находится слишком близко к роботу, то он останавливался до тех пор, пока лидарный скан не окажется на безопасном расстоянии.
Что происходило во время соревнований, как поменялся код, что не работало?
Как это обычно бывает, то что у нас работало в “домашних условиях” и на что мы рассчитывали на соревнованиях не заработало, поэтому пришлось адаптироваться. Далее будут приведены проблемы, с которыми мы столкнулись во время стартов:
Освещение - вообще не прямое и неравномерное. Камера не смогла нормально определять ARUco метки, поэтому от нее пришлось просто отказаться. Данный факт оказал очень болезненное влияние, но не критичное. Антистолкновение полностью перешло на LiDAR. От одометрии по камере тоже пришлось отказаться, а значит и от лидарной тоже, Осталась только одометрия по колесам и IMU.
В качестве initial pose, мы брали всегда одно и то же значение, которое предварительно задавалось до матча. Мы стартуем всегда из одной базы, при этом положение робота всегда отсчитываем по сбросу плаката.
На RPi4 на матчах отсутствовал интернет, а значит ее системное время не синхронизировалось со временем на PC. Отсюда время ROS2 сообщений вообще не совпадало и алгоритмы не работали как надо. Два дня мы не могли понять, почему у нас в лаборатории все работает штатно, а на соревнованиях ничего не работает. Эффект наблюдателя не иначе.
Ссылка в GiHub на репозиторий программного проекта робота ROCKHLYA.
V. СИМЫ
СИМы – вспомогательные роботы, основная задача которых заключалась в том, чтобы в определённое время выехать на поле, проехать по линии до своих мест и каким-либо образом создавать атмосферу «шоу». Для этого у робота должны быть подвижные части.
Почему Arduino — зло, а экономия — грех
На бумаге всё выглядело разумно: простой микроконтроллер Arduino Nano, датчики TCRT5000 для следования по линии и VL53L0X для предотвращения столкновений. Два аккумулятора LiFePO4, понижающий преобразователь, раздельное питание для моторов и логики — казалось, система должна работать.

Но реальность оказалась куда менее дружелюбной.
Проблема первая: TCRT5000 и их капризы
Датчики TCRT5000, выбранные из соображений экономии и предоставления необходимого функционала (для эффективной езды по линии требуется аналоговый выход у датчика), вели себя как настоящие диверсанты. Их показания хоть как-то напоминали правду только тогда, когда они были вплотную к полю, любой малейший сдвиг их положения приводил к тому, что робот переставал выполнять то, что от него ждала наша команда. В итоге роботы то слепо неслись мимо линии, то замирали в нерешительности, словно внезапно осознав тщетность своего существования.
Проблема вторая: Arduino и миф о простоте
Arduino Nano была выбрана за кажущуюся простоту программирования.
И отчасти это правда, потому что для работы с моторами и датчиками были использованы первые рекомендованные библиотеки из Arduino IDE, и все по-отдельности вполне себе неплохо заработало. Но когда потребовалось одновременно обрабатывать показания датчиков, управлять моторами и следить за столкновениями, выяснилось, что «простота» Arduino — это иллюзия.
Однопоточность превратила код в нагромождение delay() и костылей. Попытки реализовать что-то похожее на параллельные процессы лишь увеличили сложность отладки. Но в итоге вполне получилось обеспечить достаточно надежную работу роботов, без ярко выраженных задержек в действиях. Пришлось отказаться от ультразвукового датчика расстояния в пользу лазерного для реализации системы антистолконовения, так как ультразвук требовал задержек для корректной работы.
STM32 или хотя бы ESP32 дали бы нам реальную многозадачность и более точное управление временем.
Конструкция СИМ
Конструкция СИМ была создана, исходя из следующих требований:
1. Компактность. Стартовая площадка для робота имеет размеры 150 мм × 450 мм. Робот в высоту не может превышать 150 мм. Задействованные подвижные части конструкции должны добавлять к проекции периметра не более 100 мм.
2. Наличие подвижных частей. Они не должны значительно усложнять конструкцию.
3. Доступ к электронике. Для удобства калибровки датчиков, а также замены электронных компонентов при необходимости.
Были созданы СИМы двух типов: «Рокер» и «Фанат». Их конструкция различается только типом подвижного элемента – манипулятора.

Основные элементы конструкции
Колесная база
Деталь служит основанием робота. Здесь предусмотрены полукруглые выступы для крепления опорных колёс, место для установки двух датчиков линии TCP5000, преобразователя LM2596, двух мотор-редукторов N20 6V 200RPM, драйвера MX1508.
Крепления моторов

Прикрепляют мотор к колесной базе, фиксируют его, исключая люфт и прочие нежелательные перемещения. На мотор N20 крепятся резиновые колеса K346 43 мм с D-отверстием.
Корпус

Имеет достаточно сложную форму, т.к. необходимо предусмотреть: аккумуляторный отсек, отверстие под моторы, отверстие под сервопривод sg-90, отверстия для ключа и для кнопки аварийной остановки. Для доступа к электронике которая находится на основании робота, верхний ярус робота сделали выдвижным. Поэтому корпус с внутренней стороны имеет «рейки» - по ним будет перемещаться основание верхнего яруса. Спереди снизу у робота предусмотрена ещё одна выдвижная крышка, которая также обеспечивает доступ к электронным компонентам.
Корпус СИМы - «Рокера» отличается небольшим цилиндрическим выступом для крепления манипулятора и отверстием для прокладки проводов.
Передняя выдвижная крышка
Различается в зависимости от типа СИМы. Для «Рокера» крышка цельная, служит исключительно для доступа к электронике нижнего яруса. У «Фанатов» к крышке крепится датчик расстояния: VL53L0XV2.
Основание верхнего яруса

Прямоугольные отверстия предусмотрены для расположения проводов. Также предусмотрены отверстия для крепления сервопривода. На верхнем ярусе устанавливается микроконтроллер Arduino Nano.
Крепление сервопривода, крепление концевика и замыкателя

Фиксирует сервопривод на нужной высоте основания верхнего яруса. Концевик и замыкатель необходимы для обеспечения запуска «по шнуру» в соответствии с регламентом. При извлечении замыкателя цепь переходит в замкнутое состояние, начинается работа программы.
Верхняя крышка
Обеспечивает доступ к электронике верхнего яруса. Закрепляется с помощью толстой проволоки или иного гладкого вала подходящего размера.
Манипуляторы

Данный элемент конструкции различается у разных типов СИМ. Для СИМы «Рокер» создан манипулятор-гитара. К его основанию крепится лазерный дальномер. углубления на манипуляторе служат для прокладки проводов от датчика.
Для СИМы «Фанат» создан манипулятор-рука. Он более простой по конструкции, т.к. его основная функция – это движение после остановки СИМ на поле. В манипуляторе предусмотрено отверстие для какого-либо декоративного элемента, дополняющего образ «фаната». В обоих случаях манипулятор приводится в движение с помощью сервопривода.
Благодаря откидной верхней крышке не возникало сложностей с прошивкой микроконтроллера. Компоненты робота были крепко закреплены и не разбалтывались в процессе использования. Процесс сборки относительно простой, не требует специальных инструментов и может быть реализован одним человеком.
Роботы СИМа получились достаточно компактными, что позволило разместить в стартовой зоне одного «Рокера» и двух «Фанатов» и принести дополнительные баллы нашей команде.
Итоги
По итогам соревнований наша команда заняла почётное второе место, оказавшись в шаге от победы.
На связи команда Инженерного кружка НИЯУ МИФИ. Контактное лицо: Вальковец Данила.
Над Rockhlya работала команда Engi-Teams:
1. Антонов Сергей (программист)
2. Двинских Павел (электронщик)
3. Караваев Кирилл (электронщик)
4. Кузенков Александр (конструктор)
5. Маньшин Тимур (капитан-программист)
6. Мосиевских Илья (электронщик)
7. Напалков Вячеслав (программист)
8. Осипов Кирилл (конструктор)
9. Тимофеенко Михаил (SMM)
10. Чуйко Снежана (конструктор).
11. Ермаков Александр (Руководитель)
