Android的camera开发中,使用最多的是camera2 以及现在Google主推的cameraX 架构,而这两个架构主要针对的是手机移动端上camera的流程。
而今天介绍的EVS(Exterior View System)架构是不同于camera2上的手机架构,针对Automotive的版本,也就是Android为车载开发的camera架构。
参考:https://source.android.google.cn/docs/devices/automotive/camera-hal?hl=zh-cn
更多技术文章,全网首发公众号 “极客钛” 锁定 -上午11点 - ,感谢大家关注、转发、点赞!
1.EVS概述
EVS(Exterior View System),可以见名知义,EVS的使用场景是针对汽车外景系统,具体表现就是倒车影像,360全景这类影像系统。
借鉴官方文档上的架构图,EVS主要分为四个部分:EVS APP、EVS Manager与EVS HAL,Vehicle HAL
1.1 EVS APP
在EVS APP中,最重要的任务就是通过EVS Manager拿到底层HAL传递的Camera数据,不过原生的EVS APP实现其实是相当不完善的,在Android12中仅支持简单的图像预览。
APP的基本流程如图。
枚举底层配置video设备节点,对video设备所支持的格式进行判断,最后符合条件的,会将device放入到sCameraList中。
在需要使用Vehicle HAL的前提下,连接Vehicle HAL,订阅车辆挡位信息与转向灯信息,当数据变化时通过listener回调处理。
开启EvsStateControl状态更新线程,在该线程内根据外部输入调整EVS APP的运行状态以及实现具体的图像绘制。
源码位置 /packages/services/Car/cpp/evs/apps/default
参考:
https://s.deepinout.com/android-14.0.0_r2/xref/packages/services/Car/cpp/evs/apps/default/
1.2 EVS Manager
EVS Manager作为中间嵌套的一层,为APP提供接入EVS HAL的接口。
EVS Manager实现与底层 HAL 驱动程序相同的 API,并通过支持多个并发客户端来提供扩展服务(多个客户端可以通过 EVS 管理器打开相机并接收视频流)。
同时实现对两个重要抽象对象(EVS Camera与EVS Display)的集中管理,此外还提供了额外的诸如权限管理,诊断功能等。
EVS Manager本质上是对HAL接口的一层封装,只不过在此基础上增加了一些其他东西。比如数据统计、诊断相关以及对虚拟Camera设备的支持等。
源码位于packages/services/Car/cpp/evs/manager
参考:
https://s.deepinout.com/android-14.0.0_r2/xref/packages/services/Car/cpp/evs/manager/
1.3 EVS HAL
EVS HAL作为硬件抽象层的具体实现,将与内核驱动进行交互,获取具体摄像头数据。在这一层将会实现两个重要的抽象对象:EVS Camera与EVS Display。
EVS HAL作为隔离用户态程序(EVS APP)与底层驱动(Camera Driver)的HAL实现,是OEM产商最为关注的部分。这部分也是原生EVS架构中最为复杂的部分。
EVS HAL存在两个版本,即1.0版本与1.1版本。关于两个版本的具体差异,我们可以大致看一下HIDL接口上的差异。
从文件上来讲,在1.1中多了IEvsUltrasonicsArray.hal与IEvsUltrasonicsArrayStream.hal两个文件。
这两个文件中定义的接口其实是为摄像头上可能存在的超声波Sensor提供相应的API,这部分新增的内容可能是为了未来的自动驾驶做考虑。
其源码路径位于/hardware/interfaces/automotive/evs目录。
参考:
https://s.deepinout.com/android-14.0.0_r2/xref/hardware/interfaces/automotive/evs/
1.4 Vehicle HAL
Vehicle HAL是整体Android Automotive版本中对外(与汽车其他控制器)沟通的桥梁。
一般而言Vehicle向下会接入CAN/Uart/Ethernet实现对外通信,向上接入CarService,服务于Java Framework,当然Native Framework也是可以接入的。
Vehicle HAL的接口定义与默认实现位于hardware/interfaces/automotive/vehicle/2.0目录。
参考:
https://s.deepinout.com/android-14.0.0_r2/xref/hardware/interfaces/automotive/vehicle/2.0/
2.EVS与camera2 的区别
控制难易程度
EVS架构一般针对车外摄像头。车外摄像头的位置都是固定的,且都属于鱼眼视角,其他参数上也较为固定。
因此也注定了在EVS架构中,系统对摄像头的控制是比较少的。
而camera2 本身是用于手机camera相关的控制上,或者可以用于车内中IMS(座舱检测系统)、DMS(驾驶员监测系统)等系统,camera需要更加灵活的调节方法与参数设定。
因此,Camera2提供了丰富的API可以实现对摄像头的多项控制,如闪光,3A控制等。
启动时机
EVS 在使用场景下一般都需要快速的启动,不能依赖太多的Android上层的service,开机启动一般不能超过2s。
如果基于手机端的Android启动方式,过于依赖Android native service,而这部分往往会耗时更多,导致整个启动后显示、使用都过于迟缓。
EVS具有更快的响应,更快的启动,以及更低的延时,这才是车载系统中最需要的部分。
例如,在汽车启动的时候,用户就需要开启倒车,整个系统的启动不能依赖Android JVM启动之后再启动APP,使用Native来实现的EVS由此应运而生。
开发难度
Camera2在Java Framework层提供了丰富的API支持(CameraManager),使得开发者可以快速开发自己的应用。
而EVS则需要开发者自己去构建诸如Input管理,View子系统等,也需要使用OpenGL ES的API去进行图像绘制,开发难度相对较大。
并且市面上关于camera2的架构以及开发的示例更多,关于EVS架构的分析是比较少的,本文也是对EVS进行一个基本的介绍分析。
综上,关于EVS 相关的软件架构到此结束,后续将会针对camera使用的细节进行分析。
感兴趣的同学也可以一起研究学习,并且帮忙指正文章中描述有误的地方,共同学习进步。