镜头组的特点是通过摄像头来获取赛道的信息,从而达到前瞻的效果,完成转向和速度决策。
我们的方案,带上元素识别,大概在TC264上5ms一帧,所以我们开了100hz的图象。
之前我看别的博客上有人说,他们组的50帧到100帧提升不大,但是我试了下100帧还是有明显的提升的,大家可以都试试
摄像头比较重要的一点是 确定好图象的大小尺寸,摄像头的高度和角度,之后就不要在变化了,确定好前瞻距离和最近距离。近端距离是来控制转向的,前瞻距离是做速度决策的
如果突然卡死了,或是时间出乎意料地长, 大概率是数组越界了,检查下数组的索引
我们采用的是某飞的方案,即先通过近端白线的平均值来获取认为的白块,然后通过这个白块来寻找最长上升白列,然后通过这个白列向左向右的寻找边线,之后我会详细介绍
图象识别有一个比较大的差别就是是否二值化,就是把灰度图转换成只有黑白的图,一般常用的额算法是大津法,我们最开始也是用的这个方法,后来一段时间之后,觉得如果二值化的话时间实在太长了(印象中是>20ms的),就放弃了二值化的方案,采用了某飞的方案
我来简单的介绍下逐飞的方案,具体可以去看他们的直播。
主要用到的函数就是这几个
首先是求图象最近几个的平均值,也就是这一块下面红色区域的平均值,然后用吧这个平均值用于
白线和出界的判断,比如这个值是小于50 那么说明车跑出界了,需要设置一个信号量给调参的同学,让小车停下来。(这个边线不贴合赛道可能是无线图传的问题)
通过这个平均值,可以识别出赛道每一条数值方向的白列,这个白列,可以作为速度决策的依据
(这是逐飞的图象,所示的黄线就是最长上升白列)
之后要做的就是边线的扫描,我们用的也是逐飞的差比和算法,也就是 比如说 ,目前找到的点是(40,100)灰度值为a,我们要搜寻左边线,就是要搜索和这个点的左边隔了一段距离,比如(35,100)的点,灰度值为b,通过这个(a - b)/(a +b) 所得的值 大于某一个阈值的时候,则说明了这个是一个明显的黑白交接点,可以把它认为是赛道的边线。
有些优化的方案,比如每继承每一次的值,如果上一条边找到了左边线,那就往右回撤几个像素 再继续进行差比和运算,可以大大减少运算量。
我们也可以利用前面求到的近端白列的平均值,给定一个比例,例如超过这个像素点110%的即为白色,低于70%的则为黑色。如果遇到白色的情况的话,直接continue,因为这不可能是边界,如果认为是黑色,则直接确定这点为边线,进行下一条线的寻找。
从边线中我们还可以获取到两个信息。一个是左右边线的丢线,和连续丢线的长度。另一个是如果小车在一条大直道的情况下,假设最顶端宽度是25,最低端宽度是150,这样我们就可以估计一个正常赛道的宽度。然后我们计算扫线扫到的赛道宽度,如果这个宽度和理论赛道宽度差距比较大的话,那就有是元素的嫌疑了