如何理解自動駕駛,SLAM,BEV,訓練數(shù)據(jù)源常見術語?(1)
Simultaneous Localization and Mapping(SLAM):并發(fā)定位與地圖測繪,相對于BEV的另外一種感知技術。Perception:感知,SLAM和BEV在AD領域里都是協(xié)助控制系統(tǒng)了解車輛周圍狀況的感知技術:知道自己在哪,有哪些障礙物,障礙物在自己的什么方位,距離多遠,哪些障礙物是靜態(tài)的那些是移動的,等等相關信息,便于隨后做出駕駛決策。SLAM VS BEV:SLAM主要通過各種傳感器掃描周圍空間的物體結構,以3維數(shù)據(jù)來描述這些信息。BEV同樣通過傳感器掃描獲知周邊狀況,主要以2維數(shù)據(jù)來描述這些信息。從應用范圍來講,目前SLAM更為廣闊,在AD火起來之前主要應用在VR/AR等領域,BEV主要集中在AD行業(yè)里。從技術實現(xiàn)來看,SLAM偏向于傳統(tǒng)數(shù)學工具,包括各種幾何/概率論/圖論/群論相關的軟件包,而BEV基本上清一色的基于深度神經(jīng)網(wǎng)絡DNN。兩者最好不要對立著看,很多情況下可以互補。以下將側(cè)重于BEV的基礎介紹。SLAM和BEV最基礎和核心的傳感器就是相機(Camera),所以兩者在計算過程中有大量的算力都被消耗在了圖像中信息提取/識別和變換計算。SLAM傾向于識別圖像中的特征(Feature)點,屬于特征信息里的低級信息,通過計算這些特征點在不同圖像幀上的位置來獲取場景結構以及相機自身的位姿(Position and Pose)。而BEV傾向于識別車輛/道路/行人/障礙物等等高級特征信息,這些是卷積網(wǎng)CNN和Transformer擅長的。相機有兩個最基礎的數(shù)據(jù):內(nèi)參(Instrinsics)和外參(Extrinsics),內(nèi)參主要描述的是相機的CCD/CMOS感光片尺寸/分辨率以及光學鏡頭的系數(shù),外參主要描述的是相機在世界坐標系下的擺放位置和朝向角度。其中內(nèi)參的常見矩陣是:??0??0????001]
其中fx和fy分別表示光學鏡頭的橫向/縱向焦距長度(Focus),正常情況下焦距是不分橫縱向的,但因為CCD/CMOS感光片上的像素單元不夠正,如果這個像素是絕對的正方形,那么fx = fy,實際上很難做到,有微小的差異,導致光線經(jīng)過鏡頭投射到感光片上后,橫縱坐標在單位距離上出現(xiàn)不等距的問題,所以相機模塊的廠家會測量這個差異并給出fx和fy來,當然開發(fā)者也可以利用標定(calibration)過程來測量這兩個值。
圖1
圖2另外,在傳統(tǒng)的光學領域里,fx和fy的默認單位是毫米:mm,但在這個領域默認單位是像素:Pixel,導致很多有攝影經(jīng)驗的人看到fx和fy的值都挺納悶,特別大,動不動就是大幾千,這數(shù)值都遠超業(yè)余天文望遠鏡了。為什么這里用像素?我們試著通過內(nèi)參計算一下相機的FOV(Field of View,視場大小,通常以角度為單位)就明白了:
圖3
這里fy是縱向焦距,h是照片高度。因為h的單位是像素,所以fy也必須是像素,這樣才好便于計算機處理,所以fx和fy的單位就統(tǒng)一成了像素。其實都不用到計算機這步,CCD/CMOS感光片一般是要集成另外一塊芯片ISP(Image Signal Processor)的,這塊芯片內(nèi)部就要把感光數(shù)據(jù)轉(zhuǎn)成數(shù)字化的圖片,這里就可以用像素單位了。內(nèi)參除了這個矩陣外還有一套畸變(Distortion)系數(shù)K,這個東西不詳細說了,正常的鏡頭成像后都是居中位置的變形小,四周變形大,一般通過標定(Calibration)獲得這個參數(shù)后,對照片做反畸變處理,恢復出一個相對“正常”的照片。SLAM算法里很強調(diào)這個反畸變的重要性,因為特征點在照片上的絕對位置直接關系到了定位和建圖的準確性,而大部分的BEV代碼里看不到這個反畸變處理,一方面是BEV注重物體級別的高級特征,像素級別的輕微偏移影響不大,另一方面是很多BEV項目都是為了寫論文,采用了類似nuScenes/Argoverse這類訓練數(shù)據(jù),這些數(shù)據(jù)的畸變比較小而已,一旦你在自己的項目里用了奇怪的鏡頭還是老老實實得做反畸變預處理。
圖4外參就簡單多了,一個偏移(Transform)系數(shù)加一個旋轉(zhuǎn)(Rotation)系數(shù)。
3維空間里表述旋轉(zhuǎn)的計算方式常見的有2種:矩陣(Matrix)和四元數(shù)(Quaternion),為了防止矩陣方式存在萬向節(jié)死鎖(Gimbal Lock)問題,通常采用四元數(shù)來計算旋轉(zhuǎn)。但在AD領域里很少這么干,因為相機是固定在車子上,只有垂直于地面的軸(一般是Z軸)才會發(fā)生360度的旋轉(zhuǎn),根本無法引發(fā)萬向節(jié)問題,總不至于用戶堅持在翻車的階段仍舊保持自動駕駛這個詭異的需求。所以BEV的代碼里通常就是矩陣形式,SLAM因為還會用在AR和其它領域,相機不是相對固定的,所以會采用四元數(shù)。另外,AD領域里不考慮****現(xiàn)象,所以外參都是仿射矩陣(Affine Matrix),這點和CG領域的3維渲染是不同的。另外,一般文章里介紹內(nèi)參時還會考慮旋轉(zhuǎn)偏差,這是由于CCD/CMOS感光片在工廠里被機器給裝歪了,但AD領域一般不會考慮它,誤差太小,而相機安裝在車輛上時本身外參就有很大的相對旋轉(zhuǎn),不如一并算了,最后交由DNN學習過濾掉,而AR領域里的SLAM更是要主動計算外參,這點毛毛雨就不考慮了。內(nèi)外參了解之后,下一個基礎的重點就是坐標系。AD的坐標系有好幾個,不事先理清楚就直接看代碼有點暈。1)世界坐標系(World Coordination),這個是真實世界空間里,車輛的位置和方位角,通常粗略的位置是由GNSS(Global Navigation Satellite System)衛(wèi)星定位系統(tǒng)獲取,GNSS包括了美國GPS/中國BDS/歐洲Galileo/毛子GLONASS/日本QZSS/印度IRNSS,各有千秋,定位精度一言難盡,一般標稱的精度都是指:車輛在空曠地區(qū),上面有好幾顆定位衛(wèi)星罩著你,車輛靜止,定位設備天線粗壯,無其它信號源干擾的情況下的測試結果。如果你處在城市內(nèi),四周高樓林立,各種無線電干擾源,衛(wèi)星相對你時隱時現(xiàn),車速還不慢,這種情況下給你偏個幾十米都是對的起你了。為此有兩種常見解決方案:差分****糾偏和地圖通行大數(shù)據(jù)糾偏。這能給你造成一種錯覺:衛(wèi)星定位還是蠻準的。不管怎么弄,最后得到的坐標位置是經(jīng)緯度,但跟常規(guī)GIS(Geographic Information System)相比,AD的經(jīng)緯度不是球面坐標系,而是展開成2維地圖的坐標系,所以最終在系統(tǒng)內(nèi)的坐標系也是有區(qū)別的,比如google會把WGS84的經(jīng)緯度換算成它自家地圖的矩形切片編碼,Uber提出過一種六邊形切片的H3坐標編碼,百度則是在火星坐標的基礎上疊加了一個BD09的矩形切片坐標,等等諸如此類。這些都是絕對坐標位置,而通過類似SLAM技術掃描的高精度地圖還會在這個基礎上引入一些相對坐標。不管怎么樣,最后在代碼里看到的只剩下XY了。但這些系統(tǒng)都不能獲取車輛朝向(地理正北為0度,地理正東為90度,依此類推,這仍舊是在2維地圖上表示方式),所以AD里的車輛角度都是指“軌跡朝向”,用當前位置坐標減去上一時刻的坐標獲得一個指向性的矢量。當然在高精度地圖的加持下,是可以通過SLAM技術算出車輛的瞬時方位角。在缺失GNSS定位的時候,比如過隧道,需要用車輛的IMU(Inertial Measurement Unit)這類芯片做慣性導航補充,它們提供的數(shù)值是一個相對的坐標偏移,但隨著時間的推移累積誤差大,所以長時間沒有GNSS信號的時候,IMU表示也沒辦法。2)BEV訓練數(shù)據(jù)集的世界坐標系(nuScenes World Coordination,其它訓練集就不特別說明了),這個跟GNSS的絕對坐標系就不同了:
圖5這是一個nuScenes地圖,它的世界坐標系是圖片坐標系,原點在圖片左下角,單位是米,因此在使用訓練數(shù)據(jù)集時,是不用考慮經(jīng)緯度的。數(shù)據(jù)集中會根據(jù)時間序列給出車輛的瞬時位置,也就是在這個圖片上的XY。3) Ego坐標系(Ego Coordination),在BEV里,這個Ego是特指車輛本身,它是用來描述攝像機/激光雷達(Lidar,light detection and ranging)/毫米波雷達(一般代碼里就簡稱為Radar)/IMU在車身上的安裝位置(單位默認都是米)和朝向角度,坐標原點一般是車身中間,朝向如圖:
圖6所以車頭正放的相機默認都是Yaw(Z軸)為0度,外參(Extrinsics Matrix)主要就是描述這個坐標系的。4) 相機坐標系(Camera Coordination),切記,這個不是照片坐標系,坐標原點在CCD/CMOS感光片的中央,單位是像素,內(nèi)參(Intrinsics Matrix)主要就是描述這個坐標系的。5) 照片坐標系(Image Coordination),坐標原點在圖片的左上角,單位是像素,橫縱坐標軸一般不寫成XY,而是uv。
圖7左中右三套坐標系分別為:Ego Coordination, Camera Coordination, Image Coordination。所以,當在BEV中做LSS(Lift,Splat,Shoot)時,需要把照片中的像素位置轉(zhuǎn)換到世界坐標系時,要經(jīng)歷:Image_to_Camera, Camera_to_Ego, Ego_to_World,用矩陣表示:Position_in_World = Inv_World_to_Ego * Inv_Ego_to_Camera * Inv_Camera_to_Image * (Position_in_Image)其中Inv_表示矩陣的逆。實際代碼里,Camera_to_Image通常就是Intrinsics參數(shù)矩陣,Ego_to_Camera就是Extrinsics參數(shù)矩陣。這里要注意的一點是:fx,fy,它們實際上是這樣計算得到的:
Fx和Fy分別是橫向/縱向的鏡頭焦距,但單位是米,Dx和Dy分別是一個像素有幾米寬幾米高,得出fx和fy的單位就是像素。當使用(Ego_to_Camera * Camera_to_Image)矩陣乘上Ego空間的坐標,會以像素為單位投影到照片空間,當使用(Inv_Ego_to_Camera * Inv_Camera_to_Image)矩陣乘上照片空間的坐標,會以米為單位投影到Ego空間,不會有單位上的問題。大部分的BEV是多攝像頭的,意味著要一次性把多組攝像頭拍攝的照片像素換算到Ego或者世界坐標系:
圖8
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權請聯(lián)系工作人員刪除。