Симулятор робота для лабиринта: заливка по расстоянию
Запустите робота для лабиринта в браузере: он исследует коридоры и тупики, затем заливкой по расстоянию находит кратчайший путь и проходит его на скорости.
- Категория
- ESP32
- Время
- 2–4 hours
- Платформа
- Браузер · ESP32
01 / Начните здесь
Введение
Роботы сначала исследуют лабиринт, затем оптимизируют маршрут. Лаборатория показывает обе фазы: обход в глубину по коридорам и тупикам с возвратом, затем заливку от цели, которая находит единственный кратчайший путь, и его быстрый проход. Наблюдайте, как робот пробует неверные пути и выбирает правильный — это принцип, который использует настоящий ESP32 Micromouse.
Live lab / Maze exploration & flood-fill shortest path
Maze solver simulator
Watch a robot explore a real maze — down every corridor, into dead ends, backtracking out — then flood-fill the map and speed-run the one shortest path to the centre.
Bold lines are maze walls. The shaded corridors are everywhere the robot explored (including dead ends it backtracked out of); the bold line is the shortest path found by flood fill; the triangle is the robot and its heading.
- Wall
- Explored (wrong paths)
- Shortest path
- Goal
- Phase
- Ready
- Explored
- 1 / 144
- Exploration
- — moves
- Shortest path
- — moves
- Saved
- —
- Maze
- —
Keyboard: focus the maze, then use Space to run/pause, N to step, R to reset, M for a new maze, and F for full screen.
Управление
Выберите режим — Исследовать, затем пройти на скорости или Только быстрый проход — и нажмите «Пуск», чтобы посмотреть, как робот решает задачу, или «Шаг», чтобы выполнять по одному ходу. Новый лабиринт создаёт новый случайный лабиринт; Сброс повторяет тот же. Три скорости, сочетания клавиш и полноэкранный режим позволяют управлять запуском. Жирными линиями обозначены стены лабиринта, затенённые коридоры — все места, где побывал робот, включая тупики, а жирная линия — кратчайший путь, найденный заливкой по расстоянию.
Теория
Лабиринт на сетке состоит из клеток, соединённых открытыми рёбрами, а между остальными находятся стены. Чтобы найти кратчайший маршрут, робот сначала должен узнать лабиринт, поэтому в этой лаборатории выполняются две фазы.
Исследование. Робот обходит лабиринт в глубину по правилу левой руки: на каждом перекрёстке поворачивает налево, если может, иначе едет прямо, а затем направо. При попадании в тупик он возвращается к последнему перекрёстку и выбирает следующую ветвь. Повторение до посещения каждой клетки составляет карту всего лабиринта, включая все неверные пути, которые пришлось исключить.
Оптимизация. Когда карта готова, заливка по расстоянию назначает цели расстояние ноль и распространяет увеличивающиеся значения через каждое открытое ребро. Теперь в каждой клетке хранится расстояние до цели, поэтому кратчайший путь просто таков: из старта всегда переходить в соседнюю клетку с меньшим числом. Робот проходит этот путь на скорости — он намного короче бесцельного исследования.
Алгоритм
- Исследуйте лабиринт в глубину по правилу левой руки, выходя из каждого тупика с возвратом, пока не будут посещены все клетки.
- Запишите каждое открытое ребро с обеих сторон, чтобы готовая карта знала о каждой стене.
- Выполните заливку по расстоянию от цели: обозначьте её 0 и распространяйте увеличивающиеся расстояния через каждое открытое ребро.
- Считайте кратчайший путь с поля: из старта каждый раз переходите в соседнюю клетку, расстояние до которой на единицу меньше.
- Пройдите этот путь к цели на скорости.
- Сравните длину исследования с длиной кратчайшего пути, чтобы увидеть, насколько карта сократила блуждание.
Исходный код
Разделите исследование, построение карты, планирование и движение на отдельные функции:
// Phase 1 — map the whole maze, backtracking out of dead ends
exploreDepthFirst(map, robot); // left-hand rule until every cell is visited
// Phase 2 — flood-fill the finished map and run the shortest path
map.floodFill(goal); // goal = 0, distances ripple outward
for (Cell c = start; c != goal; c = map.lowerNeighbor(c))
robot.driveTo(c); // always step one distance lower
Такая граница позволяет проверить один и тот же планировщик в этой браузерной лаборатории, на настольном компьютере и на итоговом контроллере ESP32.
Допущения и отличия от реального оборудования
Лаборатория делает построение карты чистым, убирая сложную часть настоящего Micromouse — одометрию. Смоделированный робот перемещается ровно на одну клетку за шаг без проскальзывания колёс, смещения гироскопа и ошибки поворота на 90°, а его три датчика расстояния идеально сообщают о стенах без ложных срабатываний. Физическая конструкция на ESP32 накапливает ошибку курса и расстояния при каждом ходе, должна выравниваться по стенам и фильтровать показания ToF с учётом солнечного света и просадки питания, — поэтому руководство по точным поворотам и руководство по заливке уделяют больше времени движению, чем планированию. Используйте этот симулятор, чтобы понять, зачем заливке перепланировать, а не чтобы доказать работу слоя движения.
Схема соединений
Используйте внешний стабилизатор, рассчитанный на ток остановки двигателя. ESP32 и датчикам нужен стабильный логический источник даже при реверсе двигателей.
Список оборудования
Компоненты
- Отладочная плата ESP32
- Три датчика расстояния по времени полёта или в инфракрасном диапазоне
- Два редукторных двигателя с энкодерами
- Двойной драйвер двигателей и стабилизированный аккумуляторный источник питания
- Компактное шасси с приводом на дифференциальном принципе
Исследуйте граф
Где используется этот симулятор
Проекты, учебные пути и руководства, которые опираются на эту лабораторию.
Продолжайте сборку
Материалы для загрузки
Пользуйтесь этими справочными материалами на странице, пока работаете над проектом. Загружаемые пакеты проекта появятся только после публикации их исходников и версии.
Частые вопросы
Часто задаваемые вопросы
Какой алгоритм прохождения лабиринта лучше всего подходит для первого робота?
Исследуйте лабиринт в глубину, чтобы составить его карту, а затем используйте заливку по расстоянию для поиска кратчайшего пути. Заливка по расстоянию — сильный учебный выбор, потому что каждой достижимой клетке присваивается значение расстояния, и каждый ход можно проверить. Этот симулятор сначала исследует лабиринт, а затем выполняет заливку по расстоянию на готовой карте, поэтому и построение карты, и планирование кратчайшего пути остаются понятными.
Как робот для прохождения лабиринта находит кратчайший путь?
Он не может узнать кратчайший путь, пока не увидит лабиринт, поэтому сначала исследует его. Этот симулятор, как и настоящий Micromouse, использует две фазы: этап исследования, который проходит каждый коридор и тупик для построения карты всего лабиринта, затем быстрый проход по единственному кратчайшему пути, который находит заливка по расстоянию на готовой карте. Первая фаза тщательная и медленная; вторая — короткая и оптимальная.
Чем заливка по расстоянию отличается от BFS или A*?
BFS и A* планируют на уже известном графе. Заливка по расстоянию предназначена для лабиринта, который ещё исследуется: она назначает цели расстояние ноль и распространяет увеличивающиеся значения через каждое ребро, не известное как заблокированное, а затем пересчитывает их, когда новая обнаруженная стена меняет карту. Само поле расстояний кодирует маршрут, поэтому роботу достаточно переходить в любую соседнюю клетку с меньшим значением.
Чем отличаются фазы исследования и быстрого прохода?
Исследование составляет карту лабиринта: робот обходит его в глубину, заходит в каждый коридор и тупик, выходит из неверных ветвей с возвратом, пока не узнаёт о каждой стене, — именно здесь видно, как он пробует все неверные пути. Быстрый проход использует готовую карту: заливка по расстоянию превращает её в поле расстояний, а робот следует единственному кратчайшему пути от старта к цели. Исследование медленное и тщательное; быстрый проход короткий и оптимальный.
Какие датчики нужны Micromouse или роботу для прохождения лабиринта?
Как минимум нужны датчики расстояния, направленные влево, вперёд и вправо, чтобы определить стены текущей клетки, а также колёсные энкодеры для точного перемещения на заданное число клеток и выравнивания по стенам после поворотов. Распространены датчики расстояния по времени полёта или в инфракрасном диапазоне; энкодеры важны, потому что только определение стен не позволяет узнать, на сколько переместился робот.
Почему использовать заливку по расстоянию, а не следование вдоль стены?
Следование вдоль стены — всё время держать одну руку на стене — просто, но не позволяет достичь цели, не соединённой с внешней стеной, например центра лабиринта Micromouse, и редко находит короткий маршрут. Заливка по расстоянию строит карту расстояний всего известного лабиринта, поэтому может достичь внутренней цели и улучшать маршрут по мере исследования.
Дополнительные материалы
Источники
Авторитетные источники, чтобы пойти глубже ограниченной учебной модели этого симулятора.