机器人
anjoman2012/08/23机械与工具 IP:四川
灭火机器人共享方案
一、基本概况
机器人灭火是中小学机器人比赛的常规项目,怎样提高机器人的灭火速度与稳定性是需要重点解决的课题。从整个宁波市情况看,宁波市中小学机器人项目起晚,水平不是很高。但宋诏桥小学灭火项目实力很强,在2005年的全国比赛中以较大的优势夺取了冠军。其123号房间灭火所使用的时间分别为3.8秒、6.9秒和9.6秒,可以说速度惊人,其他学校则实力一般。总体来讲,只要能在3分钟时间内成功灭火,就有望在市内获将。丹城中学机器人实验室自20059月份组建以来,经过2个月的奋战,终于研制成功灭火机制人“小白龙一号”,实现了比较先进的“无火不进房间”算法。该机器人在发挥稳定的情况下(没有加电压),1234号房间灭火所使用的时间分别为4.8秒、8.8秒、13.1秒和16.7秒。虽然这个成绩和国内的一流水平还有一定差距,但也不乏有一些成功的算法。
二、常用算法介绍
1)溜边法
就是靠墙走,包括左手法则和右手法则,这是最基本的机器人灭火走迷宫算法,是其他算法的基础。但仅仅使用简单的左手法则或右手法则只能完成小学组比赛,初中组由于要灭4个房间的火并且还要回家,高中组还要完成搜救任务,所以需要组合应用左右手法则。该方法编程简单但速度较慢,适合初学者使用,多见于县、市级比赛。
2)固定线路走法
   该方法组合应用走直线和走弧线两种基本方法,容易受电池电量和地面粗糙程度等因素的影响,算法的稳定性低,使用的人较少。
3)一技必杀法
   网络上人称失传多年的“一招致胜”算法,该算法的要点是在出发点就查找火焰在哪个房间,直接向需要灭火的房间前进。由于该算法没有任何加分系数,并且对场地的要求高,所以使用的人很少。
4)无火不进房间
    该方法的要点是在房间的门口看一下,如果房间内有火,则进去灭火,否则去其他房间寻找火焰,比简单使用左右手法则速度要快很多。该算法实际上是左手法则、右手法则、固定线路法的综合应用,实现起来比较难,是目前国内的主流算法,多见于省级和国家级比赛。
5)作弊算法
    常见的作弊算法是先编写好不同房间的灭火程序,抽签得到房间号后用声控、按钮、遥控等方法控制使用哪个子程序。该方法属于歪门邪道,没有研究价值。
参考以上算法,本实验室化了两个多月时间,调试近千次,终于实现了1-2-3-4号房间的无火不进房间算法,现对其中比较成功的部分向大家作一简单介绍。至于规则,由于篇幅所限,请大家自己到网络上去搜索。本校使用的机器人基本组件由纳英特公司提供。

三、丹城中学灭火机器人方案介绍
一)场地
机器人灭火竞赛场地平面示意图如下所示(单位:cm)
其中“H”为出发点,角落的是火焰,墙中间的是家具。
二)        传感器接法
      本机器人使用下列传感器接法,以实现左右法则的使用。
  左红外避障传感器接数字15口,
45度角红外避障传感器接数字10口,
右红外避障传感器接数字14口,
右左45度角红外避障传感器接数字8口,
前红外避障传感器接数字9口,
声控传感器接模拟2口,
左火焰传感器接模拟3口,
右火焰传感器接模拟4口,
前地面灰度传感器接模拟5口,
后地面灰度传感器接模拟6口。
三)        
在门口看火焰


总体算法
走左手去1号房间

走出起点0.5


     有火
在门口看火焰


                                                              
灭火

                                                                                                                        无火
后退,走右手去2号房间

          有火                                                        
                                          无火

在门口看火焰


灭火

                                           无火                                                                      
转身,走左手去3号房间


回家

                                                      
                                                                                                   无火     有火
灭火


回家

                                                                                    无火
回家

转身,走右手数秒,然后走夹道到4号房间墙壁,再走右手去4号房间,灭火,回家。



