NXP

十一届恩智浦摄像头双车追逐

2019-07-12 12:37发布

调车总结,留存备份;    一年的飞思卡尔调车结束了,在这个过程中学到了很多。我调的是双车追逐组,C车模,用的是鹰眼OV7725摄像头,主控为ARM KL26。调车不是一个人就能干好的,只有大家一块共同努力,才能取的好的成绩。    下面我就按照自己的理解讲一下双车组。因为传感器选用的是摄像头,所以图像处理是很大的问题,也是关键的问题。
一、摄像头的选择        刚开始的时我们用的是蓝宙捕食者4的摄像头,但是用KL26芯片没能把图像采集好,所以换成了鹰眼7725。在后期的调车中发现这两个摄像头还是有很多区别的。鹰眼7725是硬件二值化,相对来说更好一点,因为省去了软件二值化的部分,加快了程序的执行周期,但是一个主要问题是鹰眼是一个比较型的摄像头,如果看到的图像绝大部分是黑 {MOD}(蓝膜),那么他的图像就会变得很乱,在原本该是黑 {MOD}的部分会出现很多白的。蓝宙捕食者倒没这个问题,但根据学长讲好像捕食者只能50帧,而鹰眼最多可以设置成150帧。二、广角镜的选择与失真矫正        我们选择的是150°的广角镜,如果不进行矫正的话失真还是很严重的(左图),会大大影响中线的提取与图像分析。经过纵向矫正后如右图,可见图像水平方向畸变已经校正的差不多,对于赛道信息判断干扰几乎可以消除。校正方法为找出图像中畸变的最大值和最小值,然后拟合线性关系,将原图像按照拟合出的关系映射至新的图像数组。                                    

三、寻边线方式    对于摄像头组来说,其根本就是根据图像找出赛道的中心线,然后根据中心线的偏差经过一系列处理控制舵机打角。所以重中之重就是找中心线。一副图像有好多的点,选择一个好的方法找中心线将会大大缩短程序的执行周期,更有利于对于小车的控制。总的来说寻线有三种方法,一、从中间向两边,二、根据上一行的中心线所在往两边。三、在上一行左边界附近找左边界,在上一行右边界附近找右边界。很显然第三种方法效率更高。对于第三种方法也就是边沿跟踪检测法,很可能出现一边边线有跳变,然后在你查找的这个范围内没找到边线的情况。如左图。右边界上面有跳变,在上一行 “右边界附近”并不能找到跳变点,所以找线失败。这时就要加一个判断,如果没找到跳变,而且大部分是黑点,说明是在赛道外,如果是找右边界时出现这种情况,就接着往左找跳变,相反如果大部分是白,则证明是在赛道内,就往右找。同理找左边界时出现这种情况处理方式一样。                                       
    还有就是从中间向两边找线,大部分采取的是从最长的白线行(右图红线)往两边找边线,这样找线简单而且准确率高,就是执行时间长,并不是一个太好的方法。   (最长白线行寻找方法:从图像底部往上扫描,如果是白就++,是白到黑跳变就结束本列的寻找,开始寻找下一列,就是取最大白点数所在列往两边扫描。)  四、中线提取边线提取完毕后就是根据边线找中心线了,最简单的就是左右边界都找到,这时候直接左右边界中心就是中心线所在了。但是在弯道,或者在直道贴边跑时,往往会出现一边丢线的情况,这时候如果还是左右边界取中线的话得到的图像就如左图所示,这样的中线无疑偏离了实际赛道的中线,很容易车就会拐出界。所以在弯道处出现一边丢线情况时应该根据另一边界平移合适的距离得到中线(如右图)。                             
    这种方法的话会出现中线不连续的情况,但是发现他并不影响实际的控制。如果看不过去可以采取一些措施,首先判断是弯道,然后才采取平移边线的方式找中线。 五、特殊元素处理1、十字    十字处两边都丢,或者一边丢线另一边不正常的趋势(比如左边界呈减小趋势,右边界呈增加趋势),根据这一特征可以很简单的判断出十字。                                       
    如果对十字不进行特殊处理,当稍微斜点进入十字的话图像就会乱,如图。这样车很明显会往左稍微拐一下,很可能就出界。分析十字处的图像可以发现他有一个明显的特征,就是中线存在跳变。这样我们就能找到上下两个跳变,然后把这两个跳变点之间用直线连接起来就好了。十字处理好后,单车跑就没有太大问题了。2、黑三角    分析可知黑三角肯定出现在十字处(图为没对三角处理图形)进行黑三角是否存在的判断。                                                 分析图像知黑三角有几个特征       1、在十字中心处出现;2、左右都是白的;3、上下都是白的。    根据这三个特征,我选择从图像底部中心左右各八行向上找,碰到黑就截止。如果有一部分黑线截止行明显小于最大黑线截止行,而且这些长度都差不多,就可以大致判断可能存在三角。然后看在这些可能存在三角的区域左右是不是都是白,如果是,就可以判断存在黑三角。只要十字不误判,这种方法几乎没误判。    识别到黑三角之后就是判断三角的方向了。这个相对来说就比较简单了,再判断黑三角是否存在的时候,建立过一个数组,用来存放图像底部左右八行黑线截止行的长度。三角存在的情况下,判断数组里面长度大致相等几个数的趋势,如果是增加趋势,则三角向右,反之减小趋势则三角向左。判断出三角方向后就可以进行相应的补线控制车拐弯了。 具体补线方式:三角向左,车应该向左拐,所以从上向下寻找左边界的跳变,找到后令该行中线为0,令有效行为(RowMax---该行坐标)如果寻找到中线下边一个跳变,就直接把跳变点和左边界的跳变点连起来当中线(左),如果没跳变,就令最下行中线为40 ,然后连接两个点(右)、(实际三角上部分中线应该不存在,存在也不处理ㄟ(⊙ω⊙ㄟ)    因为没有好的图了)                                         
      前车遇到三角应该直走,所以前车的话直接十字处理就行了,不需要再单独处理三角,因为我们选择上下跳变补线的方式三角不影响 其补线。 
