• 沒有找到結果。

JC 程序的基本程序结构

在文檔中 目 录 第 1 章 (頁 53-56)

第 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);”就能返回两侧光敏的测量值。

要用好能力风暴传感器,需要对测量、采样原理有所了解。通常在使用传感器测量之前 都有个标定过程,设置测量值的参考点。能力风暴在出厂前,已经对所有的传感器进行了检 测,但是器件偏差和环境干扰是不可避免的。比如可能会出现左右光敏对同样光强的测量值 不一样,或采样出现异常值。所以在编程中,使用一些偏移量校正、去除测量噪声和避免误 触发的方法还是很有用的。

在文檔中 目 录 第 1 章 (頁 53-56)