四)        白线检测
本校对纳英特技术人员在网站上提供的算法做了较大改进,使用一前一后两个灰度传感器,测试上千次无一失手,可靠性大大提高,现介绍如下:
1)            出发点的检测
其中bs=80  hs=120是常数,分别表示白线和地面灰度。
while((analog(5)< bs)&&(analog(6)<bs))//位于出发点
    { motor(0,100);
      
motor(1,100);}
    motor(0,100);
    motor(1,100);
    sleep(0.5);
    gotofangjian1();//走出出发点去1号房间
2)            终点的检测
outtime=mseconds();//出门时间
    while(1)     //      {
        
        if (analog(5)<bs &&analog(6)<bs&&digital(9)==0)//如果前后灰度都是白色,且前面有墙壁
          {
            if (mseconds()-outtime>3000l)//防止机器人在灭火圈或门口位置误以为到家
              { motor(0,-20);//到家刹车
                motor(1,-20);
                sleep(0.1);
                stop();
                break;}}
       //其他回家代码
       }
3)            房间门口线的检测
if(( analog(5)<bs && analog(6)>hs)||( analog(6)<bs && analog(5)>hs))//如果前白后黑或前黑后白则到门口
4)            灭火线的检测
if((((analog(5)<bs)&&(analog(6)>hs))||((analog(5)>hs)&&(analog(6)<bs))) &&((analog(3)<30|| (analog(4)<30))
//如果前白后黑或前黑后白并且火焰很强
{findhuoyanquan=1;//找到灭火圈
break;}
五)        灭火技巧
1)摇头灭火算法
   在京沪对抗赛上,很多学校使用了左右摇晃脑袋的算法进行灭火,本校首先试验了大范围摇头的算法,发现这种算法可靠性低,一旦前几次摇头灭火不成功,就有可能出现“南猿北撤”的现象,原因是左右轮胎的摩擦系数有所差异,导致风扇逐渐偏离火焰。其算法如下:
{
                    motor(0,-60);
                    motor(1,60);
                    sleep(0.8);
                    motor(0,60);
                    motor(1,-60);
                    sleep(0.8);
                    
                }
为避免上述情况,本校对算法作了如下改进:
motor(3,100);//开启灭火风扇
            tzcs=0;//此参数防止机器人做过多的摆动
            while(tzcs<35)
              {
                if (analog(3)<analog(4))//左边火焰强,向左多摇动一点。
                  {
                    motor(0,-60);
                    motor(1,60);
                    sleep(0.3);
                    motor(0,60);
                    motor(1,-60);
                    sleep(0.1);
                    
                }
                else if (analog(4)<analog(3)) //右边火焰强,向右多摇动一点。
                    {
                      motor(0,60);
                      motor(1,-60);
                      sleep(0.3) ;  
                      motor(0,-60);
                      motor(1,60);
                      sleep(0.1) ;
                  }
                  else //正对火焰,左右摇动幅度一样。  
                 {
                      motor(0,60);
                      motor(1,-60);
                      sleep(0.1) ;  
                      motor(0,-60);
                      motor(1,60);
                      sleep(0.1) ;
                  }

                  tzcs++;  
            }    
该算法的优点是能逐渐对准火焰,不会出现“南猿北撤”的现象。
2)接近火焰的算法
  有时候机器人离火焰比较远,导致风扇吹了很长时间也没有熄灭火焰,为了避免出现这种情况,我们使用了下列算法:
miehuotime=mseconds();
if( mseconds()-miehuotime>800L)//每灭火0.8秒前进0.2
              { miehuotime=mseconds();
                motor(0,30);
                motor(1,30);
                sleep(0.2);
                }
