視系統(tǒng)搭建全流程:從硬件選型到量產(chǎn)落地)
去年接到一個(gè)任務(wù)要把一臺(tái)還在圖紙階段的車(chē)型從零搭出一套AVM全景環(huán)視系統(tǒng)。團(tuán)隊(duì)里一開(kāi)始有人覺(jué)得這活兒挺簡(jiǎn)單——買(mǎi)四個(gè)魚(yú)眼攝像頭接上域控制器屏幕上一拼圖不就完了等真正把整條鏈路走通我才意識(shí)到AVM環(huán)視遠(yuǎn)不止“拼圖”這么簡(jiǎn)單它背后牽扯到光學(xué)選型、嵌入式驅(qū)動(dòng)、圖像算法、3D渲染、車(chē)規(guī)級(jí)標(biāo)定和產(chǎn)線一致性任何一個(gè)環(huán)節(jié)掉鏈子最后都會(huì)以“全景畫(huà)面看著別扭”的形式暴露在用戶面前。這篇文章我就把這套系統(tǒng)的搭建全過(guò)程攤開(kāi)來(lái)講從為什么AVM是智能駕駛里最容易被低估的模塊到硬件選型時(shí)的算力推導(dǎo)再到標(biāo)定拼接里那些讓你抓狂的細(xì)節(jié)最后是量產(chǎn)落地階段的踩坑實(shí)錄。內(nèi)容主要面向正在做或準(zhǔn)備做AVM項(xiàng)目的工程師也適合想了解這套系統(tǒng)內(nèi)部邏輯的產(chǎn)品和測(cè)試同學(xué)。我會(huì)盡量把每一個(gè)“為什么這么做”講透而不是只給結(jié)論。1. AVM系統(tǒng)的真實(shí)定位它遠(yuǎn)不止“四個(gè)攝像頭拼個(gè)畫(huà)面”1.1 從一次透明底盤(pán)需求說(shuō)起項(xiàng)目剛啟動(dòng)時(shí)產(chǎn)品部門(mén)提了一個(gè)需求“我們要做透明底盤(pán)用戶低速行駛時(shí)能看到車(chē)底路面。”乍一聽(tīng)很簡(jiǎn)單無(wú)非是把車(chē)底盲區(qū)圖像補(bǔ)出來(lái)。真正開(kāi)始設(shè)計(jì)時(shí)才發(fā)現(xiàn)透明底盤(pán)需要結(jié)合車(chē)輛運(yùn)動(dòng)軌跡、歷史鳥(niǎo)瞰圖幀緩存和實(shí)時(shí)位姿推算本質(zhì)上是給AVM系統(tǒng)加了一個(gè)輕量級(jí)SLAM模塊。也就是說(shuō)AVM并不是一個(gè)孤立的全景影像功能它已經(jīng)變成承載其他智能功能的底層視覺(jué)平臺(tái)。透明底盤(pán)只是例子之一。現(xiàn)在很多車(chē)型上的“窄路輔助”、“限寬墩通過(guò)”、“遙控泊車(chē)”、“哨兵模式”底層圖像來(lái)源全是這套AVM系統(tǒng)。它解決的不僅是泊車(chē)時(shí)看盲區(qū)的問(wèn)題——在狹窄路段會(huì)車(chē)、側(cè)方停車(chē)、通過(guò)石墩時(shí)全景俯視視角給駕駛員提供的是一個(gè)近乎零盲區(qū)的上帝視角這直接決定了一臺(tái)車(chē)“好不好開(kāi)、好不好?!钡牡谝挥∠?。1.2 AVM在整車(chē)功能矩陣?yán)锏慕巧绻话袮VM當(dāng)成“泊車(chē)輔助”的附屬品格局就小了。實(shí)際整車(chē)功能架構(gòu)里AVM處在視覺(jué)感知、實(shí)時(shí)渲染和車(chē)輛控制的交叉點(diǎn)上對(duì)駕駛員提供2D/3D全景視圖、單視圖、車(chē)輪視角、透明底盤(pán)對(duì)APA泊車(chē)系統(tǒng)提供環(huán)視魚(yú)眼圖像作為感知輸入用于車(chē)位檢測(cè)和障礙物識(shí)別對(duì)行車(chē)系統(tǒng)在低速場(chǎng)景下提供盲區(qū)補(bǔ)盲配合超聲波雷達(dá)做融合判斷對(duì)遠(yuǎn)程控制場(chǎng)景哨兵模式、遠(yuǎn)程看車(chē)都需要環(huán)視攝像頭長(zhǎng)時(shí)間在線工作。這意味著AVM系統(tǒng)的穩(wěn)定性和實(shí)時(shí)性直接影響的是整車(chē)多個(gè)功能模塊的體驗(yàn)。一個(gè)“看起來(lái)不高級(jí)”的拼接錯(cuò)位可能直接導(dǎo)致APA泊車(chē)系統(tǒng)感知誤判。所以整套系統(tǒng)的搭建流程從一開(kāi)始就要站在整車(chē)電子電氣架構(gòu)的高度去設(shè)計(jì)而不是單點(diǎn)地把四路視頻流拼到屏幕上就收工。1.3 系統(tǒng)搭建的整體視角多條鏈路并行推進(jìn)AVM系統(tǒng)搭建我習(xí)慣把它拆成五條并行鏈路硬件鏈路攝像頭模組、串行解串芯片、域控制器視頻輸入接口、供電和信號(hào)線束驅(qū)動(dòng)鏈路解串器I2C配置、攝像頭ISP初始化、視頻流采集、幀同步機(jī)制算法鏈路內(nèi)參標(biāo)定、外參標(biāo)定、畸變校正、BEV合成、拼接融合、圖像增強(qiáng)應(yīng)用鏈路2D/3D渲染、視圖切換、車(chē)輛模型交互、OSD疊加、CAN信號(hào)接入工程化鏈路產(chǎn)線標(biāo)定方案、在線EOL檢測(cè)、溫漂補(bǔ)償、防塵防水、OTA升級(jí)。這五條鏈路不是先后關(guān)系而是從項(xiàng)目第一天起就要并行推進(jìn)的。硬件選型影響著算法精度算法方案反過(guò)來(lái)約束硬件指標(biāo)產(chǎn)線標(biāo)定流程在設(shè)計(jì)階段就要介入否則樣車(chē)做出來(lái)了卻發(fā)現(xiàn)產(chǎn)線無(wú)法復(fù)現(xiàn)標(biāo)定效果那整個(gè)項(xiàng)目就得推倒重來(lái)。后面幾章我按從硬到軟的路徑展開(kāi)但大家心里要清楚這只是一個(gè)敘述順序真實(shí)項(xiàng)目中所有環(huán)節(jié)都是咬合在一起的。2. 硬件選型與算力推導(dǎo)從四個(gè)魚(yú)眼鏡頭到域控平臺(tái)2.1 攝像頭選型參數(shù)背后的真實(shí)意義AVM對(duì)攝像頭的核心要求是“看的寬、看得清、夠穩(wěn)定”。先說(shuō)鏡頭市面上AVM攝像頭普遍采用魚(yú)眼鏡頭水平視場(chǎng)角做到190°到210°。為什么要這么大的視場(chǎng)角因?yàn)樗穆窋z像頭要覆蓋車(chē)周360°相鄰攝像頭之間必須保留足夠的重疊區(qū)域用于拼接融合。如果水平視場(chǎng)角只有160°那車(chē)輛四個(gè)角就會(huì)出現(xiàn)大范圍盲區(qū)再怎么調(diào)算法也補(bǔ)不回來(lái)。再看傳感器目前量產(chǎn)項(xiàng)目主流集中在200萬(wàn)像素級(jí)別的車(chē)規(guī)級(jí)CMOS比如OV10640、OV10635或者索尼IMX390系列。有人會(huì)問(wèn)800萬(wàn)像素不是看得更清楚嗎但AVM的場(chǎng)景里像素提升并不會(huì)帶來(lái)等比例的效果提升反而會(huì)成倍增加ISP處理壓力、傳輸帶寬和SoC功耗。200萬(wàn)像素魚(yú)眼在畸變校正和BEV映射之后輸出到屏幕的顯示分辨率是綽綽有余的。傳感器的低照度性能反而是更應(yīng)該關(guān)注的指標(biāo)——地下車(chē)庫(kù)、夜間泊車(chē)才是環(huán)視系統(tǒng)真正的考場(chǎng)。2.2 圖像傳輸方案為什么非GMSL不可攝像頭分布在車(chē)前格柵、左右后視鏡下方和后備廂牌照燈上方到域控制器的線纜長(zhǎng)度普遍在3到5米。這時(shí)候如果把傳感器輸出的MIPI信號(hào)直接拉這么遠(yuǎn)信號(hào)完整性基本沒(méi)法保證。量產(chǎn)方案里主流選擇是GMSL2或FPD-Link這類(lèi)車(chē)規(guī)級(jí)串行傳輸技術(shù)。我們項(xiàng)目用的是GMSL2方案串行器加解串器的組合一條同軸線纜里既傳視頻數(shù)據(jù)還通過(guò)反向通道傳I2C控制指令同時(shí)給攝像頭供電這就是常說(shuō)的PoC供電。這種架構(gòu)帶來(lái)的好處很直接線束簡(jiǎn)化、EMI更容易過(guò)、傳輸距離可以做到15米以上。但代價(jià)是驅(qū)動(dòng)復(fù)雜度上來(lái)了。解串器初始化時(shí)要正確配置寄存器序列I2C地址仲裁、GPIO中斷、鏈路鎖定狀態(tài)檢測(cè)每一個(gè)環(huán)節(jié)都有坑。我們遇到過(guò)解串器在某些低溫環(huán)境下出現(xiàn)鏈路反復(fù)重訓(xùn)練的情況畫(huà)面一卡一卡的最后是通過(guò)修改解串器重訓(xùn)練閾值和增加攝像頭供電去耦電容才解決。2.3 算力評(píng)估用一張表算清數(shù)據(jù)流AVM的算力需求很多人拍腦袋覺(jué)得“隨便一個(gè)MPU都能搞定”直到他們?cè)谂?D全景渲染時(shí)才被幀率打臉。我習(xí)慣用一張延遲預(yù)算表來(lái)推動(dòng)選型決策處理環(huán)節(jié)數(shù)據(jù)流說(shuō)明延遲預(yù)算攝像頭曝光與讀出卷簾快門(mén)逐行曝光5ms串行傳輸GMSL2鏈路的傳輸與解串2msISP處理去馬賽克、白平衡、AE/AF8ms畸變校正與LUT映射查表替換像素坐標(biāo)5msBEV鳥(niǎo)瞰圖合成四路透視變換與重疊融合12ms3D渲染透視投影、貼圖映射、車(chē)模繪制12ms顯示輸出傳輸?shù)狡聊徊⑺⑿?0ms加起來(lái)大概是54ms看起來(lái)離100ms的預(yù)算還有余量但這里沒(méi)算操作系統(tǒng)調(diào)度、CAN信號(hào)采集和上層應(yīng)用邏輯的消耗。真到整車(chē)上跑起來(lái)幀率波動(dòng)、內(nèi)存帶寬競(jìng)爭(zhēng)、GPU負(fù)載峰值都會(huì)讓這個(gè)數(shù)字往上飆。我們當(dāng)時(shí)的經(jīng)驗(yàn)是以“重建一條完整數(shù)據(jù)通路”為目標(biāo)去評(píng)估SoC, 而不是只看ISP能不能處理四路視頻。規(guī)格書(shū)上寫(xiě)的4路全高清處理能力是在純ISP流水線場(chǎng)景下的理論值。一旦你要在同一顆芯片上同時(shí)跑渲染、跑APA感知、跑CAN通信資源沖突幾乎是必然的。所以選SoC時(shí)一定要留出至少30%的算力余量否則后面加需求時(shí)就會(huì)陷入“要么砍功能、要么換芯片”的兩難。目前量產(chǎn)項(xiàng)目里地平線J3、TI TDA4VM、高通SA8155P這類(lèi)芯片都是常見(jiàn)選擇具體選哪顆取決于你手上的算法棧和供應(yīng)鏈情況。3. 標(biāo)定與拼接整個(gè)系統(tǒng)最硬的一塊骨頭3.1 為什么說(shuō)“完美拼接”是個(gè)很主觀但又極苛刻的目標(biāo)AVM效果好不好用戶第一眼就能看出來(lái)。拼接縫錯(cuò)位、地面直線扭曲、車(chē)模周?chē)霈F(xiàn)重影這些主觀感受層面的瑕疵在驗(yàn)收評(píng)審時(shí)會(huì)被產(chǎn)品、質(zhì)量、管理層輪番放大。而要做到“看起來(lái)天衣無(wú)縫”本質(zhì)上是讓四路相機(jī)在各自獨(dú)立的坐標(biāo)系里通過(guò)標(biāo)定參數(shù)映射到同一個(gè)車(chē)輛坐標(biāo)系再投到統(tǒng)一的鳥(niǎo)瞰圖平面上。這個(gè)映射鏈路上任何一個(gè)參數(shù)有偏差最后都會(huì)以幾何畸變或者拼接錯(cuò)位的形式暴露。更麻煩的是標(biāo)定誤差在動(dòng)態(tài)視角下會(huì)被放大。2D俯視圖下1個(gè)像素的錯(cuò)位在3D自由視角旋轉(zhuǎn)時(shí)會(huì)表現(xiàn)為整個(gè)地面平面的扭曲。人眼對(duì)直線和輪廓又極其敏感車(chē)位線稍微偏移一下馬上就會(huì)覺(jué)得“這車(chē)全景好山寨”。這也是為什么AVM項(xiàng)目里標(biāo)定工程師的話語(yǔ)權(quán)非常大他們說(shuō)效果不行算法團(tuán)隊(duì)就得回頭查參數(shù)。3.2 單目?jī)?nèi)參標(biāo)定魚(yú)眼畸變模型的選擇魚(yú)眼鏡頭的畸變非常劇烈不能用普通針孔模型的徑向畸變參數(shù)來(lái)描述必須使用專(zhuān)門(mén)的魚(yú)眼畸變模型。目前工業(yè)界常用的是Kannala-Brandt模型它用多項(xiàng)式來(lái)描述入射角與像素坐標(biāo)之間的映射關(guān)系。我們項(xiàng)目里內(nèi)參標(biāo)定用的是棋盤(pán)格法采集不同角度、不同距離的棋盤(pán)格圖像然后通過(guò)角點(diǎn)檢測(cè)和優(yōu)化求解得到內(nèi)參矩陣和畸變系數(shù)。內(nèi)參標(biāo)定看起來(lái)是純算法問(wèn)題但實(shí)際執(zhí)行時(shí)有很多操作細(xì)節(jié)決定成敗。比如棋盤(pán)格必須保持平整輕微翹曲都會(huì)給標(biāo)定結(jié)果引入誤差拍攝時(shí)棋盤(pán)格要在畫(huà)面各個(gè)區(qū)域都出現(xiàn)特別是邊緣和角落否則魚(yú)眼邊緣的畸變系數(shù)就擬合不準(zhǔn)。我們用了一套自動(dòng)采集質(zhì)量評(píng)分流程實(shí)時(shí)檢測(cè)棋盤(pán)格角點(diǎn)數(shù)量、重投影誤差、圖像清晰度不滿足要求就提示重拍這才把內(nèi)參標(biāo)定的成功率提上來(lái)。3.3 外參標(biāo)定把四個(gè)相機(jī)“裝”到一輛車(chē)上外參標(biāo)定要解決的是每個(gè)相機(jī)相對(duì)于車(chē)輛坐標(biāo)系的旋轉(zhuǎn)和平移關(guān)系。由于每輛車(chē)在生產(chǎn)線上安裝攝像頭的位置都存在公差外參不能像內(nèi)參那樣在實(shí)驗(yàn)室里一次性標(biāo)定好必須每輛車(chē)單獨(dú)做。量產(chǎn)外參標(biāo)定通常用標(biāo)定布鋪在車(chē)輛前后左右的地面上標(biāo)定布上有已知尺寸的黑白棋盤(pán)格或圓點(diǎn)陣列。車(chē)輛開(kāi)到標(biāo)定工位后系統(tǒng)抓取四路圖像檢測(cè)各自視野內(nèi)的角點(diǎn)再通過(guò)PNP求解出相機(jī)到車(chē)輛坐標(biāo)系的變換矩陣。這里的核心難點(diǎn)是“基準(zhǔn)統(tǒng)一”標(biāo)定布上的圖案定義了車(chē)輛坐標(biāo)系的原點(diǎn)和方向所有相機(jī)的外參都必須對(duì)齊到同一個(gè)標(biāo)定布坐標(biāo)系上。如果標(biāo)定布鋪設(shè)不水平、或車(chē)輛停位偏差過(guò)大那標(biāo)定出來(lái)的外參就是錯(cuò)的拼接效果必然崩。我們?cè)诋a(chǎn)線上專(zhuān)門(mén)做了一個(gè)定位工裝用輪擋和側(cè)向定位器把車(chē)輛停在固定位置標(biāo)定布也用定位銷(xiāo)固定在地面上這樣把人為誤差降到最低。3.4 BEV合成與融合策略外參標(biāo)定完成后算法流程就是把四路魚(yú)眼圖像分別做畸變校正然后通過(guò)逆透視變換將每個(gè)相機(jī)視角映射到車(chē)輛坐標(biāo)系下的鳥(niǎo)瞰圖平面。但每個(gè)相機(jī)只能覆蓋一部分地面區(qū)域所以相鄰相機(jī)的映射結(jié)果必須在重疊區(qū)做融合。融合策略直接決定畫(huà)面觀感。最簡(jiǎn)單的線性加權(quán)融合實(shí)現(xiàn)方便但容易出現(xiàn)“鬼影”因?yàn)樵谥丿B區(qū)兩個(gè)相機(jī)看到同一物體的位置存在細(xì)微偏差。我們項(xiàng)目里先是用了多頻段融合效果好了不少但權(quán)重計(jì)算和實(shí)時(shí)性能需要做很多調(diào)優(yōu)。后來(lái)又加入基于光流的動(dòng)態(tài)融合權(quán)重處理運(yùn)動(dòng)物體跨相機(jī)切換時(shí)的殘影問(wèn)題。這套融合模塊是整個(gè)算法棧里迭代次數(shù)最多的部分因?yàn)樗绊懙牟皇悄骋粋€(gè)指標(biāo)而是整體主觀體驗(yàn)。亮度一致性同樣是個(gè)大頭。四個(gè)攝像頭對(duì)著不同方向曝光和色溫天然不同尤其一側(cè)有樹(shù)蔭、一側(cè)曬著太陽(yáng)的時(shí)候拼接出來(lái)的全景圖會(huì)像“陰陽(yáng)臉”。我們的做法是在ISP端做全局AE/AWB鎖定然后在算法端做亮度均衡先提取重疊區(qū)的亮度偏差再生成一個(gè)平滑的增益場(chǎng)把整個(gè)拼接圖的光影過(guò)渡拉均勻。這個(gè)過(guò)程如果做得過(guò)猛又會(huì)引入色階斷層所以增益場(chǎng)的平滑度和作用范圍需要一點(diǎn)點(diǎn)調(diào)參。4. 實(shí)時(shí)渲染與人機(jī)交互車(chē)規(guī)級(jí)顯示的要求和細(xì)節(jié)4.1 渲染管線的核心從鳥(niǎo)瞰圖到動(dòng)態(tài)視角2D俯視全景是AVM的基礎(chǔ)模式但近幾年的產(chǎn)品幾乎都標(biāo)配了3D全景。3D模式里車(chē)輛周?chē)牡孛姹挥成涞揭粋€(gè)碗狀或平面狀的三維網(wǎng)格上用戶可以通過(guò)觸摸或旋鈕旋轉(zhuǎn)視角也可以讓系統(tǒng)根據(jù)擋位和方向盤(pán)轉(zhuǎn)角自動(dòng)切換視角。這個(gè)渲染過(guò)程通常跑在GPU上核心步驟包括三維場(chǎng)景構(gòu)建、紋理貼圖、虛擬相機(jī)設(shè)置、透視投影和光柵化顯示。紋理貼圖的數(shù)據(jù)源就是那四路經(jīng)過(guò)校正的魚(yú)眼圖像它們被映射到三維網(wǎng)格的不同區(qū)域。虛擬相機(jī)的位置和朝向由用戶交互或車(chē)輛狀態(tài)決定比如倒車(chē)時(shí)虛擬相機(jī)自動(dòng)切到車(chē)尾方向打左轉(zhuǎn)向燈時(shí)切到左前角。這里有一個(gè)容易被忽視的關(guān)鍵點(diǎn)渲染頻率必須與視頻輸入頻率解耦。視頻流是30幀進(jìn)但渲染如果也鎖死在30幀一旦GPU負(fù)載波動(dòng)就會(huì)導(dǎo)致掉幀和卡頓。我們把渲染循環(huán)獨(dú)立到60幀用最新的視頻幀去更新紋理這樣即使視頻流偶爾掉一兩幀屏幕上也不會(huì)出現(xiàn)明顯抖動(dòng)。車(chē)模的繪制精度也要注意細(xì)節(jié)太粗會(huì)顯得廉價(jià)面數(shù)太高又?jǐn)D占GPU資源我們最后在視覺(jué)質(zhì)量和渲染開(kāi)銷(xiāo)之間取了一個(gè)平衡值。4.2 視圖邏輯什么時(shí)候給駕駛員看什么AVM不是簡(jiǎn)單的全屏俯視圖它必須跟車(chē)輛狀態(tài)深度綁定。典型的視圖切換策略是掛入R擋默認(rèn)顯示后視全景的組合視圖如果存在APA泊車(chē)功能還要疊加車(chē)位標(biāo)線和軌跡線D擋低速行駛切換為前視全景方便窄路通過(guò)和觀察車(chē)頭盲區(qū)轉(zhuǎn)向燈觸發(fā)打左轉(zhuǎn)向燈時(shí)自動(dòng)切出左側(cè)車(chē)輪視角幫助駕駛員觀察路邊臺(tái)階或障礙物自定義觸發(fā)通過(guò)中控屏按鈕切換2D/3D、自由視角、廣角單視圖、透明底盤(pán)。這些邏輯看起來(lái)是純交互設(shè)計(jì)但實(shí)際執(zhí)行時(shí)要跟CAN總線信號(hào)做聯(lián)調(diào)。擋位信號(hào)、車(chē)速信號(hào)、方向盤(pán)轉(zhuǎn)角信號(hào)的實(shí)時(shí)性和穩(wěn)定性決定了視圖切換是否跟手。我們遇到過(guò)車(chē)速信號(hào)偶爾跳變導(dǎo)致視圖在低速/高速模式之間反復(fù)橫跳的問(wèn)題后來(lái)做了一階濾波和遲滯判斷才解決。4.3 渲染延遲與顯示安全車(chē)規(guī)級(jí)AVM對(duì)端到端延遲有硬性要求。國(guó)標(biāo)和主流車(chē)企的企標(biāo)一般都要求從攝像頭曝光到屏幕顯示不超過(guò)100毫秒倒車(chē)場(chǎng)景下延遲太大會(huì)讓駕駛員覺(jué)得方向盤(pán)和畫(huà)面不同步嚴(yán)重情況下會(huì)影響泊車(chē)安全判斷。延遲優(yōu)化不能只看渲染環(huán)節(jié)整條鏈路的每一環(huán)都要壓時(shí)間。我們做過(guò)的優(yōu)化包括在驅(qū)動(dòng)層保證四路攝像頭的幀同步避免拼接時(shí)使用不同時(shí)刻的畫(huà)面ISP輸出直接走零拷貝內(nèi)存導(dǎo)入GPU紋理省掉CPU拷貝渲染層關(guān)閉垂直同步里的多余緩沖減少畫(huà)面駐留時(shí)間。經(jīng)過(guò)這一輪優(yōu)化端到端延遲從最初的一百二三十毫秒壓到了八十毫秒左右。5. 從樣車(chē)到產(chǎn)線標(biāo)定一致性、溫漂與整車(chē)間差異5.1 產(chǎn)線標(biāo)定每輛車(chē)都要做還必須做得快實(shí)驗(yàn)室里把AVM調(diào)得再好產(chǎn)線上做不出來(lái)也等于零。量產(chǎn)AVM的標(biāo)定工位節(jié)拍一般控制在60秒以?xún)?nèi)全自動(dòng)完成車(chē)輛定位、圖像采集、角點(diǎn)檢測(cè)、外參計(jì)算和結(jié)果驗(yàn)證五個(gè)環(huán)節(jié)。這意味著標(biāo)定算法必須做到一次性通過(guò)率高不能有太多需要人工干預(yù)的分支。我們?cè)诋a(chǎn)線標(biāo)定這塊踩過(guò)比較大的坑是標(biāo)定布磨損。標(biāo)定布鋪在地面上被叉車(chē)、料架、工裝反復(fù)碾壓角點(diǎn)圖案很容易出現(xiàn)局部磨損或污漬這會(huì)導(dǎo)致視覺(jué)檢測(cè)到的角點(diǎn)坐標(biāo)系統(tǒng)性偏移。后來(lái)我們做了一個(gè)標(biāo)定布健康度檢測(cè)功能每次標(biāo)定前自動(dòng)抓取標(biāo)定布圖像跟標(biāo)準(zhǔn)模板比對(duì)磨損超過(guò)閾值就報(bào)警提示更換把這一類(lèi)問(wèn)題從源頭掐掉了。5.2 溫漂問(wèn)題攝像頭也會(huì)“熱脹冷縮”攝像頭模組的支架通常用注塑件或壓鑄件材料的熱膨脹系數(shù)比鏡頭玻璃大得多。溫度變化時(shí)鏡頭和傳感器的相對(duì)位置會(huì)發(fā)生微米級(jí)變化這直接影響標(biāo)定參數(shù)的準(zhǔn)確性。典型的場(chǎng)景是早上冷車(chē)啟動(dòng)時(shí)全景拼接還挺好開(kāi)了一兩個(gè)小時(shí)車(chē)身暴曬或發(fā)動(dòng)機(jī)艙發(fā)熱后前攝像頭的支架受熱變形拼接開(kāi)始出現(xiàn)肉眼可見(jiàn)的錯(cuò)位。解決溫漂問(wèn)題有幾個(gè)方向一是在攝像頭支架結(jié)構(gòu)設(shè)計(jì)上做補(bǔ)償選擇低膨脹系數(shù)材料或者在結(jié)構(gòu)上設(shè)計(jì)應(yīng)力釋放槽二是在標(biāo)定算法里引入溫度補(bǔ)償模型不同溫度區(qū)間使用對(duì)應(yīng)的外參修正值三是在系統(tǒng)啟動(dòng)時(shí)做動(dòng)態(tài)自檢發(fā)現(xiàn)拼接誤差偏大就觸發(fā)短期自標(biāo)定。我們當(dāng)時(shí)選擇的是第二種方案配合環(huán)境溫度傳感器的數(shù)據(jù)在軟件里做查表修正效果比較明顯。5.3 整車(chē)一致性驗(yàn)證抽樣與全檢結(jié)合AVM屬于主動(dòng)安全相關(guān)的顯示功能很多車(chē)企對(duì)這種功能要求全檢。我們當(dāng)時(shí)的做法是產(chǎn)線終端做一次EOL檢測(cè)通過(guò)標(biāo)定布或?qū)S玫尿?yàn)證圖案自動(dòng)檢測(cè)拼接精度、亮度一致性、顏色一致性并對(duì)結(jié)果打分。得分低于閾值就觸發(fā)重新標(biāo)定二次標(biāo)定仍不合格則進(jìn)入返修區(qū)。這里有一個(gè)管理層面的心得AVM效果的最終驗(yàn)收不能只看系統(tǒng)自己報(bào)的“通過(guò)”還要安排人員做抽檢而且抽檢時(shí)要覆蓋白天、夜晚、地庫(kù)、雨天等多種真實(shí)環(huán)境。算法團(tuán)隊(duì)和產(chǎn)線團(tuán)隊(duì)對(duì)“合格”的定義經(jīng)常有分歧提前拉齊驗(yàn)收標(biāo)準(zhǔn)后面能少吵很多架。6. 實(shí)測(cè)踩坑記錄六個(gè)至今印象深刻的疑難問(wèn)題6.1 車(chē)位線在拼接處“劈叉”現(xiàn)象是車(chē)位線在前攝像頭畫(huà)面和左攝像頭畫(huà)面的重疊區(qū)里顯示成兩條錯(cuò)開(kāi)的線像被劈開(kāi)一樣。排查鏈路先查外參重新標(biāo)定后問(wèn)題還在又查融合權(quán)重發(fā)現(xiàn)重疊區(qū)寬度本身只有不到30厘米但融合權(quán)重過(guò)渡得太快兩邊畫(huà)面的結(jié)構(gòu)信息沒(méi)有對(duì)齊就做了混合。最終定位根因是外參里前相機(jī)和左相機(jī)的Z軸旋轉(zhuǎn)角存在約0.3度的偏差這個(gè)偏差在單相機(jī)畫(huà)面里完全看不出問(wèn)題但在重疊區(qū)的幾何連續(xù)線上就會(huì)暴露。處理辦法是重寫(xiě)了外參優(yōu)化里的聯(lián)合對(duì)齊項(xiàng)讓重疊區(qū)內(nèi)的地面對(duì)應(yīng)點(diǎn)重投影誤差一起參與優(yōu)化而不是各相機(jī)單獨(dú)求解后再拼接。6.2 地庫(kù)里的LED頻閃條紋在地下車(chē)庫(kù)等場(chǎng)景畫(huà)面出現(xiàn)緩慢滾動(dòng)的明暗條紋。原因是LED燈具的驅(qū)動(dòng)頻率和攝像頭曝光頻率不同步產(chǎn)生差頻。這個(gè)問(wèn)題在地庫(kù)這種大面積LED照明的環(huán)境下特別明顯攝像頭曝光時(shí)間越短條紋越清晰。解決思路有兩個(gè)方向一是把曝光時(shí)間設(shè)置為L(zhǎng)ED驅(qū)動(dòng)頻率的整數(shù)倍比如50Hz地區(qū)用10毫秒或20毫秒曝光二是使用抗頻閃傳感器模式讓ISP自動(dòng)檢測(cè)環(huán)境光頻閃頻率并調(diào)整曝光參數(shù)。我們最終用了第二種方案并在地庫(kù)場(chǎng)景下做了一輪專(zhuān)門(mén)的曝光參數(shù)標(biāo)定效果基本可接受。6.3 透明底盤(pán)轉(zhuǎn)彎時(shí)圖像撕裂透明底盤(pán)依賴(lài)歷史幀拼接但在轉(zhuǎn)彎時(shí)車(chē)輛運(yùn)動(dòng)模型和實(shí)際軌跡存在偏差導(dǎo)致車(chē)底虛擬視圖和周?chē)鷮?shí)時(shí)視圖錯(cuò)位。這個(gè)問(wèn)題的本質(zhì)是歷史幀的投影基準(zhǔn)已經(jīng)過(guò)期而系統(tǒng)沒(méi)有及時(shí)判斷“這里的舊數(shù)據(jù)已經(jīng)不可信了”。我們的修復(fù)方式是在透明底盤(pán)算法里增加一個(gè)置信度圖根據(jù)車(chē)輛運(yùn)動(dòng)速度、轉(zhuǎn)向角速度和歷史幀的時(shí)長(zhǎng)為每一塊車(chē)底區(qū)域計(jì)算一個(gè)數(shù)據(jù)新鮮度。當(dāng)新鮮度低于閾值時(shí)就把那塊區(qū)域標(biāo)記為半透明或直接用實(shí)時(shí)畫(huà)面填充而不是強(qiáng)行用過(guò)期的歷史圖像拼湊。效果上犧牲了一點(diǎn)“全透明”的炫酷感但避免了看著頭暈的硬傷。6.4 倒車(chē)時(shí)畫(huà)面延遲突然變大某次OTA之后收到反饋說(shuō)倒車(chē)影像延遲變大。排查發(fā)現(xiàn)是新版本的圖形庫(kù)在渲染全景視圖時(shí)占用過(guò)高導(dǎo)致整個(gè)顯示模塊的幀率掉到二十幀以下。根因是我們?cè)谀前嫘枨罄镄略隽恕?D車(chē)模隨方向盤(pán)轉(zhuǎn)動(dòng)”的動(dòng)畫(huà)這個(gè)動(dòng)畫(huà)在GPU上跑的是逐幀骨骼動(dòng)畫(huà)消耗比預(yù)期大。優(yōu)化方式是把這個(gè)動(dòng)畫(huà)改為預(yù)先烘焙好的幀序列貼圖同時(shí)把全景視圖和車(chē)模動(dòng)畫(huà)拆成兩個(gè)渲染層車(chē)模動(dòng)畫(huà)掉到30幀不影響全景底層的60幀輸出。經(jīng)驗(yàn)是新功能上線前一定要做渲染性能回歸測(cè)試尤其要關(guān)注GPU內(nèi)存帶寬的峰值占用。6.5 夜間倒車(chē)時(shí)后攝像頭畫(huà)面發(fā)白夜間倒車(chē)車(chē)尾對(duì)著白墻或來(lái)車(chē)大燈時(shí)后攝像頭畫(huà)面經(jīng)常過(guò)曝發(fā)白周?chē)?xì)節(jié)全部丟失。這個(gè)問(wèn)題的本質(zhì)是單幀AE算法面對(duì)大動(dòng)態(tài)范圍場(chǎng)景時(shí)為了保住中間亮度區(qū)域把高光區(qū)域全部犧牲掉了。方案是把后攝像頭的AE策略從全局測(cè)光改為自定義權(quán)重測(cè)光把畫(huà)面底部的車(chē)輛近處區(qū)域和車(chē)牌區(qū)域設(shè)為高權(quán)重這樣即使車(chē)尾方向有一塊高亮區(qū)域畫(huà)面核心信息仍然保留。另外在ISP端加了局部色調(diào)映射壓縮高光區(qū)域的灰階范圍讓白墻上的障礙物輪廓重新顯現(xiàn)出來(lái)。6.6 EMC測(cè)試導(dǎo)致圖像水波紋在進(jìn)行整車(chē)EMC抗擾測(cè)試時(shí)發(fā)現(xiàn)攝像頭畫(huà)面出現(xiàn)水波紋狀干擾。這類(lèi)問(wèn)題的本質(zhì)是輻射干擾耦合到了攝像頭輸出鏈路上模擬信號(hào)或數(shù)字信號(hào)的傳輸完整性被破壞。排查時(shí)我們換了屏蔽電纜、增加了共模電感、調(diào)整了PCB布局最終確認(rèn)干擾路徑是同軸線纜的屏蔽層接地阻抗偏高導(dǎo)致共模干擾轉(zhuǎn)化成差模干擾。改善方案是把攝像頭安裝位置的接地點(diǎn)從車(chē)身油漆面改到裸金屬接地柱并優(yōu)化了線束的屏蔽層360度端接工藝。EMC問(wèn)題的排查通常比較痛苦因?yàn)楦蓴_路徑不直觀經(jīng)驗(yàn)就是優(yōu)先懷疑接地其次懷疑屏蔽最后才是電路本身。7. 量產(chǎn)交付的最后一公里功能安全、臟污檢測(cè)和OTA迭代7.1 功能安全視角下的AVM設(shè)計(jì)AVM系統(tǒng)如果僅僅作為“給駕駛員看的畫(huà)面”功能安全等級(jí)要求不高。但一旦它的圖像輸出被APA、遙控泊車(chē)等系統(tǒng)用于感知計(jì)算那么從攝像頭到SoC再到算法鏈路整個(gè)鏈條都需要按ASIL-B的流程來(lái)開(kāi)發(fā)。這意味著要做硬件診斷覆蓋分析、軟件單元測(cè)試覆蓋率、安全機(jī)制設(shè)計(jì)如攝像頭失幀檢測(cè)、數(shù)據(jù)完整性校驗(yàn)、看門(mén)狗監(jiān)控。我記得在給APA系統(tǒng)輸出圖像時(shí)我們單獨(dú)加了一條“圖像健康狀態(tài)”通道每一幀畫(huà)面都附帶一個(gè)狀態(tài)字包含時(shí)間戳、幀計(jì)數(shù)、CRC校驗(yàn)、ISP錯(cuò)誤標(biāo)志。感知算法拿到圖像的同時(shí)先檢查狀態(tài)字發(fā)現(xiàn)異常就丟棄該幀并觸發(fā)降級(jí)邏輯。這種設(shè)計(jì)比在算法端事后去猜“圖像是不是壞的”要可靠得多。7.2 攝像頭臟污檢測(cè)沒(méi)人愿意去擦鏡頭AVM攝像頭安裝在車(chē)身外部泥水、灰塵、雨滴、甚至樹(shù)葉遮擋都是常態(tài)。如果系統(tǒng)不做任何檢測(cè)駕駛員在屏幕上看到的可能是一片模糊的畫(huà)面還可能因此誤判周?chē)窙r。臟污檢測(cè)的做法是在ISP輸出的圖像上跑輕量級(jí)圖像質(zhì)量評(píng)估算法提取模糊度、對(duì)比度、局部紋理特征判斷對(duì)應(yīng)攝像頭是否被遮擋、被污染或失焦。檢測(cè)結(jié)果會(huì)通過(guò)UI提示駕駛員清潔攝像頭同時(shí)在APA等下游功能里降低該攝像頭的感知置信度。臟污檢測(cè)功能要有用戶教育因?yàn)楹芏囫{駛員不理解明明有影像卻還要下車(chē)擦鏡頭所以提示文案要寫(xiě)得清晰友善比如“后攝像頭區(qū)域可能有污漬請(qǐng)檢查并清潔”。7.3 OTA迭代AVM功能是能持續(xù)進(jìn)化的AVM系統(tǒng)在量產(chǎn)交付之后并不是一錘子買(mǎi)賣(mài)。我們?cè)谶@個(gè)平臺(tái)上做過(guò)好幾輪OTA升級(jí)包括優(yōu)化夜間成像參數(shù)、增加新的視圖模式、提升標(biāo)定自恢復(fù)能力等。這里有一個(gè)架構(gòu)層面的建議把算法參數(shù)和代碼邏輯分離標(biāo)定參數(shù)、融合權(quán)重、曝光策略這些都可以做成配置文件下發(fā)而不是每次調(diào)整都要走一版固件升級(jí)流程。OTA要特別注意的是升級(jí)失敗的回滾機(jī)制和差分升級(jí)的體積控制。AVM涉及的配置文件通常不大但包含的表格和參數(shù)非常多差分處理時(shí)要防止新舊參數(shù)混用導(dǎo)致的怪異bug。我們踩過(guò)一次因?yàn)閰?shù)版本兼容性判斷不嚴(yán)謹(jǐn)OTA后出現(xiàn)車(chē)模和地面相對(duì)位置偏移的本地bug后來(lái)在升級(jí)包里強(qiáng)制帶版本號(hào)并做參數(shù)交叉校驗(yàn)這類(lèi)問(wèn)題才徹底杜絕。一點(diǎn)個(gè)人體會(huì)把AVM系統(tǒng)從頭到尾搭過(guò)一遍之后我最大的感受是這套系統(tǒng)的技術(shù)門(mén)檻不在某一個(gè)單點(diǎn)而在“把所有點(diǎn)串起來(lái)”的過(guò)程中。圖像算法、嵌入式驅(qū)動(dòng)、硬件選型、產(chǎn)線工藝、用戶體驗(yàn)任何單一領(lǐng)域的專(zhuān)家都可能在某些環(huán)節(jié)掉鏈子。一個(gè)優(yōu)秀的AVM工程師要有能力在鏡頭光學(xué)參數(shù)和產(chǎn)線節(jié)拍之間來(lái)回切換視角也要能在標(biāo)定精度和成本預(yù)算之間做出取舍。如果你正準(zhǔn)備啟動(dòng)這樣一個(gè)項(xiàng)目我的建議是第一花足夠時(shí)間在需求定義和系統(tǒng)架構(gòu)設(shè)計(jì)上不要急著選芯片和調(diào)算法第二硬件、算法、應(yīng)用、產(chǎn)線四條線從第一天就同步推進(jìn)越晚發(fā)現(xiàn)交叉問(wèn)題代價(jià)越大第三把主觀體驗(yàn)量化成可驗(yàn)收的指標(biāo)這樣才能在團(tuán)隊(duì)內(nèi)部拉齊預(yù)期。希望這篇流程拆解對(duì)你有點(diǎn)幫助后面如果有機(jī)會(huì)再把標(biāo)定算法、融合策略、渲染優(yōu)化這些子模塊單獨(dú)展開(kāi)聊。