光电组武汉科技大学首安一队技术报告 - 图文 联系客服

发布时间 : 星期日 文章光电组武汉科技大学首安一队技术报告 - 图文更新完毕开始阅读153b4e9c0912a21615792904

第四章 智能汽车控制软件分析与设计

4.1 小车整体软件设计

为了保证小车既能稳定运行,又能提升速度,我们需要使整个系统控制具有良好的实时性和周期性,因此除了既要能实现功能的完整性,还要使其能够在既定的时间里稳定执行相应的任务,在设计时,需要用到定时器中断来完成。

然而,在设计时,毕竟中断时间有限,不能将所有的执行程序都放入中断。 所以在程序执行时,从主函数开始,首先完成对系统资源的初始化设定,然后打开定时中断,再进入一个主循环函数,在该循环函数中是一些对控制实时性要求不高或使用频率较低的辅助性函数,如液晶显示屏显示、拨码及按键情况扫描等函数,主要是在中断函数执行完后的空余时间里执 行,我们可以将其称为后台。而对于其他需要具有较好的周期性和实时性的控制类函数,则主要放在了定时中断函数里面,如信号采集、信号处理、控制运算、控制输出等子函数,这样以保证系统运行的稳定性,可以将其称作为前台。这样既可以提高执行效率,又可以对各个部分做到精确的控制。

27

第九届全国大学生智能汽车邀请赛技术报告

各个模块初始化 开外部中断 N Y 开始 开定时器中断 N 定时器中断? Y 外部中断? Y 显示屏幕 AD采集及图像处理 满足停车? Y 灯塔结束程序 满足起跑? Y 灯塔起跑程序 按键扫描 平衡控制 方向控制 速度控制 按下按键或拨码 小车停止 小车启动 改变参数或策略 出外部中断 出定时器中断 刷新屏幕 图4.1 整体程序框图

28

4.2线性CCD传感器路径精确识别技术

在本届大赛中,光电组的规则发生了翻天覆地的变化,由传统的四轮小车变成了两轮直立车 ,对于光电传感器要求选择使用线性CCD以及LED作为新一代的光电车的传感器,但由于LED的前瞻距离十分有限,所以线性CCD自然成为了较好的方案选择。

4.2.1新型传感器路径识别状态分析

由于今年的赛道信息增加了直角规则,并且对光源传感器做出了要

求,在使用CCD进行赛道识别,传统的传感器搜索跳变沿算法可取之处不是很大,不过不缺乏借鉴之处。

图 4.2 CCD传感器返回值波形图

我们的小车采用三路CCD对赛道信息进行识别,其中主要原理是利用第一第二个CCD的加权算出赛道中心偏差,一个CCD包含128个像素点,但这128个点并不是所有的点都能够被准确获取灰度值,我们选择采用左右各56个像素点来对赛道信息进行采集。这些像素点中每个点的灰度值理论上都有0到1024(我们的AD采样为2的8次)这些种状态,我们分别把左右各56个像素点记为left 8~63和right 64~119。这里我们采用双峰直方图测动态阀值,我们将灰度值除以10,将灰度值数组压缩成103,然后检测这103段不同灰度值点的多少,找出白色和黑色的最大分布点,进一步得到阀值,程序如下:

#define LATCH_LINE_SUPER 103 uint16 ccd0min=300; uint16 ccd1min=300; uint16 ccd2min=300; uint16 ccd3min=300; uint16 ccdmax=1024;

uint16 ccd_white_latch=0; uint16 ccd_black_latch=0;

uint16 get_super_latch(uint16 *pic,uint8 x,uint16 ccdmin,float per) //双峰直方图测动态阀值如果出现问题,请检查电池是否有电

29

第九届全国大学生智能汽车邀请赛技术报告

{

uint16 i=0;

uint16 total_super;

uint16 line_latch_super[LATCH_LINE_SUPER]={0}; //灰度值数组 float latch;

for (i=0;i

for (i=8;i<120;i++){

line_latch_super[pic[i]/10]++; }

total_super=line_latch_super[LATCH_LINE_SUPER-1]+line_latch_super[LATCH_LINE_SUPER-2]+line_latch_super[LATCH_LINE_SUPER-3]; //白点方向的连续三组分布总和

for(i=LATCH_LINE_SUPER-1;i>1;i--) //找连续三组和最大的地方 {

if(line_latch_super[i]+line_latch_super[i-1]+line_latch_super[i-2]>=total_super||total_super<10)

{total_super=total_super+line_latch_super[i-2]-line_latch_super[i+1];}//向暗处移动,找白色的最大分布点

else{ccd_white_latch=i;break;}//此处为白线灰度 }

total_super=line_latch_super[0]+line_latch_super[1]+line_latch_super[2]; //黑点方向的连续三组分布总和

for(i=30;i

{if(line_latch_super[i]+line_latch_super[i+1]+line_latch_super[i+2]>=total_super)

{total_super=total_super+line_latch_super[i+2]-line_latch_super[i-1];} //向亮处移动,找黑色的最大分布点

else{ccd_black_latch=i;break;} //此处为黑线灰度 }

latch=per*ccd_white_latch+(1-per)*ccd_black_latch;//图像检测阀值

while(line_latch_super[(int)latch]>40)latch-=1; return (int)(latch*10); }

30