张宏宽,楼勇亮,胡权,顾晨,舒信阳
(数源科技股份有限公司,浙江 杭州 310012)
目前公交和旅游大巴等大型车辆的汽车后视镜采用的是玻璃反光镜,车辆在行驶过程中容易受到天气和恶劣环境影响,比如在雨雪、大雾等天气情况,玻璃反光镜会很模糊,驾驶员存在视觉模糊问题,另外大型车辆车身比较长,车辆转弯时前内轮转弯半径与后内轮转弯半径不同,存在“内轮差”,使得前、后车轮的运动轨迹不重合,车辆在转弯过程中玻璃反光镜存在明显的视觉盲区,驾驶员在行驶过程中无法实时观察到车辆侧后方的障碍物和行人车辆信息[1]。本文给出的视觉辅助系统,可以实时将车外盲区图像视频在车内显示屏上进行呈现,有效解决了传统光学后视镜的盲区问题,为安全驾驶提供了保障。
基于i.MX6D的视觉辅助系统的整体系统框架图如图1所示,系统主要有i.MX6D主机、左LCD屏和右LCD屏、4路高清数字摄像输入和处理模块组成。两组高清屏分别安装在车内左侧A柱和右侧A柱,屏的高度与司机的视角平行,车外左侧和右侧分别安装2路高清摄像头,角度对着车外两侧的视觉盲区区域,将左右两侧视觉盲区的视频实时呈现在A柱显示屏上,可以让司机实时了解到车外状况,为安全驾驶提供保障。
图1 视觉辅助系统整体系统框架图
系统采用的嵌入式SOC处理器是恩智浦公司的ARM Cortex-A9架构i.MX6D芯片,CPU双核,主频1.2GHz。它拥有3个vivante的GPU(Graphics Processing Unit),用于图形的加速处理[2]。i.MX6D有2个IPU(Image Processing Unit),能够接受MIPI CSI-2格式的数据,用于摄像头数据的处理。i.MX6D可以通过LDB子模块控制显示内容输出到左显示屏,HDMI子模块控制显示内容输出到右显示屏。i.MX6D的视频编解码处理单元(VPU)完全支持H.264编码格式[3-4],可以将摄像头采集到的数据进行H.264编码压缩并且存储到TF卡里面。
系统的主要工作流程为4路高清的数字摄像头产生的数字影像通过同轴线缆传输到i.MX6D 处理器,再通过处理器的子模块进行格式的转换,输出到左右显示屏,同时将视频流进行H.264压缩编码存储到TF卡。
系统主机主要有SOC处理器NXP i.MX6D,视频图像接口MAX9286,LCD的驱动显示接口DS90UB947和DS90UB949。MAX9286芯片集成四个通道的解串器,能够接收和同步来自四个串行器的视频输入,并且能够通过CSI-2输出[5],主机的功能框架图如图2所示。
图2 i. MX6D主机的功能框架图
视频图像接口驱动芯片MAX9286接受4路高清的数字摄像头产生的影像数据,并进行数据格式的转换,将CSI-2格式的数据输出到i.MX6D内。i.MX6D通过硬件模块IPU接受到CSI-2格式的影像数据后,会将其转换成4路YUV422格式的数据,再通过DMA的方式传输到指定的内存块上,使用GPU对其进行处理。同时IPU再把内存中YUV422格式的数据转换成YUV420格式,使用DMA传输到指定内存的物理地址上,可以通过VPU进行对其进行H.264的编码压缩处理,同时将其存储到TF存储卡内。
i.MX6D内部的硬件模块GPU主要负责图像的处理,将通过IPU处理后传输到内存中YUV422格式的数据转换成RGB的格式,并且可以对视频数据进行镜像操作,这样便于摄像头实际安装位置的调整。通过DMA的方式将RGB格式的数据传输到framebuffer指定的内存物理地址上,便于linux应用程序在显示屏上进行显示。2路高清显示是通过串行总线FPD-LINK III来实现的,使用的高速信号传输方式是单个差分链路高速视频数据传输,采用的通信方式为双向全双工通信。采用的TI DS90UB947是一款OpenLDI到FPD-Link III的桥接器件[6]。该器件可将LVDS的输入转换成串行数据并且支持WUXGA和1080P60的视频分辨率,支持的色深为24位。采用的TI DS90UB949是一款HDMI到FPD-Link III的桥接器件[7]。该器件可将HDMI的输入转换成串行数据并且支持WUXGA和1080P60的视频分辨率,支持的色深为24位。TI的DS90UB948是FPD-Link III 的解串器,它与DS90UB949/947的串行器进行配合,可将单通道或双通道的FPD-Link III 流转换成OpenLDI 接口的格式数据[8]。并且DS90UB948能够从单通道或双通道的FPD-Link III串行数据流中恢复数据,并且将其转换成LVDS格式的数据和相对应的时钟。在使用上主要是通过DS90UB947串行器和DS90UB948解串器进行配合,以及DS90UB949串行器和DS90UB948解串器进行配合。i.MX6D有多种输出显示方式,本文通过i.MX6D的LDB 子模块来输出低压差分信号LVDS 到TI 的DS90UB947串行器通过FPD-LINK III串行总线到TI的DS90UB948解串器最后输出到左高清显示屏。另外一路则是通过i.MX6D的HDMI控制器输出显示信号到TI的DS90UB949串行器再通过FPD-LINK III串行总线到TI的DS90UB948解串器最后输出到右显示屏,以此来完成双屏同时显示的功能。FPD-LINK III接口能够实现一条差分链路上的双向全双工通信,来透传i2c的通信数据。光感模块采用的是BH1750FVI[9],使用i2c接口接入到DS90UB948 解串器的接口上。IMX6D 可以通过DS90UB947串行器、FPD-Link总线和DS90UB948解串器这一条链路获取光感值数据,来实现对环境光照大小的检测,并且通过读取光感的值来实现对LCD显示屏的背光亮度大小的调节。
在i.MX6D处理器上运行的是linux操作系统,其版本为4.1.15。由于视觉辅助系统需要有实时性、清晰度和可靠性作为保障,因此本设计采用的数字摄像头,其帧率为30FPS、分辨率为720P[10-11]。为了能够充分利用CPU的多核架构,在软件上采用的是多线程的设计方式。视觉辅助系统的软件流程图,如图3所示。在linux应用主程序中派生出4个视频存储的线程、1个4路摄像头视频显示的线程和1个背光自动调节的线程,由于4个视频存储的线程是类似的,因此在图3的软件流程图中只画了其中的一路。
图3 视觉辅助系统的软件流程图
在摄像头视频显示的线程中,分为这几个步骤进行处理,分别为对摄像头参数的初始化、视频图像信号的采集、图像显示格式的转换处理和对图像数据的显示。本文是通过linux的V4L2框架与显示系统框架来进行编程的,主要步骤如下:
(1)打开视频设备文件获得文件描述符。
(2)查询视频设备是否是一个视频捕捉设备并且具有数据流控制模式。
(3)设置视频的制式和帧的格式。
(4)打开显示设备文件,获得显示文件描述符。
(5)使用显示文件描述符获取相应显示设备的可变信息(Framebuffer的长度、宽度以及颜色深度)。
(6)使用显示文件描述符获取相应显示设备的固定信息(Framebuffer的起始物理地址)。
(7)使用显示文件描述符设置虚拟屏幕的大小为实际屏幕大小的3倍。
(8)通过GPU来申请连续的物理内存,将申请的视频帧缓冲区映射到GPU申请的物理内存上。
(9)将申请到的帧缓冲全部入队列,以便存放采集到的数据。
(10)开始视频的采集。
(11)通过出队列来获取已采集到帧缓冲数据。
(12)将采集到的YUV422格式数据转成RGBA8888格式,用于显示。
(13)将采集到的YUV422格式数据转成YUV420格式,同时降低分辨率为480P,复制数据到用于H.264编码的内存中。
(14)将帧缓冲区重新入队列尾,以便用于循环采集。
背光自动调节的线程,首先将光感驱动注册到内核中,根据数据手册对光感进行上电,通过读ID判断光感这颗粒是否可以工作。在线程的应用程序中,其操作步骤主要如下:
(1)打开光感所挂载的i2c设备文件,获得文件描述符。
(2)通过文件描述符,设置光感的设备地址。
(3)通过文件描述符,读光感的值。
(4)打开控制背光亮度的文件描述符。
(5)根据光感和背光亮度值的对照表,调节背光亮度。
(6)延时500ms,读光感的值。
(7)再次调节背光亮度值,回到第6部,循环执行。
视频存储的线程,主要采用的是VPU 硬件模块[12],来实现H.264的视频编码压缩,具体编程的步骤如下:
(1)打开一个编码器实例,使用读写方式打开TF卡所在的目录文件。
(2)对VPU硬件子模块进行参数的初始化。
(3)获得编码器的关键参数,帧缓冲区的大小。
(4)通过上一步获取到的信息,申请帧缓冲区。
(5)将IPU转换后的YUV420格式的数据拷贝到上一步申请到的帧缓冲区中。
(6)产生图像编码后数据头的高级语法结构。
(7)开始对当前图像数据进行H.264编码,等待图像编码完成产生的中断。
(8)检查压缩图像的编码信息,同时将编码压缩后的数据写入到TF卡存储器内。
(9)程序跳转到第5步来进行循环操作。
(10)关闭打开的编码器实例,同时释放VPU的资源。
通过摄像头视频显示线程、背光自动调节线程和视频存储线程的操作,来实现4路摄像头数据的采集,显示以及压缩存储,同时能够根据光感获取到的环境光照大小,自动地调节背光的亮度,从而完成一个完整的产品。
为保证系统可靠运行,本文从系统运行资源和高低温负荷试验入手,对系统性能进行了模拟测试。采用linux操作系统,版本4.1.15,两路高清LCD显示分别采用1920*720分辨率,4路摄像输入为720p 30fps数字格式,通过top指令查看系统运行资源使用情况,如图4所示,内存占比为8%,CPU占比为1%,这是由于视频图像处理部分主要由系统GPU、VPU和IPU单元实现,所以对CPU和内存的资源消耗比较低。
图4 系统运行资源测试
车载设备要求在 -30 ℃到80℃范围稳定运行, 图5-1和图5-2分别给出了系统在 -30 ℃和80℃环境下24小时CPU运行曲线图,在高温试验中CPU温度最后稳定在91℃,经过高低温负荷试验,设备运行稳定。
图5-2 高温80℃负荷CPU运行曲线
图5-1 低温-30℃负荷CPU运行曲线
针对公交和商用大巴等大型车辆在行驶过程中后视镜存在视觉盲区问题,本文设计了基于i.MX6D的视觉辅助系统,系统采用一路主机驱动两组高清显示屏,通过对系统GPU、VPU和IPU图像处理单元的接口设计,实现了4路数字视频数据的采集、显示和存储功能,通过对系统进行高低温负荷试验和系统运行资源测试分析,系统性能达到设计预期,有效解决了车外视觉盲区的安全隐患,具有很好的应用前景。