发表日期:2016-10-31 20:58:28文章编辑:浏览次数: 标签:
数学表达式在机器人程序中的重要应用
数学是个神奇的东西,它可以使问题简单化。学习机器人,如果有较好的数学基础,能帮助你更加清晰地分析问题和处理问题。
下面是对寻线的程序中表达式书写的分析。
void check()
{
ll=grd.getV(1); //这些数据,看到黑线为0,未看到黑线为1
l=grd.getV(2);
m=grd.getV(5);
r=grd.getV(3);
rr=grd.getV(4);
n=ll+l+r+rr+m; // n==5时为五个眼睛全看到白色区域
}
这个函数里引入的变量n,获取五个地面寻线传感器取值之和。看似一个非常简单的表达式,却为后面书写复杂条件提供了方便。
举例如下:
1、五个眼睛都看到白色区域:n==5(每个眼睛看到白色的传感器取值为1)
2、五个眼睛都看到黑色线:n==0
如果没有引入n这个变量,要说明上述两个条件也不难,就写:
ll+l+m+r+rr==0/5
可要表达下面这个条件,变量n的作用就明显起来
3、五个眼睛中有四个看到白色,只有其中一个看到黑色,表达式为:n==4。
想想看,如果没有变量n,你打算如何写。从未思考过这个问题的同学,你或许还无从下手。
4、五个眼睛中仅三个眼睛看到白色,两个眼睛看到黑线:n==3
更大的优势表现在下面的条件中:
5、至少有3个眼睛同时看到黑线:n<3
6、至少有4个眼睛同时看到黑线:n<2
读者不妨去掉n这个变量,看看这两个条件如何写。如果你能写出正确的表达式,你更会觉得变量n的引入,真让人太方便了。
我们再来看下面这段我们最常见的程序
先将地面寻线传感器的读数程序改动如下:
void check()
{
ll=1-grd.getV(1); //经这么修改,看到黑线为1,未看到黑线为0
l=1-grd.getV(2);
m=1-grd.getV(5);
r=1-grd.getV(3);
rr=1-grd.getV(4);
n=ll+l+r+rr+m; //n==5时,是五个眼睛全看到黑线
}
这里多次使用 x=1-y 形式的表达式,其作用是使x与y的0/1属性刚好相反。
经过上面的改动,n的值对应于n个眼睛看到黑线,更符合人们的习惯。且常用的寻线程序如下:
void line()
{
if (ll+l==2) motor(-10,50);
else if (ll==1) motor(0,40);
else if (l==1) motor(10,30);
else if (r==1) motor(30,10);
else if (rr==1) motor(40,0);
else if (rr+r==2) motor(50,-10);
else if (m==1) motor(20,20);
if (n>2) //三个或以上的眼睛同时看到黑线
{
motor(0,0);
return;
}
}
我们再借助2个变量,将程序写成另一种形式,但效果一样。
int v0=20;
void line()
{
k=2*ll+l-r-2*rr;
motor(v0-10*k,v0+10*k);
if (n<3)
{
motor(0,0);
return;
}
}
这样程序变量相对简单,且不易出错。修改也简单,我们只要修改v0和k的系数,就可以改变机器人对不同线型循迹的需要。
在这里,变量k的取值对应下面的情况:(v0=20)
变量或表达式 |
ll |
l |
r |
rr |
k |
v0-10*k |
v0+10*k |
分 析 |
1 |
0 |
0 |
0 |
0 |
0 |
20 |
20 |
全白 |
2 |
0 |
1 |
0 |
0 |
1 |
10 |
30 |
黑线偏左 |
3 |
1 |
0 |
0 |
0 |
2 |
0 |
40 |
黑线偏左严重 |
4 |
1 |
1 |
0 |
0 |
3 |
-10 |
50 |
左边两个眼睛同时看到黑线 |
5 |
0 |
0 |
1 |
1 |
-3 |
50 |
-10 |
右边两个眼睛同时看到黑线 |
6 |
0 |
0 |
0 |
1 |
-2 |
40 |
0 |
黑线偏右严重 |
7 |
0 |
0 |
1 |
0 |
-1 |
30 |
10 |
黑线偏右 |
8 |
1 |
1 |
1 |
1 |
1 |
20 |
20 |
全黑 |
从上表的分析,我们可以看出一个简单的语句与上面程序中多个分支语句(if 结构)的对应关系,而表达式
k=2*ll+l-r-2*rr;
和语句motor(v0-10*k,v0+10*k)里的两个速度表达式,将复杂的条件分析简化为数学运算。但数学表达式的产生,需要大家在实践中总结经验,才能获取理想的描述现象的表达式来。