3、直道超车区                                              
        分析图像知直道超车区明显特征是一边边线正常,另一边有跳变,而且还是在直道上才有。根据这些特征就能判断了,在直道上一边线突然跳变,而且接下来的十行赛道宽度均大于跳变行处的赛道宽度,则可以判断 是直道超车区。直道超车区判断出来后,就可以对中线进行相应处理让车靠边停或者直走。如果进超车区,在跳变行上 中线就是该边界减15(减多少自己尝试出来),实际效果不错。车能进入直道超车区。如果直走 ,则中线就根据左边界平移合适距离即可。                                            
    从直道超车区出来后,不需要进行特殊处理,只要不要让他检测黑三角就行。    至此,图像处理算是结束。      图像处理,说白了就是翻来覆去的对那么多数据进行分析,尤其是特殊元素,更是一个“找不同”的过程,只要找到不同元素对所独有的特征,接下来的就好弄了。

六、双车通信        要让两个车实现超车,什么时候拐弯,什么时候进直道超车区,就是一个逻辑时序问题。如图,掌握好标志位的发送与接收,还有什么时候清除标志位就ok       
 

七、方向速度控制    获得中心线后,就可以根据中心线求出偏差,然后PID控制舵机。加权对控制有很好的效果,速度的话注意道前减速,即直道进弯使减速,入弯后加速。调PID参数很磨人,要坚持。
总之
    一年的调车是一个漫长的过程,中间会发生很多事情,唯有坚持下来,才能获得好成绩。很多时候 ,你会发现自己找了几天的错误其实就是一个变量定义错了类型,又或者是少写了一个符号,这真的是很烦人的情况,但是也是在所难免。坚持!唯有坚持下来,一切才有希望,苦点自己没什么,在这个过程中学到的才是最重要的。共勉~ 

注:程序已上传,有需要可以参考   摄像头双车追逐程序