交互式模拟器中级

迷宫求解机器人模拟器:洪水填充规划

在浏览器里运行迷宫求解机器人:看它探遍每条走廊和每个死胡同,再对地图做洪水填充,找出唯一的最短路径并全速冲刺。

类别
ESP32
时长
2–4 小时
平台
浏览器 · ESP32
迷宫求解机器人模拟器:洪水填充规划 技术示意图WALL SENSING → FLOOD FILL

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.

Browser native
A twelve-by-twelve maze solver lab. A robot starts in the bottom-left corner, explores the maze depth-first — backtracking out of dead ends — then flood-fills to find and run the shortest path to the centre. Use the controls below to run it one move at a time.

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
Simulation

Ready. Press Start to explore the maze, or Step one move at a time.

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.

控件

选一种模式——先探索、再快速跑或者只快速跑——然后按开始看它求解, 或者按单步一次走一步。新迷宫会构建一个全新的随机迷宫;重置重播同一个。 三档速度、键盘快捷键和全屏让运行始终可控。粗线是迷宫的墙, 阴影走廊是机器人探索过的所有地方(包含死胡同),而那条粗线 是洪水填充找到的最短路径。

原理

栅格迷宫就是由开放的边连接起来的格子,其余部分由墙隔开。 要找出最短路线,机器人必须先知道这个迷宫——所以这个实验台分两个阶段运行。

**探索。**机器人按左手法则深度优先地走迷宫:在每个路口,能左转就左转, 否则直行,然后再右。撞到死胡同时,它回溯到上一个路口并走下一个分支。 把这个过程重复到所有格子都被访问过,就建出了整张地图—— 包括所有它必须排除掉的错误路径。

**优化。**地图建完之后,一次洪水填充给目标赋予距离零, 并通过每一条开放的边向外传播递增的数值。现在每个格子都持有它到目标的距离, 于是最短路径就是这样:从起点出发,总是走向一个数值小一的邻居。 机器人快速跑完那条路径——比漫无目的的探索短得多。

一张 8×8 的栅格,按到中心的洪水填充距离着色。中间四个目标格被描边并标为零,周围每个格子显示一个递增的数值,等于它到目标的步数距离,形成一道平滑的梯度,向外到角落处为六。
洪水填充给每个格子标上它到目标的距离。机器人总是走向一个数值小一的邻居,所以这个场本身就编码了路线。 下载 SVG

算法

  1. 按左手法则深度优先探索迷宫,从每个死胡同掉头出来,直到所有格子都被访问过。
  2. 把每一条开放的边在两侧都记录下来,好让建好的地图知道每一堵墙。
  3. 从目标开始做洪水填充:把它标为 0,并通过每一条开放的边向外传播递增的距离。
  4. 从这个场上读出最短路径:从起点出发,反复走向一个距离小一的邻居。
  5. 快速跑那条路径到目标。
  6. 把探索长度和最短路径长度作比较,看看建图省下了多少漫无目的。

源代码

把探索、建图、规划和运动保持为彼此独立的函数:

// 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 和传感器也需要一条稳定的逻辑电源轨。

迷宫机器人接线的框图。左侧、前方和右侧的测距传感器经 I²C 或 GPIO 接入 ESP32,轮子编码器经支持中断的 GPIO 接入,ESP32 通过 PWM 和方向线驱动一个电机驱动器,由它给电机供电。
ESP32 读取三个测距传感器和编码器,然后通过一个由按堵转电流选型的电源供电的驱动器来指令电机。 下载 SVG

硬件清单

元器件

  • ESP32 开发板
  • 三个飞行时间或红外测距传感器
  • 两个带编码器的减速电机
  • 双路电机驱动和稳压电池电源
  • 紧凑型差速驱动底盘

探索关联图谱

哪里用到这个模拟器

以这个实验台为基础的项目、学习路线和教程。

继续搭建

下载资源

完成项目时可以参考本页上的这些资料。可下载的项目包只会在其源文件和版本发布之后才会添加。

常见问题

常见问题解答

第一台机器人最适合用哪种迷宫算法?

先用深度优先探索建出迷宫地图,再用洪水填充找出最短路径。洪水填充是很好的教学选择,因为每一个可达的格子都会得到一个距离值,而且每一步移动都可以逐一检查。本模拟器先探索,再对建好的地图做洪水填充,因此建图和最短路径规划两部分都一目了然。

迷宫机器人是怎样找到最短路径的?

在见过迷宫之前,它不可能知道最短路径,所以要先探索。本模拟器和真实的 Micromouse 一样分两个阶段:先是一次探索运行,走遍每一条走廊和死胡同,建出整个迷宫的地图;然后沿着对建好的地图做洪水填充所揭示的那条唯一最短路径快速跑一遍。第一阶段全面而缓慢;第二阶段简短而最优。

洪水填充和 BFS 或 A* 有什么不同?

BFS 和 A* 是在一张你已经知道的图上做规划。洪水填充则是为一个你仍在探索的迷宫设计的:它给目标赋予距离零,并通过每一条尚未确认被堵住的边向外灌注递增的数值,然后每当新感知到的墙改变了地图时就重新计算。距离场本身就编码了路线,所以机器人只需走向任何一个数值小一的邻居即可。

探索阶段和快速跑阶段有什么区别?

探索是为迷宫建图:机器人以深度优先的方式走进每一条走廊和死胡同,从错误的路里回溯出来,直到知道每一堵墙——你看到它把所有错误路径都试一遍,就是在这个阶段。快速跑则利用那张建好的地图:洪水填充把它变成一个距离场,机器人沿着从起点到目标的唯一最短路径行进。探索缓慢而全面;快速跑简短而最优。

Micromouse 或迷宫机器人需要哪些传感器?

至少需要朝左、朝前、朝右看的测距传感器,用来判断当前格子有哪些墙,再加上车轮编码器,以便准确地移动若干格并把转弯摆正。飞行时间或红外测距传感器很常见;编码器之所以重要,是因为单靠墙壁感知无法告诉你已经走了多远。

为什么用洪水填充而不用沿墙走?

沿墙走(始终把一只手搭在墙上)很简单,但它无法到达不与外墙相连的目标,比如 Micromouse 迷宫的中心,而且它很少能找到短路线。洪水填充会为整个已知迷宫建立一张距离地图,所以它能到达内部的目标,并在探索过程中逐步逼近最短路径。

延伸阅读

参考资料

权威资料,帮助你越过本模拟器有限的教学模型,进一步深入学习。