标签:AD4 AD1 开始 代码 电感 智能 ringCount ringFlag &&
桶形失真是由镜头引起的成像画面呈桶形膨胀状的失真现象。会将一些明显的跳变点误判成普通的弧线。
摄像头的舵机控制与环岛处理可以处理绝大多数的赛道状况,美中不足的是摄像头对于小圆环的处理不太理想,特别是弯道后的小圆环,会因严重的桶形失真影响判断。另外,相比于摄像头判断,电磁判断是一种更为简单且稳妥的方案。
电磁杆上有4个电感,分别是左侧水平电感、左侧斜45°电感、右侧斜45°电感、右侧水平电感。
处理普通路段时,使用简单的差比和算法。斜45°电感的作用是判断环岛的方向。根据法拉第电磁感应定律,垂直于环岛电磁线的电感的电压值会明显大于平行于环岛电磁线的电感的电压值。在入环和过环时,通过增大相应方向电感的电压值的比例控制小车走向正确的方向。
void ADProcess(void){ uint16 AD1,AD2,AD3,AD4; AD1=adc_mean_filter(ADC_1,ADC1_CH3_B14,10); AD2=adc_mean_filter(ADC_1,ADC1_CH4_B15,10); AD3=adc_mean_filter(ADC_1,ADC1_CH10_B21,10); AD4=adc_mean_filter(ADC_1,ADC1_CH12_B23,10); lcd_showuint16(0,4,AD1); lcd_showuint16(0,5,AD2); lcd_showuint16(0,6,AD3); lcd_showuint16(0,7,AD4); if(AD1<40&&AD4<40){//出界停车 pit_close(PIT_CH0); pit_close(PIT_CH1); pwm_duty(PWM1_MODULE3_CHA_D0,0); pwm_duty(PWM1_MODULE3_CHB_D1,0); } /*====环岛处理在这里开始====*/ //AD1-4从右至左 static uint8 ringFlag=0; static uint8 ringSide=0; static uint32 ringCount=0; lcd_showuint8(0,2,ringFlag); if(ringFlag==0){ if((AD1+AD4>6000)&&(AD1-AD4<1500)&&(AD4-AD1<1500)&&(AD1>2000)&&(AD4>2000)){ ringFlag=1; } } else if(ringFlag==1){//已遇到环岛未开始入环 if(ringSide==0){//已遇到环岛未判断方向 ringSide=AD2>AD3?1:2;//1:右环,2:左环 } else if((ringSide==1)&&(AD2<AD3)){ ringFlag=11;//开始入右环 } else if((ringSide==2)&&(AD2>AD3)){ ringFlag=12;//开始入左环 } } else if(ringFlag==11){ ringCount++; if(ringCount<80){ offset=-(int16)(80*((float)(4*AD2-AD3))/((float)(4*AD2+AD3))); return; } else if(ringCount>80){ if((AD1+AD4>6000)&&(AD1-AD4<1500)&&(AD4-AD1<1500)&&(AD1>2000)&&(AD4>2000)){ ringFlag=21;//开始出左环 ringCount=0; } } } else if(ringFlag==12){ ringCount++; if(ringCount<80){ offset=-(int16)(80*((float)(AD2-4*AD3))/((float)(AD2+4*AD3))); return; } else if(ringCount>80){ if((AD1+AD4>6000)&&(AD1-AD4<1500)&&(AD4-AD1<1500)&&(AD1>2000)&&(AD4>2000)){ ringFlag=22;//开始出右环 ringCount=0; } } } else if(ringFlag==21){ ringCount++; if(ringCount<80){ offset=-(int16)(80*((float)(AD2-4*AD3))/((float)(AD2+4*AD3))); return; } else if(ringCount>80){ ringFlag=0; ringSide=0; ringCount=0; } } else if(ringFlag==22){ ringCount++; if(ringCount<80){ offset=-(int16)(80*((float)(4*AD2-AD3))/((float)(4*AD2+AD3))); return; } else if(ringCount>80){ ringFlag=0; ringSide=0; ringCount=0; } } /*====环岛处理在这里结束====*/ offset=-(int16)(80*((float)(AD1-AD4))/((float)(AD1+AD4))); }
标签:AD4,AD1,开始,代码,电感,智能,ringCount,ringFlag,&& 来源: https://www.cnblogs.com/stephen0829/p/13424672.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。