Путь сборкиПродвинутыйНесколько выходных

Соберите Micromouse для прохождения лабиринта

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

Техническая схема: Соберите Micromouse для прохождения лабиринтаWALL SENSING → FLOOD FILL

Что вы собираете

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

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

Стратегия двух проходов

Соревновательные Micromouse выполняют несколько проходов, и результат оценивается по самому быстрому. Это даёт стратегию, которую стоит копировать, даже когда никто не засекает время:

Первый проход — исследование. Аккуратно двигайтесь, записывайте, какие стены находятся у каких клеток, и достигайте центра. Скорость не имеет значения; результатом является карта.

Второй проход — использование знаний. Примените заливку к готовой карте, вычислите кратчайший маршрут и проедьте его, не останавливаясь для повторного считывания уже известного.

Разделение важно, потому двум проходам нужны противоположные качества. Исследованию нужны медленное и осторожное движение, а также постоянные измерения. Скоростному проходу нужна решимость. Попытка совместить их приводит к роботу, который плохо выполняет обе задачи.

Почему алгоритм — не самая сложная часть

Заливка действительно проста: присвойте целевой клетке расстояние 0, каждому соседу — на 1 больше минимального достижимого значения, затем всегда переходите к меньшему числу. Это несколько десятков строк, и на сетке алгоритм доказанно даёт кратчайший путь.

Сложность в том, что он предполагает: робот знает, в какой клетке находится.

Ошибка в подсчёте хотя бы одной клетки или несколько поворотов на 88° вместо 90° означают, что теперь планировщик решает лабиринт для робота, находящегося в другом месте. Симптом вызывает сильное раздражение: алгоритм идеален, подключение исправно, а робот уверенно врезается в стену.

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

Перечень компонентов

Компонент Кол-во Примерная стоимость Примечания
Arduino Uno или Nano 1 $5 Ограниченно по RAM: лабиринт 16×16 требует внимания. Mega или ESP32 снимает проблему
VL53L0X 3 $15 Слева, спереди, справа. Три, а не один — см. ниже
MPU-6050 1 $2 Курс при поворотах; именно тогда колёса проскальзывают сильнее всего
Двигатели N20 с энкодерами 2 $16 1:50 или 1:100. Металлический редуктор обязателен: люфт накапливается за каждый поворот
TB6612FNG 1 $3
Шасси 2WD 1 $10 Должно помещаться в клетку лабиринта с зазором — шириной менее примерно 90 mm
Аккумулятор 1 $8 2×18650
Стены лабиринта — $10–30 Пенопластовый картон или фанера. Стандартные клетки имеют размер 180 mm со стенами 50 mm

Итого: примерно $70–95, плюс лабиринт.

Три датчика расстояния, а не один. Один датчик спереди заставляет робота поворачиваться, чтобы посмотреть, что занимает время и — что гораздо хуже — добавляет ошибку курса при каждом наблюдении. Три неподвижных датчика позволяют считать все три стены клетки одновременно, без перемещения. Это разница между роботом, который надёжно строит карту, и роботом, который накапливает ошибку при каждой проверке стены.

Помните, что все три датчика VL53L0X включаются с адресом 0x29, поэтому нужны три вывода GPIO для XSHUT, чтобы включать их по одному и переназначать адреса. Это следует повторять при каждой загрузке, потому что новый адрес действует только до перезапуска.

Следите за RAM. Поле расстояний заливки для лабиринта 16×16, хранимое как uint8_t, занимает 256 байт, плюс карту стен и очередь. На 2 KB Uno это помещается, но только при осознанном подходе, что само по себе полезное упражнение и причина многим перейти здесь на ESP32.

Порядок сборки

1 — Получите три чистых измерения расстояния. Спереди, слева и справа с помощью датчиков времени полёта VL53L0X. Они используют общую шину I²C и включаются с одинаковым адресом, поэтому включайте их по одному, удерживая остальные в сбросе, и переназначайте адреса при запуске. До установки чего-либо убедитесь, что каждый датчик считывает стену на известном расстоянии.

