灭火机器人迷宫策略.docx
《灭火机器人迷宫策略.docx》由会员分享,可在线阅读,更多相关《灭火机器人迷宫策略.docx(33页珍藏版)》请在冰豆网上搜索。
![灭火机器人迷宫策略.docx](https://file1.bdocx.com/fileroot1/2023-4/17/238028e0-b256-4ee2-af57-8191febb6462/238028e0-b256-4ee2-af57-8191febb64621.gif)
灭火机器人迷宫策略
灭火机器人迷宫策略
我们丹城中学机器人实验室经过大量实验,结合网络上搜索到的资料,经过归纳,总结出下列最基本的法则,下列原则和红外传感器的数量无关,和使用的教学机器人类型(红外传感器类型)无关,是抽象层次的描述,至于具体实现,请参考下面的代码或者各共享方案。
一)红外传感器实现左右手法则的最基本原理
1)迷宫法则
看到墙壁离开墙壁,看不到墙壁,接近墙壁.
2)迷宫函数构造法则
迷宫函数语法结构中必须包含有前进、左转、右转三个分量,或者可以分解出上述三个分量。
二)红外传感器实现左右手法则的一般过程
迷宫法则看似简单,实则博大精深,上面讲述的最基本原理非常抽象,就象牛顿第一定理f=ma一样,需要结合实际例子才能理解,我们把他分散在第6、9、11、13等章节进行讲解,使迷宫法则逐渐从科学的殿堂走下来,让他成为同学们手中的玩物。
上面的“看到墙壁离开墙壁,看不到墙壁,接近墙壁.”是哲学层次的描述,也是最高层次的描述,抽象性最高,是一切迷宫算法的理论基础,哲学层次的描述和红外传感器的数量无关。
从哲学层次出发,我们可以找到几种算法层次的描述,哲学层次和算法层次都和使用的机器人种类无关。
从算法层次出发,算法进行具体化,我们就要进行代码编程,代码层次和硬件直接有关,也就是不同公司的产品代码可能会有差别。
编码后,我们还要到场地上进行实地调试,使机器人真真能走出稳定快速的迷宫线路。
构造迷宫算法的理论依据越原始,算法变化的空间越大,设计难度也大,但出现又快又稳的算法的可能性也大,下面内容,以及第9,11,13等章节,我们将从各个层次上来论述迷宫算法的构建过程。
为了找到火焰,我们要让机器人做迷宫搜索,不管使用什么策略,左手法则和右手法则都是迷宫搜索的基础,我们至少要实现其中一种行走方法。
在这里作者向大家推荐的方案是机器人左右手法则都会走,这样机器人灭火和回家的效率就比较高,在这里中间朝前的红外传感器是左右手法则共用的传感器。
本章我们只是简单介绍一下迷宫算法,关于迷宫法则的深入讨论,作者把它放在<第九章>和<第十三章>这两章再作论述。
6.1 左手法则
所谓左手法则就是机器人把左边的墙壁看成是参照物,机器人贴迷宫左侧的墙壁实现行走。
要实现左手法则需要用到红外避障传感器,最常见的是用两个或三个传感器的实现方法,两个传感器来实现左手法则调试最简单。
三个传感器的实现方法调试比较难,三个以上传感器的用法行走速度不一定就快,传感器之间相互干扰很难解决,在这里我们不作介绍。
一个传感器的实现方法稳定性低,实战中很少有人使用。
6.1.1 三个传感器实现左手法则的算法
三个传感器实现左手法则可以使用两个传感器类似的方法,就是“看到墙壁,往外走,看不到墙壁往里走。
”在这里我们给出比较典型的算法,下面的算法调试比较难,调试得不好,机器人容易做出自向矛盾的微动作,表现为停步不前,或者在某处发抖。
在这里提供的算法原理是:
前面看到右转,左45度看到右转,左边看到前进,什么也没有看到转左弧。
图6-1
图6-1是三个传感器走左手常见的安装方法,根据调试经验,左传感器也向前偏转一定角度,这样设计,机器人走迷宫的速度会快一些。
前红外传感器观察范围20cm左右,左传感器观察范围20cm左右,左45度传感器观察范围10cm左右,红外的观察范围、角度和下面面的马达参数一样,都需要调节以适应自己的机器人。
假设纳英特机器人前面传感器接13口,左45度接12口,左红外接11口。
参考代码如下:
Voidmigong_left()
{
If(digital(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);
}
}
如果同学们觉得这个算法调试有难度,可以使用下面的基本算法:
Voidmigong_left()
{
If(digital(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);
}
}
6.1.2 两个传感器实现左手法则的算法
不管你使用那个公司的产品,左手法则都可以用两个传感器实现,如图6-2是两个传感器走左手的常见安装方法。
一个传感器在机器人前面中间位置,另一个装在机器人中间位置,朝左前45度偏转,观察距离10-15厘米。
左手法则的基本原理是看到墙壁,往外走,看不到墙壁往里走。
假设纳英特机器人前面传感器接13口,左45度接11口。
则具体参考代码如下:
图6-2
Voidmigong_left()
{
If(digital(13)==1)//前面有墙原地右转。
{
Motor(0,40);////右转时间长,前面有墙壁不前进,否则要撞墙。
Motor(1,-100);
Sleep(0.05);
}
ElseIf(digital(11)==1)//左边有墙原地右转并前进。
{
Motor(0,40);//右转时间长。
Motor(1,-100);
Sleep(0.05);
Motor(0,70);//前进无延时,否则要撞墙。
Motor(1,70);
}
Else//什么也看不见,划左弧。
{
Motor(0,-80);
Motor(1,80);
Motor(0,80);
Motor(1,80);
}
}
如果同学们觉得这个算法调试有难度,可以使用下面的基本算法:
Voidmigong_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);
}
}
上面我们给出了两个传感器实现左手法则的一种算法,给出这种算法是为了说明两个传感器走左手的原理,在第二章我们论述了把迷宫行走和地面检测结合起来的算法,为无火不进房间的实现提供了基础。
6.1.3一个传感器实现左手法则的算法
一个传感器走左手法则的算法本身意义不大,我们在这里提供算法只想说明一个问题,就算是到了很困难的程度,我们也要有解决问题的信心。
实现的原理和2个传感器一样,这里的算法我们把一个传感器当做两个来用,传感器安装在机器人前左45度角,接12号口,红外的观察距离是10-15厘米左右。
图6-3
intm=0;
voidmain()//主程序
{
while
(1)
{
migong_left();
}
}
voidmigong_left()//左手法则
{
if(digital(12)==1)//如果传感器看到墙壁
{
m++;
if(m>30000)
m=0;
if((m%3)<2) //3个时间片内2个时间片右转
{
motor(0,40);
motor(1,-70);
sleep(0.03);
}
else//3个时间片内1个时间片右转并前进
{
motor(0,40);
motor(1,-70);
sleep(0.03);
motor(0,50);
motor(1,50);
}
}
else//如果传感器没有看到墙壁
{
motor(0,-40);//向左转弧线
motor(1,40);
motor(0,80);
motor(1,80);
}
}
6.2 右手法则
所谓右手法则就是机器人把右边的墙壁看成参照物,机器人贴迷宫右侧的墙壁实现行走的方法。
右手法则的实现原理和左手法则一样,传感器的安装及算法是完全对称的。
最常见的是用三个传感器的实现方法,两个传感器来实现右手法调试简单。
三个或三个以上传感器的实现方法调试比较难,行走速度不一定就快,一个传感器的实现方法稳定性低,实战中很少有人使用。
6.2.1 三个传感器实现右手法则的算法
三个传感器实现右手法则的一种算法是:
前面看到左转,右45度看到左转,右边看到前进,什么也没有看到转右弧。
前传感器观察范围20cm左右,右传感器观察范围20cm左右,右45度传感器观察范围10cm左右。
红外的观察范围、角度和下面面的马达参数一样,都需要调节以适应自己的机器人。
假设纳英特机器人前面传感器接13口,右45度接14口,右红外接15口。
具体参考代码如下:
Voidmigong_right()
{
If(digital(13)==1)//前面看到,原地左转
{
motor(0,-70);
Motor(1,40);
}
elseIf(digital(14)==1)//右上角45度看到,原地左转
{
motor(0,-70);
Motor(1,40);
}
elseIf(digital(15)==1)//右边看到,前进
{
motor(0,60);
Motor(1,60);
)
Else//什么也没有看到,转右弧
{
motor(0,80);
Motor(1,-80);
motor(0,80);
Motor(1,80);
}
}
。
6.2.2 两个传感器实现右手法则的算法
不管你使用那个公司的产品,右手法则都可以用2个传感器实现。
一个传感器在机器人前面中间,另一个在机器人中间朝右前45度,观察距离10-15厘米。
基本原理是看到墙壁,往外走,看不到墙壁往里走。
假设纳英特机器人前面传感器接13口,右45度接15口。
则具体参考代码如下:
Voidmigong_rightt()
{
If(digital(13)==1)//前面有墙原地左转
{
Motor(0,-100);////左转时间长,前面有墙壁不前进,否则要撞墙
Motor(1,40);
Sleep(0.05);
}
ElseIf(digital(15)==1)//右面有墙原地左转并前进
{
Motor(0,-100);//左转时间长
Motor(1,40);
Sleep(0.05);
Motor(0,70);//前进无延时,否则要撞墙
Motor(1,70);
}
Else//什么也看不见,划右弧
{
Motor(0,80);
Motor(1,-80);
Motor(0,80);
Motor(1,80);
}
}
6.2.3一个传感器实现右手法则的算法
实现的原理和2个传感器一样,只是在这里我们把一个传感器当做两个来用,
假设纳英特机器人,红外传感器安装在机器人前右45度角,接14号口,红外的观察距离是10-15厘米左右。
intm=0;
voidmain()//主程序
{
while
(1)
{
migong_right();
}
}
voidmigong_right()//右手法则
{
if(digital(14)==1)//如果传感器看到墙壁
{
m++;
if(m>30000)
m=0;
if((m%3)<2) //3个时间片内2个时间片左转
{
motor(0,-70);
motor(1,40);
sleep(0.03);
}
else//3个时间片内1个时间片左转并前进
{
motor(0,-70);
motor(1,40);
sleep(0.03);
motor(0,50);
motor(1,50);
}
}
else//如果传感器没有看到墙壁
{
motor(0,40);//向右转弧线
motor(1,-40);
motor(0,80);
motor(1,80);
}
}
6.3 常见搜索策略介绍
搜索策略一般可以分为两大类,一类是常规的搜索法,使用左手法则和右手法则为基础,一般搜索的顺序是1-2-3-4房间或按照4-3-2-1的房间顺序搜索。
另一类非常规的搜索法,主要有一技必杀和固定路线两种。
以下所讲的方法不存在哪种最好的问题,如果世界上有最好的算法,也就没有人用其他方法了,比赛也没有意义了。
6.3.1 常规搜索法
6.3.1.1进房间搜索法
进房间搜索法就是左手法则或右手法则的简单应用,是入门阶段的常用方法,算法简单易学,速度慢,多出现在刚开始开展机器人活动的地方,现在使用的人已经很少,适合刚入门的小学生使用。
如左手法则在起点朝前启动,只能搜索到1、2、3号房间,朝右启动,只能搜索到4号房间,但它是一切算法的基础,是所有灭火机器人学习者必须掌握的一种方法。
本教程把进房间搜索法简称为"绕房法",把不进房间搜索法简称为"退房法",这时候"退房法"是广义的退房法,包括退房法和旋转法。
在《小泥鳅》系列共享方案中,我们还介绍了一种绕房法向退房法进化的过渡类型———半退房法。
4.3.1.2 不进房间搜索法
简单搜索法不管房间内有没有火都要进去绕,所以速度慢,无火不进房间是对简单搜索法的改进。
它结合白线检测,按照房间把迷宫搜索分为几阶段,到了房间门口就停止脚步,检测里面是否有火焰,如果有火进去灭火,否则,顺序搜索下一个房间。
不进房间搜索法实际上是对简单迷宫法则的改进,简单的迷宫法则把墙壁当作参照物来决定下一步的动作,而不进房间搜索法实际上是利用墙壁和门口白线参照物来决定下一步的动作。
根据利用门口白线的方法不同,又可以分为退房法和旋转法两大类。
(1) 退房法
对无火不进房间的机器人来说,又存在两种实现策略,比较容易的是退房法,机器人在房间门口如果判断出房间内没有火焰,就后退出房门,然后到其他房间搜索。
例如从4号房间出来,后退一定时间或后退到后面的传感器看到墙壁,然后走右手法则进3号。
退房法根据后退的方法不同,又可以分为时间法和条件法两类,时间法就是后退一定的时间,然后转动一定角度,接下去搜索其他房间。
时间法比较容易掌握,但很难把握后退时间的长短,如果后退时间太长,有撞墙的可能,会降低迷宫行走的速度。
后退时间太短,机器人找不到参照物,会出现转圈的现象。
条件法就是在机器人后面安装1-2个传感器,在传感器看到墙壁时,就停止后退。
我们也可以结合使用2种方法,先后退一段时间,然后后退到传感器看到墙壁,这种方法稳定性高.我们后面要学习的各个共享方案大部分是退房法,大家可以到这些方案中学习具体操作方法。
(2)旋转法
旋转法是利用门口白线和墙壁作为迷宫行走参照物的实现方法,旋转法的实现要比退房法难,速度也更快。
旋转法可以在旋转的同时检测火焰,节省了检测时间,由于机器人在转动的过程中容易发现火焰,所以检测火焰的效率更高。
旋转法速度比退房法快点,但调试难度大。
根据旋转的角度,旋转法有半旋法和全旋法两类。
机器人进行90度旋转的方法叫半旋法,180度旋转的方法叫全旋法,我们在后面的章节向大家介绍的是半旋法实现的方案。
根据旋转方向不同可以分为同向旋转法和反向旋转法。
机器人进门时处于旋转状态,如果旋转法旋转的方向和进门旋转的方向相同,我们称之为同向旋转法。
如果旋转法旋转的方向和进门旋转的方向相反,我们称之为反向旋转法,反向旋转法的实现比较容易。
旋转时的参照物可以是地面白线,也可以是两侧的墙壁,也可以用时间作控制变量,第十章的右手法则反向旋转法就是用时间和地面进行双保险设计的算法。
(3)环绕法
除了著名的退房法和旋转法以外,作者还实验过另一种方法,取名字叫环绕法。
如图6-4,把走轨迹的方法引入到灭火中,用它来越过门口,越过门口的方法也分左手法则和右手法则两种。
如图6-5,在机器人下面安装2-3个地面传感器,A或B看到白线向左转,C看到向前走,什么也没看见,转右弧,一直到红外发现对面的墙壁,接下去走普通的右手。
图6-4
图6-5
6.3.2特殊搜索法
特殊搜索法是用的人比较少的方法,所有特殊搜索法共同特点是速度快,调试难度大,稳定性低.。
这类方法中著名的方法有一技必杀法和时间法两种。
(1)一技必杀法
一技必杀法并非主流算法,具体实现也有很多方法,共同特点是直接进入有火房间灭火,给人一种速度很快的感觉。
但由于有房间系数的存在,该方法不见得能提高多少成绩,根据现在的教育部规则,对中学组根本就不合适。
作者是反对该方法的应用,认为该方法阻碍了算法的发展。
该方法适合小学组应用,但中学组应用的人也不少,可能是上一届的同学根据规则发现该方法简单有效,规则修改后,下一届同学还去参考的缘故。
既然用的人比较多,我们在这里也介绍其中的一种算法。
由于规则并没有规定机器人的高度(2006规则)(实际上规则上已经考虑到一技必杀的效果不可能很好),在机器人中间竖一根比墙壁高的‘天线’,上面安装3个火焰传感器,机器人在起点朝前启动,1个传感器朝1号房间方向,另1个传感器朝4号房间方向,第三个传感器朝前,如果朝1号房间方向的传感器发现火焰,走左手灭1号,如果朝4号房间方向的传感