Симулятор города для робота-курьера: Arduino Uno, физика и уступающие дорогу пешеходы

Прокомментировать Просмотры: 9

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

Наша интерактивная онлайн-платформа PinPort позволяет прямо в окне браузера конструировать электронные схемы и писать код для Arduino, который моментально выполняется встроенным эмулятором микроконтроллера. Базовые компоненты вроде датчиков и светодиодов присутствовали на сервисе давно, а со временем появились и мобильные роботы. На этот раз перед нами стояла амбициозная задача: смоделировать полноценный виртуальный мегаполис с дорожной сетью, автомобилями, пешеходами и светофорами, где автономный робот-курьер должен успешно доставлять грузы из начальной точки в целевую.

Получившееся устройство получило имя R-D6: конструкция базируется на шести колесах с возможностью разворота на месте. Логика его поведения задается не сторонними JavaScript-скриптами, а классическим управляющим кодом для Arduino Uno. Скетч компилируется на удаленном сервере посредством arduino-cli, после чего готовый бинарный файл потактово исполняется в эмуляторе чипа ATmega328P. Ниже мы подробно разберем внутреннее устройство этой системы.

Три кита архитектуры

Программный комплекс состоит из трех взаимосвязанных модулей, функционирующих абсолютно синхронно:

  1. Микроконтроллер. Процессорный эмулятор AVR обрабатывает прошивку на неизменной тактовой частоте 16 МГц, задействуя таймеры, ШИМ, интерфейсы I2C и UART.

  2. Физический движок. Шасси и корпус робота реализованы на базе твердотельных объектов Rapier (шесть колес и электромоторы), при этом шаг симуляции мира составляет ровно 2 миллисекунды.

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

Вычисления процессора и физики чередуются: за двумя миллисекундами эмуляции следует очередной шаг симуляции мира. За отведенный интервал времени специально разработанный класс считывает с выводов контроллера параметры ШИМ-сигналов для пинов ENA/ENB, а также логические уровни линий IN1–IN4 драйвера двигателей L298N, преобразуя их в реальное тяговое усилие. Обратная связь работает в противоположном направлении: дискретные датчики передают данные на линии D2/D3, в то время как дальномер и навигационный модуль взаимодействуют через регистровые структуры шины I2C.

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

Интерфейс датчиков на базе регистров

В реальных условиях лидар и модуль навигации обменивались бы данными с управляющей платой через последовательный порт по сложным протоколам. Для удобства пользователей мы реализовали более интуитивную концепцию — модель регистровых файлов, взаимодействующих по протоколу I2C. Первый байт запроса указывает адрес целевого регистра, после чего чтение потока данных происходит последовательно, аналогично популярным микросхемам MPU6050 или DS3231.

Компонент

Адрес

Передаваемые данные

Частота обновления

Лидар

0x52

36 угловых секторов по 10°, дистанция в сантиметрах (uint16), порядковый номер сканирования

10 Гц

Навигатор с системой распознавания светофоров

0x53

служебные флаги, статус разрешающего сигнала, идентификатор путевой точки, текущий курс, угол до цели, удаления, скорость, координаты

50 Гц

Полный пакет данных лидара весит 72 байта, тогда как стандартный буфер коммуникационной библиотеки Wire на плате Uno ограничен 32 байтами. В связи с этим специализированная библиотека RD6.h производит чтение тремя порциями по 24 байта строго в моменты обновления счетчика оборотов. Эта деталь в точности имитирует реальные аппаратные ограничения, с которыми неизбежно сталкивается любой разработчик встраиваемых систем.

Виртуальный дальномер функционирует путем трассировки лучей в движке Rapier. Каждый из 36 секторов содержит три луча (−3°, 0°, +3°), из которых выбирается ближайшая точка пересечения. Использование лишь одного луча на сектор приводило к тому, что тонкие опоры светофоров (около 14 см в диаметре) с пятиметрового расстояния проскакивали между ними, провоцируя столкновения. Максимальная дальность сканирования ограничена 20 метрами; если препятствия отсутствуют, датчик возвращает значение 2000 см.

Урбанистическая среда

Карта представляет собой регулярную сетку кварталов размером 3×3 с шагом 32 метра. Ширина проезжей части составляет 8 метров (по одной полосе в каждом направлении), ширина тротуарной зоны — 3 метра. На пяти ключевых перекрестках установлены светофоры, обслуживающие в общей сложности 16 пешеходных переходов. Стандартный цикл работы светофора длится 50 секунд: 20 секунд зеленого света для основного направления, 3 секунды желтого и 2 секунды полного запрещающего красного для всех участников. Пешеходная фаза активируется синхронно с попутным автомобильным потоком, причем последние 4 секунды разрешающий сигнал мигает.

Автотранспорт (в количестве 12 единиц) движется по выделенным полосам, останавливается перед запрещающими сигналами, соблюдает безопасную дистанцию и случайным образом выбирает направления на перекрестках. Маневры поворота выполняются по плавным траекториям: правый поворот описывает дугу вокруг угла бордюра радиусом 2 метра, левый — радиусом 6 метров. Транспортное средство не начинает движение через перекресток, если его траектория пересекается с чужой. В случае одновременного прибытия приоритет получает машина с меньшим внутренним идентификатором. Столь прямолинейное правило позволяет полностью исключить риск возникновения мертвых блокировок (дэдлоков).

