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