3)防止死灰复燃的算法
很多学校使用下面的简单算法来灭火:如果有火焰,开风扇3秒钟,无火焰,回家。这一算法不太可靠,很可能在检测火焰的瞬间,火焰接近于熄灭状态,等机器人回家时,死灰复燃,从而导致灭火失败。
本校使用连续3次确认灭火成功的算法来防止死灰复燃,每次检测1秒钟,其中menkouhuoyan=240是门口火焰值,这是一个常数
具体算法如下:
motor(3,100);
        try=0;
         if (try<3)
          {  
             while(try<3)//连续3次确认是否成功
              {
                trytime=mseconds();//开始检测火焰的时间
                trycg=1;//表示灭火成功
                 while(mseconds()-trytime<1000L)//连续检测1秒钟
                  {
                    if ((analog(3)<menkouhuoyan)||(analog(4)<menkouhuoyan))
                       trycg=0;//只要有1次发现火焰就表示灭火不成功
                   }
                if (trycg==0)
                try=0;//表示灭火不成功,需要重新确认
                motor(3,100);//开电机灭火2秒钟
                sleep(2.0);
                try++;
                 }
六)        回家算法
11号房间回家
走右手法则回家。
24号房间回家
走右手法则回家。
33号房间回家
走左手法则回家。
42号房间回家
走特殊的左手法则回家,实际上是左手法则和固定线路的组合。
由于2号房间回家对初学者是一个难点,现介绍算法如下:
首先走左手一段时间以调整身体姿态,在2号房间墙壁中间位置开始闭着眼睛走直线,走到3号号房间墙壁中间位置恢复走左手,然后回家。这种走法有较大的误差容限,可靠性比较高。具体代码如下:
void gohome2()
{
    motor(0,30);//转身回家,因为右手进门,现在要左手出门。
    motor(1,-90);
    sleep(0.3);  
    stop();  
    
    zc=0;//直走标志为未走
    outtime=mseconds();          //回家时间
    outdoortime=mseconds()+3000L;//出门口时间初值
    
    while(1)     //
      {
        
        if (mseconds()-outtime>2000L)//防止误把灭火线为当作门口线的情况出现
          if ((analog(5)<bs&&analog(6)>hs)||(analog(5)>hs&&analog(6)<bs))
            outdoortime=mseconds();//记下出门口时间
        
        if (analog(5)<bs &&analog(6)<bs)//如果回到家
          {
            if (mseconds()-outtime>3000l)
              { motor(0,-20);//终点刹车
                motor(1,-20);
                sleep(0.1);
                stop();
                break;}}
        
        
        if ((mseconds()-outdoortime>1300L)&&(zc==0))//出门1.3秒并且没有走过直道,开始走直道
          {
            zc=1;//走直道只能一次,置已经走过标志
            beep();
            motor(0,100);
            motor(1,100);
            sleep(1.1);  // 走直道1.1        
        }
          else//其他时间走左手法则回家
          {//下面是左手法则代码
            if (digital(9)==0 || digital(10)==0) // 前面有墙右转  
           {
                motor(0, 10);   //
                motor(1, -100);
            }
            else if (digital(15) == 0)  //  左边有墙直行  
         {
                  motor(0, 100);   //?
                  motor(1, 100);
              }
              else     //前无墙并且左无墙,左转。
                {
                  motor(0, -100);
                  motor(1, 100);
                  motor(0, -10);   //
                  motor(1, 100);
              }
        }        
         }
         }
七)        3号房间到4号房间的走夹道算法
3号房间先转身,然后走右手数秒,再走夹道到4号房间墙壁,接下去走右手进4号房间。其中走夹道算法如下:
while(digital(9)!=0)//走夹道直到前面看到4号房间墙壁
      {
       if (digital(15)==0&&digital(14)==0)//左有墙并且右有墙,前进
          {motor(0,80);
            motor(1,80);}
         else if (digital(15)!=0&&digital(14)!=0) //左无墙并且右无墙,前进
             {motor(0,80);
              motor(1,80);}
              else if (digital(10)==0&&digital(8)==0) //45度有墙并且右45度有墙,前进
             {motor(0,80);
                motor(1,80);}
            else if (digital(10)!=0&&digital(8)!=0) //45度无墙并且右45度无墙,前进
                {motor(0,80);
                  motor(1,80);}
              else if (digital(14)==0||digital(8)==0) // 只是右有墙,左转
                   {motor(0,-80);
                    motor(1,30);}
                else if (digital(15)==0||digital(10)==0) // 只是左有墙,右转
                     {motor(0,30);
                      motor(1,-80);}
                     }

四、小结
本校机器人实验室刚组建不久,整体算法不是很理想,稳定性不高,算法过于复杂,c语言代码有20多页,消耗了机器人53%的内存空间。现在本校正在研制更加先进的灭火机器人“海龙王一号”,试图应用新的灭火技术,如果取得较好结果,容以后向大家介绍。根据规则,连续转相同的5个圈为行动失败,为此还需要研究防迷路算法和迷路后的挽救措施。机器人静止30秒也会被判灭火失败,也需要研究相应对策。这些我们都来不及做实验,如以后能得到一些好的算法,也一并向大家介绍。

来自:仪器与装备 / 机械与工具
3
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}