规则要求车辆通过十字交叉路口需要直行,不允许左转、右转。赛道如图4.6所示。这就需要我们能够准切的判断十字防止图像将CCD当作弯道进行处理。我们对于十字的判断是先用第三个也就是最远的那个CCD进行预判,然后对于寻线先是选择最近的那一个CCD进行寻线,当第二个CCD出十字第一个CCD入十字后又选择第二个CCD进行寻线,这样就能够准确的判断和处理十字交叉路口了。具体程序如下:
图4.6 十字交叉路口
void cross_road()//十字ccd切换,优先选择较进的ccd巡线 {
cross_in_flag=0; cross_out_flag=0;
if(//ccd1_both_lost_count>=4 // &&
ccd3_roadwidth[0]>70 &&ccd3_roadwidth[1]>70 &&ccd3_roadwidth[2]>70 &&ccd3_roadwidth[3]>70
)//ccd3丢线,第三个CCD进入十字
{ccd3_cross_flag=1;} else ccd3_cross_flag=0; if(ccd1_roadwidth[0]>70 &&ccd1_roadwidth[1]>70 &&ccd1_roadwidth[2]>70 &&ccd1_roadwidth[3]>70
)//ccd1丢线,第二个CCD进入十字 ccd1_cross_flag=1;
else ccd1_cross_flag=0; if(ccd2_roadwidth[0]>70 &&ccd2_roadwidth[1]>70 &&ccd2_roadwidth[2]>70
39
第九届全国大学生智能汽车邀请赛技术报告
&&ccd2_roadwidth[3]>70
)//ccd1丢线,第一个CCD进入十字 {ccd2_cross_flag=1;}
else if(ccd1_cross_flag==1
&&ccd2_roadwidth[0]>70 &&ccd2_roadwidth[1]>70 )
{ccd2_cross_flag=1;} else ccd2_cross_flag=0;
if(ccd3_cross_flag==1&&ccd1_cross_flag==0&&ccd2_cross_flag==1)//ccd2十字,ccd1非十字,优先选择有效最近ccd巡线 {
if(ccd1_right_record[0]==1
&&ccd1_right_record[1]==1 &&ccd1_left_record[0]==1 &&ccd1_left_record[1]==1 &&ccd1_roadwidth[0]<45
&&ccd1_roadwidth[1]<45//ccd1已经出十字,且搜线正常,偏差有效
&&ccd1_roadwidth[2]<45 &&ccd1_roadwidth[3]<45 )
{cross_out_flag=1;bellring=100;} }
if(ccd2_cross_flag==1&&ccd1_cross_flag==1&&ccd3_cross_flag==0)//ccd2,ccd1十字,ccd3非十字 { if(
ccd3_right_record[0]==1
&&ccd3_right_record[1]==1 &&ccd3_left_record[0]==1 &&ccd3_left_record[1]==1 &&ccd3_roadwidth[0]<=70 &&ccd3_roadwidth[1]<=70 &&ccd3_roadwidth[2]<=70
)//ccd3已经出十字,且搜线正常,偏差有效 {cross_in_flag=0;bellring=100;} } }
40
4.3.5 障碍策略分析
赛道障碍是对称楔形体,长宽高分别为 30、10、5厘米。路障内侧边缘距离赛道中心线距离是 5 厘米。路障的出现给直立小车带来了非常大的影响,如若盲目的冲撞上去,必然会导致翻车儿无法继续进行本圈的比赛,因此,我们不得不对其进行检测,当CCD检测到连续4场全黑的情况下,我们便默认为小车前方出现了路障,并对速控以及转向进行处理,进而达到平稳过路障得效果。
图4.7 路障
4.3.6 坡道策略分析
CCD在入坡道时,由于仰视,CCD看不到坡道信息,且CCD检测不出是否处于坡道。我们利用陀螺仪在垂直水平面的方向上的角速度积分来判别,当积分值大于设定值,即认为,处于上坡阶段。同样也能判别下坡。
4.4对速度的闭环控制
图4.7 PID控制工作原理
PID控制策略其结构简单,稳定性好,可靠性高,并且易于实现。其缺点在于控制器的参数整定相当繁琐,需要很强的工程经验。相对于其他的控制方式,在成熟性和可操作性上都有着很大的优势。所以最后我们选择了PID的控
41
第九届全国大学生智能汽车邀请赛技术报告
制方式。
在小车跑动中,因为不需要考虑小车之前走过的路线,所以,我们舍弃了I控制,将小车转向的PID控制简化成PD控制。
steer_d = steer_kn+char_abs((int)(diserror))*d_rate;//转向D跟随偏差变化率
steerpwmout=temp*(steer_control_count+1)/5+steerpwmold;
本方案中通过双电机的差速控制采用位置式的PD控制,速度闭环控制采用了位置式PI控制。
speed_pout=speed_kp*(speed_error);
速度I控制,积分分离,在偏差过大时关闭积分。 if (speed_error<=15&&speed_error>=-15) {speed_integration+=speed_ki*speed_error;}
if(speed_integration>=180)//积分限幅,需要测试确定限幅值 speed_integration=180;
if(speed_integration <=-180) speed_integration=-180;
speedpid_out =speed_integration+speed_pout; if(speedpid_out>=speedpidout_limit) speedpid_out=speedpidout_limit;
if(speedpid_out<=-speedpidout_limit) speedpid_out=-speedpidout_limit;
}
uint8 speed_sample_count=0;
void SpeedControlOut() //速度平滑输出 {
speedpid_pwm=speedpidold_out+(speedpid_out-speedpidold_out)*(speed_sample_count+1)/50.0;
}
在本方案中,使用试凑法来确定控制器的比例、积分和微分参数。
试凑法是通过闭环试验,观察系统响应曲线,根据各控制参数对系统响应的大致影响,反复试凑参数,以达到满意的响应,最后确定PID控制参数。试凑不是盲目的,而是在控制理论指导下进行的。在控制理论中已获得如下定性知识:
比例调节(P)作用:是按比例反应系统的偏差,系统一旦出现了偏差,比例调节立即产生调节作用用以减少偏差。比例作用大,可以加快调节,减少误差,但是过大的比例,使系统的稳定性下降,甚至造成系统的不稳定。
积分调节(I)作用:是使系统消除稳态误差,提高无差度。因为有误差,积分调节就进行,直至无差,积分调节停止,积分调节输出一常值。积分作用的强弱取决与积分时间常数Ti,Ti越小,积分作用就越强。反之Ti大则积分
42