Apollo開放平臺:從自動駕駛場景能力到開發(fā)者易用性(1)
從2022年上半年開始,我們進(jìn)行了社區(qū)的第一次NPS調(diào)研,并形成了半年一次的面向所有開發(fā)者的例行反饋機(jī)制。表1是2022年上半年第一次NPS調(diào)研的數(shù)據(jù),Apollo整體NPS極高,但感知和PnC(規(guī)劃與控制)的開發(fā)體驗NPS極低。這也進(jìn)一步印證了我們對于Apollo社區(qū)價值與產(chǎn)品價值差距的認(rèn)知。表1 2022年上半年NPS數(shù)據(jù)同時,在每次發(fā)版前,我們會進(jìn)行alpha內(nèi)測與beta公測,針對不同使用場景的開發(fā)者形成SIG(Special Interest Group,特別興趣小組)來定向獲取反饋,如圖1的感知場景開發(fā)者訪談記錄。圖1 感知仿真開發(fā)調(diào)試場景SIG調(diào)研反饋此外,我們定期與社區(qū)布道師進(jìn)行深度訪談來進(jìn)一步收集意見與建議。通過這些方式,我們期望深度切入開發(fā)者痛點,切實解決開發(fā)者使用中的各種問題,讓小白開發(fā)者從入門到精通,幫助資深開發(fā)者快速從0到1,提升效率。通過基于場景的分類和多方位的開發(fā)者反饋收集,我們梳理了四類核心問題。首先,是如何高效復(fù)用工程能力?Apollo工程龐雜且與Robotaxi場景耦合較深,如何能快速基于Apollo的核心能力擴(kuò)展應(yīng)用到其他場景?需要更靈活方便的發(fā)布機(jī)制來支撐;第二,如何快速驗證新的算法模型,滿足各種差異化應(yīng)用場景落地對于算法模型的需求,或是滿足科研領(lǐng)域?qū)τ谛滦退惴ǖ奶剿?;第三,如何提升開發(fā)調(diào)試效率?工欲善其事必先利其器,目前Apollo工具偏向整車應(yīng)用場景,而非個人開發(fā)調(diào)試場景。開發(fā)個人開發(fā)者工具,縮小與個人開發(fā)者需求之間的差距同樣非常重要。最后,如何降低學(xué)習(xí)曲線?提供符合開發(fā)者學(xué)習(xí)習(xí)慣的內(nèi)容與產(chǎn)品,縮短開發(fā)者學(xué)習(xí)過程是提升產(chǎn)品價值不可或缺的部分。接下來,我們將基于以上四點,詳細(xì)介紹最新發(fā)布的Apollo開放平臺8.0在工程技術(shù)、算法模型、開發(fā)工具、知識學(xué)習(xí)等方面可以為開發(fā)者帶來哪些價值應(yīng)用。高效復(fù)用平臺能力——包管理升級Apollo軟件包管理的主要目標(biāo)是將自動駕駛系統(tǒng)的編譯產(chǎn)出按照“模塊”粒度進(jìn)行規(guī)范化組織,一方面支持直接使用產(chǎn)出包的方式使用組件,另一方面規(guī)范組件的依賴關(guān)系以及組件的粒度,從而降低組件的使用/復(fù)用難度,提升自動駕駛系統(tǒng)的的研發(fā)效率。Apollo的源碼是基于Bazel進(jìn)行構(gòu)建的,其優(yōu)劣勢都很明顯,一方面得益于Bazel先進(jìn)的并行編譯速度,70W+行的源碼可以在1小時內(nèi)完成整體編譯。另一方面受限于Bazel的單源碼樹的限制,Apollo模塊之間無法使用二進(jìn)制的方式進(jìn)行依賴。Bazel包支持嵌套依賴,導(dǎo)致Apollo模塊之間的依賴關(guān)系極其復(fù)雜,很難單獨使用一個或者幾個模塊。因此,Apollo包管理將基于Bazel進(jìn)行擴(kuò)展,主要規(guī)范構(gòu)建產(chǎn)出(以及部分源碼)內(nèi)容,并配套相關(guān)工具,讓Apollo的模塊可以通過二進(jìn)制的方式引入復(fù)用,因此本文介紹的概念和術(shù)語主要是針對Apollo的構(gòu)建產(chǎn)出。此外,Apollo的包目前對Bazel工程的支持將優(yōu)先于CMake工程,但是Apollo包最終將制作成標(biāo)準(zhǔn)的DEB包,可以安裝在Ubuntu操作系統(tǒng)上,也可以作為普通的系統(tǒng)包在CMake工程下使用。包管理的整體框架介紹Apollo的軟件包管理是一系列工具的集合,覆蓋整個軟件包的整個生命周期,如圖2所示。圖2 Apollo包管理框架其中包含如下模塊:RepoServer是軟件包的云端倉庫,存儲包實體(即deb包)與包的索引。具體實現(xiàn)是采用靜態(tài)網(wǎng)站服務(wù)結(jié)合CDN加速技術(shù)實現(xiàn)高速、高可用的文件下載服務(wù)。LocalRepo即軟件包的本地倉庫,是一個基礎(chǔ)的本地文件系統(tǒng),按照標(biāo)準(zhǔn)的文件系統(tǒng)規(guī)范存儲包的內(nèi)容,其中即包含從遠(yuǎn)程倉庫下載安裝的deb包,也包括本地工程構(gòu)建產(chǎn)出的Local版本軟件包。該本地倉庫中存儲的內(nèi)容有兩方面作用,一是在Apollo系統(tǒng)運行時提供動態(tài)鏈接庫,另外也是在Apollo組件編譯時提供依賴庫。Buildtool是使用軟件包作為擴(kuò)展組件依賴時的配套構(gòu)建工具。Apollo使用Bazel作為構(gòu)建系統(tǒng),所以推薦擴(kuò)展組件也使用Bazel進(jìn)行構(gòu)建,Bazel在云端編譯、緩存等技術(shù)上有很大的優(yōu)勢。而Buildtool目前的底層也是基于Bazel的(未來可以考慮支持CMake等多種編譯系統(tǒng))。Buildtool的核心作用是將Apollo的軟件包作為編譯依賴加到bazel構(gòu)建體系中,而且盡量簡化使用復(fù)雜度。眾所周知,將動態(tài)庫加到Bazel的依賴體系中是比較繁瑣的,首先需要安裝動態(tài)庫,雖然Bazel中可以使用http_archive進(jìn)行下載包,但是一般情況下還是會使用Apt等工具在操作系統(tǒng)中先安裝好動態(tài)庫。緊接著需要使new_local_repository創(chuàng)建一個repository并且提供一個BUILD文件,其中包含cc_library。在依賴包存在相互依賴的情況下,需要自行梳理版本防止依賴沖突。Buildtool通過依賴版本分析、自動拉取依賴包、自動生成repository配置、自動處理級聯(lián)依賴等功能配合包描述文件(cyberfile.xml),可以讓上述繁瑣過程對使用者透明,只需要在包描述中聲明一個依賴即可。Buildtool的第二個作用是支持源碼方式使用Apollo的軟件包。C++使用二進(jìn)制作為依賴一直存在ABI等問題難以解決,所以在Apollo的軟件包中將源碼也作為標(biāo)準(zhǔn)內(nèi)容,Buildtool支持將包的源碼自動引入到使用者的工作空間下參與編譯,與此同時Buildtool也將多個源碼包的編譯順序納入管理。除了在構(gòu)建中使用Buildtool下載安裝使用,也可以使用Apt等工具直接安裝使用,例如在使用Dreamview播放Record文件的場景下我們不需要從頭編譯Apollo工程,只需要使用apt installapollo-neo-dreamview-dev,將dreamview以及其依賴按照到本地就可以來播放數(shù)據(jù)包回看數(shù)據(jù)了。軟件包管理的各個組成部分已經(jīng)介紹完了??梢钥闯銎淙抗δ芏几鸁o人駕駛系統(tǒng)本身沒有關(guān)系,那它對于Apollo的發(fā)展有什么作用呢?Apollo開源項目是一整套完整的無人駕駛系統(tǒng),但是由于業(yè)務(wù)場景不同,具體分場景下開發(fā)者不會直接部署一整套項目,而是從中選取適合自己的功能、算法等內(nèi)容放到自己的項目中使用。而目前Monolithic Repository的組織結(jié)構(gòu),各個功能組件之間存在耦合,要抽離出來單獨使用的成本很大,所以很多開發(fā)者會自己再重新實現(xiàn)一份代碼。但這樣不但浪費開發(fā)者的時間成本,也會導(dǎo)致開發(fā)者的擴(kuò)展內(nèi)容無法進(jìn)行貢獻(xiàn)。有了軟件包管理后,一方面先進(jìn)技術(shù)可以按照功能模塊的粒度以二進(jìn)制庫(或者源碼)的方式被開發(fā)者直接使用,同時也為開發(fā)者提供了更輕量級并且和Apollo龐大的單體源碼解耦的方式來共享自己的擴(kuò)展能力,即按照Apollo軟件包的規(guī)范開發(fā)/發(fā)布自己的軟件包,為Apollo自動駕駛系統(tǒng)生態(tài)的健康發(fā)展奠定了基礎(chǔ)。
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。