5.3.3
获取赛道信息;通过对左丢线还是右丢线来判别车体偏离中心线的程
度。
uchar RightLostCnt,LeftLostCnt; void Getline2 (uchar *a) {
uchar i;
uchar LeftLostFlog=1,RightLostFlog=1; for(i=2;i<124;i++) {
if(abs(a[i]-a[i+2])>Threshold) {
if(abs(a[i-1]-a[i+3])&&abs(a[i-2]-a[i+4])) {
if(a[i] LeftPot=i+1; LeftLostFlog=0; LeftLostCnt=0; } if(a[i]>a[i+2]) { RightPot=i+1; RightLostFlog=0; RightLostCnt=0; } } } } if((LeftLostFlog==0)&&(RightLostFlog==0)) 21 RaceFlog=NotLost; else if(LeftLostFlog==0) { RightLostCnt++; RaceFlog=RightLost; } else if(RightLostFlog==0) { LeftLostCnt++; RaceFlog=LeftLost; } else RaceFlog=AllLost; 5.4转向控制策略; 转向控制信号的源输入控制信号源自CPU对编码器信息和传感器CCD信息经过一系PID计算分别对电机控制模块输出当前小车状态下赛道对电机运转的要求。 提取赛道信息: float Direction_P; float Direction_D; float DirectionError0,DirectionError1,DirectionDiff; //0当前差值,1上次差值 int DirectionOut; void DirectionControl1(void) { float fP,fD; float BorderCom;//丢线补偿量 22 float BorderError;//丢线偏差 //取中线偏差 if(RaceFlog==NotLost) { Centerpot=(LeftPot+RightPot)/2; DirectionError0=Centerpot-LineCenter; } else if (RaceFlog==RightLost) { BorderError=LeftPot; BorderCom=BorderError_p1*BorderError*BorderError*BorderError +BorderError_p2*BorderError*BorderError Centerpot = (LeftPot +127+BorderCom)/2; DirectionError0 = Centerpot -LineCenter; } else if (RaceFlog==LeftLost) { BorderError=127-RightPot; BorderCom=BorderError_p1*BorderError*BorderError*BorderError +BorderError_p2*BorderError*BorderError +BorderError_p3*BorderError+BorderError_p4;; Centerpot = (RightPot - BorderCom)/2; DirectionError0 = Centerpot-LineCenter; } else { DirectionError0=DirectionError1; } //位置式pid DirectionDiff=DirectionError0-DirectionError1 23 DirectionError1 = DirectionError0; DirectionOut = fP +fD; //角度限制在-290~290 if(DirectionOut>290) DirectionOut=290; if(DirectionOut<-290) DirectionOut=-290; //舵机转角 ServoAction(DirectionOut); } 5.5速度控制策略 实际上是对电机驱动模块的控制通过编码器将当前小车的速度值反馈回来,从而形成控制闭环,利用PID制器配合不高,而对速度的变化速度要求很所以在控制的过程中当速度和升速度差别很大的时候用ang-Bang控制从而可以迅速达到设定速度周围,然后再通过PID控制平稳控制速度达到设定值。在实运行当中,P的增大可以加快上升时间,使调节更快,但会引起较大震荡,而增加 D可以减少震荡会是上升之稳定的时间加长,由于车在运行过程中属于大惯性系统,调整PD的时候优先调整在达到适合的时间之后再去调整D使速度变化平稳。 速度给定策略基本思想史入弯减速,出弯加速,在曲率不变的赛道上如直道,大的环形弯,十字弯上都加速通过。同时设置最快最慢速度阈值保证能顺利入弯不会冲出赛道。程序一开始小车需要静止在轨道上两秒,然后迅速加速达到设定速度,然后进入行驶阶段,在行驶阶段按照速度控制策略尽量做到加速刹车快速,变化过程平稳没有震荡,设定一个速度变化的阈值,避免速度剧烈变化,阈值的增加对于小车的适应性有影响,所量避免限制的过紧。 24 总结 6.1效果: 启动后,液晶显示模块各项参数显示正常,起跑后能顺利通过大小弯道直道。蓝牙模块能正常传送各项参数到上位机。 6.2遇到的问题和解决办法: 6.2.1机械安装上 由于舵机安装过程和舵机本身的原因,在矫正前轮初始摆正过程中未能达到理想要求。解决办法:适当调整拉杆的长度和舵机臂锁定螺丝的位置。这个就要慢慢的调整了。 6.2.2方案问题: (1)时序问题: 采集用的是蓝宙的20ms曝光自适应程序,但是稍微暗环境下上位机显示电压依然很低。也许是我们没有领略到他的精华所在吧,晚上不能调车。当光线很强的情况下,依然调不了车…… 经过一系列调整参数,修改程序,最终确定方案如下: 5ms曝光,数据采集,滤波,动态阈值二值化,去除噪点,根据获取到的赛道信息,判定丢线情况。 根据丢线点数的多少进行补光量的计算并进行舵机摆角的控制输出。 (2)对环境光强赖性很强的问题弱 动态阈值二值化可以有效解决”自适应曝光”依然有的暗光下,输出电平依然很低的问题。 25