第 4 章 能力风暴编程
4.4 JC 程序的基本程序结构
下面是JC 程序中最常见的一种程序模式。
while(1) /*循环检测*/
{
ir=ir_detector(); /*对环境采样*/
if(ir>0) /*条件判断*/
{
语句 1; /*做相应的处理*/
语句 2;
} else { 语句 3;
语句 4;
}
wait(0.1); /*采样周期*/
}
4.4.1
一个机器人“台球”程序
下面结合“台球”程序来学习碰撞传感器的使用。
void main () {
int bill_trans=0;
int bill_rot=0;
int bmpr=0;
while(1) /*无限循环检测*/
{
bmpr=bumper(); /*检测碰撞传感器*/
if(bmpr!=0) {
if(bmpr==0b0011) /*正前方发生碰撞*/
{
bill_trans=-80; /*后退*/
bill_rot=0;
}
else if(bmpr==0b1100) /*正后方发生碰撞*/
{
bill_trans=80; /*前进*/
bill_rot=0;
}
else if(bmpr & 0b0101) /*左侧发生碰撞*/
{
bill_trans=0;
bill_rot=-80;
drive(bill_trans,bill_rot);
wait(0.5); /*顺时针转一个角度*/
bill_trans=80; /*前进*/
bill_rot=0;
}
else if(bmpr & 0b1010) /*右侧发生碰撞*/
{
bill_trans=0;
bill_rot=80;
drive(bill_trans,bill_rot);
wait(0.5); /*逆时针转一个角度*/
bill_trans=80; /*前进*/
bill_rot=0;
}
drive(bill_trans,bill_rot); /*驱动电机*/
} } }
在该函数中有一个检测传感器的常用结构 “while(1){ 检测传感器;作出响应;}”。该结 构实现了对传感器的循环检测,使能力风暴能够对周围环境的变化及时作出响应。能力风暴 作出的响应可以是改变运动方式,也可以是改变一个内部变量。在这个例子里,能力风暴响 应来自外部四个方向上的碰撞,并相应地改变运动方向。程序刚开始运行时,能力风暴静止。
这时你只要给它一个初始碰撞,它就开始不停运动起来,在障碍物之间撞来撞去。你可以试 着用脚去碰它,看一看它是不是象一个“足球”。如果你有不止一个能力风暴,试着改变程 序对碰撞的响应方式,给每个能力风暴下载这样的程序,把它们摆在一起,让其中一个能力 风暴从远处撞过来,那场面一定象打台球,非常有趣。
4.4.2
红外和光敏的使用
能力风暴的红外传感器可以说是它最有用的武器。通过红外传感器,能力风暴可以探测 到前方和左右两侧 10~80 厘米以内的障碍,就象它的一对“眼睛”。下面我们看一个有趣的 程序,看看如何使用能力风暴的“眼睛”。
void main()
{ int ir = 0; /* 红外检测变量 */
int bmp = 0; /* 碰撞检测变量 */
int old_bmp = 0; /* 前一次的碰撞检测结果 */
int fol_trans_def =80; /* 预设的前进速度 */
int fol_rot_def = 40; /* 预设的转弯速度 */
printf("Follow\n"); /* 显示在 LCD 屏幕上 */
while(1)
{ ir = ir_detector(); /* 取红外系统检测结果 */
bmp = bumper() & 0b0011; /* 检测前左、前右方向上的碰撞 */
if (old_bmp && (! bmp)) /* 连续两次碰撞 */
wait(0.5); /* 等一会 */
else if (bmp) /* 如果前方有碰撞 */
stop(); /* 停止运动 */
else if (ir == 0) /* 前方没有物体 */
stop(); /* 停止运动 */
else if (ir == 4) /* 前方有物体 */
drive(fol_trans_def,0); /* 往前追 */
else if (ir == 1) /* 物体在左侧 */
drive(fol_trans_def,fol_rot_def); /* 转向左 */
else if (ir == 2) /* 物体在右侧 */
drive(fol_trans_def,(- fol_rot_def)); /* 转向右 */
wait(0.1); /* 让运动持续一会 */
old_bmp = bmp;
} }
这个例子实现了跟随前方物体。能力风暴可以跟随前方移动的人或物;如果撞上前方的 物体,就停一停;如果前方红外系统探测范围内没有物体,它就停下来。可以修改上面的程 序,让能力风暴避开障碍物。给一个能力风暴下载避让程序,其他的能力风暴下载跟踪程序,
在适当的条件下能看到,能力风暴一个跟着一个排成长龙,鱼贯前进。
光敏的使用和红外系统类似,所不同的是光敏只能感知左右两侧的明暗,和距离没有直 接关系。调用“photo(l); photo(2);”就能返回两侧光敏的测量值。
要用好能力风暴传感器,需要对测量、采样原理有所了解。通常在使用传感器测量之前 都有个标定过程,设置测量值的参考点。能力风暴在出厂前,已经对所有的传感器进行了检 测,但是器件偏差和环境干扰是不可避免的。比如可能会出现左右光敏对同样光强的测量值 不一样,或采样出现异常值。所以在编程中,使用一些偏移量校正、去除测量噪声和避免误 触发的方法还是很有用的。