发表日期:2017-08-27 19:51:36文章编辑:戴 渊浏览次数: 标签:亮宁机器人
一、预备知识
用于机器人巡线的地图上,终点的位置往往被设计成一个路口,方便机器人判断和停车。如果在终点的位置没有路口,仅仅是一根线,那么以前判断路口停车的方法便不再适用了。此时,我们需要换一种思路,既当机器人长时间感应不到黑线时便停车。
二、分析与实现
在之前的巡线学习过程中,我们用一个n变量来表示同一时间有几个传感器同时看到黑线就停车(如下面的代码段)。
void check()
{
ll=AR(4)>619; //检测到黑线返回1给ll变量,否则返回0
l=AR(2)>632;
m=AR(1)>509;
r=AR(3)>644;
rr=AR(5)>684;
n=ll+l+m+r+rr;//0<=n<=5,表示n个传感器同时检测到黑线
}
我们知道当n的值为0的时候,表示没有传感器检测到黑线,那么此时此刻停车,是不是就达到无路口停车的目的呢?这是行不通的,因为在正常巡线过程中也可能出现无传感器看到黑线的情况,如图1所示。
图1 巡线过程中可能出现“无眼看到黑线”
可能有人提出疑问,亮宁机器人巡线传感器固定支架,是允许调整传感器位置的。那是否可以通过调节传感器的位置,使相邻传感器的位置小于黑线宽度,使得在巡线过程中,不会出现图1所示的情况呢?当然我们可以这么去尝试,但是这并不能彻底的解决问题,因为图1所示情况,你还是无法百分百的排除,还会带来误码判路口的问题。为了大幅度增加无路口停车的准确度,我们还得继续往下学习。
当机器人行驶到路线的末端时,机器人检测不到黑线了,此时的情况与在线路上检测不到黑线的区别就是,它是长时间的检测不到黑线。那么我们的问题就在于如何判断机器人长时间检测不到黑线了。所谓“长时间检测”无非就是反复地、多次地检测到同样品结果。那么我们可以借助计数型循环(for)来完成该功能。请看如下的代码与注释。
for (i=1;i<=3000;i++)//准备3000次循环
{
check();//check函数的内容是上面的代码段
if (n>0) break;//只要有传感器看到黑线就终止跳出for循环
}
以上代码中的for循环,有两个终止条件:一是,当i由1逐一递增到3001;二是通过break语句终止。不难得出结论,如果for循环是由第一种情况结束的,那么i的值就是3001,此时意味着,3000次循环中n>0这个条件始终没有成立,也就是一段时间内始终没有传感器看到黑线,那么我们就该停车了!
在for循环的后面增加如下的判断语句:
if (i>3000) {motor(0,0);while(1)}
值得注意的是,这里的3000次循环,只不过是作者假设的一个循环次数,或者讲是作者假设的一个时间段。具体的循环次数(时间)还得读者自己去尝试。
三、程序实例
如图2所示的轨迹,要求机器人从A点出发沿着B黑线行驶,停止在B点。
#include <LNDZ.h>
int ll,l,m,r,rr,n,i;
int t=3000;//循环次数
void check()
{
ll=AR(4)>234;
l=AR(2)>245;
m=AR(1)>199;
r=AR(3)>210;
rr=AR(5)>299;
n=ll+l+m+r+rr;
}
void find()
{
if (ll==1) motor(-35,35);
if (l==1) motor(0,35);
if (m==1) motor(35,35);
if (r==1) motor(35,0);
if (rr==1) motor(35,-35);
}
void init()
{
B_start();
motor(30,30);
}
void repeat()
{
for (i=1;i<=t;i++)//准备t次循环
{
check();
find();//正常巡线的两个必要函数
if (n>0) break;//一旦看到黑线就跳出循环
}
if (i>t)//如果i>t表示t次循环内,n>0始终没有成立,因为,一旦n>0成立,for循环就//会被break语句强行终止,那么此时的i值不可能大于t
{
motor(0,0);
while (1);//停车
}
}
长沙市内培训报名联系电话:
1、长沙亮宁公司教育中心(总部):13787283661 13975105196
2、长沙市中山路培训部:13349601581
3、长沙市雨花区第六都培训部:13807311550 13873168349
4、长沙县万家丽北路培训部:13278862293
5、长沙市韶山路维一星城:18973116762
6、长沙市杨家山方舟大厦:13508476583
7、长沙市北辰三角洲优智机器人俱乐部:13873186864
8、长沙市雨花区万博汇:15211109942