ADAS在车载导航设备上的应用
首先我们来了解一下ADAS的基本概念,ADAS全称是Advanced DriverAssistance Systems,中文翻译是高级驾驶辅助系统。随着城市化的进一步发展,居民生活水平的提高,路上的车越来越多了,一个可悲的事就是交通事故越来越多了,这里面有很多原因驾驶人员的安全意识、违法驾驶、路况、疲劳驾驶等等原因很复杂,因此有一个ADAS来帮助驾驶员的需求变得越来越强烈了。很多时候,我们都知道副驾驶有个称职的乘客可以帮驾驶员注意前面车辆行驶动态,能偶尔提醒一下驾驶员安全驾驶,注意保持车距,相比来说,有副驾驶的正常情况下出交通事故的比例比没有的要少一些。但是副驾驶毕竟有时确实是没有啊,只有司机一个人,那么就把ADAS当着一个全天候的安全卫士,你的副驾驶吧!说了这么多,我们就来看看ADAS在android系统上是怎么实现的吧!
/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/edsam49原创,转载请注明出处,谢谢!
/*****************************************************************************************************/
ADAS目前的方案多数都是基于图像分析的,也就是用摄像头捕捉车辆前方行驶动态,然后数字化,通过算法里的模型计算分析,来分辨出前面车辆的位置、大小,车道线的位置。这个算法不是我们讨论的重点,这个有专业人员做深入研究,我们主要是把它应用起来,用于生产实践。
从前面我们了解到,摄像头相当的关键,它出来的原始图像的清晰度,亮度、饱和度、对比度这些都会影响车辆检测的效果,直接影响分析的结果。因此,我们在选摄像头的时候需要分辨率相当要是比较高一点的,另外它的视角大小,水平角度、垂直角度,镜头的质量至关重要,sensor大小,FOCALLENGTH以及BACK FOCALLENGTH,另外摄像头的曝光窗口位置、大小都直接决定了图像采集的质量。理论上,采集的图像质量越好,算法分析的结果就越准确。
前面探讨了图像源的一些影响参数,下面就讨论一下算法处理相关的一些东西。目前ADAS在使用上大多需要做标定,也就是量身定制,有点私人定制的味道,说通俗点就是按你的车的实际情况来调节设置算法使用的参数。比如你的车宽、车头长度、车高等,另外需要的一个车辆行驶的速度,可以直接用GPS的速度,有条件的最好还是通过OBD直接取原车的速度,这样准确,因为GPS在高架桥下、隧道等特殊地方有可能收不到星,会影响效果。通常只能做惯导处理,这也是一个不得已的补救方案。
在android系统上,摄像头的处理已经有现成的处理模块了,一般车载方案都做了行车记录仪的功能,所以ADAS不会增加硬件成本,因此可以共用行车记录的图像。那么就需要在camera HAL层来做文章了,熟悉camera处理的也都知道,里面肯定有一个采集线程,我们可以把ADAS的处理放在那个线程里面去,但是由于ADAS一般都是比较耗CPU的,处理速度没那么快,一般的行车记录仪都能达到25fps,但是ADAS一般都处理不了那么多数据,因此我们可以建立一个工作buffer队列,这队列不同于摄像头原始的队列,是基于原始队列建立的二级队列,也就是说ADAS没消耗一个buffer,就允许添加一个最新的buffer到这个二级队列里面去,这样就能保持处理的流畅性,不至于会导致行车记录丢帧。这样建立一个线程去跑ADAS算法处理这个二级buffer队列,然后把算法处理结果传递出来,一般都会埋一个回调函数了。在这个回调函数里面再想办法把结果数据传递给上层应用,传递的过程还是挺复杂的,不过当你搞懂系统camera自带的数据上报处理流程后,类似添加也就不难了。具体实现我们在下一篇文章中再仔细探讨一下。下面我们就看一下我们的几张实际路测的截图吧!