2 — Обеспечьте прямое движение и точный поворот. Это и есть основная задача. Следуйте руководству движение вдоль стены и точные повороты: используйте ПИД-регулятор (PID) с боковыми датчиками для сохранения центровки, повороты с интегрированием гироскопа вместо подсчёта по энкодерам и повторное выравнивание по передней стене всякий раз, когда она доступна. Не переходите дальше, пока робот не выполнит десять поворотов и не будет смотреть в правильную сторону.

3 — Надёжно считайте клетки. Энкодеры предсказывают положение границы, а спадающий фронт боковой стены подтверждает её фактическое положение. При расхождении доверяйте стене: это физический ориентир, а не накопленная оценка.

4 — Записывайте стены в карту. Два бита на четыре стены каждой клетки; лабиринт 16 × 16 помещается в память объёмом несколько сотен байт. Записывайте то, что видите, когда видите.

5 — Добавьте заливку. Теперь у планировщика есть достоверные данные. Пересчитывайте расстояния всякий раз, когда новая стена делает текущий план недействительным: именно ради такого перепланирования применяется заливка вместо однократного поиска.

Важные замечания по оборудованию

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

Люфт — это ошибка курса. При каждом повороте на месте двигатели меняют направление, и свободный редуктор теряет первые несколько градусов — около 0.9° курса на колесе 42 mm при 4° люфта. Именно поэтому существуют двигатели N20 с металлическими редукторами.

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

Обеспечьте датчикам стабильное питание. При просадке шимы VL53L0X возвращает правдоподобные, но неверные значения вместо явного отказа, то есть худший вид неисправности: карта заполняется несуществующими стенами.

Как выглядит хороший результат

Измерение Первый рабочий Micromouse Хорошо настроенный
Скорость исследования 0.2–0.3 m/s 0.3–0.5 m/s
Скоростной проход 0.4–0.6 m/s 1.0–2.0 m/s
Ошибка центровки клетки после 10 клеток 10–20 mm Менее 5 mm
Ошибка курса после 10 поворотов 8–15° Менее 3°
Точность обнаружения стен Должна быть 100% 100%
Полное исследование 16×16 3–6 мин 1–2 мин

Две из этих строк заслуживают отдельного внимания.

Обнаружение стен не даёт частичного результата. Неверно записанная стена портит карту, после чего заливка вычисляет уверенный путь сквозь стену, и скоростной проход направляется прямо в неё. Плавной деградации нет, поэтому исследование выполняется медленно.

Показатели дрейфа — вот что составляет основную задачу проекта. Алгоритм — не самая сложная часть: заливка занимает около сорока строк, и её можно полностью проверить в симуляторе вообще без оборудования. Сложность в том, что после десяти клеток робот находится не там, где считает, а Micromouse с дрейфом 20 mm на десять клеток будет касаться стены на противоположной стороне лабиринта. Всё, что заставляет настоящий Micromouse работать, — коррекция движения вдоль стены, повороты с объединением данных гироскопа и калибровка энкодеров, — существует для борьбы с одним этим числом.

Когда что-то идёт не так

Симптом Обычная причина
Уверенно врезается в стену Ошибка подсчёта клеток — проблема положения, а не планирования
После нескольких поворотов робот оказывается развёрнут по диагонали Не вычтено смещение гироскопа или повороты не выровнены повторно
Резко наезжает на боковые проходы В контур движения вдоль стены не включена проверка наличия стены
Строит карту несуществующих стен Просадка питания датчиков или взаимные помехи между модулями
Медленно решает лабиринт, быстро разбивается Скоростной проход слишком быстр для работы контура движения — сначала замедлитесь, затем повышайте скорость

