恩智浦杯智能车智能车摄像头组环岛怎么过,怎么识别,总会有误判,加上环岛程序还不如不加,求大佬

飞思卡尔智能车摄像头组新手指南(6)--赛道处理进阶篇1
赛道处理算法进阶之弯道
前面已经贴出了最简单的赛道处理算法。当然,这种方法实际中是不能用的,因为遇到不同赛道类型时会误判。
我是这样的:
假设靠近车头的是行数最大的,假设最大行是第i行。那么,我将第i行到第i-4这5行用中间往两边找跳变点的方法算出这5行的中点,如果这5行中有3行或以上都找到两边了,那么这场图像是有效的,否则,舍去这一场图像。这就是基准行。该场图像有效就算出中点的平均值,然后第i-5行就以这个平均值为中心,例如这个平均的中心点列为50,那么第i-5行向左边扫的起始位置就是该平均值点即所说的50减去若干个像素点(具体多少个像素点可以自己根据实际取)得到第i-5行的向左扫描起始点A,向右边扫的起始位置就是该平均值点即所说的50加上若干个像素点就得到第i-5行的向右扫描起始点B。以此类推,之后的第i-6行向左边扫的起始位置就是A点即所说的50加上若干个像素点就得到第i-6行的向左扫描起始点,右边扫的起始位置就是B点即所说的50加上若干个像素点就得到第i-6行的向右扫描起始点就得到第i-6行的向右扫描起始点。每一行都是这样的操作。当然,还有其他的方法,例如,每次都计算一下赛道范围以便快速搜索,这些就不说了,不然三天三夜都讲不完,这里只是给个参考给你们,你们要有自己的想法,不要被我的这种思维模式给套住了。具体的编写看我的代码,有注释的。
下面再挑两种赛道类型--弯道和单线来阐述下我的算法,至于直角、十字那些赛道类型看我代码就好了(那么多种赛道类型很难用文字表述完)。
弯道处理主要是解决弯道处计算出的中线不准确的问题。图:
这个图是左线和屏幕右边线求中线的,很明显这样的中线是错误的!
修正后的:
我是这样处理的,你们可以参考下:
注意:上图中所说的赛道宽度的一半跟计算出的中线是不一样的,这里的赛道宽度的一半是指(右边线&-&左边线)/2,结合坐标来理解就好理解,而中线是(左线&
&右线)/2。
矫正的那数组就是固定的一个数组,但是每一次调整摄像头高度或者俯角后,这个数组就变了,需要重新获取。
&& 通过这样的处理后,弯道能得到较好的校正。
PS:限于作者的水平,对于文档中存在的不严谨甚至错误,希望各位能够予以指教,
本人联系邮箱:。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。十一届恩智浦智能车摄像头组烟台大学 侣行_腾讯视频
三倍流畅播放
1080P蓝光画质
新剧提前看
1080P蓝光画质
纯净式无框播放器
三倍流畅播放
扫一扫 手机继续看
下载需先安装客户端
{clientText}
客户端特权:
3倍流畅播放
当前播放至 {time}
扫一扫 手机继续看
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要豆丁微信公众号
君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
飞思卡尔摄像头组图像识别智能车技术报告(答辩版)
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口智能车摄像头组
障碍处理方法
智能车摄像头组中最重要的就是图像处理了,这里面的图像处理包括很多方面,比如十字如何处理,弯道如何处理,起跑线,障碍等等问题,接下来我要讲的就是障碍处理方法。
首先我们先描述一下障碍的形状,在智能车竞赛中障碍是一个长方形,距离边界有5CM的距离,这样在图像上显示出来时候就是(图1)所显示的样子
在这里面我们可以看到中线有明显的偏移,右边界也有明显的跳变,那么这个跳变我要怎么去提取呢,我第一步用的就是中心线的方差,通过计算方差来判断是否能够进入障碍程序,当中线的方差满足障碍条件后进入障碍处理程序,但是往往一个判断是不够准确的,进入这一个条件后我去判断边界的连续性,就是通过边界的跳变去查找,程序上如何实现呢,最简单的就是这样一句话。
if(cha1&=2&&abs(cha3-cha1)&=2&&abs(cha2-cha3)&=2)在这里面cha1,cha2,cha3的定义呢就是
cha1=right_line[1][i-3]-right_line[1][i];
cha2=right_line[1][i-3]-right_line[1][i+1];
cha3=right_line[1][i-3]-right_line[1][i+2];这里的定义就顾名思义了,就是判断连续点之间的差分,进而可以判断是否有跳变。判断完跳变之后呢还是不能达到100%的准确率。接下来在做的判断就是找到中间这个黑色的障碍,通常这个障碍所占的位置比较大,而且在中线与右边界的中间部分向上搜索一定会有黑色的障碍出现,那么这个时候就可以判断出来这个位置是障碍了,这段程序呢也很简单,就判断黑白就可以了。
当障碍处理完成后要怎么做呢,接下来就是控制的问题,在我这里控制就是将从障碍开始以后所有的中线都移向左边,这样就可以控制小车很轻松的避开障碍了。以上说的是障碍在赛道右侧的时候,如果在赛道左侧则同理就能得出。并且起跑线处理方法也类似。如果出现剐蹭现象只需改变一下舵机P值就可以得到很好地改善效果了。具体程序见评论中的链接,因为纯属自己编写的程序所以不是免费下载的。如果有其他需求大家可以联系我继续写一些图像处理方法。小车的效果可以在本人QQ空间中观看,有视频。
联系方式见评论。
浅谈全国大学生智能车竞赛-摄像头组图像处理及控制算法
浅谈智能车摄像头组斜入十字处理方法
飞思卡尔智能车之摄像头使用篇
关于智能车的一些坑
恩智浦杯(飞思卡尔)全国大学生智能车竞赛摄像头简单的图像失真矫正技术原理与实现(透视变换)
智能车实验室7.21-7.31计划
没有更多推荐了,飞思卡尔智能车摄像头组新手指南(5)--让车跑起来篇
舵机、电机控制策略让车跑起来
控制器设置了快速的控制周期,在每个运算周期内,控制器即时地得到智能车车速以及传感器采样来的道路信号,经过控制算法的计算后,控制单元输出相应的前轮控制转角以及电机占空比的值,其输出值再经过函数映射关系转换为&PWM&脉宽信号传至前轮舵机以及驱动电机,从而实现一个周期的控制。
由于摄像头的信号是具有周期性的,可以直接采用摄像头采集一幅图像的周期作为控制周期。
舵机控制采用&PD&控制,&控制跟随性较好,P可以及时对赛道的变化作出反应,当然舵机的&P&项值也是跟随赛道情况变化的,直道和较小的弯道时控制较弱,90&度弯道或&270&度大弯道控制量较强,D有预测道路类型的作用,也就是能使舵机提前打角。
电机控制采用&PID&控制,可以减小动态误差并且跟随性能较好。当然也可以使用其他控制,很多人舵机采用P控制,电机采用PD或PI控制。对比他们的优缺点自己选择适合自己小车的PID。这里不进行深入讲解。
前面的工作完成后懂得基本的图像处理算法就差不多可以使小车跑起来了!
要使小车跑起来其实不难的,很多初学者最希望的就是看自己的车跑起来,因为当初我也是这样的,很理解师弟师妹们此刻的想法!
最基本的图像处理算法就是:图像中间往两边搜索黑线
注意:初学者在初学时不知道偏差是怎样计算的。这里就提一下:偏差就是计算出的中线即图中赛道中的黑线与摄像头所看到的中线即图中赛道中的竖直红线(例如采集到的图像是100列的,那么摄像头看到的中线就是50)做差得到的值就是偏差。它表示车当前位置与期望位置的偏离程度。
再看个图吧:
用两行来说明,其他的一样。
第一行左边坐标(0,1)&右边坐标(0,99),得出的中线就是(0,50),那么50所在的那一列就是摄像头所看到的中线(就是图中竖直的红线)。这里再提一下,很多人提出中线后发现上位机上或LCD上没显示出中线,其实显示出中线很简单的:根据RGB,一个像素点的像素值为255时显示出来的是白色,像素值为0时显示出来的是黑色。从这我们可以知道,提取出中线数据后,将中线的值置为0,重新写入图像数组中就可以了。也就是只要把图像数据中(0,50)这个数据赋值为0,即&Image[0][50]&=&0x00;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Image[1][50]&=&0x00;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.......................
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
.......................
这个操作就是把黑线写进图像数组,这样便能显示出中线了。
图像处理算法对于不同的编写者有不同的处理方法,下面就贴出最简单的处理短代码,让你们的爱车早日跑起来。
下面所列代码的赛道行数为60行,列数为80列。
//////////////////
#define&servo_freq&50
#define&servo_FTM&FTM3
#define&servo_CH&FTM_CH1
#define&servo_pwm_middle&&780&&&&//&舵机中值
#define&servo_pwm_max&&835&&&&&&//&舵机偏转最大值
#define&servo_pwm_min&&735&&
#define&White_Line_Min&10&&&//最小赛道宽度
#define&White_Line_Max&80&&&//最大赛道宽度
float&KP=8;//舵机方向比例系数
float&KD=0.08;&//5.0;//舵机方向微分系数
&for(i=60;i&0;i--)
&&&&for(j=40;j&0;j--)&&//&从中间向左边搜索,寻找黑点
&&&&&&if(img[j]==0xff&&&img[j-1]==0x00)
&&&&&&&&Left_Black=j;&&&&
&&&&&&&&Left_Black_Old=Left_B&
&&&&&&else
&&&&&&&&Left_Black=0;&&//&未找到左边黑点
&&&&for(j=41;j&80;j++)&&&&&&&&&&//&从中间向右边搜索,寻找黑点
&&&&&&if(img[j]==0xff&&&&img[j+1]==0x00)
&&&&&&&&Right_Black=j;&&&&&&&&&
&&&&&&&&Right_Black_Old=Right_B&&
&&&&&&else
&&&&&&&&Right_Black=0;&&&//未找到右边黑点
&&&&if(Left_Black==0&&&&Right_Black==0)&&&&
&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&Left_Black=Left_Black_O
&&&&&&Right_Black=Right_Black_O
&&&&&&middleline=(Left_Black&+&Right_Black)/2;
这是简单的提中线,,,,
太简单了?&(&T_T&)
好吧,再加点料:
void&get_centerline()&&&&//&&提取黑线
&&&uint8&Left_Black_Flag=0;
&&&uint8&Right_Black_Flag=0;
&&&for(i=60;i&1;i--)&&//整幅图像的每一行都进行扫描(效率低)
&&&&for(j=40;j&1;j--)&&//&从中间向左边搜索,寻找黑点
&&&&&&if(img[i][j]==0xff&&&img[i][j-1]==0x00)
&&&&&&&&Left_Black=j;&&&&&&&//&找到左边黑点
&&&&&&&&Left_Black_Old=Left_B&&//&保存上一次的值,当下一次未找到黑点时,将上一次的黑点作为本次的黑点
&&&&&&&&Left_Black_Flag++;&&//找到左黑线则Left_Black_Flag加1&,用于后面路径类型的判断
&&&&&&else
&&&&&&&&Left_Black=j;&&//&未找到左边黑点
&&&&&&&&Left_Black_Flag=0;
&&&&for(j=41;j&80;j++)&&&&&&&&&&//&从中间向右边搜索,寻找黑点
&&&&&&if(img[i][j]==0xff&&&&img[i][j+1]==0x00)
&&&&&&&&Right_Black=j;&&&&&&&&&//找到右边黑点
&&&&&&&&Right_Black_Old=Right_B&&&&//&保存上一次的值,当下一次未找到黑点时,将上一次的黑点作为本次的黑点
&&&&&&&&Right_Black_Flag++;
&&&&&&else
&&&&&&&&Right_Black=j;&&&//未找到右边黑点
&&&&&&&&Right_Black_Flag=0;
&&&&//////////////////////&&道路判断&&&&-------------///////////////////////
&&&&&////////////&&&&&&&&&&进入直道&&&&///////////////////
&&&&if(Left_Black_Flag==1&&&&Right_Black_Flag==1)&&&&//找到双边黑线,&车在直道上
&&&&&&if((Right_Black-Left_Black&=White_Line_Min)&&&(Right_Black-Left_Black&=White_Line_Max))&//使黑线宽度在规定的范围内,即限定赛道的宽度,因为采集的总共有80列的,可知赛道的两边差值应在0~80之间
{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Middleline=(Left_Black&+&Right_Black)/2;
&&&&&&&&Fit_Middleline[i]=M
&&&&/////////////&&&直道结束&&&&&/////////////////////
&&&&/////////////&&&进入左弯道&&&/////////////////////
&&&&else&if(Left_Black_Flag==0&&&&Right_Black_Flag==1)&&&//只找到右侧黑线,证明黑线向左弯
&&&&&&if((Right_Black&&=White_Line_Min)&&&&(Right_Black&&=White_Line_Max))
&&&&&&&&&Middleline=Right_Black/2;
&&&&&&&&&Fit_Middleline[i]=M
&&&&/////////////&&&左弯道结束&&&////////////////////&
&&&&/////////////&&&进入右弯道&&&/////////////////////
&&&&else&if(Left_Black_Flag==1&&&&Right_Black_Flag==0)&&&//只找到左侧黑线,证明黑线向右弯
&&&&&&if((Img_Col&-Left_Black&&=White_Line_Min)&&&&(Img_Col&-Left_Black&&=White_Line_Max))
&&&&&&&&&Middleline=(Left_Black+Img_Col)/2;
&&&&&&&&&Fit_Middleline[i]=M
&&&&/////////////&&&右弯道结束&&&////////////////////
&&&&////////////&&&&进入十字路口或者丢失两边黑线&&&/////////////////////////
&&&&else&if(Left_Black_Flag==0&&&&Right_Black_Flag==0)&&&//两边都没找到黑线,则舍弃该行,沿用上一行的值
&&&&&&&&&Left_Black=Left_Black_O
&&&&&&&&&Right_Black=Right_Black_O
&&&&&&&&&Middleline=(Left_Black&+&Right_Black)/2;
&&&&&&&&&Fit_Middleline[i]=M
舵机控制也对应写个最简单的代码:
int&servo_control(void)
&&&int&SteerSum=0;&
&&&for(i=55;i&35;i--)&&//仅对近处的20行取平均值
&&&&SteerSum+=Fit_Middleline[i]-Img_Col/2;//注意:Fit_Middleline[i]-Img_Col/2时对应于//Servo_PWM&+&servo_pwm_middle时摄像头正向安装可以正常跑,,,
&//&但是如果Img_Col/2-Fit_Middleline[i]时对应于&servo_pwm_middle-Servo_PWM&时摄像头反向安装才可以正常跑,测试便可知。
&&&Error=(int)(SteerSum/20);
&&Servo_PWM=KP*Error+KD*(Error-LastError);
&&Servo_PWM=Servo_PWM&+&servo_pwm_
&&LastError=E
&&if(Servo_PWM&&&servo_pwm_max)&&//限定舵机打角范围,防止超过两个轮子所能转过的范//围,servo_pwm_max是轮子最大的转角,可调节占空比使舵机打角后轮子所能转的角度对//应的最大占空比,这样便可得出轮子所能转过的最大占空比和最小占空比。
&&&&Servo_PWM&=&servo_pwm_
&&if(Servo_PWM&&&servo_pwm_min)
&&&&Servo_PWM&=&servo_pwm_
&&&if((Error&2)&&&&(Error&-2))&&&&//偏差太小就不改变舵机角度
&&&&&Servo_PWM=servo_pwm_&&&&//使用原来舵机的值&
&&&Servo_Control_PWM=Servo_PWM;
&&return&Servo_PWM;
其中Error是本次偏差,LastError是上一次的偏差值。最后得出的这个Servo_PWM就可以控制舵机了。
上面那些舵机、图像的参数要根据你自己的车来更改。
至此,恭喜,你的爱车跑起来了!!!&&^_^&
PS:限于作者的水平,对于文档中存在的不严谨甚至错误,希望各位能够予以指教,
本人联系邮箱:。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 第十三届恩智浦智能车 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信