发表日期:2017-03-27 14:48:09文章编辑:信息管理员浏览次数: 标签:亮宁机器人
老师们从网站或QQ群里下载的亮宁机器人巡线程序,都只是一个巡线的框架,并没有考虑场地、摩擦力的大小,环境光照条件以及场地线形等细节的处理。所以,作者在这撰文,重点分析巡线程序应该解决的一些问题。
1、为何要取平均值?测光值时,要求测量黑值和白值,然后取平均值,作为机器人是看到黑线还是白线的分界线。因为中间值离黑值和白值相差一样远,使黑白分明,且不会因一点点波动,就会影响对黑白判断的失误。
2、多个眼睛的值为何不相同?模拟地面灰度传感器除了个体传感器,阻值的误差导致传感器取值不同之外,还与五光传感器安装的位置受环境光影响不同有关。所以我们测值的结果,不同传感器的分界值会有不同。
3、一般光线分界值在什么范围内?亮宁机器人的地面循线传感器有两种。一种的白值在400~500之间,黑值在600~800之间,分界值在500~600之间。上下有点偏差,但都很正常。另一种白值在100~200之间,黑值在300~400之间,平均值在150~250之间。同样允许有些偏差。
4、为什么五个传感器有一个与众不同?如果五个传感器所测的值相差太大,特别是其中一个远不同于其他四个,则主要原因是该灰度传感器的光敏元件歪斜所致,如图1所示,将其小心拨正就是。我们应该始终保持光敏元件的受光面与地面平行。
5、为何所测量的分界值每次都不一样?因为光照条件、地面材质不同,会使每次所测得的分界值有所不同。但也不致相差太远。如果发现变化太大,就要注意场地白色区域是否干净,放在黑线上时,传感器是否在黑线正上方。特殊情况下测得的光值就是不正确的。
6、是否每次巡线都要测光值?如果场地没有改变材质,环境光线没有大的改变,就不必要重测光值。对于亮宁机器人,细微的改变,不会影响运行结果。所谓大的改变,一般为是否拉窗帘,是否开白炽灯,是否由木质场地改灯箱布,是否由晴转阴等。
关于路口的处理,程序段通常是以下这种基本形式:
if (n>2)
{
t++; //路口计数
if (t<=4 || t==8||t==10)
{
motor(40,40);delay(100); //1至4号、8号,10号路口直行
}
else if (t==5||t==7)
{
motor(-40,40);delay(300); //5,7号路口左转
}
else if (t==6||t==9)
{
motor(40,-40);delay(300); //6,9号路口右转
}
else
{
motor(0,0);while(1); //11号路口停车并终止程序
}
}
本文讨论的路线图
但如果就用上面的程序运行,其结果是成功率很低。这是为什么呢?
机器人从起点出发,途径一段很长的路,到达5号路口才转弯。不难想像,这时机器人走得很顺,速度很快。当其检测到5号路口时,往往会冲出十字路口。这时我们应该将机器人后退一小段时间再转弯,不然会脱线或回头走。
当机器人经过6、7号路口时,因为前面刚刚转弯过来,或经过一段弧线,机器人速度还没跑上来,又要转弯了。这时机器人看到黑线立即转弯,导致转弯后找不到左右转弯的路线面往回走。所以,我们应该在机器人看到黑线后向前走一小段再转弯。于是5号路口与7号路口要分别对待的现象。
而9号路口,却因转弯前经过两段直线,可能状况不会出现上述两个极端的情形,我们可以不予理会。
上面的分析,只是一般情况的分析。具体情况,要视走线的情况,经过观察发现问题。例如场地摩擦比较大,机器人的速度始终上不来,我们就要把大部分情况都视同短距离助跑的现象来对待,反倒长距离不用管它。
即使是直行,我们也要分别对待。因为起先只是为了越过黑线,不让机器人对同一路口 反复计数,所以时间尽量短,以免脱线。也就要根据当时的速度快慢来决定延时的时间长短。
上面的程序段修改如下:
两种转弯脱线的示意图
if (n>2)
{
t++; //路口计数
if (t==2||t==3||t==4)
{
motor(40,40);delay(70); //2至4号直行,时间短
}
else if (t==1||t==8||t==10)
{
motor(30,30);delay(100); //1,8,10号直行时间长
}
else if (t==5)
{
motor(-30,-30);delay(50);
motor(-40,40);delay(300); //5号路口左转处理,先后退
}
else if (t==7)
{
motor(30,30);delay(100);
motor(-40,40);delay(300); //7号路口左转,先前进
}
else if (t==9)
{
motor(-40,40);delay(300); //9号不做处理
}
else if (t==6)
{
motor(30,30);delay(100);
motor(40,-40);delay(300); //6,9号分别处理
}
else
{
motor(0,0);while(1); //11号路口停车并终止程序
}
}
以上程序各个时间的长短,也只是一个假定。具体的数值不宁在临场进行调试。