張宏寬,樓勇亮,胡權(quán),顧晨,舒信陽
(數(shù)源科技股份有限公司,浙江 杭州 310012)
目前公交和旅游大巴等大型車輛的汽車后視鏡采用的是玻璃反光鏡,車輛在行駛過程中容易受到天氣和惡劣環(huán)境影響,比如在雨雪、大霧等天氣情況,玻璃反光鏡會很模糊,駕駛員存在視覺模糊問題,另外大型車輛車身比較長,車輛轉(zhuǎn)彎時前內(nèi)輪轉(zhuǎn)彎半徑與后內(nèi)輪轉(zhuǎn)彎半徑不同,存在“內(nèi)輪差”,使得前、后車輪的運動軌跡不重合,車輛在轉(zhuǎn)彎過程中玻璃反光鏡存在明顯的視覺盲區(qū),駕駛員在行駛過程中無法實時觀察到車輛側(cè)后方的障礙物和行人車輛信息[1]。本文給出的視覺輔助系統(tǒng),可以實時將車外盲區(qū)圖像視頻在車內(nèi)顯示屏上進行呈現(xiàn),有效解決了傳統(tǒng)光學后視鏡的盲區(qū)問題,為安全駕駛提供了保障。
基于i.MX6D的視覺輔助系統(tǒng)的整體系統(tǒng)框架圖如圖1所示,系統(tǒng)主要有i.MX6D主機、左LCD屏和右LCD屏、4路高清數(shù)字攝像輸入和處理模塊組成。兩組高清屏分別安裝在車內(nèi)左側(cè)A柱和右側(cè)A柱,屏的高度與司機的視角平行,車外左側(cè)和右側(cè)分別安裝2路高清攝像頭,角度對著車外兩側(cè)的視覺盲區(qū)區(qū)域,將左右兩側(cè)視覺盲區(qū)的視頻實時呈現(xiàn)在A柱顯示屏上,可以讓司機實時了解到車外狀況,為安全駕駛提供保障。
圖1 視覺輔助系統(tǒng)整體系統(tǒng)框架圖
系統(tǒng)采用的嵌入式SOC處理器是恩智浦公司的ARM Cortex-A9架構(gòu)i.MX6D芯片,CPU雙核,主頻1.2GHz。它擁有3個vivante的GPU(Graphics Processing Unit),用于圖形的加速處理[2]。i.MX6D有2個IPU(Image Processing Unit),能夠接受MIPI CSI-2格式的數(shù)據(jù),用于攝像頭數(shù)據(jù)的處理。i.MX6D可以通過LDB子模塊控制顯示內(nèi)容輸出到左顯示屏,HDMI子模塊控制顯示內(nèi)容輸出到右顯示屏。i.MX6D的視頻編解碼處理單元(VPU)完全支持H.264編碼格式[3-4],可以將攝像頭采集到的數(shù)據(jù)進行H.264編碼壓縮并且存儲到TF卡里面。
系統(tǒng)的主要工作流程為4路高清的數(shù)字攝像頭產(chǎn)生的數(shù)字影像通過同軸線纜傳輸?shù)絠.MX6D 處理器,再通過處理器的子模塊進行格式的轉(zhuǎn)換,輸出到左右顯示屏,同時將視頻流進行H.264壓縮編碼存儲到TF卡。
系統(tǒng)主機主要有SOC處理器NXP i.MX6D,視頻圖像接口MAX9286,LCD的驅(qū)動顯示接口DS90UB947和DS90UB949。MAX9286芯片集成四個通道的解串器,能夠接收和同步來自四個串行器的視頻輸入,并且能夠通過CSI-2輸出[5],主機的功能框架圖如圖2所示。
圖2 i. MX6D主機的功能框架圖
視頻圖像接口驅(qū)動芯片MAX9286接受4路高清的數(shù)字攝像頭產(chǎn)生的影像數(shù)據(jù),并進行數(shù)據(jù)格式的轉(zhuǎn)換,將CSI-2格式的數(shù)據(jù)輸出到i.MX6D內(nèi)。i.MX6D通過硬件模塊IPU接受到CSI-2格式的影像數(shù)據(jù)后,會將其轉(zhuǎn)換成4路YUV422格式的數(shù)據(jù),再通過DMA的方式傳輸?shù)街付ǖ膬?nèi)存塊上,使用GPU對其進行處理。同時IPU再把內(nèi)存中YUV422格式的數(shù)據(jù)轉(zhuǎn)換成YUV420格式,使用DMA傳輸?shù)街付▋?nèi)存的物理地址上,可以通過VPU進行對其進行H.264的編碼壓縮處理,同時將其存儲到TF存儲卡內(nèi)。
i.MX6D內(nèi)部的硬件模塊GPU主要負責圖像的處理,將通過IPU處理后傳輸?shù)絻?nèi)存中YUV422格式的數(shù)據(jù)轉(zhuǎn)換成RGB的格式,并且可以對視頻數(shù)據(jù)進行鏡像操作,這樣便于攝像頭實際安裝位置的調(diào)整。通過DMA的方式將RGB格式的數(shù)據(jù)傳輸?shù)絝ramebuffer指定的內(nèi)存物理地址上,便于linux應用程序在顯示屏上進行顯示。2路高清顯示是通過串行總線FPD-LINK III來實現(xiàn)的,使用的高速信號傳輸方式是單個差分鏈路高速視頻數(shù)據(jù)傳輸,采用的通信方式為雙向全雙工通信。采用的TI DS90UB947是一款OpenLDI到FPD-Link III的橋接器件[6]。該器件可將LVDS的輸入轉(zhuǎn)換成串行數(shù)據(jù)并且支持WUXGA和1080P60的視頻分辨率,支持的色深為24位。采用的TI DS90UB949是一款HDMI到FPD-Link III的橋接器件[7]。該器件可將HDMI的輸入轉(zhuǎn)換成串行數(shù)據(jù)并且支持WUXGA和1080P60的視頻分辨率,支持的色深為24位。TI的DS90UB948是FPD-Link III 的解串器,它與DS90UB949/947的串行器進行配合,可將單通道或雙通道的FPD-Link III 流轉(zhuǎn)換成OpenLDI 接口的格式數(shù)據(jù)[8]。并且DS90UB948能夠從單通道或雙通道的FPD-Link III串行數(shù)據(jù)流中恢復數(shù)據(jù),并且將其轉(zhuǎn)換成LVDS格式的數(shù)據(jù)和相對應的時鐘。在使用上主要是通過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接口能夠?qū)崿F(xiàn)一條差分鏈路上的雙向全雙工通信,來透傳i2c的通信數(shù)據(jù)。光感模塊采用的是BH1750FVI[9],使用i2c接口接入到DS90UB948 解串器的接口上。IMX6D 可以通過DS90UB947串行器、FPD-Link總線和DS90UB948解串器這一條鏈路獲取光感值數(shù)據(jù),來實現(xiàn)對環(huán)境光照大小的檢測,并且通過讀取光感的值來實現(xiàn)對LCD顯示屏的背光亮度大小的調(diào)節(jié)。
在i.MX6D處理器上運行的是linux操作系統(tǒng),其版本為4.1.15。由于視覺輔助系統(tǒng)需要有實時性、清晰度和可靠性作為保障,因此本設(shè)計采用的數(shù)字攝像頭,其幀率為30FPS、分辨率為720P[10-11]。為了能夠充分利用CPU的多核架構(gòu),在軟件上采用的是多線程的設(shè)計方式。視覺輔助系統(tǒng)的軟件流程圖,如圖3所示。在linux應用主程序中派生出4個視頻存儲的線程、1個4路攝像頭視頻顯示的線程和1個背光自動調(diào)節(jié)的線程,由于4個視頻存儲的線程是類似的,因此在圖3的軟件流程圖中只畫了其中的一路。
圖3 視覺輔助系統(tǒng)的軟件流程圖
在攝像頭視頻顯示的線程中,分為這幾個步驟進行處理,分別為對攝像頭參數(shù)的初始化、視頻圖像信號的采集、圖像顯示格式的轉(zhuǎn)換處理和對圖像數(shù)據(jù)的顯示。本文是通過linux的V4L2框架與顯示系統(tǒng)框架來進行編程的,主要步驟如下:
(1)打開視頻設(shè)備文件獲得文件描述符。
(2)查詢視頻設(shè)備是否是一個視頻捕捉設(shè)備并且具有數(shù)據(jù)流控制模式。
(3)設(shè)置視頻的制式和幀的格式。
(4)打開顯示設(shè)備文件,獲得顯示文件描述符。
(5)使用顯示文件描述符獲取相應顯示設(shè)備的可變信息(Framebuffer的長度、寬度以及顏色深度)。
(6)使用顯示文件描述符獲取相應顯示設(shè)備的固定信息(Framebuffer的起始物理地址)。
(7)使用顯示文件描述符設(shè)置虛擬屏幕的大小為實際屏幕大小的3倍。
(8)通過GPU來申請連續(xù)的物理內(nèi)存,將申請的視頻幀緩沖區(qū)映射到GPU申請的物理內(nèi)存上。
(9)將申請到的幀緩沖全部入隊列,以便存放采集到的數(shù)據(jù)。
(10)開始視頻的采集。
(11)通過出隊列來獲取已采集到幀緩沖數(shù)據(jù)。
(12)將采集到的YUV422格式數(shù)據(jù)轉(zhuǎn)成RGBA8888格式,用于顯示。
(13)將采集到的YUV422格式數(shù)據(jù)轉(zhuǎn)成YUV420格式,同時降低分辨率為480P,復制數(shù)據(jù)到用于H.264編碼的內(nèi)存中。
(14)將幀緩沖區(qū)重新入隊列尾,以便用于循環(huán)采集。
背光自動調(diào)節(jié)的線程,首先將光感驅(qū)動注冊到內(nèi)核中,根據(jù)數(shù)據(jù)手冊對光感進行上電,通過讀ID判斷光感這顆粒是否可以工作。在線程的應用程序中,其操作步驟主要如下:
(1)打開光感所掛載的i2c設(shè)備文件,獲得文件描述符。
(2)通過文件描述符,設(shè)置光感的設(shè)備地址。
(3)通過文件描述符,讀光感的值。
(4)打開控制背光亮度的文件描述符。
(5)根據(jù)光感和背光亮度值的對照表,調(diào)節(jié)背光亮度。
(6)延時500ms,讀光感的值。
(7)再次調(diào)節(jié)背光亮度值,回到第6部,循環(huán)執(zhí)行。
視頻存儲的線程,主要采用的是VPU 硬件模塊[12],來實現(xiàn)H.264的視頻編碼壓縮,具體編程的步驟如下:
(1)打開一個編碼器實例,使用讀寫方式打開TF卡所在的目錄文件。
(2)對VPU硬件子模塊進行參數(shù)的初始化。
(3)獲得編碼器的關(guān)鍵參數(shù),幀緩沖區(qū)的大小。
(4)通過上一步獲取到的信息,申請幀緩沖區(qū)。
(5)將IPU轉(zhuǎn)換后的YUV420格式的數(shù)據(jù)拷貝到上一步申請到的幀緩沖區(qū)中。
(6)產(chǎn)生圖像編碼后數(shù)據(jù)頭的高級語法結(jié)構(gòu)。
(7)開始對當前圖像數(shù)據(jù)進行H.264編碼,等待圖像編碼完成產(chǎn)生的中斷。
(8)檢查壓縮圖像的編碼信息,同時將編碼壓縮后的數(shù)據(jù)寫入到TF卡存儲器內(nèi)。
(9)程序跳轉(zhuǎn)到第5步來進行循環(huán)操作。
(10)關(guān)閉打開的編碼器實例,同時釋放VPU的資源。
通過攝像頭視頻顯示線程、背光自動調(diào)節(jié)線程和視頻存儲線程的操作,來實現(xiàn)4路攝像頭數(shù)據(jù)的采集,顯示以及壓縮存儲,同時能夠根據(jù)光感獲取到的環(huán)境光照大小,自動地調(diào)節(jié)背光的亮度,從而完成一個完整的產(chǎn)品。
為保證系統(tǒng)可靠運行,本文從系統(tǒng)運行資源和高低溫負荷試驗入手,對系統(tǒng)性能進行了模擬測試。采用linux操作系統(tǒng),版本4.1.15,兩路高清LCD顯示分別采用1920*720分辨率,4路攝像輸入為720p 30fps數(shù)字格式,通過top指令查看系統(tǒng)運行資源使用情況,如圖4所示,內(nèi)存占比為8%,CPU占比為1%,這是由于視頻圖像處理部分主要由系統(tǒng)GPU、VPU和IPU單元實現(xiàn),所以對CPU和內(nèi)存的資源消耗比較低。
圖4 系統(tǒng)運行資源測試
車載設(shè)備要求在 -30 ℃到80℃范圍穩(wěn)定運行, 圖5-1和圖5-2分別給出了系統(tǒng)在 -30 ℃和80℃環(huán)境下24小時CPU運行曲線圖,在高溫試驗中CPU溫度最后穩(wěn)定在91℃,經(jīng)過高低溫負荷試驗,設(shè)備運行穩(wěn)定。
圖5-2 高溫80℃負荷CPU運行曲線
圖5-1 低溫-30℃負荷CPU運行曲線
針對公交和商用大巴等大型車輛在行駛過程中后視鏡存在視覺盲區(qū)問題,本文設(shè)計了基于i.MX6D的視覺輔助系統(tǒng),系統(tǒng)采用一路主機驅(qū)動兩組高清顯示屏,通過對系統(tǒng)GPU、VPU和IPU圖像處理單元的接口設(shè)計,實現(xiàn)了4路數(shù)字視頻數(shù)據(jù)的采集、顯示和存儲功能,通過對系統(tǒng)進行高低溫負荷試驗和系統(tǒng)運行資源測試分析,系統(tǒng)性能達到設(shè)計預期,有效解決了車外視覺盲區(qū)的安全隱患,具有很好的應用前景。