1、灭火机器人迷宫策略 我们丹城中学机器人实验室经过大量实验,结合网络上搜索到的资料,经过 归纳,总结出下列最基本的法则,下列原则和红外传感器的数量无关,和使 用的教学机器人类型(红外传感器类型)无关,是抽象层次的描述,至于具 体实现,请参考下面的代码或者各共享方案。 一)红外传感器实现左右手法则 的最基本原理 )迷宫法则 看到墙壁离开墙壁,看不到墙壁,接近墙壁. )迷宫函数构造法则 迷宫函数语法结构中必须包含有前进、左转、右转三个分量,或者可以分解出 上述三个分量。 二)红外传感器实现左右手法则 的一般过程 迷宫法则看似简单,实则 博大精深,上面讲述的最基本原理非常抽象,就象牛顿第一定理 f=m
2、a 一样,需要结合实际例子才能理解,我们把他分散在第 、等章节进行讲解,使迷宫法则逐渐从科学的殿堂 走下来,让他成为同学们手中的玩物。 上面的“看到墙壁离开墙壁,看不到墙壁,接近墙壁.”是哲学层次的描述,也 是最高层次的描述,抽象性最高,是一切迷宫算法的理论基础,哲学层次的描 述和红外传感器的数量无关。从哲学层次出发,我们可以找到几种算法层次的 描述,哲学层次和算法层次都和使用的机器人种类无关。从算法层次出发,算 法进行具体化,我们就要进行代码编程,代码层次和硬件直接有关,也就是不 同公司的产品代码可能会有差别。编码后,我们还要到场地上进行实地调试, 使机器人真真能走出稳定快速的迷宫线路。 构
3、造迷宫算法的理论依据越原始,算法变化的空间越大,设计难度也大,但 出现又快又稳的算法的可能性也大,下面内容,以及第,等章 节,我们将从各个层次上来论述迷宫算法的构建过程。 为了找到火焰,我们要让机器人做迷宫搜索,不管使用什么策略,左手法则 和右手法则都是迷宫搜索的基础,我们至少要实现其中一种行走方法。在这 里作者向大家推荐的方案是机器人左右手法则都会走,这样机器人灭火和回 家的效率就比较高,在这里中间朝前的红外传感器是左右手法则共用的传感 器。本章我们只是简单介绍一下迷宫算法,关于迷宫法则的深入讨论,作者 把它放在和这两章再作论述。 61 左手法则 所谓左手法则就是机器人把左边的墙壁看成是参照
4、物,机器人贴迷宫左侧的 墙壁实现行走。要实现左手法则需要用到红外避障传感器,最常见的是用两个 或三个传感器的实现方法,两个传感器来实现左手法则调试最简单。三个传感 器的实现方法调试比较难,三个以上传感器的用法行走速度不一定就快,传感 器之间相互干扰很难解决,在这里我们不作介绍。一个传感器的实现方法稳定 性低,实战中很少有人使用。 611 三个传感器实现左手法则的算法 三个传感器实现左手法则可以使用两个传感器类似的方法,就是“看到 墙壁,往外走,看不到墙壁往里走。”在这里我们给出比较典型的算法,下 面的算法调试比较难,调试得不好,机器人容易做出自向矛盾的微动作,表 现为停步不前,或者在某处发抖。
5、在这里提供的算法原理是:前面看到右转, 左 45 度看到右转,左边看到前进,什么也没有看到转左弧。 图 6-1 图 6-1 是三个传感器走左手常见的安装方法,根据调试经验,左传感器也向前 偏转一定角度,这样设计,机器人走迷宫的速度会快一些。前红外传感器观察 范围 20cm 左右 ,左传感器观察范围 20cm 左右,左 45 度传感器观察范围 10cm 左右,红外的观察范围、角度和下面面的马达参数一样,都需要调节以适 应自己的机器人。假设纳英特机器人前面传感器接 13 口,左 45 度接 12 口,左 红外接 11 口。参考代码如下: Void migong_left() If (digital
6、(13)=1)/前面看到,原地右转 motor(0,40); Motor(1,-70); elseIf (digital(12)=1)/左上角 45 度看到,原地右转 motor(0,40); Motor(1,-70); elseIf (digital(11)=1)/左边看到,前进 motor(0,60); Motor(1,60); ) Else/什么也没有看到,转左弧 motor(0,-80); Motor(1,80); motor(0, 80); Motor(1,80); 如果同学们觉得这个算法调试有难度,可以使用下面的基本算法: Void migong_left() If (digita
7、l(13)=1 |digital(12)=1 |digital(11)=1)/ 看到墙壁,往外走 motor(0,40); Motor(1,-70); else /看不到墙壁往里走 motor(0,-50); Motor(1,50); motor(0, 50); Motor(1,50); 612 两个传感器实现左手法则的算法 不管你使用那个公司的产品,左手法则都可以用两个传感器实现,如图 6-2 是两个传感器走左手的常见安装方法。一个传感器在机器人前面中间位置,另 一个装在机器人中间位置,朝左前 45 度偏转,观察距离 10-15 厘米。左手法则 的基本原理是看到墙壁,往外走,看不到墙壁往里走
8、。假设纳英特机器人前面 传感器接 13 口,左 45 度接 11 口。则具体参考代码如下: 图 6-2 Void migong_left() If (digital(13)=1)/前面有墙原地右转。 Motor(0,40);/ /右转时间长,前面有墙壁不前进,否则要撞墙。 Motor(1,-100); Sleep(0.05); Else If (digital(11)=1)/左边有墙原地右转并前进。 Motor(0,40);/右转时间长。 Motor(1,-100); Sleep(0.05); Motor(0,70);/前进无延时,否则要撞墙。 Motor(1,70); Else/什么也看不见
9、,划左弧。 Motor(0,-80); Motor(1, 80); Motor(0,80); Motor(1,80); 如果同学们觉得这个算法调试有难度,可以使用下面的基本算法: Void migong_left() If (digital(13)=1|digital(11)=1)/ 看到墙壁,往外走 motor(0,40); Motor(1,-70); else /看不到墙壁往里走 motor(0,-50); Motor(1,50); motor(0, 50); Motor(1,50); 上面我们给出了两个传感器实现左手法则的一种算法,给出这种算法是为 了说明两个传感器走左手的原理,在第二章
10、我们论述了把迷宫行走和地面检测 结合起来的算法,为无火不进房间的实现提供了基础。 613 一个传感器实现左手法则的算法 一个传感器走左手法则的算法本身意义不大,我们在这里提供算法只想说 明一个问题,就算是到了很困难的程度,我们也要有解决问题的信心。实 现的原理和 2 个传感器一样,这里的算法我们把一个传感器当做两个来用, 传感器安装在机器人前左 45 度角,接 12 号口, 红外的观察距离是 10-15 厘 米左右。 图 6-3 int m=0; void main()/主程序 while(1) migong_left(); void migong_left()/左手法则 if (digita
11、l(12)=1)/如果传感器看到墙壁 m+; if( m30000) m=0; if (m%3) 30000) m=0; if (m%3) 125)在 C 语言语法中是正确的,但在这里却是死循环效果,这样机器人转昏了 头,也许很久后会碰到 3 号灭火圈或门口线退出循环,但这时候已经出现了计 算白线错误或浪费了大量时间,从上面的分析我们可以知道旋转法的稳定性要 比退房法低,所以初学者最好不要去搞旋转法。为了提高旋转法的稳定性,在 第 10 章我们介绍了一种时间旋转法和地面旋转法双保险设计的旋转法。设计思 想请参考灭火机器人防错技术和补救算法设计。 (3)周围墙壁为标准 这种方法的可靠性更低,多半和时间法、地面法配合使用,先时间法或地 面法,然后前进或转动到传感器看到墙壁,然后接下去走迷宫,这里就不做介 绍。