張博為,崔 鵬
(貴州財經大學 信息學院,貴州 貴陽 550025)
隨著自動駕駛汽車落地的加快,傳統(tǒng)的實地路試已經逐漸不能滿足自動駕駛汽車對各種極端情景重現(xiàn)的需求,于是針對模擬自動駕駛汽車路試情景的自動駕駛仿真技術便愈發(fā)受到重視[1]。在業(yè)界的實踐中,算法在仿真系統(tǒng)中運行的時間已經超過了在路試上花費的時間。
近年來越來越多的自動駕駛模擬路試平臺出現(xiàn)[2,3],這些平臺主要分為兩類,一類是基于現(xiàn)有的三維仿真軟件進行開發(fā)。例如基于Carsim開發(fā)的自動駕駛相關軟件,對車輛動力學的模擬較好,但是由于內置渲染器和平臺的限制,只能針對于自動駕駛相關的車輛動力學方面進行仿真,而不能將仿真拓展到自動駕駛的全流程。Zofka等[4]基于GAZEBO平臺實現(xiàn)了一套帶有較為完善車輛操縱與動力學模型的自動駕駛仿真平臺,在此基礎上實現(xiàn)了基于深度圖的仿真場景像素級標注的數(shù)據(jù)支持,雖然該平臺實現(xiàn)了對車載攝像頭的仿真,但是由于GAZEBO平臺渲染效果的缺陷,輸出的仿真攝像頭的數(shù)據(jù)與真實數(shù)據(jù)的特征空間差異過大,不能很好測試自動駕駛模型的性能。另外一類是基于游戲引擎進行開發(fā)[5-9],這類仿真平臺能夠模擬如暴雨、暴雪、行人橫穿馬路等復雜多變條件下的場景,更多地覆蓋現(xiàn)實生活中較少出現(xiàn)以及過于危險的情景。目前,大多數(shù)主流自動駕駛模擬路試系統(tǒng)都基于游戲引擎進行開發(fā)。例如,Alexey等[8]提出了一套基于UnrealEngine4(UE4)的自動駕駛仿真系統(tǒng)CARLA,提供了對模擬環(huán)境進行控制的Python接口,使用UE4對仿真進行時對場景中的人物和車輛進行控制,但是上述框架將自動駕駛相關算法限制在本機運行,限制了算法仿真的效率,并且不支持將測試算法部署到邊緣計算平臺。聞龍[9]提出了一種云端推理的模擬路試系統(tǒng)架構,采用了本地數(shù)據(jù)采集+云端推理的模式,結合高效的圖像壓縮的方式將本地采集到的仿真器數(shù)據(jù)傳輸?shù)皆贫艘怨?jié)省帶寬,但是不能很好地模擬當前自動駕駛的實際應用情況。
相較于僅搭載攝像頭的方案,搭載激光雷達的方案抗干擾能力強,在對高精度地圖的構建上具有顯著優(yōu)勢。在對激光雷達的仿真上,現(xiàn)有多數(shù)仿真系統(tǒng)采用游戲物理引擎,通過物理引擎提供的場景查詢方法,來達到獲取仿真點云的目的,近年來也有一些研究通過對已有的點云進行處理,并結合已有三維模型來產生點云。CARLA等框架[4,8]采用游戲引擎所提供的射線檢測算法,這套算法通過實時平臺的物理引擎,從指定點出發(fā),對指定方向的場景物體進行求交。但是要求場景中的模型采用最高精度的碰撞模型,加重了物理引擎的計算量,并且光線的求交與查詢是運行在實時平臺的主線程上的,增加了光線的數(shù)量會造成實時平臺的幀率下降,影響模擬傳感器的效果。柴國貝等[10]提出了一種基于三維模型頂點的激光雷達仿真方法,利用了GPU的頂點著色管線獲得了較大的性能提升。但是三維模型的頂點在世界坐標系中并不一定按照激光雷達的掃描方式進行排列,需要對頂點點云進行過濾操作,所以不能很好地模擬車載激光雷達輸出點云的特性。Fang等[11]提出了基于掃描場景的激光雷達仿真方法,在預處理階段,對真實世界點云使用PointNet++[12]等點云分類模型剔除前景物體(如行人、汽車等),再將可能的動態(tài)物體的三維模型處理成點云表示添加進場景。Manivasagam等[13]改進了前景車輛的生成方法,采用真實的車輛掃描點云。以上方法可以通過已有數(shù)據(jù)集進行端到端的點云模擬,但不易對非前景物體進行更改,并且無法使用同一套數(shù)據(jù)對激光雷達之外的傳感器進行仿真。另外,隨著自動駕駛相關算法復雜性的日漸提高,使得自動駕駛汽車本身硬件的重要性逐漸凸顯,自動駕駛汽車由于續(xù)航、空間等本身的限制,只能搭載低功耗的車載計算平臺,而車載計算平臺算力低的特點也就決定了自動駕駛的仿真系統(tǒng)不能像傳統(tǒng)人工智能應用一樣盲目地堆高算力。
針對以上的問題,本文提出了一套分布式的部署框架,將仿真環(huán)境、激光雷達仿真器、算法容器平臺按照處理數(shù)據(jù)的不同抽象成節(jié)點。其中環(huán)境仿真基于UE4引擎,能夠提供逼真的環(huán)境仿真效果,算法容器平臺可以選擇部署到高性能服務器上進行監(jiān)督學習,或是部署到邊緣計算平臺上進行在實車條件下的算法測試。本文的貢獻主要有兩點:提出了一套易于部署的,對邊緣節(jié)點友好的自動駕駛模擬路試系統(tǒng);實現(xiàn)了基于光線追蹤算法的激光雷達模擬,利用GPU的高度并行性,提升了車載激光雷達仿真的效率。本文提出的自動駕駛模擬路試系統(tǒng)驗證了自動駕駛仿真架構異構部署和光線追蹤算法模擬車載激光雷達的可行性,為后續(xù)相關工作提供了經驗。
如圖1所示,本文所提出的模擬路試系統(tǒng)系統(tǒng)主要分為4個部分:①世界構建與自動駕駛相關傳感器信息采集;②激光雷達仿真;③數(shù)據(jù)分發(fā);④算法容器。
圖1 模擬路試系統(tǒng)架構
本系統(tǒng)的部署方式為多機分布式部署,算法容器與左側3個模塊之間通過局域網連接,以上4個模塊共同組成一個訓練節(jié)點。整個仿真系統(tǒng)的流程如圖2所示。
圖2 模擬路試系統(tǒng)流程
為了架構的靈活性和仿真?zhèn)鞲衅鞯恼鎸嵭?,本模擬路試系統(tǒng)采用了當前應用較為廣泛的開源游戲引擎UE4作為仿真引擎。UE4能提供時較為真實渲染質量,并且其自帶的動畫、行為樹等模塊也能使構建仿真環(huán)境的過程更為簡單和快速。
本系統(tǒng)通過封裝自動駕駛汽車的控制操作和仿真?zhèn)鞲衅?攝像頭、慣性測量單元等)的數(shù)據(jù)流,通過網絡與分離部署的算法容器建立雙向數(shù)據(jù)交換。當環(huán)境仿真引擎和算法容器分離部署時,將采集到的傳感器數(shù)據(jù)封裝成數(shù)據(jù)流發(fā)送到算法容器中,再由算法容器返回指令給仿真引擎操縱仿真環(huán)境中的車輛。整個仿真引擎是依賴于UE4的PIE(play in editor)模式運行的,這樣使得每次對仿真場景的修改都可以在下一次仿真中直接看到效果。
模擬路試平臺生成數(shù)據(jù)幀具有一定的時間間隔,假設T1為環(huán)境仿真引擎渲染一幀的時間,T2為單向網絡延遲時間,T3為算法容器處理一幀傳感器數(shù)據(jù)需要的時間,ti為一類仿真?zhèn)鞲衅鞑杉瘮?shù)據(jù)的時間,i為傳感器編號,則對仿真?zhèn)鞲衅鞑杉瘮?shù)據(jù)時間T4如式(1),系統(tǒng)總延遲T如式(2)
T4=max(t1,t2,t3,…,tn)
(1)
T=T1+2T2+T3+T4
(2)
多數(shù)的自動駕駛仿真系統(tǒng)對激光雷達的模擬都是通過使用仿真引擎自帶的物理引擎進行射線檢測從而得到單束激光目標點的位置,由于場景的查詢多是串行執(zhí)行的,當每幀點云數(shù)目過多時,會使得產生一幀點云數(shù)據(jù)的時間過長,使得式(1)中T4過大,最終增大整個系統(tǒng)的響應延遲。對此本文方法選擇將激光雷達仿真從仿真引擎中獨立出來,并使用光線追蹤算法在GPU上進行并行計算,使得激光雷達仿真部分不阻塞仿真引擎的渲染流程,提高了效率,并且改進了以往光線追蹤算法中耗時最高的光線生成算法以及著色算法,以滿足對激光雷達仿真實時性的要求。激光雷達仿真模塊接收仿真引擎?zhèn)鬟f的傳感器位置,輸出一幀點云。
算法容器中提供了針對所有傳感器數(shù)據(jù)的數(shù)據(jù)訪問的Python接口,用于自定義模型的數(shù)據(jù)獲取,也提供了針對常用目標檢測算法以及車道線識別算法的封裝(如Yolo v3、Faster RCNN),方便快速搭建系統(tǒng)。算法容器針對仿真環(huán)境中的車輛控制提供了方向盤角度、油門百分比、檔位等車輛駕駛行為的封裝。同時,分布式的部署方式使得算法容器可以靈活地部署在高性能服務器或是邊緣計算平臺上。
分布式部署依賴于高性能仿真平臺進行數(shù)據(jù)分發(fā)。而在單機部署的情況下,使用共享內存在各個模塊之間進行數(shù)據(jù)傳輸,以達到最佳的性能。在分布式部署的情況下,需要傳輸?shù)臄?shù)據(jù)主要有點云數(shù)據(jù)、多路攝像頭數(shù)據(jù)、車輛信息數(shù)據(jù),以及算法容器傳回的指令。數(shù)據(jù)交換采用谷歌GRPC框架,其中多路視頻流的傳輸采用編碼、傳輸、解碼的方式以節(jié)省帶寬。數(shù)據(jù)分發(fā)模塊采用工作隊列將發(fā)送接收線程與工作線程解耦,工作線程以固定的時間間隔工作。數(shù)據(jù)的流向如圖3所示。
圖3 仿真器數(shù)據(jù)流向
光線追蹤算法[14]是一種易于在并行處理器上實現(xiàn)的算法。在實際的應用中,每一個像素都可以并行運行這一算法。本文提出的改進光線追蹤算法運用了現(xiàn)代GPU的光線追蹤渲染管線來進行場景的求交查詢以及通過命中材質的物理屬性進行回波強度的計算,得到最終的激光雷達仿真器輸出。
目前廣泛采用的光線追蹤算法使用基于GPU的渲染流水線[15],主流的路徑追蹤流水線可以用5個著色器來表示:①光線生成著色器,用于定義一束光線的初始狀態(tài),并且開始進行場景遍歷;②交叉著色器,用于定義與非三角形基元(如球面、體素,以及曲面細分)相交的規(guī)則,決定了物體的形狀,與具體的圖元的碰撞檢測是采用遍歷BVH(bounding box hierarchy)樹[15]來進行的;③未命中著色器,用于定義一束射線在沒有與任何幾何體相交的情況下如何著色;④最近交點著色器,用于定義射線的交點如何著色,也可以在這個著色器中產生新的射線(用于反射等),形成一個遞歸調用;⑤任何交點著色器,用于定義射線是否要忽略這個交點,繼續(xù)遍歷場景求交。后3種著色器用于控制每條射線的行為。
在通常情況下,光線生成著色器都是對窗口大小內的所有像素進行生成操作,但是對于仿真激光雷達來說,視口內的大多數(shù)發(fā)射光線都是激光雷達所不需要的,所以本文使用了一種改進的光線生成算法,相較于原來的光線生成算法,本文的方法規(guī)定了光線的生成規(guī)則,使得實際發(fā)射的光線的數(shù)量、位置與實際的激光雷達相同,同時優(yōu)化了Close-Hit Shader的執(zhí)行過程,去掉了著色器中對命中點不必要的采樣,將Close-Hit Shader中的指令數(shù)量降低為原來的30%。本文采用的光線生成算法如圖4所示,其中θ為發(fā)射的兩條光線間的夾角,P1、P2為像素坐標系上兩點,P′1、P′2為射線OP1、OP2在世界坐標系中與三維模型的交點。
圖4 改進光線生成算法
像素坐標系到世界坐標系的轉換如式(3)和式(4),其中R為相機旋轉矩陣,T為相機在世界坐標系中的位置
[XC,YC,ZC]=ZK-1[x,y,1]T
(3)
(4)
在模擬仿真雷達時,還需要考慮仿真激光雷達的參數(shù),例如在對多線束機械式激光雷達進行模擬時,就需要考慮角分辨、垂直FOV等參數(shù)。改進光線生成算法默認啟動矩陣的最上方一行像素和最下方一行像素作為仿真激光雷達的最上方線束和最下方線束,再對滿足條件的線束執(zhí)行初始化和射線檢測,并判斷與場景是否有交點,算法的偽碼如下:
算法1:改進光線生成算法
輸入:像素坐標,相機參數(shù),仿真激光雷達參數(shù)
輸出:生成的光線
(1)根據(jù)式(3)、 式(4)計算u,v對應的世界坐標P
(2)IF(P滿足線束間夾角andP滿足角分辨率條件)
(3)dr=P-PCamera
(4)Ray←InitializeRay(dr,PCamera)
(5) WHILE !Ray.HitTriangle() and !Ray.IsMaxLength()
(6)Ray.Update(s)//s為射線每次的步長
(7) END WHILE
(8) IFRay.ValidHit()//射線與場景中的三角形有有效交點
(9)CloseHitShader(Ray)
(10) END IF
(11) END IF
為了改善傳統(tǒng)激光雷達仿真軟件采用的采用基于距離衰減的回波強度的計算公式,本文引入了文獻[10]提出的回波強度計算方法,其能較好模擬激光雷達回波強度的特性,本文將之應用于 Closest-Hit著色器。與原本的Closest-Hit著色器相比,本文的改進主要體現(xiàn)在以下4點:①去除了間接光照的計算以降低計算量;②對場景中的透明材質進行過濾,忽略透明物體的反射;③在完成命中點BRDF計算之后采用式(5)計算當前的輻亮度;④在一幀結束后使用CUDA編寫的并行歸約算法計算當前幀輻亮度范圍,用于之后的分析。其中BRDF選用了常用的Cook-Torrance BRDF函數(shù)[16]
(5)
(6)
其中,a為仿真場景大氣散射系數(shù),R為激光雷達到命中點的距離,Pt為發(fā)射功率,fr(x,ωi,ωo) 為BRDF函數(shù),ηt,ηr分別為發(fā)射和接受光學系統(tǒng)的透過率,Lrange為系統(tǒng)的輻亮度范圍。Cook-Torrance BRDF定義如式(7)
(7)
其中,D(h) 為法線分布函數(shù),用于描述微觀法線方向的分布情況,粗糙表面法線分布相對均勻,光滑表面法線分布相對集中;F(v,h) 為菲涅爾函數(shù),用以描述在不同入射光角度下反射光線所占的比率;G(l,v)是微平面幾何函數(shù),用以描述微平面間的自遮擋關系,粗糙平面表面上的微平面有可能擋住其它的微平面從而減少表面所反射的光線;n為宏觀平面法線方向;h為微平面法線方向;l為入射光方向;v為觀察方向。對于Close-Hit著色器,首先對光線命中點材質進行采樣,得到粗糙度等渲染相關的信息,再計算BRDF值,最后使用式(5)與式(6)計算回波強度并返回到主機端,算法使用CUDA進行并行計算,算法偽碼如下:
算法2:改進Close-Hit著色器算法
輸入:物體材質參數(shù)Mat,滿足條件的光線列表ValidRayList,系統(tǒng)輻亮度范圍Lrange
輸出:回波強度值Intensity
(1)FORRay←ValidRayList.Begin() toValidRayList.End()
(2)HitMat←SampleMaterial(Ray,Mat) //獲取光線命中點處法線,粗糙度等渲染相關信息
(3)S←BRDF(HitMat,Ray)
(4)根據(jù)式(6)使用HitMat與S計算Lr
(5)根據(jù)式(5)使用Lr與Lrange計算Intensity
(6)Intensity寫入回傳緩存
(7)END FOR
(8)回傳緩存復制到主機端,執(zhí)行并行歸約算法得到當前幀輻亮度范圍
根據(jù)本文提出的自動駕駛仿真器的特性,提出了3組實驗來測試整個系統(tǒng)的性能,包括每秒激光雷達最大點云數(shù)、仿真平臺的數(shù)據(jù)速率、邊緣設備對生成的視頻數(shù)據(jù)進行預測的性能。在實驗中發(fā)現(xiàn)CARLA與Airsim實現(xiàn)激光雷達仿真的方法基本一致,故在這里選擇效果更好的CARLA進行比較。
框架整體分成4個模塊進行實現(xiàn)。在世界構建與傳感器信息采集模塊中,仿真環(huán)境生成采用C++語言結合UE4引擎的GamePlay框架進行實現(xiàn),彩色攝像頭、深度攝像頭通過引擎的渲染相關緩存進行獲取,IMU數(shù)據(jù)通過采集場景中的車輛相關姿態(tài)角經計算后得到。為了支持多路視頻的同時編解碼,采用基于GPU的VPF框架進行編解碼操作。激光雷達仿真模塊使用基于CUDA實現(xiàn)的改進光線追蹤算法。數(shù)據(jù)分發(fā)模塊使用Python實現(xiàn)了一個基于GRPC框架的模塊間通信與交換系統(tǒng)。算法容器模塊中,使用Python封裝車輛操作的邏輯,在沒有NVIDIA GPU的節(jié)點上采用ffmpg解碼視頻,在其它節(jié)點上使用VPF進行解碼。仿真平臺的實際運行效果如圖5所示。
圖5 模擬環(huán)境運行效果
實驗環(huán)境采用AMD 3900X、RTX 2070、32 GB內存的運算設備,操作系統(tǒng)為Windows 10 2004版本,使用的UE4版本為4.25,CARLA版本為0.9.10,Pytorch版本為1.6.0,測試實驗配置的參數(shù)見表1。
本文的主要實驗如下:實驗1:將本文的激光雷達仿真方法與CARLA以及典型激光雷達產生的最大點云數(shù)量進行對比。實驗2:將本文的仿真環(huán)境的數(shù)據(jù)速率與CARLA
表1 系統(tǒng)參數(shù)
以及直接渲染的數(shù)據(jù)速率進行對比。實驗3:將本文的模擬路試系統(tǒng)輸出的數(shù)據(jù)在目前的主流檢測算法上進行測試。
為了驗證仿真系統(tǒng)產生點云的效率,本文對比了自動駕駛模擬平臺CARLA使用PhysX物理引擎進行場景求交運算產生點云的方法。每秒生成的最大點云數(shù)量的計算方法如式(8)
P=AveragePoints×AverageFPS
(8)
(9)
其中,AveragePoints是平均每幀產生的點云數(shù)量,AverageFrameTime是每幀平均的幀時間。
本文實驗了在16線、32線、64線、128線下的每秒最大點云產生數(shù)量,這里的每秒最大點云輸出數(shù)量定義為:在且掃描線數(shù)固定的情況下,橫向分辨率設置為激光雷達仿真器的最小值。對于本文方法,通過忽略角分辨率條件使得滿足垂直分辨率的每一行像素都發(fā)射光線,以達到每秒最大點云輸出數(shù)量。對于CARLA,在固定射線通道數(shù)的情況下,不斷加大每秒預期輸出點云數(shù)量,直到最后的實際輸出點云數(shù)量不再變化,以達到每秒最大點云輸出數(shù)量。通過對每秒最大點云輸出數(shù)量的測試能夠得到仿真激光雷達的性能上限。圖6的實驗結果表明,本文方法相比CARLA在每幀最大輸出點云的指標上,在模擬激光雷達線數(shù)為128時達到了7倍的最大點云數(shù)量。驗證改進的光線追蹤算法在模擬自動駕駛使用的多線束掃描式激光雷達上相比于基于物理引擎的射線求交方式有著顯著的優(yōu)勢。
圖6 每秒最大點云數(shù)量的對比
為了驗證整個仿真系統(tǒng)在運行時的數(shù)據(jù)速率,在開啟三路攝像頭和激光雷達模擬的情況下,將整套系統(tǒng)部署在同一個節(jié)點上,以此對比本文方法和CARLA在每秒最大點云數(shù)量下的數(shù)據(jù)速率。同時也對UE4引擎直接渲染場景的幀率進行了對比測試。圖7、圖8的實驗結果表明,本文提出的自動駕駛模擬路試的仿真部分相較于傳統(tǒng)依賴于游戲引擎流水線的架構擁有巨大的優(yōu)勢,提高了40%的幀速率。表2的數(shù)據(jù)表明,對比CARLA,本文提出的架構也可以有效減少在開啟模擬激光雷達的情況下仿真環(huán)境的卡頓。通過分析,發(fā)現(xiàn)CARLA采集除激光雷達外的其它傳感器的時間只占幀時間中很少的一部分,一幀中大多數(shù)的時間都用在激光雷達仿真模塊與UE4物理引擎的交互中,而使用物理引擎進行射線查詢生成點云的方式,因為其與UE4引擎主循環(huán)的強耦合,阻塞了渲染線程,導致了性能的大幅度下降。本文提出的方法,利用了GPU并行計算能力強的特點,加快了點云的生成速度,并且數(shù)據(jù)的生成不依賴于游戲引擎。
圖7 仿真激光雷達幀率
圖8 UE4引擎幀率
表2 幀時間超過0.5 s數(shù)量統(tǒng)計
為了驗證本文提出的架構在運行典型深度學習模型時的效率和準確率,測試采用模型官方發(fā)布的COCO數(shù)據(jù)集上訓練的預訓練模型進行,輸入的數(shù)據(jù)集為從本文的模擬環(huán)境中采集的3段1280*720 30 FPS帶語義信息(行人與車輛)的模擬路試畫面,分別測試了在YOLO-V3和YOLO-V5以及RetinaNet上的效率。測試采用配置為i5 1035G4 CPU (244.9 GFLOPS),8 GB內存的邊緣計算設備,運行示例如圖9所示。表3的結果表明,各個模型在算法容器中運行的效率符合預期,生成的數(shù)據(jù)能夠較好地評價算法的性能。AP50指的是重疊度(IoU)閾值為0.5時的平均精度(AP)測量值,IoU以及AP的計算公式如下
(10)
(11)
(12)
(13)
其中,Rdi與Rgi分別為預測目標框和真實目標框,TP表示預測與實際均為正樣本的目標數(shù)目,F(xiàn)P表示實際為負樣本預測為正樣本的目標數(shù)目,F(xiàn)N表示實際為正樣本但預測為負樣本的目標數(shù)目。AP表示準確率-召回率曲線下的面積precisionmax(i) 表示該點對應的最大準確率。AP越高,模型的檢測效果越好。
圖9 實時檢測結果
表3 各個模型在算法容器中的運行性能
當前自動駕駛模擬路試框架中存在的對激光雷達模擬效果不佳、無法分離部署自動駕駛仿真器和自動駕駛相關算法等問題,本文提出了一種改進的自動駕駛模擬路試系統(tǒng)。為了提高對車載激光雷達進行模擬的效率,本系統(tǒng)提出了一種運行在GPU上的改進路徑追蹤算法,該算法改進了傳統(tǒng)光線追蹤算法的渲染方程和Cook-Torrance BRDF函數(shù),實現(xiàn)了性能提升并且能更好地模擬車載激光雷達的實際運行狀況。算法提高了平均4.5倍的每秒最大點云數(shù)量,模擬時的卡頓概率降低為其它框架的1/9。本系統(tǒng)采用的分布式部署的架構能夠較好地評估各個算法的性能,同時降低自動駕駛算法與模擬環(huán)境搶占算力的可能。下一步考慮將改進光線追蹤算法應用到采用高精度掃描模型的自動駕駛仿真場景中,并且優(yōu)化和隱藏現(xiàn)有平臺的數(shù)據(jù)傳輸開銷,以達到更加高效的模擬。