Почти каждая строка этой таблицы описывает неисправность движения или измерений, а не алгоритма. Это распределение — самое полезное знание перед началом работы, поскольку подсказывает, на что потратить выходные.

Если нужны идеи построения карты и планирования без оборудования, симулятор решателя лабиринта выполняет ту же двухэтапную стратегию в браузере, а план обучения планированию траектории и построению карты продолжает её к A* и SLAM. Для гораздо более дешёвого первого робота, проходящего лабиринт, робот для прохождения лабиринта по линии использует ленту вместо стен и вообще не нуждается в датчиках расстояния.

Дорожная карта проекта

Путь сборки

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

0 / 16 выполнено

100%
Учебный путь

Планирование траектории и построение карты

План обучения

Открыть путь
Симулятор

Наблюдайте, как планировщик перестраивает маршрут

Интерактивно

Открыть симулятор
Сборка

Научите робота строить карту лабиринта

Сборка

Цель

Научите робота проходить маршрут

Цель

Компоненты

Руководства на этом пути

Попрактикуйтесь до сборки схемы

Настройте его в интерактивном симуляторе

Путь сборки проходит через лабораторию в браузере. Добейтесь правильного поведения здесь, а затем перенесите настройки на реального робота.

Часто задаваемые вопросы

Что такое Micromouse?

Небольшой автономный робот, проходящий лабиринт со стенами, и старейшее постоянно проводящееся соревнование по робототехнике в мире. Стандартный лабиринт имеет размер 16 на 16 клеток по 18 cm каждая, а цель находится в центре; робот не получает карту и должен исследовать лабиринт, построить её, а затем проехать самый быстрый найденный маршрут. Это полная задача робототехники в одной коробке: измерения, точное движение, построение карты и планирование должны работать вместе, и отказ любого из них сразу заметен.

Почему использовать датчики времени полёта вместо ультразвуковых?

По трём причинам, каждую из которых лабиринт усиливает. Ультразвуковой луч расходится примерно на 15 градусов, поэтому в узком коридоре он отражается от стен по обе стороны от цели. Несколько ультразвуковых датчиков мешают друг другу, воспринимая отражённые сигналы соседей. Каждое измерение занимает миллисекунды времени полёта, что ограничивает частоту контура управления. У VL53L0X узкий луч, он не создаёт взаимных помех с соседями и выполняет измерение примерно за 20 ms.

Нужен ли гироскоп при наличии энкодеров?

Для лабиринта да. Энкодеры измеряют вращение колёс, а не робота, и эти величины расходятся при каждом проскальзывании колеса, то есть именно при повороте на месте. Ошибка 2 градуса за поворот незаметна однократно и критична после десяти поворотов. Гироскоп непосредственно измеряет фактическое вращение робота, поэтому повороты остаются прямыми независимо от действий колёс.

Чем это отличается от робота для прохождения лабиринта по линии?

Это разные роботы, случайно имеющие общее название. В лабиринте по линии чёрная лента нанесена на доску и считывается направленным вниз массивом отражательных датчиков, а память маршрута LSRB удаляет тупики из последовательности поворотов. У Micromouse есть физические стены, он считывает их датчиками расстояния и должен построить настоящую карту лабиринта, чтобы планировать движение по не посещённым ранее клеткам. Лабиринт по линии значительно дешевле; Micromouse учит построению карты.

Почему мой робот решает лабиринт, но разбивается на скоростном проходе?

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

Можно ли собрать Micromouse на Arduino Uno?

Для первого Micromouse да. Uno может работать с тремя датчиками VL53L0X и IMU по I²C и хранить карту стен 16 на 16 в памяти объёмом несколько сотен байт. Он не может конкурировать: серьёзные Micromouse используют более быстрые 32-битные контроллеры, чтобы контур движения работал с частотой в килогерцах, а планировщик постоянно пересчитывался. Сначала соберите медленную версию; почти все полученные знания переносятся.