第九章灭火机器人设计技巧9.1 迷宫行走和白线检测合一的设计方法很多公司的教学机器人使用多进程的方法,一个进程走迷宫,另一个进程测地面。
使用双进程的方法,对速度慢的机器人来说,确实没有什么影响。
当我们把机器人灭火的速度提高到平均每个房间3秒钟以内的时候,由于两个进程之间很难同步,会出现找不到白线的情况。
为了克服这一错误的发生,我们可以使用迷宫行走和白线检测合一的设计方法来解决这个问题。
当我们的迷宫算法里面没有使用sleep语句时,可以在算法的开头和结尾加入判断地面的语句。
当机器人在白色地面行走时,函数返回1,在黑色地面上行走时,函数返回0。
再利用这个迷宫函数编写按时间走迷宫和走迷宫到白线的函数。
利用这两个函数来实现分段迷宫算法,从而实现无火不进房间的走法。
该算法我们在第三章已经作了简单介绍,在这里就不再论述。
如果程序中使用了sleep语句,该语句可以使用循环语句来代替,关于怎样消除sleep 语句,大家可以参考下面的文章。
9.2 提高灭火机器人稳定性的常用方法(1)降低机器人的重心如下图就是一台低底盘的机器人,重心低的机器人在行走时不容易出现抖动现象,稳定性得到提高,速度也更快。
图9_1(2)走中间道路我们在自己实验室测试机器人时,参数最好是设置为使机器人成功率最高的状态,例如从4号门口退出,力求机器人是从门的中间后退,如果机器人开始位置总是向右偏,在后退之前我们先让机器人把位置转正。
这样到了比赛场地,由于各种因素的作用,机器人还是会出现偏差,但由于我们在前面已经把机器人参数设置为中间状态,稍微的偏移不容易导致任务的失败。
(3)冗余设计例如我们有1个方案,使用4-3-1-2的搜索顺序,如果4号和3号没有发现火,在路过1号门口时也没有发现火,那么火就在2号房间,机器人走到2号房间的灭火圈后不用检测火焰,就可以直接扑灭火焰。
但这样做有一定的风险,最好是到了灭火圈再作一次判断,如果有火,扑灭火焰,如果没有,进入补救程序。
这样我们就解决了漏检火焰的问题,机器人的稳定性得到了提高。
(4)出错后的补救9.3 迷宫法则的演化规律机器人要完成灭火任务,首先要学会走迷宫。
走迷宫的基本方法叫溜边法,就是机器人沿着一边的墙壁走路。
所有的机器人,不管有多少个红外避障传感器,走迷宫都有一个共同的法则,我们把它叫“迷宫法则”迷宫法则:看到墙壁,离开墙壁,看不到墙壁,接近墙壁。
上面的话看上去是自相矛盾,机器人就是在不断解决这对矛盾的过程中,找到行走的路线的。
迷宫法则根据参照物在机器人的左侧还是右侧,又可以分为左手法则和右手法则。
左手法则:看到墙壁往右转,看不到墙壁往左转。
由于右手法则和左手法则是完全对称的,左手法则的原理经过变化也适合右手法则,所以在这一节我们对右手法则不再讨论。
作者希望对迷宫算法进行规律性的分析,为同学们做出又快又稳的迷宫走法提供一些思路。
迷宫行走的速度和红外传感器的数量有关,数量相同,和传感器的分布位置有关。
上述两个因素都相同,还和传感器的分布角度有关,上述三个因素相同,速度还和迷宫法则实现的语法结构有关。
上述四个因素都相同,迷宫行走的速度还和马达参数有关。
可以说迷宫算法是千变万化,所以就出现了下面的情况,有的同学的机器人走迷宫象飞一样,而有的同学的机器人走迷宫象蜗牛爬,甚至在原地打转。
由于变化的因素太多,所以迷宫调试的难度很大,关于迷宫调试没有公式可用,作者试图总结出一些规律供同学们参考。
(1)规律一:红外传感器的数量越多,迷宫行走速度的分化越严重。
随着红外传感器数量的增加,迷宫行走速度的分化越来越严重。
如果做得好,红外传感器数量越多,迷宫行走的速度越快,调试能力低,红外传感器数量越多,迷宫行走的速度越慢。
其原因是红外传感器的数量增加后,相互配合的选择性变多,如果调得好,速度能加快。
如果调试不好,传感器越多,相互干扰越大,机器人常做出自相矛盾的微动作,机器人表现为在某处发抖。
在角落处,由于红外传感器发出的光线被反复反射后被其他传感器收到,抖动现象特别厉害,严重的甚至出现30秒不动的情况。
目前看来,国内的各种教学机器人,以使用三个传感器走迷宫的方法为主流。
据作者了解,目前国内已经有少数高手掌握了四个传感器的迷宫走法,速度特别快,这些人多半是全国或省冠军的教练。
同学们一般是从两个开始学习,能熟练掌握三个传感器的调试方法就已经很成功了。
(2)规律二:语法结构中前进语句越多,机器人行进速度越快。
语法结构中前进语句越多,机器人行进速度越快,撞墙的可能性也随着增加,调试难度同样增加。
下面我们举了几个例子来说明这个问题。
假设纳英特机器人前面传感器接13口,左45度接11口,那么下面的代码就是左手法则的简单应用。
Void migong_left(){If (digital(13)==1|| digital(11)==1)// 看到墙壁往右转。
{Motor(0,40); // 右转Motor(1,-100);}Else//看不到墙壁往左转弧线{Motor(0-60) ;// 左转Motor(1,60);Motor(0,80); //前进Motor(1,80);}从上面的代码大家可以看到,前进语句只占移动语句的1/3,所以这个迷宫算法是很慢的,是我们刚入门阶段学习的方法。
如果把上面的代码改成Void migong_left(){If (digital(13)==1)// 前面看到墙壁往右转。
{Motor(0,40); // 右转Motor(1,-100);}Else If (digital(11)==1)// 左边看到墙壁往前走。
{Motor(0,80); //前进Motor(1,80);}Else//看不到墙壁往左转弧线{Motor(0-60) ;// 左转Motor(1,60);Motor(0,80); //前进Motor(1,80);}上面的算法前进速度是增加了,但它要撞墙,所以这个算法是没有用的。
一般来说,前进分量不能达到或超过全部移动量的一半,否则机器人的转动就成了问题。
前进分量越接近全部移动量的一半,算法越快,但这样的算法不好找。
对此,我们可以在一个传感器的判断中插入半个前进,现在对上面的算法进行改进。
Void migong_left(){If (digital(13)==1)// 前面看到墙壁往右转。
{Motor(0,40); // 右转Motor(1,-100);Sleep(0.005);}Else If (digital(11)==1)// 左边看到墙壁右转并前进。
{Motor(0,40); // 右转Motor(1,-100);Sleep(0.005);Motor(0,80); //前进Motor(1,80);Sleep(0.001);}Else//看不到墙壁往左转弧线{Motor(0-60) ;// 左转Motor(1,60);Motor(0,80); //前进Motor(1,80);}如果这个算法还要撞墙,可以增加转动量或减少前进量,如:Void migong_left()If (digital(13)==1)// 前面看到墙壁往右转。
{Motor(0,40); // 右转Motor(1,-100);Sleep(0.005);}Else If (digital(11)==1)// 左边看到墙壁右转并前进。
{Motor(0,40); // 右转Motor(1,-100);Sleep(0.005);Motor(0,80); //前进无延时,否则要撞墙。
Motor(1,80);}Else//看不到墙壁往左转弧线{Motor(0-60) ;// 左转Motor(1,60);Motor(0,80); //前进Motor(1,80);}如果设计三个传感器的走法,我们可以先根据迷宫法则写出原型,然后进行改进,如:Void migong_left(){If (digital(13)==1)// 前面看到墙壁往右转。
{Motor(0,40); // 右转Motor(1,-100);}Else If (digital(12)==1)// 左45度看到墙壁往右转。
{Motor(0,40); // 右转Motor(1,-100);Else If (digital(11)==1)// 左边看到墙壁往右转。
{Motor(0,40); // 右转Motor(1,-100);}Else//看不到墙壁往左转弧线{Motor(0-60) ;// 左转Motor(1,60);Motor(0,80); //前进Motor(1,80);}大家可以看到,在这个算法原型中,前进量太少,机器人的速度比两个传感器的走法还要慢。
对此,我们可以把接11号端口的左边传感器有关的判断改为前进,速度可以明显提高。
Void migong_left(){If (digital(13)==1)// 前面看到墙壁往右转。
{Motor(0,40); // 右转Motor(1,-100);}Else If (digital(12)==1)// 左45度看到墙壁往右转。
{Motor(0,40); // 右转Motor(1,-100);}Else If (digital(11)==1)// 左边看到墙壁往前进。
{Motor(0,80); // 前进Motor(1,80);}Else//看不到墙壁往左转弧线{Motor(0-60) ;// 左转Motor(1,60);Motor(0,80); //前进Motor(1,80);}这是纳英特机器人公司的典型算法,我们还可以在12号传感器的判断中插入半个前进,如:Void migong_left(){If (digital(13)==1)// 前面看到墙壁往右转。
{Motor(0,40); // 右转Motor(1,-100);Sleep(0.005);}Else If (digital(12)==1)// 左45度看到墙壁往右转并前进。
{Motor(0,40); // 右转Motor(1,-100);Sleep(0.005);Motor(0,100); // 前进Motor(1,100);}Else If (digital(11)==1)// 左边看到墙壁往前进。
{Motor(0,100); // 前进Motor(1,100);}Else//看不到墙壁往左转弧线{Motor(0-60) ;// 左转Motor(1,60);Motor(0,80); //前进Motor(1,80);}这个算法的红外传感器的分布,观察距离、角度、马达参数等调节难度比较大,但速度更快。
现在同学们已经知道了,为什么调节得好,四个红外会走得更快的原因了吧。
9.4 sleep语句的消除9.5 一技必杀法变种介绍本算法适合小学组,我们浙江省最强的队如宋诏桥小学,画溪小学,云山小学,启新学校,群星学校,灭第4个房间,不管1-2-3-4还是4-3-2-1都是11秒左右,算上系数是3秒多,不合算。