发表日期:2016-10-31 20:58:37文章编辑:浏览次数: 标签:
下面的程序段一是简单的寻迹程序:
【程序段一】
void repeat()
{
if (gnd.getV(5)==0 motor(40,40);
if (gnd.getV(2)==0 motor(30,40);
if (gnd.getV(3)==0 motor(40,30); //此处向左向右调整的幅度是相同
delay(100);
}
上述算法用于走直线或弧度较小的曲线轨迹是没有问题的。但对于弧度较大的轨迹,机器人常常会冲出弯道。如下图所示的轨迹,我们用下面的程序段二来适用。
【程序段二】
void repeat()
{
if (gnd.getV(5)==0 motor(40,40);
if (gnd.getV(2)==0 motor(30,40);
if (gnd.getV(3)==0 motor(40,20);
delay(100);
}
上述程序的显著特点是,机器人向右调整时,调整幅度较大,而向左调整时幅度较小。所以称其为不对称法。如果机器人从上图的相反方向运行寻迹,则将调整方式兑换过来。
可是上述算法有一个缺陷,那就是机器人始终运动在向右偏转的道路上。如果是下图这样的轨迹,那冲出道路的概率会更高。
无论向哪个方向运动,机器人都面临向左或向右偏移运动。这时我们要智能地判断机器人所面临道路的情况。此时,我们借用一个状态变量来解决问题。
【程序段三】
int a;
void repeat()
{
if (gnd.getV(5)==0) {motor(40,40);a=0} //中间眼睛看到黑线时的情况没有改变
if (gnd.getV(2)==0) //两边的眼睛看到黑线分两种情况对待
{
if (a==1) motor(20,40); //连续左偏,则加大左偏力度
else
{
motor(30,40);a=1; //非连续左偏,则做较小偏转
}
}
if (gnd.getV(3)==0)
{
if (a==2) motor(40,20);
else
{
motor(40,30);a=2;
}
}
}
这个算法,用变量a记下上一个循环周期内机器人是向左(a=1)还是向右偏转的。如果本次偏转的方向和上一次的一致,说明向该方向上偏转的力度不够,则增加向这个方向上偏转的力度。如果本次偏转与上次不一致,无外乎是对上次偏转过度的反方向补偿,或刚有一定偏离轨迹的调整,则进行较小幅度的调整即可。
注意,上述程序中的偏转量只是理论上的,只是相对大小的说明。实践中要根据实际情况修改它们的值。而且上述算法也默认了机器人左右两轮子的速度、力量都是完全一致的。但大多数情况下,由于电子元件或马达的个体差异,很多情况下我们都应该注意参数的不对称性。
例如用函数motor(40,40)来走直线,结果,我们发现机器人总是向左偏转,说明机器人左轮速度相对右轮有点慢,我们就可以向前运动的指令写成motor(40,38)来抵销硬件上的差异。