赞
踩
本博客使用的图像是188*120的大津法二值化图像。摄像头安装高度为25cm(离地),前瞻长度约1m。
前面已经讲过了十字的识别思路,现在来说一下三岔。
在编写程序时,以下各行条件是层层递进进行判定的,一旦有一个条件判定不满足就退出此次判定。
三岔是三个120°V形拼在一起的构象,在几何上对称,所以出入三岔的识别基本一致,但是在斜对三岔时需要特殊处理,减少误判。
预识别条件:
决定识别条件:
三岔的三个120°V形拐点中,中间V拐点存在,左右V拐点至少存在一个。
示意图
(1)远端情况
以下示意图情况我称之为远端情况,左/右侧V拐点在图像中是可见的,这种情况使用最基本的远端条件,找拐点就可以轻松完成判定;
正入三岔示意图:
斜入三岔示意图:
这种情况多发生在即将出三岔、过急弯后入三岔时。入三岔时机的前后,也会导致图像有巨大的差异。
(2)近端情况
在过急弯后进入三岔,可能出现图像处理跟不上车速的情况,这时候进入三岔,视野内只会剩下中间V拐点,这种情况我称之为近端情况,这时候需要引入一个近端条件进行辅助判断:两条参考线的至少一侧均丢边。
近端实拍:
以下状态按照时间顺序排列,且在识别程序的状态切换过程中,进入下一个状态的前提是状态位已经置为上一个状态。
尚未进入三岔:
(1)远端条件:视野内存在三个(正入)V拐点或者两个(斜入)V拐点,但是中间V拐点一定存在;
(2)近端条件:中线黑线足够长,中间V拐点存在,近端两条参考线的一侧均丢边;
三岔标志位置位,三岔状态位置1,入三岔补线开始;
车头即将拐入三岔:此时视野下方会有很大的白色区域,此时选定的近端某行参考线,至少有一侧会发生丢线(视野内类似斜入三岔的情况),三岔状态位置2(此时编码器积分开始,在积分过程中锁定三岔判断,不进行识别,防止所有三岔状态转换在第一次认到三岔的几帧内直接就全部完成了,三岔标志异常清除);
车头已经进入三岔:选定的两行参考线两侧均不丢线(这时车头应该在进入三岔很短的那一小段直道内),三岔状态位置3,入三岔补线结束;
车在三岔内的直道行驶:正常循迹行驶,编码器照常积分;
车头进入即将出三岔的那个弯道:视野内会出现一侧的尖点,当编码器积分结束,重新使能三岔判定后,这个时候很容易发生误判导致提前清标志位,在这里我临时引入了近端参考线两侧均不发生丢边的条件进行限制,防止在这一段出现提前误判;
车头即将遇到三岔出口,斜对三岔:视野内会出现中间V拐点和一侧V拐点(也可能出现两个V拐点,因为是斜对三岔的,图像也是斜的,此时状态V拐点不是很好认,识别滞后车很容易冲出去,我采用的解决方案是在上一个状态进入后临时减少中线黑线长度阈值,退出三岔时再把这个阈值加回去),此时重新认到三岔,三岔状态位置4,出三岔补线开始;
即将出三岔:视野内认不到左右侧V拐点了,三岔状态位置5;
出了三岔:两条参考线两侧均不丢线,清除三岔状态位和三岔标志位,出三岔补线结束。
具体的示例图片这里也不放了,需要注意的主要就是状态2、状态5和状态6,这三个状态下非常容易发生误判!由于今年省赛赛道的特殊性,我们选择的是车库出来向十字方向发车,在出了三岔之后斜对斑马线也很容易误判三岔(可以通过限制V拐点判定区域、引入参考线判定进行规避,也可以使用CD机制给每个元素的判断都加上CD),这些状态分组可能做的不是很好,使用的时候肯定是需要微调的!
需要提前设置的一些阈值
思路
注意:三岔在使用全图进行判定的时候很容易在弯道、斑马线或是已经进入三岔、但是还没有出三岔的那个弯道内发生误判,所以这里对V拐点的判定需要截取一部分图像进行,以此限制V拐点在图像中的有效坐标,可降低误判率并方便补线。
(1)统计中线上黑色线段长度;
(2)(可选)判定赛道宽度上大下小行数是否达到阈值,赛道边界横坐标“上外下里”倒置行数是否达到阈值;
(3)V拐点的判定:
①左右侧V拐点的判定
左右侧V拐点判定相对简单,只需要从下至上判定边线的斜率是否发生突变即可。图像的坐标原点在左上角,正常直道情况下,左边线斜率为-1.5左右,右边线斜率为+1.5左右。而在三岔,边线发生了外拐的情况,这时候势必可以造成边线斜率的正负变化,通过每间隔10行取一个边线上的点计算该段斜率并存储至一个数组中,遍历这个数组即可轻易发现边线斜率是否存在突变。同时,可以限制对V拐点坐标的检出范围,以降低误判概率。
②中间V拐点的判定
中间V拐点的判定相对复杂,但其实和十字寻找L角点有相似之处。第一步,从全图的最下方开始,逐列、向上扫描黑白交界点,将扫描出来的黑白交界点纵坐标存入一个数组(这一步和十字基本一致)。第二步,根据扫描到的黑白交界点纵坐标数组,分析其中的数据特点,判定是否找到了中间V拐点。由已有的上黑白交界数组为基础,其中的数据大致会呈现“M”型分布(见下方的示意图),中间V拐点即为此M的中间点,寻找其需要分为两步:1.从左向右找到M型上的第一个尖点位置,即数组开始变大的点;2.找到M型上的第二个尖点位置即为所求V拐点坐标,即在数组变大后开始变小的点,这就是所求的中间V拐点。
注意:补线需要直接补进边线数组
传统补线方式,就是在识别到三岔后,且中间V拐点存在时(这是开始补线的必要条件,中间V拐点也是补线的起点),连接中间V拐点和左/右侧V拐点,或者是直接把中间V拐点与图像左/右下角直接拉死一条线(实测这么拉线也是可以的)。因为后者补线方法可以在视野内有无左右侧V拐点(分别对应即将进入三岔的远端和近端图像)的时候均可实现拉线,不需要再细分情况且误差可以接受,所以就采用了这种方法补线。这种方法在即将进入三岔,但是视野下方还没有完全变为黑色的时候会停止补线,因为车在即将转入三岔的时候,视野内的中间V拐点趋向性已经不是很明显了,V的右半边在图像中几乎是水平的,这时就无法补线了。
但是,传统补线方式有很大的缺陷:补线抖动比较严重,如果直接限制中间V拐点的坐标位置的话,就很容易导致该补线的时候不补线;从不补线到补线,计算出来的中线偏差值在一瞬间会发生较大的突变,在没有滤波的情况下很容易导致舵机打飞,加滤波的话又容易来不及打舵机而导致打不进三岔。
适用条件:在图像中只有一侧边线是存在的,另一侧边线几乎不存在或者大量行是丢边的,就可以引入单边循线的方法进行循线。
实现方法:先在标准的直道上将车模居中摆放,摄像头正对直道前方,记录下此时摄像头视野内每行赛道的宽度(某行赛道宽度=右边线横坐标-左边线横坐标);记录完毕后,在需要使用单边循线的状态下,检测左右边线丢线行数,在丢线少的一侧边线每行横坐标分别加上之前测量的该行直道宽度,在丢线多的一侧的边线数组中把这个边线补出来,中线偏差计算程序根据这个拟合后的边界和已有的边界进行中线偏差计算,即可完成单边循迹。
优点:相比补线,单边循迹的抖动更小,不会像传统补线方式一样造成中线偏差值的突变。这种方法也可以适用于弯道的偏差修正。
缺点:单边循迹法存在系统误差,使用单边循迹的车模在三岔内的直道上行驶时,相比正常循迹抖动会大很多,这个需要仔细调整PID参数,可以有一定程度的缓解,但是由于单边循线固定的系统误差就摆在那里,所以跟直接双边循线比起来。理论上使用进出三岔单边循线+三岔内双边循线的方法的话会有所缓解,但是我实测可能因为没解决好误判的关系,使用这种方法比较容易导致两种循线方式不按规定情况切换,抖动更加严重了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。