導(dǎo)讀
地平線在智東西公開課開設(shè)的「地平線自動(dòng)駕駛技術(shù)專場(chǎng)」第3講順利完結(jié),地平線智能駕駛應(yīng)用軟件部負(fù)責(zé)人宋巍圍繞《面向規(guī)模化量產(chǎn)的智能駕駛系統(tǒng)和軟件開發(fā)》這一主題進(jìn)行了直播講解。
宋巍老師首先結(jié)合以往智能駕駛應(yīng)用軟件開發(fā)過程中的痛點(diǎn)和實(shí)踐經(jīng)驗(yàn),對(duì)智能駕駛應(yīng)用軟件技術(shù)進(jìn)行了詳細(xì)分析。之后,他從軟件視角闡述了“軟硬結(jié)合”和“軟硬解耦”的意義與價(jià)值,并對(duì)智能駕駛軟件開發(fā)平臺(tái)Horizon TogetherOS Bole進(jìn)行了深度講解。最后,還展望了智能駕駛應(yīng)用軟件的開發(fā)趨勢(shì)。
本次課程內(nèi)容分為4個(gè)部分:
1、智能駕駛應(yīng)用軟件技術(shù)拆解2、軟件視角的“軟硬結(jié)合”與“軟硬解耦”3、智能駕駛軟件開發(fā)平臺(tái)Horizon TogetherOS Bole4、智能駕駛應(yīng)用軟件開發(fā)趨勢(shì)展望
01 智能駕駛應(yīng)用軟件技術(shù)拆解
談到軟件,那什么是軟件呢?維基百科上的解釋是:Software is a set of instructions and documentation that tells a computer what to do or how to perform a task。在百度百科上也給了軟件中文解釋,是指一系列按照特定順序組織的計(jì)算機(jī)數(shù)據(jù)和指令的集合。對(duì)于軟件來說,它就是在執(zhí)行單元上執(zhí)行指令和數(shù)據(jù),也就是在硬件之上,所有事情都是軟件。
?
整個(gè)智能駕駛中,如果從大的領(lǐng)域劃分,可以看到有廣義感知、地圖融合、規(guī)劃和控制幾個(gè)大領(lǐng)域。如果是根據(jù)算法時(shí)代來劃分,可以劃分成軟件1.0和軟件2.0。
軟件1.0是傳統(tǒng)的CV,或者是在端到端的深度學(xué)習(xí)落地之前,基于規(guī)則實(shí)現(xiàn)的一些面向自動(dòng)駕駛的軟件和算法。軟件2.0是未來可以通過深度學(xué)習(xí)和數(shù)據(jù)驅(qū)動(dòng),端到端的把整個(gè)軟件算法性能迭代起來。但描述它時(shí)都是用軟件1.0和軟件2.0,這其實(shí)是一個(gè)廣義的軟件定義。那對(duì)于一個(gè)智能駕駛的軟件工程師來說,這時(shí)就要承載上面所有領(lǐng)域的研發(fā)工作。
一個(gè)軟件研發(fā)工程師,他的能力要求該如何被定義呢?簡(jiǎn)單來看,因?yàn)橐?a href="http://wenjunhu.com/v/tag/232/" target="_blank">嵌入式開發(fā),懂C++就可以。但如果是面向智能駕駛業(yè)務(wù)開發(fā)的工作,那既要有豐富的軟件工程能力;還要有完備的智能駕駛業(yè)務(wù)知識(shí)體系,知道智能駕駛的業(yè)務(wù)在做什么;又要對(duì)硬件有一定理解,因?yàn)樵?a target="_blank">嵌入式上開發(fā),資源和在服務(wù)器上開發(fā)是非常不一樣的;且要有一定的算法實(shí)現(xiàn)能力,因?yàn)樵陂_發(fā)過程中,如果對(duì)算法一無所知,整個(gè)開發(fā)過程會(huì)遇到非常多的困難。
?
我們可以把智能駕駛的環(huán)境感知做一些拆解。從地平線征程5 SoC芯片的系統(tǒng)框圖上,可以看到有OS部分,即基礎(chǔ)操作系統(tǒng);再往上有中間件和軟件開發(fā)平臺(tái),整個(gè)通訊的組件,基礎(chǔ)中間件和應(yīng)用中間件;再往上就是面向自動(dòng)駕駛和智能交互的上層應(yīng)用。
主要看下環(huán)境感知部分。我們把它做一些簡(jiǎn)單的拆解,如果做環(huán)境感知,首先要有一系列的傳感器,有時(shí)間同步,有攝像頭、激光雷達(dá)、毫米波、超聲波、車身的底盤信號(hào)、GPS/IMU等。然后,在一個(gè)嵌入式SoC上有很多的硬核,需要對(duì)硬核做一些調(diào)度,來執(zhí)行模型。對(duì)模型也要做調(diào)度,比如模型的前處理、后處理?;诘妆P信號(hào),要做自測(cè)里程計(jì),用到Odom。有了感知結(jié)果和Odom之后,會(huì)做感知結(jié)構(gòu)化,進(jìn)而可以做動(dòng)/靜態(tài)的目標(biāo)重建、自車的位姿估計(jì)。
同時(shí),為了做軟件2.0,整個(gè)的數(shù)據(jù)閉環(huán)能夠以數(shù)據(jù)驅(qū)動(dòng)迭代算法,還要在端上做數(shù)據(jù)緩存。對(duì)于一些特定的數(shù)據(jù)做數(shù)據(jù)觸發(fā),把緩存信號(hào)再發(fā)出去。這個(gè)過程都是需要軟件來做的,后面也會(huì)逐一的進(jìn)行拆解:先是傳感器的部分,后面講硬核調(diào)度,然后是偏算法的Odom和感知結(jié)構(gòu)化。
首先是傳感器和數(shù)據(jù)。第一點(diǎn)要看的是時(shí)間同步。智能駕駛是一個(gè)時(shí)間敏感的測(cè)量系統(tǒng)。這里有兩個(gè)詞,一個(gè)是“時(shí)間敏感”,一個(gè)是“測(cè)量”。因?yàn)閷?duì)于智能駕駛來說,如果時(shí)間錯(cuò)了50毫秒、100毫秒,整個(gè)計(jì)算結(jié)果就會(huì)有非常大的誤差。同時(shí),環(huán)境感知也是測(cè)量環(huán)境中不同目標(biāo)距離自車的相對(duì)位置、速度、加速度等信息,它們對(duì)于時(shí)間都有一個(gè)非常重要的定義。只有各個(gè)SoC都在一個(gè)精確的時(shí)間體系下,智能駕駛才能夠正常運(yùn)作。
廣泛使用的時(shí)間同步方式,有NTP。NTP通常在毫秒級(jí)精度搭建比較簡(jiǎn)單,對(duì)硬件也沒有要求,但NTP通常會(huì)受網(wǎng)絡(luò)環(huán)境波動(dòng)的影響,時(shí)間調(diào)整會(huì)比較大。GPS+PPS用到的也比較多,雖然精度比較高,但是當(dāng)GPS信號(hào)丟失時(shí),非常容易出現(xiàn)時(shí)間的波動(dòng)。比如在山里面經(jīng)常有隧道,有的隧道比較長(zhǎng),過一個(gè)隧道有可能GPS信號(hào)會(huì)丟失,當(dāng)GPS信號(hào)再次獲取時(shí),時(shí)間就很容易出現(xiàn)波動(dòng)。同時(shí),PPS信號(hào)也是時(shí)間同步非常重要的一個(gè)描述發(fā)源。如果一個(gè)系統(tǒng)里只有GPS和PPS,給多個(gè)觸發(fā),PPS分線也會(huì)導(dǎo)致一些壓降、信號(hào)缺損。PTP/gPTP精度比較高,但對(duì)網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)要求也會(huì)比較高,各個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)均需要支持時(shí)間同步協(xié)議,才能夠完成高精度的時(shí)間同步。在CAN系統(tǒng)里面,車內(nèi)ECU間授時(shí)使用較多,普通CAN時(shí)間同步在ms級(jí),TTCAN也會(huì)把時(shí)間同步的精度提高到微秒級(jí)精度。
如上圖左上角所示,通常一個(gè)系統(tǒng)都會(huì)是GPS+PPS作為一個(gè)獨(dú)立的時(shí)間源,之后會(huì)有一個(gè)時(shí)間同步的Server,然后作為一個(gè)Master,經(jīng)過一些Switcher,然后給各個(gè)Slave節(jié)點(diǎn)或者Client做時(shí)間授時(shí)。
對(duì)于時(shí)間同步的精度,通常談到的高精度時(shí)間同步是一個(gè)理論的精度。GPS理論的時(shí)間同步精度很高。如果是純軟件實(shí)現(xiàn),接收一個(gè)PPS的脈沖信號(hào)時(shí),就會(huì)受限于軟件的調(diào)度能力,精度也會(huì)從ns級(jí)降低到us級(jí)。而在地平線的征程芯片中,為了能夠讓整個(gè)系統(tǒng)有更高的時(shí)間同步精度,會(huì)以軟硬結(jié)合的方式實(shí)現(xiàn)。對(duì)于軟件來說,會(huì)解析一個(gè)待同步的時(shí)間,硬件響應(yīng)PPS信號(hào),然后在硬件的方案下,直接對(duì)整個(gè)啟動(dòng)時(shí)間進(jìn)行更新,達(dá)到時(shí)間同步方案的理論精度。
同時(shí),由于時(shí)間同步有一個(gè)PPS,所以時(shí)間同步往往也和傳感器觸發(fā)相關(guān)。很多的傳感器都依賴于PPS信號(hào)調(diào)整傳感器的一些相位差,來達(dá)到時(shí)間同步的精度和傳感器的對(duì)齊精度。
這個(gè)部分也會(huì)涉及到一些軟件和硬件的差別。對(duì)于軟件實(shí)現(xiàn)來說,通常需要在周期比較穩(wěn)定的MCU中響應(yīng)PPS信號(hào),然后向各個(gè)傳感器發(fā)送觸發(fā)信號(hào)。而這種觸發(fā)信號(hào)對(duì)于MCU來說,達(dá)到10us級(jí)就已經(jīng)比較高了。但這個(gè)精度仍然無法滿足部分傳感器的觸發(fā)要求,因?yàn)橛械膫鞲衅髟谄毓庥|發(fā)時(shí),觸發(fā)條件非常高,要求觸發(fā)信號(hào)在幾u(yù)s級(jí)別內(nèi)。如果觸發(fā)信號(hào)沒有達(dá)到精度,有可能圖像會(huì)出現(xiàn)一些缺損,或者圖像出現(xiàn)一些重曝光,對(duì)后續(xù)的影響比較大。
在硬件實(shí)現(xiàn)方面,地平線征程芯片支持LPWM,可以接收PPS信號(hào)。通過硬件轉(zhuǎn)發(fā)觸發(fā)信號(hào),也可以設(shè)置不同觸發(fā)信號(hào)的相位差,達(dá)到整車傳感器的時(shí)間同步對(duì)齊作用。
當(dāng)把所有的SoC和傳感器都做到一個(gè)時(shí)間同步精度下,下一步就看傳感器。
首先看攝像頭,攝像頭是視覺感知系統(tǒng)的核心。對(duì)于算法的同學(xué),可能只關(guān)注ISP Tuning和圖像的成像質(zhì)量,那除此之外還需要關(guān)注哪些方面呢?
在做一些高等級(jí)的自動(dòng)駕駛算法時(shí),目前已經(jīng)和過去的時(shí)代不太一樣。在過去傳統(tǒng)的視覺感知過程中,經(jīng)常是由人工標(biāo)記2D的bounding box,然后做模型訓(xùn)練。而對(duì)于未來一些3D算法,像特斯拉最近開放了很多的BEV算法,地平線也實(shí)現(xiàn)了BEV算法,這些算法中對(duì)攝像頭的同步,及其對(duì)于時(shí)間系統(tǒng)的要求是非常高的。所以軟件工程師和算法工程師,都需要理解攝像頭的曝光原理。
Global Shutter和Rolling Shutter大家可能都會(huì)知道,但是Rolling Shutter的曝光原理到底是什么?曝光時(shí)間是我們經(jīng)常提到的ISP曝光控制時(shí)間,它和每行傳感器的數(shù)據(jù)生成時(shí)間到底是什么關(guān)系?一幀數(shù)據(jù)生成,比如曝光時(shí)間是10毫秒和一幀數(shù)據(jù)生成的30毫秒,關(guān)系到底是什么?傳感器中間的時(shí)序到底是如何設(shè)置的?這些是后續(xù)整個(gè)算法設(shè)計(jì),視覺和其他傳感器對(duì)齊中非常重要的一點(diǎn)。
同時(shí)攝像頭的曝光觸發(fā)模式,也會(huì)是多種多樣的。比如一些標(biāo)準(zhǔn)的觸發(fā)模式,像Shutter Sync。剛才談到時(shí)間同步時(shí)有PPS信號(hào),標(biāo)準(zhǔn)觸發(fā)模式一般都是接收到PPS信號(hào),攝像頭立刻曝光觸發(fā)。Shutter Sync會(huì)有一個(gè)確定性的延遲,然后讓數(shù)據(jù)開始往外傳輸。這兩種模式得到的傳感器時(shí)間是不一樣的,它的物理的意義也是不一樣的。
在做多傳感器對(duì)齊時(shí),不同的曝光模式對(duì)后續(xù)的算法和軟件實(shí)現(xiàn)差別都會(huì)非常大。對(duì)于軟件來說,一個(gè)攝像頭,除了曝光原理、觸發(fā)模式,還有很多其他的信息需要了解,因?yàn)閷?duì)于攝像頭這種高頻的數(shù)據(jù),還有很多的異常需要做檢查。像高速接口MIPI很容易受到外部電磁的干擾;MIPI校驗(yàn),CRC校驗(yàn),每一行數(shù)據(jù)寬度的校驗(yàn);有了傳感器,它會(huì)有一些復(fù)雜的功能,傳感器內(nèi)部溫度是否過高,也需要做校驗(yàn)。傳感器是否會(huì)被人調(diào)包,算法適配的傳感器是不是裝錯(cuò)了,裝成了別的型號(hào),這時(shí)還有一些傳感器的identity驗(yàn)證。每幀數(shù)據(jù)在效應(yīng)區(qū),如上圖左上角的效應(yīng)區(qū),Embedded Data里有單幀的2A,F(xiàn)uSa等信息,這些都是軟件開發(fā)者需要關(guān)注的事情。
對(duì)于模組來說,還要做很多管理相關(guān)的事情,像模組的版本管理。因?yàn)樵诹慨a(chǎn)過程中,模組也會(huì)有很多的版本,它是AA對(duì)焦的?模組的對(duì)焦是什么狀態(tài)?模組的材質(zhì)、Lens內(nèi)參存儲(chǔ)在什么位置?機(jī)電模型到底用的是什么?模組材質(zhì)在不同的溫度下,鏡頭內(nèi)會(huì)不會(huì)起霧?Lens的光學(xué)特性,Lens會(huì)不會(huì)出現(xiàn)一些鬼影和擦散光?以上這些都是在自動(dòng)駕駛開發(fā)過程中,軟件工程師需要關(guān)注的一些點(diǎn),通過這些才能夠把整個(gè)系統(tǒng)串起來。
同時(shí),多傳感器曝光在曝光原理部分就能很好地體現(xiàn)出來。如上圖右下角所示,一個(gè)傳統(tǒng)的機(jī)械激光雷達(dá),處于一個(gè)360度掃描的狀態(tài)。Lidar在0時(shí)刻掃描時(shí),攝像頭到底從哪個(gè)時(shí)刻要觸發(fā)曝光,到底是選擇用Standard trigger還是Shutter Sync,這都是整個(gè)系統(tǒng)中軟件工程師需要明確討論的內(nèi)容。
不同的方案對(duì)于地平線來說,從征程2、征程3到征程5,它們?cè)谥饾u覆蓋越來越復(fù)雜的智能駕駛系統(tǒng)。從1V的2M攝像頭、到1V的8M攝像頭,到6V,再到后面10V、11V,最終能夠做一個(gè)完整的自動(dòng)駕駛產(chǎn)品。從上圖可以看出,攝像頭在這里扮演著非常重要的角色,而且攝像頭的復(fù)雜程度也會(huì)越來越高。對(duì)于不同的攝像頭,都要理解不同攝像頭的曝光原理、觸發(fā)模式,各種安全校驗(yàn),這是非常復(fù)雜的。
那如何簡(jiǎn)化這個(gè)過程呢?地平線有一些傳感器認(rèn)證的方案,經(jīng)過認(rèn)證方案的傳感器,它們都經(jīng)過前面提到的模式驗(yàn)證,能夠很好的和地平線軟件、算法、以及芯片做匹配,能夠幫我們的用戶,盡可能把多個(gè) 攝像頭、多類型傳感器更好的搭建起來。
對(duì)于激光雷達(dá)來說,有哪方面的應(yīng)用呢?高階自動(dòng)駕駛可能會(huì)選擇激光雷達(dá)作為感知傳感器,低階自動(dòng)駕駛會(huì)使用激光雷達(dá)作為一個(gè)真值系統(tǒng)。而現(xiàn)有的2.5D/3D算法方案,都會(huì)使用激光雷達(dá)真值做自動(dòng)化的數(shù)據(jù)標(biāo)注方案。
激光雷達(dá)有很多不同的種類,比如有機(jī)械激光雷達(dá),如上圖左下角所示,是一個(gè)360度旋轉(zhuǎn)的激光雷達(dá)。激光雷達(dá)可以接收時(shí)間同步的PPS信號(hào)來調(diào)整馬達(dá)轉(zhuǎn)速,讓激光雷達(dá)在它的坐標(biāo)系定義的0度上,和0時(shí)刻對(duì)齊。還有一些固態(tài)/半固態(tài)激光雷達(dá),比如MEMS,在MEMS內(nèi)會(huì)把它劃分成多區(qū),然后進(jìn)行掃描。MEMS的好處是多區(qū)可以同時(shí)掃描,但區(qū)塊之間會(huì)有一些overlap和重影。旋轉(zhuǎn)鏡跟機(jī)械激光雷達(dá)的精度差不多,也是旋轉(zhuǎn)的形式,從左至右掃描過去。也有一些非重復(fù)的、非規(guī)則的掃描,而得到的點(diǎn)云對(duì)于人來說,直觀理解會(huì)比較困難。也有純固態(tài)的Flash激光雷達(dá),激光點(diǎn)陣模擬camera曝光方式進(jìn)行掃描。
對(duì)于激光雷達(dá)的掃描方式,也都需要時(shí)間同步。通過PPS調(diào)整激光雷達(dá)和不同攝像頭曝光時(shí)刻的角度去對(duì)齊,達(dá)到右下角圖所示的情況。每一個(gè)點(diǎn)經(jīng)過時(shí)間對(duì)齊、傳感器之間的標(biāo)定,能夠讓激光雷達(dá)的點(diǎn)云與視覺實(shí)現(xiàn)一個(gè)完全對(duì)齊的方案。
激光雷達(dá)在部署過程中,也會(huì)經(jīng)常會(huì)遇到很多問題。激光雷達(dá)目前主要使用UDP協(xié)議,UDP協(xié)議網(wǎng)絡(luò)帶寬的負(fù)載會(huì)比較高,使用時(shí)也需要設(shè)置網(wǎng)絡(luò)環(huán)境/VLAN隔離;Lidar網(wǎng)絡(luò)包比較小,一般是一個(gè)MTU發(fā)一包數(shù)據(jù),這就會(huì)導(dǎo)致網(wǎng)絡(luò)包非常多,網(wǎng)絡(luò)中斷響應(yīng)也會(huì)非常多,影響整個(gè)系統(tǒng)的響應(yīng)能力;未來征程芯片也會(huì)支持硬件網(wǎng)絡(luò)拆包來解決這些的問題。
激光雷達(dá)在使用的過程中,也會(huì)遇到非常多的問題。雖然激光雷達(dá)的精度是比較高的,但使用過程中會(huì)碰到各種的鏡面反射,你將會(huì)得到一些預(yù)期不到的點(diǎn)。比如地面反射到其他的地方,或者通過車窗直接反射到遠(yuǎn)處,或更遠(yuǎn)的一些相鄰車,到雨、雪、霧、柳絮、臟污等。激光雷達(dá)在高速上比較不幸時(shí),有些小蟲子可能會(huì)撞上激光雷達(dá),導(dǎo)致傳感器出現(xiàn)一些故障;以及激光雷達(dá)對(duì)不同的物體,反射值也是不一樣的。通常我們也會(huì)設(shè)置不同反射值的映射,對(duì)于不了解激光雷達(dá)的開發(fā)者來說,有時(shí)拿到一些反射值可能會(huì)覺得比較奇怪,為什么有的反射值這么高,有的反射值這么低。
對(duì)于非純固態(tài)激光雷達(dá),供電穩(wěn)定性也會(huì)是一個(gè)很大的問題,在實(shí)車環(huán)境的供電系統(tǒng)不是特別好。如果做不到穩(wěn)定的激光雷達(dá)供電,有可能也會(huì)導(dǎo)致光頭或者機(jī)械元件出現(xiàn)異常,從而導(dǎo)致點(diǎn)云出現(xiàn)異常。同時(shí),也需要關(guān)注多傳感器對(duì)齊,這些對(duì)于軟件開發(fā)來者來說,都是非常重要的工作。
激光雷達(dá)在高頻的UDP數(shù)據(jù)包情況下,協(xié)議解析如何做到非常低的延遲,盡可能地降低CPU負(fù)載,都是軟件開發(fā)者需要關(guān)注的事情。同時(shí),傳感器和算法之間達(dá)成一致,也是在整個(gè)自動(dòng)駕駛系統(tǒng)軟件開發(fā)過程中,需要上下游不停拉通、對(duì)齊的事情。
對(duì)于激光雷達(dá),地平線也有很多合作伙伴,都能夠比較好的支持地平線的感知系統(tǒng)構(gòu)建及真值數(shù)據(jù)構(gòu)建。
自動(dòng)駕駛系統(tǒng)里還有很多其他的傳感器。
首先,車身底盤信號(hào)從CAN或CANFD,能夠拿到很多車身上其他傳感器的數(shù)據(jù)。對(duì)于CAN和CANFD來說,也有很多接入方式,比如征程5代芯片上有CAN收發(fā)器,直接使用SocketCAN,來接收CAN數(shù)據(jù)。通常車上也會(huì)引入一個(gè)MCU作為網(wǎng)關(guān),MCU和SoC之間,通過SPI進(jìn)行CAN協(xié)議轉(zhuǎn)發(fā)。這時(shí)就會(huì)出現(xiàn)數(shù)據(jù)鏈路長(zhǎng)的問題,經(jīng)過網(wǎng)關(guān),SPI、OS到HAL、USER才能進(jìn)行解析。
在協(xié)議中的時(shí)間敏感系統(tǒng),不同的SoC之間需要保證時(shí)間同步,以及數(shù)據(jù)的時(shí)刻到底是什么,所以協(xié)議中需要對(duì)時(shí)間有非常明確的定義。然后對(duì)于CAN大小端數(shù)據(jù)的校驗(yàn),Rolling Counter和CRC,各種信號(hào)的校驗(yàn)數(shù)據(jù)有效位、閾值、數(shù)據(jù)頻率、數(shù)據(jù)更新。對(duì)于軟件開發(fā)者來說,信號(hào)的校驗(yàn)是功能安全處理中非常重要的一點(diǎn)。
毫米波雷達(dá)和4D Image Radar。它們的數(shù)據(jù)鏈路比較多,有可能會(huì)使用CANFD,有的4D Image Radar用以太網(wǎng),也有4D Image Radar用MIPI,來降低數(shù)據(jù)傳輸延遲。數(shù)據(jù)類型也會(huì)比較多,目前大部分Radar都是目標(biāo)級(jí)的,即通常輸出了跟蹤之后的目標(biāo)數(shù)據(jù)。也有一些Radar能夠輸出一些原始的雷達(dá)回波信號(hào),從廠商獲取有一定難度。4D Image Radar目前合作廠商都會(huì)得到一些點(diǎn)云數(shù)據(jù),信息量與比較傳統(tǒng)的Radar相比,有明顯的提高。時(shí)間同步方面,對(duì)于不同傳感器,可以通過CAN或以太網(wǎng)進(jìn)行時(shí)間同步。
對(duì)于GPS和IMU,GPS的時(shí)間同步是授時(shí)和定位系統(tǒng)必備的。不同的GPS精度差異也比較大;不同型號(hào)的RTK,定位精度在5厘米、10厘米、20厘米級(jí)別;不同的IMU精度差異也比較大,有溫飄。數(shù)據(jù)接口通常為UART、SPI和I2C,這些接口都是相對(duì)比較低速的,特別UART在查詢時(shí),整個(gè)數(shù)據(jù)鏈路都會(huì)比較慢,穩(wěn)定性相對(duì)較差;而且對(duì)于IMU來說,通常不具備授時(shí)能力,IMU基于內(nèi)部時(shí)鐘進(jìn)行數(shù)據(jù)處理;對(duì)于一個(gè)數(shù)據(jù)敏感系統(tǒng)不穩(wěn)定的數(shù)據(jù)鏈路來說,需要使用IMU內(nèi)部時(shí)間進(jìn)行數(shù)據(jù)的時(shí)間校驗(yàn)和優(yōu)化。
超聲波雷達(dá)通常會(huì)用于一些低速的避障場(chǎng)景,與感知進(jìn)行融合,但超聲波都不具備時(shí)間同步的能力,對(duì)于低速場(chǎng)景來說還是可以接受的。
前面更多的是講到傳感器自身以及傳感器的時(shí)間同步。多傳感器以及多類型的傳感器,就需要做好傳感器標(biāo)定。
單傳感器標(biāo)定方面有產(chǎn)線標(biāo)定,通常在一輛汽車下線時(shí),在產(chǎn)線中會(huì)有一個(gè)產(chǎn)線標(biāo)定房,如上圖左上角所示,這張圖片是地平線的一個(gè)早期的標(biāo)定間,它更多是校驗(yàn)自己的算法。售后標(biāo)定是車可能會(huì)出現(xiàn)一些問題,進(jìn)行一些換件,在4S店進(jìn)行的標(biāo)定;對(duì)于在線標(biāo)定,車輛可能會(huì)有一些胎壓變化,或經(jīng)過長(zhǎng)時(shí)間的熱脹冷縮帶來的傳感器的姿態(tài)發(fā)生變化。車輛的負(fù)載變化,都需要對(duì)傳感器進(jìn)行在線標(biāo)定以及動(dòng)態(tài)標(biāo)定。
多傳感器標(biāo)定對(duì)系統(tǒng)的時(shí)間精度要求非常高,如果所有的傳感器不在一個(gè)時(shí)間系統(tǒng)下,很難獲得比較精確的時(shí)間;同時(shí),攝像頭、激光雷達(dá)的掃描方式不同,需要理解多傳感器數(shù)據(jù)的生產(chǎn)原理,保障多傳感器的時(shí)間是對(duì)齊的;也要理解應(yīng)該如何做傳感器數(shù)據(jù)的時(shí)間補(bǔ)償,如何讓多傳感器達(dá)到對(duì)齊的效果;最后,還需要多傳感器的聯(lián)合標(biāo)定算法。
在這個(gè)過程中,一方面是標(biāo)定算法的精度,另一方面,工程化是非常重要的,特別是在產(chǎn)線標(biāo)定過程中,如果工程化出現(xiàn)了問題,產(chǎn)線會(huì)被block,非常影響效率。
前面提到的軟件和一些基礎(chǔ)性算法都準(zhǔn)備好之后,可以開始準(zhǔn)備數(shù)據(jù)采集或標(biāo)注,進(jìn)一步打造自動(dòng)駕駛系統(tǒng)。
在安裝傳感器方面,首先需要整車裝備。在傳感器的布置方案中,檢查安裝不同傳感器是否足夠的固定,會(huì)不會(huì)天氣一熱膠就軟了;安裝的角度和系統(tǒng)的需求是否一致的,是否都能夠達(dá)到我們的期望。還有在安裝過程中,視野是否有遮擋,比如此前經(jīng)常要做一些數(shù)模方案,看傳感器的感知范圍內(nèi),是否會(huì)被車身所遮擋。整個(gè)安裝方案是否防水密閉,像最近北京下暴雨,如果有一輛車在這種情況下開出去,傳感器是否會(huì)進(jìn)水。
在整車的供電和散熱方面,在供電不穩(wěn)定的情況下,有些傳感器不能夠正常工作。電磁輻射,比如整車傳感器比較多,線材也比較多,是否使用一些屏蔽線,是否影響了接收信號(hào)的穩(wěn)定性。
在整車的采集設(shè)備部署過程中,整車的時(shí)間同步源精度是否足夠。當(dāng)時(shí)間發(fā)生跳變時(shí),時(shí)間同步方案是否能夠保障整個(gè)系統(tǒng)仍然能夠穩(wěn)定的運(yùn)行。傳感器是否都正常的部署。對(duì)于傳感器接入了硬件,像地平線Matrix自動(dòng)駕駛計(jì)算平臺(tái),包括工控機(jī)也要錄制所有采集到的數(shù)據(jù)。
數(shù)采軟件,需要校驗(yàn)傳感器同步以及數(shù)據(jù)采集幀率是否滿足算法的要求,即數(shù)據(jù)是否滿幀率。對(duì)于視覺系統(tǒng)來說,還要看codec編解碼,究竟是選擇264、265還JEPG。碼率的配置、圖像的質(zhì)量是否滿足算法的要求。不同的碼率配置、不同的數(shù)據(jù)格式,對(duì)整個(gè)存儲(chǔ)帶寬的影響都特別大。未來可能經(jīng)常會(huì)看到一個(gè)11V、3L、5R的智能駕駛系統(tǒng),它一秒的數(shù)據(jù)量可能都會(huì)達(dá)到GB級(jí),存儲(chǔ)能力、磁盤寫入能力是否足夠,如果不足夠,應(yīng)該如何改造。甚至軟件開發(fā)者要關(guān)注IO系統(tǒng)應(yīng)該如何做優(yōu)化,如通過數(shù)據(jù)緩存優(yōu)化IO效率。
對(duì)于數(shù)據(jù)質(zhì)量,即圖像的質(zhì)量、激光雷達(dá)的質(zhì)量、傳感器的時(shí)鐘,標(biāo)定是否對(duì)齊。如果采集回來的數(shù)據(jù)達(dá)不到這些質(zhì)量,需要判定這些數(shù)據(jù)對(duì)后續(xù)算法到底是否可用。同時(shí),對(duì)于數(shù)據(jù)來說,有一個(gè)非常重要的點(diǎn),要符合法律法規(guī),要使用合規(guī)的數(shù)據(jù)庫(kù),采集時(shí)也要做數(shù)據(jù)脫敏,不要有任何法律上的問題。以及在數(shù)據(jù)回傳之后,也要有一些回傳入庫(kù)和入庫(kù)質(zhì)檢的步驟。數(shù)據(jù)入庫(kù)之后,批量數(shù)據(jù)才能夠進(jìn)行標(biāo)注。對(duì)于標(biāo)注系統(tǒng),如果能夠全自動(dòng)化的標(biāo)注,效率肯定是最高的,另外人工校驗(yàn)也是非常重要的。
那有了數(shù)據(jù)文件之后,該怎么把它用起來呢?這時(shí)還需要很多的數(shù)據(jù)工具,需要開發(fā)各種數(shù)據(jù)訪存SDK,像視覺數(shù)據(jù)、雷達(dá)數(shù)據(jù),它們的文件size都是非常大的,在數(shù)據(jù)的訪問、查詢、跳轉(zhuǎn)、反序列化過程中,或解碼過程中,效率是否足夠高。對(duì)于數(shù)據(jù)的統(tǒng)計(jì)能力,數(shù)據(jù)幀率、延遲、關(guān)鍵信號(hào)的穩(wěn)定性,底盤數(shù)據(jù)是否丟失,數(shù)據(jù)轉(zhuǎn)碼效率是否會(huì)很高,是否能夠很明確的給這些數(shù)據(jù)一些label,讓下游真正的把數(shù)據(jù)用起來。
對(duì)于數(shù)據(jù)調(diào)試和profile工具,當(dāng)拿到一個(gè)數(shù)據(jù)時(shí),可以構(gòu)成各種信號(hào)的topic,是否能夠很好的關(guān)注這些topic的波形圖。對(duì)于數(shù)據(jù)來說,是否能夠分析實(shí)際運(yùn)行過程中的WCET,進(jìn)而分析執(zhí)行時(shí)間。由于數(shù)據(jù)都是在后臺(tái)運(yùn)行,所以也需要展示工具,展示圖像、感知結(jié)果、3D信息、點(diǎn)云。在車內(nèi)也需要有HMI,如上圖右半部分所示,是點(diǎn)云數(shù)據(jù)和HMI的展示狀態(tài)。
地平線艾迪平臺(tái),能夠支撐完整的數(shù)據(jù)閉環(huán)鏈路。在智能駕駛終端上部署整個(gè)地平線的智能駕駛軟件,然后通過數(shù)據(jù)觸發(fā)、關(guān)鍵場(chǎng)景的問題挖掘,能夠把這些經(jīng)過脫敏之后的原始數(shù)據(jù)加密傳輸。之后在云端能夠進(jìn)行端側(cè)的問題挖掘,半自動(dòng)或者全自動(dòng)的標(biāo)注工具進(jìn)行數(shù)據(jù)標(biāo)注,自動(dòng)化的模型訓(xùn)練,長(zhǎng)尾場(chǎng)景的管理,自定義迭代工作流,軟件自動(dòng)集成,自動(dòng)化回歸測(cè)試,OTA升級(jí)等。最后,再回歸到車上,這也是一個(gè)軟件2.0非常重要的概念。
接下來講解硬核調(diào)度和感知算法部分的內(nèi)容。
硬核調(diào)度如上圖所示,今天簡(jiǎn)單講解兩個(gè)部分,首先是Codec。
征程3和征程5提供4K@60fps Codec + 4K@60fps JPEG編碼能力。對(duì)于Codec,如果只是使用它,不會(huì)有什么問題,我們的軟件工程師需要看Codec編碼到底是做什么用的。對(duì)于數(shù)據(jù)采集來說,Codec要盡可能的調(diào)高圖像效果。
Codec碼率應(yīng)該如何設(shè)置,QP值該如何調(diào)整。如果是JPEG,quality配置究竟調(diào)成什么質(zhì)量,才能夠滿足后續(xù)算法的迭代過程。除了給算法進(jìn)行訓(xùn)練,Codec還有一些DVR數(shù)據(jù)回傳的需求,當(dāng)帶寬不足時(shí),又要權(quán)衡究竟設(shè)置什么樣的碼率和圖像質(zhì)量,能夠滿足數(shù)據(jù)傳輸?shù)膕ize要求。
通常Codec在單SoC只有一個(gè)加速硬核。但單SoC有6V、10V、11V的系統(tǒng),雖然Codec能力很強(qiáng),但Codec也需要一個(gè)比較好的調(diào)度器。如上圖下半部分所示,是一個(gè)簡(jiǎn)單的調(diào)度器,它主要是在硬件響應(yīng)過程中,與硬件交互,讓中斷更加及時(shí)響應(yīng)到用戶層。
更重要的還有模型前處理、后處理以及BPU調(diào)度。通常算法開發(fā)者更多的是在云端工作,拿到一些標(biāo)注好的數(shù)據(jù),訓(xùn)練模型,并通過地平線的編譯器,轉(zhuǎn)換成地平線芯片可以運(yùn)行的模型文件在BPU上去運(yùn)行。
對(duì)于軟件開發(fā)者來說,要調(diào)度一個(gè)模型,和調(diào)度CPU不會(huì)有本質(zhì)的差別,那差別是什么呢?是要理解算法的一些數(shù)據(jù)排布。要理解地平線芯片,在實(shí)現(xiàn)計(jì)算時(shí)這些數(shù)據(jù)排布到底是如何實(shí)現(xiàn)高效率。對(duì)于深度學(xué)習(xí)來說,數(shù)據(jù)排布通常有vector、matrix和tensor。如果對(duì)于軟件開發(fā)者來說,通常習(xí)慣將數(shù)據(jù)轉(zhuǎn)換為Native Layout(NHWC)。但對(duì)于硬件來說,硬件在輸出時(shí),數(shù)據(jù)排布往往也不Native,轉(zhuǎn)換Native Layout往往不是最高效的。這時(shí)就要做權(quán)衡。Native Layout用戶的編程邏輯會(huì)比較簡(jiǎn)單。但不同芯片的原生Layout,性能往往是最優(yōu)的,所以這對(duì)軟件開發(fā)者的要求也會(huì)更高,因?yàn)閿?shù)據(jù)不會(huì)經(jīng)常是連續(xù)的一個(gè)數(shù)據(jù)塊會(huì)存在一個(gè)區(qū)域,另外一個(gè)數(shù)據(jù)塊會(huì)存在另外一個(gè)區(qū)域;開發(fā)者需要理解硬件原生數(shù)據(jù)存儲(chǔ)格式。
開發(fā)者也需要理解定點(diǎn)化的概念。在模型的前處理和后處理過程中,算法往往會(huì)做定點(diǎn)化,定點(diǎn)化會(huì)讓模型的效率運(yùn)行的更高。對(duì)于軟件工程師來說,如果不理解這個(gè)模型本身數(shù)據(jù)輸出的含義,通常在實(shí)現(xiàn)的過程會(huì)出現(xiàn)一些代碼效率上的問題,即把定點(diǎn)直接轉(zhuǎn)成浮點(diǎn)。在模型計(jì)算過程中使用定點(diǎn)計(jì)算,而結(jié)果解析使用浮點(diǎn)計(jì)算,造成了性能上的損失。
這就要求軟件工程師理解一些基礎(chǔ)算法處理的邏輯。像Bounding box regression究竟是怎么做的,它的原理是什么?NMS是怎么做的?軟件實(shí)現(xiàn)為什么可以把整個(gè)計(jì)算過程實(shí)現(xiàn)成定點(diǎn)而不是浮點(diǎn)?即便是不同模型,也需要理解攝像頭的一些 projection model,distortion model。因?yàn)槲磥砀嗟氖?.5D和3D的算法,模型inference出來后,可能會(huì)是不同坐標(biāo)系下的數(shù)據(jù),需要進(jìn)行坐標(biāo)系轉(zhuǎn)換。
對(duì)于軟件工程師來說,如果不理解projection model和distortion model,這些數(shù)據(jù)很難轉(zhuǎn)換成駕駛系統(tǒng)里面真正上下游需要的一些數(shù)據(jù),包括一些Heatmap、Max Pooling如何實(shí)現(xiàn)?代碼的效率如何才是最高的?一些關(guān)鍵點(diǎn)回歸的原理是什么?這些都是對(duì)軟件工程師提的更高要求。
BPU調(diào)度,和SoC中CPU是比較類似的。CPU會(huì)有非常多復(fù)雜的任務(wù)調(diào)度。地平線征程芯片擁有雙核高性能BPU。如果一個(gè)系統(tǒng)中有11路攝像頭,通常會(huì)面臨著50~100個(gè)模型的調(diào)度。這時(shí)整個(gè)模型管理、調(diào)度編排非常重要;哪些模型是重要的?到底能不能搶占?通過軟件方案做一些模型的搶占,還是硬件方案做模型搶占?模型搶占是否會(huì)對(duì)DDR帶寬帶來一些沖擊?整個(gè)體系架構(gòu)從DDR到SRAM,再到BPU的執(zhí)行,如何才是最優(yōu)的?這些都是軟件工程師需要關(guān)注的一些點(diǎn)。在地平線Bole開發(fā)平臺(tái)發(fā)布EasyDNN,它可以幫用戶更好的面向復(fù)雜的模型調(diào)度、調(diào)度編排和搶占,解決相關(guān)調(diào)度上的問題。
在傳統(tǒng)的感知方案中都是一些2D的方案,而現(xiàn)代的一些算法方案,不管是3D方案,還是未來的BEV的方案,都需要在模型后期,再增添一些傳統(tǒng)的CV算法。在感知模型基礎(chǔ)上,進(jìn)行感知結(jié)構(gòu)化處理。
首先,要有一個(gè)自車的位姿估計(jì)。位姿估計(jì)可以使用車輛底盤積分,對(duì)于簡(jiǎn)單的行車模式下,Speed+yaw rate就足夠了。而對(duì)于一些低速場(chǎng)景,還需要引入輪脈沖輪速、方向轉(zhuǎn)角等方法。對(duì)于每輛車的yaw rate,即橫擺角速度,也會(huì)存在一些bias。當(dāng)車輛處于靜態(tài)時(shí),就會(huì)有一個(gè)靜態(tài)偏置,動(dòng)態(tài)時(shí)也可能會(huì)有一個(gè)動(dòng)態(tài)偏置。把 bias估計(jì)好才能夠得到一個(gè)更好的自車?yán)锍逃?jì)。
同時(shí),也可以使用IMU和GPS來提高里程計(jì)的精度。上圖右上角是一個(gè)行車的軌跡圖,它有兩種顏色,一個(gè)藍(lán)色和一個(gè)橙色,通過Odom的提高,展示出了兩種不同方法的實(shí)現(xiàn)結(jié)果。
使用IMU,還能夠進(jìn)行3D姿態(tài)估計(jì),特別是在跨層輔助泊車的場(chǎng)景。在這個(gè)過程中,也會(huì)遇到很多工程上的問題,對(duì)于CAN數(shù)據(jù)、底盤數(shù)據(jù)到SoC系統(tǒng)里,它的鏈路是比較長(zhǎng)的,如何更好的提高系統(tǒng)的響應(yīng),保障Odom延遲在一個(gè)可接受的范圍內(nèi),這也是軟件工程師需要解決的一些問題。
在動(dòng)態(tài)目標(biāo)建模方面,要處理的是一些多目標(biāo)跟蹤、運(yùn)動(dòng)學(xué)的建模,(CV、CA、CTRA等),以及不同的濾波器(EKF、UKF、PF等)。在處理過程中,也需要圖像空間與3D空間進(jìn)行交叉驗(yàn)證。同時(shí),動(dòng)態(tài)目標(biāo)建模也是一個(gè)時(shí)間敏感的系統(tǒng)。對(duì)于場(chǎng)景的不同,會(huì)有一些不確定性。因?yàn)閭鹘y(tǒng)CV和多目標(biāo)跟蹤,它的耗時(shí)是隨著目標(biāo)數(shù)量而增長(zhǎng)的。而對(duì)于深度學(xué)習(xí),耗時(shí)的確定性是比較高的。對(duì)于軟件工程師來說,一方面需要用數(shù)據(jù)工具,profiling整個(gè)系統(tǒng),能夠動(dòng)態(tài)的調(diào)整數(shù)據(jù)流,讓整個(gè)系統(tǒng)盡可能壓低負(fù)載和延遲。
同時(shí),也要去考慮對(duì)于確定性和不確定性,后面應(yīng)該如何解決它。對(duì)于軟件2.0的系統(tǒng),或端到端的系統(tǒng)來說,需要把更多的傳統(tǒng)CV部分,轉(zhuǎn)移到深度學(xué)習(xí)模型或BPU模型,能夠被硬件確定性執(zhí)行的部分,來提高整個(gè)系統(tǒng)的確定性、穩(wěn)定性和延遲優(yōu)化。
講到調(diào)度,Bole Dataflow調(diào)度框架,能夠幫助開發(fā)者快速構(gòu)建自動(dòng)駕駛應(yīng)用數(shù)據(jù)流圖。整個(gè)系統(tǒng)里會(huì)有各種的傳感器、硬核調(diào)度、傳統(tǒng)CV的處理模塊。各個(gè)的模塊都會(huì)有自己的執(zhí)行單元,整個(gè)自動(dòng)駕駛應(yīng)用也被分解成很多的程序。
Bole Dataflow調(diào)度框架,也提供ROS-like的編程接口。為什么是ROS-like?因?yàn)閷?duì)于很多自動(dòng)駕駛算法開發(fā)者,特別是學(xué)校里的一些同學(xué),他們?cè)趯W(xué)校上學(xué)時(shí)都是用ROS,所以ROS-like能夠讓這些算法開發(fā)者更容易的在嵌入式上進(jìn)行開發(fā)。程序整個(gè)建立在Bole Dataflow的節(jié)點(diǎn)之上,節(jié)點(diǎn)可以被應(yīng)用集成、被配置。同時(shí),也會(huì)在細(xì)粒度的模塊化節(jié)點(diǎn)內(nèi),進(jìn)行深入細(xì)化的DAG節(jié)點(diǎn)拆分,確保調(diào)度模塊的原子性,提升實(shí)時(shí)性。像上圖右下角,就是DAG數(shù)據(jù)流圖描述的應(yīng)用。
在SoC上,也有很多的硬核,不同的硬核都有不同的計(jì)算能力和性能。全局異構(gòu)調(diào)度管理,傳感器、硬件加速引擎、DSP、BPU、CPU、通信鏈路等參與統(tǒng)一的數(shù)據(jù)流調(diào)度管理。只有把所有的調(diào)度管理統(tǒng)一起來,才能使各個(gè)資源有條不紊的運(yùn)行,充分利用硬件引擎。這樣基于硬件中斷觸發(fā)的零拷貝數(shù)據(jù)流轉(zhuǎn),不經(jīng)過CPU,直接觸發(fā)硬件加速引擎處理數(shù)據(jù),來增強(qiáng)實(shí)時(shí)性。而時(shí)間觸發(fā)基于WCET分析的確定性時(shí)序執(zhí)行,確保關(guān)鍵程序的實(shí)時(shí)性。
在多個(gè)模塊、多個(gè)進(jìn)程,甚至多個(gè)SoC的過程中,除了調(diào)度,通訊也是非常重要的。Bole Communication通訊框架,支持集成多種消息中間件DDS、ZeroMQ、AutoSAR ARA::COM、PCIe等。關(guān)于PCIe,由于未來還有跨SoC、多SoC這種非常大量的數(shù)據(jù)傳輸。面向未來的架構(gòu),在多SoC時(shí),數(shù)據(jù)傳輸通常是在幾十兆每幀級(jí)的feature map,而傳統(tǒng)的以太網(wǎng)肯定不能很好的承載。PCIe在未來會(huì)是一個(gè)非常重要的數(shù)據(jù)通訊鏈路。
Bole也會(huì)提供Zero-Copy共享內(nèi)存通信機(jī)制,同時(shí)也會(huì)內(nèi)置一些自適應(yīng)通信策略,來保障節(jié)點(diǎn)部署是一個(gè)最佳通訊的模式。Bole提供多平臺(tái)的支持。開發(fā)者除了在地平線的芯片上開發(fā),還會(huì)在不同設(shè)備上進(jìn)行開發(fā)。很多的算法開發(fā)者在做算法開發(fā)時(shí),不管是調(diào)度框架還是通訊框架,在個(gè)人的電腦集群上都需要提供編譯、調(diào)試能力。同時(shí),對(duì)于通訊來說,算法在集群上做模型訓(xùn)練,也可以通過Python接口,讓算法簡(jiǎn)單的替換嵌入式模塊的一個(gè)程序,這樣也能夠快速的進(jìn)行算法原型驗(yàn)證。
調(diào)度和通訊是大的框架級(jí)別,再深入是每一個(gè)Node。如果一個(gè)Node的運(yùn)行時(shí)間過長(zhǎng),什么樣的調(diào)度框架和通訊框架都很難進(jìn)一步的提升性能,所以軟件性能優(yōu)化也是整個(gè)軟件團(tuán)隊(duì)非常重要的一部分,這一塊也需要非常深入的了解才能夠完成。
做軟件的性能優(yōu)化,需要理解芯片的一些架構(gòu)設(shè)計(jì)。首先,需要理解整個(gè)Memory Hierarchy,即整個(gè)內(nèi)存的層級(jí)系統(tǒng),也需要理解總線帶寬、DDR帶寬、DDR控制器到底是如何運(yùn)作的,還有DDR工作模式。因?yàn)楝F(xiàn)在大算力的SoC,DDR通常是雙通道和多通道,DDR到底是運(yùn)行在并發(fā)模式,還是在其他的模式下運(yùn)行,DDR的QoS到底給哪個(gè)硬核才能讓它的響應(yīng)最高,這些都需要考慮到。
對(duì)于CPU來說,CPU L2 Cache,L1 Cache工作模式是什么,各級(jí)Cache Size對(duì)系統(tǒng)性能影響是什么?系統(tǒng)中什么樣的數(shù)據(jù)需要自動(dòng)去刷新,什么樣的數(shù)據(jù)不需要?對(duì)于BPU來說,一個(gè)模型有多級(jí)的SRAM,它的工作機(jī)制、模型調(diào)度與IO之間的overhead到底是什么樣子的?
對(duì)于DSP來說,又會(huì)出現(xiàn)一個(gè)TCM,TCM和DDR之間使用DMA。對(duì)于TCM的使用,到底是使用什么樣子代碼固化在TCM上,什么樣的代碼固化到DSP的cache上。
以上這些對(duì)整個(gè)的系統(tǒng),整個(gè)Memory帶寬、軟件性能有非常大的影響。
同時(shí),要理解整個(gè)芯片設(shè)計(jì)的Interrupt Hierarchy。當(dāng)一個(gè)系統(tǒng)里有十幾個(gè)攝像頭、幾個(gè)激光雷達(dá),整個(gè)系統(tǒng)的中斷是非常多的。我們的軟件究竟如何配置中斷,中斷和CPU之間中斷響應(yīng)是如何綁定的?
也需要在純計(jì)算優(yōu)化的方式上,深入理解向量化編程。向量化編程一般都稱它為SIMD,在ARM上有NEON,在PC上有SSE以及DSP這種SIMD指令,這都是非常重要的軟件優(yōu)化手段。
內(nèi)存訪問需要靜態(tài)化。因?yàn)楝F(xiàn)在大家開發(fā)都在 OS以上,不管是Linux也好,QNX也好,對(duì)內(nèi)存的靜態(tài)化非常重要。特別是在QNX系統(tǒng)上開發(fā),QNX對(duì)內(nèi)存每次申請(qǐng)釋放都會(huì)有很多的安全性校驗(yàn),如果是太多的碎面化內(nèi)存,整個(gè)系統(tǒng)的overhead會(huì)非常重。
CPU計(jì)算的定點(diǎn)化。定點(diǎn)運(yùn)算肯定比浮點(diǎn)運(yùn)算要快,什么樣的算法能夠定點(diǎn)化,這也是軟件工程師和算法工程師需要去深入溝通的。系統(tǒng)里到底哪一部分算法是非常重的overhead,能否把它定點(diǎn)化實(shí)現(xiàn)。
對(duì)于整個(gè)復(fù)雜的自動(dòng)駕駛系統(tǒng),像11V、3L的系統(tǒng),它的線程/進(jìn)程非常多。線程和進(jìn)程的優(yōu)先級(jí)到底是什么樣子?在一個(gè)實(shí)時(shí)系統(tǒng)里面,不同的功能模塊的實(shí)時(shí)優(yōu)先級(jí)配置,線程是否能夠合并、綁定。
在系統(tǒng)整個(gè)的通訊優(yōu)化方面,因?yàn)橄到y(tǒng)里面會(huì)有各種各樣的信號(hào),可能會(huì)有非常高的高頻信號(hào),也有一些低頻信號(hào),哪些信號(hào)是可以合并的,哪些高頻信號(hào)可以做一些打包。例如可以把一些高頻信號(hào),比如每個(gè)信號(hào)都是100赫茲,有幾十個(gè)信號(hào)能否把它們?nèi)看虬梢粋€(gè)100赫茲,減少通訊的開銷。
更高要求是一些算法復(fù)雜度的優(yōu)化。算法復(fù)雜度的優(yōu)化,通常有可能把一個(gè)算法耗時(shí)降低一個(gè)數(shù)量級(jí)。
最痛苦的有可能就是純代碼級(jí)的優(yōu)化。因?yàn)樾枰诖a中一個(gè)點(diǎn)一個(gè)點(diǎn)去check,發(fā)現(xiàn)到底有哪些點(diǎn)可以再進(jìn)一步的優(yōu)化,能夠把系統(tǒng)的性能進(jìn)一步的提升。特別是量產(chǎn)的最后階段,有可能花很長(zhǎng)的時(shí)間都是零點(diǎn)幾個(gè)點(diǎn)的CPU降低,但這也是非常值得的。
綜上所述,在地平線各代的征程芯片上,上面講到的各種軟件相關(guān)的開發(fā)事項(xiàng),遇到的各種問題,以及問題的解決,它們?cè)诘仄骄€的量產(chǎn)落地的項(xiàng)目中都有體現(xiàn)。
過去地平線已經(jīng)完成了從0到1的突破,現(xiàn)在也準(zhǔn)備和行業(yè)伙伴一起實(shí)現(xiàn)從1到N的開放共贏。大規(guī)模量產(chǎn)是驗(yàn)證智能駕駛產(chǎn)品技術(shù)領(lǐng)先性的首要標(biāo)準(zhǔn),剛剛講到了很多在量產(chǎn)過程中遇到的問題和解決這些問題的經(jīng)驗(yàn)。而把這些問題和經(jīng)驗(yàn)分享出來,也是希望能夠幫助大家在后續(xù)量產(chǎn)的過程中更好地應(yīng)對(duì)這些問題。
02 軟件視角的“軟硬結(jié)合”與“軟硬解耦”
新一代汽車智能芯片領(lǐng)導(dǎo)者,必須也是世界級(jí) AI 算法公司。地平線是在2015年成立,而我是在2016年加入地平線,當(dāng)時(shí)還是處于芯片開發(fā)的初期階段。我個(gè)人也非常幸運(yùn)能夠在早期加入地平線,經(jīng)歷芯片軟硬結(jié)合,協(xié)同設(shè)計(jì)的整個(gè)過程。
對(duì)于一個(gè)軟件開發(fā)者來說,當(dāng)你從市面上拿到一款芯片,芯片可能有各個(gè)不同的硬件設(shè)置,它的DDR、各個(gè)硬核的IP,深度學(xué)習(xí)芯片的一些算子,到底是不是工程上需要的,這些都無法改變。
地平線在每一代芯片的設(shè)計(jì)、BPU設(shè)計(jì)、整個(gè)SoC的設(shè)計(jì)過程中,都和我們的軟件開發(fā)者、算法開發(fā)者進(jìn)行了非常深入的討論,以軟硬結(jié)合的方式,讓芯片真的是為后續(xù)的應(yīng)用場(chǎng)景、為軟件去服務(wù)的,即我們的芯片設(shè)計(jì),真正的從實(shí)際場(chǎng)景出發(fā),從軟件中來,到軟件中去。
地平線的芯片DDR帶寬到底需要多少,BPU算力需要多少,CPU、SP、Codec等,是否真的是一個(gè)極具性價(jià)比,極具能耗比的設(shè)計(jì)?是不是能夠把AI芯片的能力在自動(dòng)駕駛的系統(tǒng)里充分展示出來,這個(gè)都是在開發(fā)過程中軟硬結(jié)合的體現(xiàn)。
芯片設(shè)計(jì)出來后,面向芯片,需要在軟件層級(jí)上,從OS到基礎(chǔ)中間件,再到應(yīng)用中間件,打造不同的模塊單元,讓不同的開發(fā)者使用不同的、已經(jīng)封裝的、比較成熟的模塊。像剛才介紹在自動(dòng)駕駛系統(tǒng)設(shè)計(jì)中遇到的各種各樣問題,這些模塊都能很好地解決,并提供給開發(fā)者去使用,讓開發(fā)者能夠自定義的完成他們的應(yīng)用開發(fā)。
因而,從芯片到上層的操作系統(tǒng),基礎(chǔ)中間件、應(yīng)用中間件的軟硬結(jié)合,再向上提供給我們的應(yīng)用開發(fā)者,去開發(fā)各種各樣的智能汽車應(yīng)用,達(dá)到軟硬解耦。
03 智能駕駛軟件開發(fā)平臺(tái)Horizon TogetherOS Bole
在征程5芯片發(fā)布時(shí),也發(fā)布了TogetherOS,Bole是TogetherOS中的應(yīng)用中間件部分,即軟件開發(fā)平臺(tái)。Horizon TogetherOS Bole是面向高等級(jí)自動(dòng)駕駛的軟件開發(fā)平臺(tái)及中間件。
首先,介紹下高等級(jí)自動(dòng)駕駛系統(tǒng)面臨的難點(diǎn)與挑戰(zhàn)。第一,自動(dòng)駕駛車載軟件的架構(gòu)復(fù)雜度是陡增的。在過去的兩三年,L2級(jí)別單目的視覺系統(tǒng)比較主流。而從2021年開始,一輛車裝載多個(gè)攝像頭,完成NOA(領(lǐng)航輔助駕駛)等功能,已經(jīng)逐漸開始是一個(gè)標(biāo)準(zhǔn)化的過程。未來到城區(qū)自動(dòng)駕駛,傳感器會(huì)越來越多,整個(gè)自動(dòng)駕駛的車載軟件架構(gòu)設(shè)計(jì),復(fù)雜度也是陡增的。在快速迭代過程中,如何能夠提高開發(fā)效率,實(shí)現(xiàn)快速的復(fù)制,加速量產(chǎn)開發(fā)的進(jìn)程,都是會(huì)變得非常重要。
第二,自動(dòng)駕駛平臺(tái)軟件關(guān)鍵技術(shù)還沒有標(biāo)準(zhǔn)化。傳統(tǒng)車載應(yīng)用軟件的開發(fā)范式,很難做到以數(shù)據(jù)為中心的數(shù)據(jù)閉環(huán)。整個(gè)數(shù)據(jù)閉環(huán)過程中,傳統(tǒng)的軟件開發(fā)方式會(huì)顯得比較困難。AutoSAR AP、ROS等高等級(jí)自動(dòng)駕駛場(chǎng)景還處在初期摸索階段。在落地過程中,各有千秋,目前行業(yè)中還沒有形成統(tǒng)一的面向高等級(jí)自動(dòng)駕駛的軟件開發(fā)平臺(tái)及中間件。
第三,高等級(jí)自動(dòng)駕駛也需要更高的安全性保障。關(guān)于功能安全部分,此前也有同事有過相關(guān)的分享。
最后,高等級(jí)自動(dòng)駕駛也需要高算力的支撐。L3+自動(dòng)駕駛算法復(fù)雜度及功能安全的冗余設(shè)計(jì),隨著自動(dòng)駕駛等級(jí)的提高,其所需算力呈指數(shù)提升,需要BPU/DSP等異構(gòu)執(zhí)行單元對(duì)算法進(jìn)行加速。同時(shí),當(dāng)前單芯片的很難滿足算力要求,多個(gè)異構(gòu)芯片混合,軟件與計(jì)算平臺(tái)協(xié)同也變得越來越困難,自動(dòng)駕駛計(jì)算平臺(tái)的有效算力很難得到充分發(fā)揮。以上這些都是高級(jí)自動(dòng)駕駛系統(tǒng)面臨的一些難點(diǎn)和挑戰(zhàn)。
總結(jié)一下,需要安全可靠、極致效能,簡(jiǎn)單易用,而且也要面向下一代智能駕駛,是一個(gè)能夠很好達(dá)成軟件開發(fā)的系統(tǒng),而且也需要是一個(gè)開放且兼容的系統(tǒng)。
Bole,希望能夠解決自動(dòng)駕駛量產(chǎn)軟件開發(fā)中的難題,面向高等級(jí)自動(dòng)駕駛,完成上圖右半部分所示的數(shù)據(jù)閉環(huán)、軟件2.0的開發(fā)方式,能夠做到數(shù)據(jù)的錄制、實(shí)際的開發(fā),然后部署。我們將Design、Develop、Deploy、Build、Drive,Measure,Record,Store等等,把它整個(gè)閉環(huán)起來,和艾迪平臺(tái)一起,配合著完成數(shù)據(jù)閉環(huán)。
Bole會(huì)產(chǎn)出一套面向高等級(jí)自動(dòng)駕駛的開發(fā)范式;BoleStudio IDE,能夠把不同的模塊、不同的node,以DAG的形式展現(xiàn)出來;BoleViewer,能夠完成數(shù)據(jù)可視化;還有一些數(shù)據(jù)工具,像Recorder、Repaly、SensorCenter;包括車身的一些通訊VehicleIO;也有之前談到的Bole Dataflow調(diào)度框架,通訊框架Communication,BPU調(diào)度框架EasyDNN等,它們都是為了能夠快速的開發(fā)和集成。同時(shí),HobotCV也是面向征程芯片不同的硬核計(jì)算單元,提供高效的接口抽象。
數(shù)據(jù)閉環(huán),也是以數(shù)據(jù)驅(qū)動(dòng)開發(fā),助力自動(dòng)駕駛應(yīng)用快速落地。在實(shí)車的環(huán)境下,要實(shí)時(shí)抓取傳感器的數(shù)據(jù),在實(shí)車的應(yīng)用軟件下,能夠把傳感數(shù)據(jù)與日志進(jìn)行錄制,包括傳感器的標(biāo)定、常規(guī)數(shù)據(jù)采集。數(shù)據(jù)回來之后,剛才也提到數(shù)據(jù)工具也會(huì)非常重要。在云端要有數(shù)據(jù)回灌的能力,特別是在云端和艾迪的配合,對(duì)于批量的數(shù)據(jù)、批量的設(shè)備來說,艾迪平臺(tái)和Bole一起協(xié)同,能夠把數(shù)據(jù)的開發(fā)、回灌、回歸、數(shù)據(jù)可視化總體整合起來。同時(shí),也提供一個(gè)BoleStudio的AI應(yīng)用開發(fā)集成環(huán)境,能夠做到持續(xù)的改進(jìn)與開發(fā)。
04 智能駕駛應(yīng)用軟件開發(fā)趨勢(shì)展望
對(duì)于自動(dòng)駕駛的應(yīng)用開發(fā),未來會(huì)是什么形態(tài)呢?
在Bole之上,剛才也談到會(huì)有各種各樣不同的模塊。在Dataflow框架中也會(huì)把各種各樣的模塊,抽象成不同的一些module,或者node,可能會(huì)執(zhí)行在不同的計(jì)算單元上。有多模傳感器、攝像頭、激光雷達(dá)、毫米波雷達(dá)、超聲波雷達(dá)等。感知要在一個(gè)大的感知模塊下,要執(zhí)行BPU、傳感器,執(zhí)行傳統(tǒng)的CV算法。然后在定位地圖上,還要與做地圖的一些localization或者自身的定位信息,組成整個(gè)動(dòng)靜態(tài)環(huán)境模型。在融合與規(guī)劃部分,得到自車的軌跡規(guī)劃。之后到整車控制,所有的數(shù)據(jù)可視化,包括整個(gè)的車身通訊,各種各樣的信號(hào),這些都會(huì)是自動(dòng)駕駛開發(fā)系統(tǒng)中需要實(shí)現(xiàn)的一些模塊。
如果要去做一個(gè)自動(dòng)駕駛系統(tǒng),從零開始實(shí)現(xiàn)這些內(nèi)容,是非常困難的。如果能夠有一個(gè)很好的baseline,地平線也是很希望把這樣的一個(gè)baseline開放出來,能夠把我們?cè)诹慨a(chǎn)過程中積累的軟件開發(fā)經(jīng)驗(yàn),以這種module,或以node的形式,和各個(gè)合作伙伴一起把它作為一種開發(fā)的基礎(chǔ)模板,加速合作伙伴的量產(chǎn)過程,這樣會(huì)是一個(gè)更快的開發(fā)方式。
基于整個(gè)開發(fā)框架,會(huì)有各種各樣不同的模塊。上圖所示藍(lán)色的部分是地平線所做的開放框架,把在軟件框架以及量產(chǎn)工程實(shí)現(xiàn)過程中,遇到的一些經(jīng)驗(yàn)和問題抽象出來,作為一些開放的框架。同時(shí),用戶也可以自定義的完成各種不同模塊,包括一些新傳感器的接入,一些新的傳統(tǒng)CV算法的實(shí)現(xiàn),以及不同模型的前處理、后處理,都可以在我們的調(diào)度框架下完成。
同時(shí),在整套框架的定義下,也能夠把這些感知模塊、融合模塊、規(guī)劃模塊、控制模塊的接口很好的定義抽象出來,幫助開發(fā)者快速實(shí)現(xiàn)全棧的自動(dòng)駕駛開發(fā)過程。一方面,能夠在一個(gè)相對(duì)比較成熟的軟件baseline下,完成自動(dòng)駕駛量產(chǎn)的開發(fā);另一方面,把我們實(shí)現(xiàn)規(guī)模化量產(chǎn)過程中的一些經(jīng)驗(yàn)也分享出來,通過協(xié)同開發(fā),大幅提升開發(fā)效率,從而達(dá)到一個(gè)開放共贏的狀態(tài),加速智能駕駛應(yīng)用落地。
評(píng)論
查看更多