Пешеходы (20 персонажей) циклично перемещаются по тротуарам вокруг кварталов на фиксированном удалении от бордюрного камня. Приближаясь к пешеходному переходу, прохожий с вероятностью 0,4 принимает решение о пересечении проезжей части. Он ожидает зеленого сигнала светофора на краю тротуара и начинает движение исключительно на разрешающий свет, игнорируя мигающую фазу. Роботизированная техника обладает безусловным приоритетом: если аппарат оказывается перед пешеходом ближе чем на 1,7 метра, человек останавливается и спустя 0,6 секунды отступает назад, не пытаясь проскочить перед движущимся устройством.

Машины и пешеходы реализованы как кинематические объекты единого физического мира. Это обеспечивает два важнейших преимущества: лидар обнаруживает их точно так же, как статические объекты архитектуры, а физические столкновения робота с прохожими обрабатываются симулятором на основе реальных контактов.

Навигация и метод «морковки»

Построение оптимального маршрута осуществляется с помощью классического алгоритма Дейкстры на основе предварительно сформированного дорожного графа. Его узлами выступают углы пешеходных зон, границы переходов, а также точки назначения А и Б.

Целевой вектор для навигационного модуля рассчитывается не до следующей путевой точки, а до виртуальной «морковки» — точки, расположенной на траектории на расстоянии 2,5 метров впереди робота. Данный метод отсылает к алгоритму pure pursuit (геометрическому подходу управления мобильными роботами и беспилотным транспортом, обеспечивающему точное следование по заданной траектории за счет преследования целевой точки на упреждающем расстоянии). Без этого алгоритма робот срезал бы углы на пути к отдаленным целям, отклонялся к обочинам и упирался в зеленые насаждения, высаженные вдоль тротуаров с шагом 8 метров. Использование «морковки» позволяет машине стабильно удерживаться по центру пешеходной зоны и оси зебры.

Параллельно функционирует виртуальный модуль контроля правил. Каждые 20 миллисекунд на основе физических контактов он фиксирует достижение финиша (если геометрический центр робота оказался ближе 1,5 метров к точке Б), проезд на запрещающий свет (выход на переход при горящем для пешеходов красном), съезд на проезжую часть в неположенном месте, а также любые факты физических столкновений.

Детерминизм: абсолютная повторяемость

Именно ради этого принципа вся архитектура разрабатывалась с особой скрупулезностью. Было внедрено три незыблемых правила:

  • Управляемая случайность. Любые стохастические процессы опираются исключительно на генератор с фиксированным начальным сидом (mulberry32). Инициализирующее число задается параметрами детали «Случай», определяя стартовые позиции объектов, фазы светофоров и поведение пешеходов.

  • Дискретное модельное время. В программной модели полностью отсутствуют вызовы системных таймеров вроде Date.now() или performance.now().

  • Фиксированная дискретность принятия решений. Транспорт и пешеходы пересчитывают свою логику с интервалом в 20 миллисекунд, при этом перемещаясь на каждом минимальном шаге симуляции.

Корректность работы проверяется с помощью специализированных тестов. Один и тот же бинарный файл прошивки запускается дважды с разной нарезкой временных квантов: по 2 мс и по 7,3 мс за один вызов. После этого сопоставляются контрольные хеши состояния мира — они должны совпадать абсолютно. В боевых условиях проверка выглядит следующим образом: соревновательная лига на арене «Доставка» запускает код участников на сервере Node.js, используя те же программные модули, что и браузерная версия. Полученные на сервере хеши заездов полностью совпадают с нашими локальными данными вплоть до последнего знака, а общее время выполнения миссии в браузере сходится с тестовыми замерами с точностью до десятой доли секунды.

Графический рендеринг

Визуализация сцены реализована на базе легковесного кастомного WebGL-рендерера без использования тяжелых игровых движков. Здания представляют собой простые трехмерные параллелепипеды, а оконные проемы генерируются процедурно с помощью фрагментного шейдера на основе пространственных координат: окна располагаются с шагом 2,6 метра по горизонтали и 3 метра по вертикали, а нижние этажи оформлены в виде витрин. В ночное время тот же шейдер случайным образом подсвечивает около 45% окон на основе хеша этажа и пролета стены — без использования каких-либо текстурных карт. Виртуальная камера плавно следует за роботом, смещаясь за его спину. Если траекторию закрывает фасад здания, камера автоматически приподнимается, а кроны деревьев на линии взгляда просто исключаются из отрисовки.

Дополнительно предусмотрен двумерный вид сверху на базе Canvas 2D. Он не требует поддержки WebGL и оказывается даже более информативным для отладки, чем объемная сцена: на нем отчетливо видны запланированный маршрут, текущие сигналы светофоров и траектории лучей лидара.

Итоги реализации

Базовый автопилот, построенный всего на пяти простых правилах и доступный в галерее примеров, успешно справляется со всеми 12 комбинациями сценариев «маршрут × случайность» без единого нарушения правил дорожного движения. Доставка груза занимает от 65 до 135 секунд модельного времени. Если намеренно удалить из управляющего скетча логику взаимодействия со светофорами, арбитр мгновенно зафиксирует проезд на красный свет. В дальнейшем экосистема пополнилась интерактивными уроками с автоматической проверкой и соревновательной лигой. Список испытаний расширился: добавились ночное время суток, часы пик с увеличенным до 40 человек числом пешеходов, а также дорожные ремонтные работы, требующие объезда препятствий.

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

Техническая спецификация робота R-D6: https://pinport.ru/robot/rd6

Ознакомиться с исходным кодом и протестировать систему в деле («робот R-D6 выполняет доставку груза из точки А в точку Б в виртуальном городе») можно по ссылке — достаточно нажать кнопку «Запустить», процедура регистрации не требуется. https://pinport.ru/p/ex-robot-rd6-delivery

 

Источник

Похожие статьи

Поиск по играм, новостям и статьям…

Введите не менее двух символов

Введите не менее двух символов