您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 综合/其它 > 丹城中学灭火机器人共享方案(三)
丹城中学灭火机器人共享方案(三)浙江省象山县丹城中学顾熙杰摘要:机器人灭火是中小学机器人比赛的常规项目,怎样提高机器人灭火的速度和稳定性是我们需要重点解决的问题。丹城中学机器人实验室自05年9月份建立以来,经过9个多月的实验,灭火机器人的研究取得了初步的成果,使用4、3、2、1的搜索顺序,灭火最好成绩分别为2.50秒、5.44秒、9.19秒和10.75秒,稳定成绩一般每个房间要延时半秒左右。虽然这个成绩和国内的超一流水平还有一定差距,但灭火回家的成功率超过%99,其中不乏有一些成功的算法,现作些介绍,和兄弟学校的师生共享研究成果,具体描述基于纳英特机器人平台。关键词:机器人灭火一)火焰检测传感器布局设计灭火机器人最少需要1个火焰检测传感器来完成灭火任务,当然使用烟雾传感器等也是可以的。1)1个火焰传感器的安装根据规则,蜡烛高度为15-20厘米,火焰高度是2-3厘米,所以如果安装一个火焰检测传感器的话,他的高度大概应该在18厘米左右。如果安装一组传感器来检测同一目标,重心应该在18厘米高度位置。2)2个火焰传感器的安装如果2个火焰传感器是主传感器,不但要用来检测有没有火焰,而且还要利用他们进行对光操作,那么一般如下安装。2个火焰传感器的高度都在18厘米左右。一般安装在机器人前面中心位置,2个传感器对称安装,一般向外偏转一定角度,2个传感器之间有一定的距离,使机器人发现火焰的可能性尽量大,同时对称的位置有利于对准火焰。如果2个火焰检测传感器作一组,不是主传感器,用来检测同一个目标,那么可以如下配置,例如在路过2号房间时要检测1号房间有没有火焰,先从火焰位置引出两条线,连接门口两边,作角平分线,火焰传感器的主角度就按照角平分线在机器人上的位置安装,如果用2个传感器来完成这个任务,如下安装。2个传感器之间既要有水平距离,也要有垂直距离,角度也要和主角度有一定的偏转。重心落在主角度上,高度18厘米左右。由于机器人在行走时不能保证一定平行于墙壁,上面这样安装,发现火焰的可能性最大。3)3个火焰传感器的安装方法主要有上面2种,计算方法参考上面文章。有的同学把3个传感器安装在同一水平线上,这样稳定性不太好。二)黄金分割法在灭火机器人回家算法中的应用以1号房间回家为例1种常见的错误是机器人把灭火圈或者门口当成家,在那里停止不动。为此我们可以这样处理:先测量从灭火成功走到门口的时间10次,求出平均值,如4秒钟,根据黄金分割法,我们设置2.5秒时间为分界点,先走2.5秒右手法则,然后走右手法则到白色地面,这时候就到了门口,这样做的目的是防止机器人误把灭火圈当成门口。门口和家之间也同样处理,这是一种提高回家稳定性的方法,这一方法在迷宫搜索阶段同样有效。三)队列在灭火机器人白线检测中的应用队列是一种特殊的数据结构,他只能在队头出队,在队尾入队.如下图,我们引入一种特殊的队。队头指针总是指向0,所以不需要队头变量.队尾指针总是指向最后一个队员的际位置.队尾指针指向0表示队列是空的.它具有下列基本操作:longqueue[100];//队列数组intqueue_rear//队尾指针1)清空队queue_rear=0;2)入队queue_rear++;queue[queue_rear]=mseconds();3)求队长return(queue_rear);下面介绍一下他在白线检测中的应用。如上图,当机器人路过白线时,他会连续检测到白色,我们把它入队,当队列只有1个队员时,他可能是一个受到污染的白点,当队列长度比较短时,他可能是门口或灭火圈,当队列长度比较长时,他可能是起点(终点).当机器人路过黑色地面时,我们把队列清空.我们使用1个地面检测传感器来实现白线检测,假设接模拟3口.用1个火焰检测传感器来区分门口线和灭火圈,假设接模拟4口.这里使用的是纳英特机器人,参考算法如下:intbs=50;//表示白色的灰度值inths=160;//表示黑色的灰度值inti;voidmain(){queue_rear=0;while(1){migong_left();//走左手法则i=test_white()//然后你要根据i的值做不同的选择}}inttest_white(){if(queue_rear=98)//防止队满.queue_rear=97;if(analog(3)bs)//位于白色地面时入队.{if(queue_rear==0)//空队时的入队.{queue_rear++;//入队.queue[queue_rear]=mseconds()//记下检测到白色的时间.return(1);}//表示正在白色地面上行走,但暂时不知道是在家还是门口.else//队非空时的入队.{if(mseconds()-queue[queue_rear]10L)//每10毫秒作为1个时间片,参数请根据你的机器人速度修改.{queue_rear++;//入队queue[queue_rear]=mseconds();}//记下检测到白色的时间.if(queue_rear=10)//10这个参数请根据你的机器人速度修改.return(4);//表示路过家elseif(queue_rear=3)//3这个参数请根据你的机器人速度修改.//表示路过门口或灭火圈,要用火焰值来进一步区分.{if(analog(4)30)//火焰强.30这个参数请修改.return(3);//路过灭火圈.elsereturn(2);//路过门口.}elseif(queue_rear=1)return(1);//表示正在白色地面上行走,但暂时不知道是在家还是门口.}if(analog(3)hs)//位于黑色地面时清空队.{if(queue_rear=10)//10这个参数请根据你的机器人速度修改.{queue_rear=0;//清空队列以便下一次检测.return(4);//表示路过家.}elseif(queue_rear=3)//3这个参数请根据你的机器人速度修改.{//路过门口或灭火圈,要用火焰值来进一步区分.queue_rear=0;//清空队列以便下一次检测.if(analog(4)30)//火焰强.30这个参数请根据你的机器人的实际进行修改.return(3);//路过灭火圈.elsereturn(2);//路过门口.}else{queue_rear=0;//清空队列,以便下一次检测.return(-1);//表示在黑色地面上行走.}return(0);//表示在灰色地面上行走.}四)防止转5个圈的算法根据规则,如果机器人转5个相同的圈,任务就失败。为此,我校实验室研究了防止转5个圈的算法,我们使用转动频率分析的方法来实现这一算法,实际操作时参数的调节很重要。参考算法如下,以左手法则为例。Intp;Intp1;Intp2;Floatpp;voidmigong_left()//左手法则代码{if(digital(12)==0||digital(13)==0)//前有墙右转{p2--;motor(0,30);motor(1,-90);}elseif(digital(11)==0)//左有墙前进{p1++;motor(0,70);motor(1,70);}else//什么也没看到,左转{p2++;motor(0,-60);motor(1,60);motor(0,80);motor(1,80);motor(0,-40);motor(1,40);}if(p1+p22000){pp=(float)p2/(float)(p1+p2)if(pp0.6){//做出相应处理}}}调用前后要做初始化处理,防止数据溢出。
本文标题:丹城中学灭火机器人共享方案(三)
链接地址:https://www.777doc.com/doc-44850 .html