这个相当于是我学习CS后的第一个项目,写出来的时候还是非常开心的。想找个地方记录一下技术博客,发现掘金真的很方便,我把带有图片网址的文章复制过来后,自动解析并存储到掘金的服务器上了,这对我来说真的很方便,因为很多google上存的照片国内经常看不到。
GitHub 源代码:点击查看
** 如何用左手墙跟随走出迷宫?**
左手墙跟随算法(Left Wall Following Algorithm) 是一种简单但有效的迷宫导航策略。
尽管它 不保证最短路径,但在测试中,它几乎 100% 能够成功逃出迷宫。原理很简单,就是让左手沿着墙一直走,然后一直走就能走出去了。
当然,这个解法也有明显的缺陷,比如出口必须在外面,而不能在里头。我们这里假设迷宫是一个连通的常规迷宫,如下图所示:
基于传感器的决策方式
机器人依赖 两个关键的传感器数据 进行决策:
- 正前方扫描(-15° 到 15°):检测正前方的障碍物。
- 左侧扫描(45° 到 135°):测量左侧墙壁的最小距离。
算法逻辑
障碍物检测逻辑
- 如果前方有障碍物:
- 若左转状态(left-turn state)为
True,则左转。 - 否则,右转。
- 若左转状态(left-turn state)为
路径导航逻辑
- 如果前方无障碍物:
- 若在“死区”(Dead Zone),则右转。
- 若处于“死线”(Dead Line)与“保持线”(Keep Line)之间,向保持线靠近。
- 若在“保持线”与“边界线”(Boundary Line)之间,维持当前位置前进。
- 若超出“边界线”,则保持直行,直到检测到左侧墙壁。
📌 算法流程示意图:
📌 实际运行示意图:
📝 代码结构
class LeftWallFollower:
def __init__(self):
# 初始化逻辑
def clst_dtc_and_dir(self, start_degree, end_degree):
# 计算最近墙壁的位置与方向
def scan_cb(self, msg):
# 处理传感器数据
def follow_left_wall(self):
# 实现速度控制和 Bang-Bang 控制
📊 测试结果
算法在 10 次 不同的迷宫位置测试中,成功率达到 100% :
- 完美路径:60% 的情况下找到最优路径。
- 次优路径:40% 的情况下路径略显冗余,但仍然成功逃脱。
⚠️ 容错性分析
在实验中观察到 两种可能的异常情况:
- 死胡同处理:如果机器人左转进入死胡同,当遇到新墙壁时会重置自身状态。
- 出口房间误判:由于传感器精度问题,机器人可能会略过出口附近的小房间。
总体来说,实机演示效果也不错:>>实机演示链接