Openpilot EP1:Openpilot开源项目深度解析
目錄
0.前言
1.整體介紹
2.系統(tǒng)架構(gòu)與硬件配置
2.1 系統(tǒng)架構(gòu)
2.2 硬件配置
3.量產(chǎn)安全規(guī)范體系
4.生態(tài)體系
5.軟件算法分析
5.2 Supercombo模型
5.3 DMS模型
5.4 Localization算法
5.5 Planner/Controls算法
6.后記
0.前言
目前市場(chǎng)上的已經(jīng)量產(chǎn)并產(chǎn)品化的車(chē)端自動(dòng)駕駛方案,如特斯拉基于純視覺(jué)環(huán)視自動(dòng)駕駛方案,又如Mobileye的True Redundancy方案,即純相機(jī)方案 + 雷達(dá)與激光雷達(dá)方案形成一冗余的自動(dòng)駕駛方案。這兩種方案對(duì)移動(dòng)平臺(tái)的算力要求不容忽視,就Tesla 2021 AI DAY 公布的FSD chip就達(dá)到144TOPS,Mobileye面向L4級(jí)自動(dòng)駕駛推出的EyeQ Ultra,其AI算力更是能夠達(dá)到176TOPS。雖然兩者在TOPS上面都不是最出彩的,但拼算力的背后,也道出了算法模型復(fù)雜度不斷攀升的原因。但是,通過(guò)我們PerceptionX的研究,今天想為大家介紹一款經(jīng)濟(jì)實(shí)用且性價(jià)比超高的自動(dòng)駕駛外裝產(chǎn)品,來(lái)自Comma.ai 的Openpilot,它僅僅用一款樂(lè)視手機(jī)以及高通驍龍821芯片,搭載openpilot software,就能實(shí)現(xiàn)L2+自動(dòng)駕駛。
感謝PerceptionX 蔡老師這篇文章的大力支持,若有建設(shè)性問(wèn)題,請(qǐng)聯(lián)系caizhitian@pjlab.org.cn?。自動(dòng)駕駛團(tuán)隊(duì)OpenPerceptionX是上海人工智能實(shí)驗(yàn)室的智能駕駛感知團(tuán)隊(duì),致力于探索前沿的學(xué)術(shù)界與工業(yè)界感知、融合、端到端算法,感興趣同學(xué)請(qǐng)聯(lián)系小編Hugo maihaoguang@pjlab.org.cn ,我們?cè)谡衅?#xff01;上海人工智能實(shí)驗(yàn)室坐落于美麗的徐匯濱江,這里即有學(xué)術(shù)大牛具體指導(dǎo)實(shí)習(xí)生、剛?cè)肼毜男U猩?#xff1b;也適合工作多年的社招大佬在這里充分展現(xiàn)自己的價(jià)值。我們堅(jiān)信在這里能做出solid impact的工作、對(duì)標(biāo)國(guó)際一流實(shí)驗(yàn)室成果。
PS: 未經(jīng)許可,禁止私自轉(zhuǎn)載。
1.整體介紹
What is Openpilot?
在探索基于端到端的自動(dòng)駕駛過(guò)程中,一次偶然的機(jī)會(huì),我們接觸到了Openpilot這款產(chǎn)品,它是一套比較成熟的面向L2輔助駕駛功能的開(kāi)源項(xiàng)目,基于端到端模型實(shí)現(xiàn)了ACC、LKA、DMS等輔助駕駛功能。目前,已經(jīng)面向消費(fèi)者售賣(mài),能夠適配了多種車(chē)型,通過(guò)簡(jiǎn)單的安裝在自己的車(chē)上便能夠體驗(yàn)輔助駕駛功能。
相關(guān)鏈接
公司官網(wǎng):?https://comma.ai/
開(kāi)源項(xiàng)目:?https://github.com/commaai/openpilot
Demo視頻:https://www.youtube.com/watch?v=XOsa0FsVIsg
Openpilot夜晚效果:https://www.youtube.com/watch?v=aUncj2myFwc
Openpilot vs Tesla Autopilot:https://www.youtube.com/watch?v=YJzvrDBQwOE
第三方評(píng)測(cè)表現(xiàn),此為2020年基于消費(fèi)者使用評(píng)價(jià)進(jìn)行統(tǒng)計(jì)出來(lái)的評(píng)測(cè)報(bào)告。
https://data.consumerreports.org/wp-content/uploads/2020/11/consumer-reports-active-driving-assistance-systems-november-16-2020.pdf
通過(guò)以上視頻demo以及第三方評(píng)測(cè),可以看出Openpilot整體產(chǎn)品表現(xiàn)還是比較驚艷的,針對(duì)這款產(chǎn)品,我們列了一些核心的Keypoints :
- 首款開(kāi)源的基于端到端(Perception to Planning)的輔助駕駛系統(tǒng)
- 采用自標(biāo)定模塊,相機(jī)安裝簡(jiǎn)單
- 整體算法思路很新奇
- 將感知+規(guī)劃放到一個(gè)model
- 引入時(shí)序信息
- 關(guān)注最危險(xiǎn)的幾個(gè)目標(biāo)/輸出速度
- 數(shù)據(jù)體系/生態(tài)體系完善
- 積累了大量數(shù)據(jù)
- 用戶可以自行上傳數(shù)據(jù)
- 開(kāi)源社區(qū)共同服務(wù)
2.系統(tǒng)架構(gòu)與硬件配置
2.1 系統(tǒng)架構(gòu)
整體系統(tǒng)架構(gòu)如圖所示,可分為四個(gè)部分
- 環(huán)境:
- 配置
- 接管
- 物理環(huán)境
- 車(chē)機(jī):
- CommaTwo device
- CAN bus
- Panda(連接CAN和CommaTwo的硬件適配器)
- Stock sensors
- Actuators (執(zhí)行器,例如方向盤(pán)steering、油門(mén)gas、剎車(chē)brake)
- Sensors:
- Cameras: 前視和車(chē)艙內(nèi)部?jī)蓚€(gè)攝像頭
- GPS
- Software components:
- Infrastructure
- Communication dependencies
- Selfdrive Core
- Radar
- Planner
- Control
2.2 硬件配置
前面架構(gòu)圖中的CommaTwo device根據(jù)樂(lè)視手機(jī)改裝而來(lái),至于為什么要用樂(lè)視手機(jī)改裝呢?通過(guò)查閱官網(wǎng)資料了解到,由于CommaTwo采用高通驍龍821芯片,支持這款芯片的手機(jī)包括樂(lè)視3Pro,目前只適配了樂(lè)視這款手機(jī)的camera接口,如果采用其他型號(hào)還需自己去適配camera。下面展示了該設(shè)備的具體參數(shù)
3.量產(chǎn)安全規(guī)范體系
Openpilot作為一款已經(jīng)量產(chǎn)的輔助駕駛產(chǎn)品,因此每次發(fā)版上市都要遵循相關(guān)的法律法規(guī),保證功能安全。對(duì)于Openpilot而言,整體的安全規(guī)范流程如圖所示
- 從圖中可以看出Openpilot功能生產(chǎn)遵循ISO26262標(biāo)準(zhǔn),ASIL安全評(píng)級(jí)、DFMEA(潛在失效模式與效應(yīng)的分析)、NHTSA(美國(guó)國(guó)家公路安全管理局)以及FMVSS(美國(guó)公路機(jī)動(dòng)車(chē)安全標(biāo)準(zhǔn))標(biāo)準(zhǔn)
- 對(duì)于汽車(chē)系統(tǒng),ASIL安全等級(jí)劃分為QM、A、B、C、D五個(gè)等級(jí),QM代表與安全無(wú)關(guān),D等級(jí)最高。考慮因素包括:
- 嚴(yán)重性(Severity of failure,S):致命傷S3
- 可能性(Probability of exposure,E):高可能性E4
- 可控性(Controllability,E):難以控制C3
- Openpilot系統(tǒng)ASIL等級(jí)為D=S3 + E4 + C3
- 對(duì)于汽車(chē)系統(tǒng),ASIL安全等級(jí)劃分為QM、A、B、C、D五個(gè)等級(jí),QM代表與安全無(wú)關(guān),D等級(jí)最高。考慮因素包括:
- Openpilot基于DMS(Driving Monitor System)系統(tǒng)監(jiān)控駕駛員狀態(tài),遵守FMVSS requirements,同時(shí)符合NHTSA發(fā)布的標(biāo)準(zhǔn)pertinent documents
- 關(guān)于危險(xiǎn)等級(jí)(Hazard and Risk Analysis)和FMEA/DFMEA, Openpilot主要符合兩點(diǎn)設(shè)計(jì)理念
-
- 人類駕駛員優(yōu)先級(jí)永遠(yuǎn)最高,如果有任何接管,立即退出openpilot
- 執(zhí)行器(Actuators)變化不能過(guò)快,例如change trajectory需要within reasonable limits.不同車(chē)型關(guān)于safety module的閾值、case都不太一樣,具體參考?https://github.com/commaai/panda/tree/master/board/safety
-
- 在軟件功能生產(chǎn)時(shí)嚴(yán)格按照編碼規(guī)范MISRA C:2012 , 該規(guī)范由汽車(chē)產(chǎn)業(yè)軟件可靠性協(xié)會(huì)(MISRA)提出的C語(yǔ)言開(kāi)發(fā)標(biāo)準(zhǔn),其目的是在增進(jìn)嵌入式系統(tǒng)的安全性及可移植性。 Openpilot 利用Panda Firmware作為codebase,以及cppcheck模塊做代碼規(guī)范分析,通過(guò)panda的safety model保證安全性
- 在每次新版本發(fā)布之前,都會(huì)經(jīng)對(duì)功能的測(cè)試以及進(jìn)行SIL,HIL,VIL三項(xiàng)測(cè)試,具體的流程如圖所示。
4.生態(tài)體系
下面這幅圖展示了Openpilot的解決自動(dòng)駕駛問(wèn)題的設(shè)計(jì)理念-大道至簡(jiǎn),Openpilot生態(tài)體系包括數(shù)據(jù)體系和開(kāi)源社區(qū)服務(wù),通過(guò)積累大量的數(shù)據(jù),用于模型訓(xùn)練部署,循環(huán)迭代,并以此對(duì)標(biāo)Tesla。
那么Openpilot是怎么實(shí)現(xiàn)他的生態(tài)圈,或是數(shù)據(jù)閉環(huán)呢?
開(kāi)源社區(qū)體系
-
- openpilot:https://github.com/commaai/openpilot?,通過(guò)Pull request,添加車(chē)輛配置,bug reports ,數(shù)據(jù)Replay/simulation等功能,用于數(shù)據(jù)存儲(chǔ),離線開(kāi)發(fā)
- explorer:https://github.com/commaai/explorer?網(wǎng)頁(yè)在線replay功能
數(shù)據(jù)體系
-
- Comma10k:https://github.com/commaai/comma10k?,真實(shí)場(chǎng)景,10000 png,社區(qū)用戶標(biāo)注,模型訓(xùn)練
- Comma2k19:https://github.com/commaai/comma2k19,真實(shí)場(chǎng)景,comama EONs采集,Pose&Localization
- Selling:https://github.com/commaai/data-sales?,真實(shí)場(chǎng)景,comma twos采集數(shù)據(jù)
- 眾籌數(shù)據(jù):https://my.comma.ai/?, 用戶將設(shè)備數(shù)據(jù)上傳到服務(wù)器,標(biāo)注用戶數(shù)據(jù),用于模型訓(xùn)練
- challenge比賽:https://github.com/commaai/calib_challenge
Openpilot開(kāi)源的數(shù)據(jù)體系包括Comma10k和Comma2k19,其中,Comma10k主要用作像素級(jí)分割任務(wù),Comma2k19用于車(chē)規(guī)控制算法,考慮后續(xù)我們基于此數(shù)據(jù)集進(jìn)行復(fù)現(xiàn)模型,可以持續(xù)關(guān)注后續(xù)更新,這里重點(diǎn)關(guān)注Comma2k19這個(gè)數(shù)據(jù)集。
Raw_log
Globalpose from fusion
數(shù)據(jù)集解析Setup
下載數(shù)據(jù)解析相關(guān)代碼
git clone https://github.com/commaai/comma2k19 git submodule update --init --recursive sudo apt-get install libcurl4-gnutls-dev sudo apt-get install libghc-gnutls-dev pip3 install pycurl cd {PATH}/comma2k19-master && pip3 install -r requirements.txt解析代碼demo:{PATH}/notebooks
(注:需要添加所需模塊路徑:sys.path.append('{MODULE_PATH}'))
Comma2k19 數(shù)據(jù)集分 10 個(gè)卷,解壓后大約 100G。通過(guò)踩坑,可以利用openpilot提供的docker環(huán)境,然后將數(shù)據(jù)集掛載到相應(yīng)目錄進(jìn)行解析數(shù)據(jù),可以減少環(huán)境依賴。 若對(duì)數(shù)據(jù)格式感興趣,可以前往Openpilot github
Sample
5.軟件算法分析
前面幾個(gè)部分主要從宏觀角度介紹了Openpilot產(chǎn)品性能,系統(tǒng)架構(gòu),安全規(guī)范體系以及生態(tài)體系。對(duì)于沒(méi)有接觸到Openpilot這款產(chǎn)品的人,可能不太相信在自動(dòng)駕駛領(lǐng)域這種采用Percetion to Planning的方案能夠work,更神奇的是,它還是一款量產(chǎn)的產(chǎn)品。正所謂撥開(kāi)云霧才能見(jiàn)天日,帶著這樣的疑問(wèn),有必要對(duì)Openpilot源碼進(jìn)行深入分析一波,接下來(lái)我們將會(huì)細(xì)致全面地給大家介紹關(guān)鍵模塊,若有想法去調(diào)試Openpilot設(shè)備的小伙伴請(qǐng)細(xì)品。
Camera數(shù)據(jù)流部分參考代碼版本為version0.8.12模型分析部分版本參考:Link
Camera底層(kernel)分析
針對(duì)camera數(shù)據(jù)流部分,我們主要關(guān)注Openpilot設(shè)備中camera采集的圖像如何從從硬件采集到輸出給模型,根據(jù)前面硬件設(shè)備介紹可知Openpilot設(shè)備SOC采用高通的驍龍821,系統(tǒng)采用定制的安卓系統(tǒng)。通過(guò)查找源碼發(fā)現(xiàn),如圖所示,camera底層(kernel)基于linux V4L2視頻框和應(yīng)用層通信,對(duì)V4L2具體細(xì)節(jié)感興趣的可參考https://deepinout.com/v4l2-tutorials/linux-v4l2-architecture.html。
針對(duì)高通平臺(tái)而言,內(nèi)核相機(jī)驅(qū)動(dòng)在v4l2框架上進(jìn)行了相應(yīng)的擴(kuò)展。首先,創(chuàng)建了一個(gè)整體相機(jī)控制者的CRM,以節(jié)點(diǎn)video0暴露給用戶空間,主要用于管理內(nèi)核中的Session、Request以及子設(shè)備,同時(shí)各個(gè)子模塊都實(shí)現(xiàn)了各自的v4l2_subdev設(shè)備,并且以v4l2_subdev節(jié)點(diǎn)暴露給用戶空間,暴露子設(shè)備的設(shè)備節(jié)點(diǎn),在用戶空間直接通過(guò)標(biāo)準(zhǔn)的字符設(shè)備控制接口來(lái)控制各個(gè)設(shè)備。其次,創(chuàng)建了另一個(gè)video1設(shè)備節(jié)點(diǎn)用于同步數(shù)據(jù)流,保證用戶空間和內(nèi)核空間的buffer能夠高效得進(jìn)行傳遞。
- Camera init部分
Init部分主要執(zhí)行系統(tǒng)初始化,分配視頻幀內(nèi)存,源碼中預(yù)留了4幀數(shù)據(jù)大小內(nèi)存
- Camera open部分
根據(jù)前面分析的視頻框架,V4L2將camera設(shè)備節(jié)點(diǎn)以設(shè)備文件形式映射到用戶空間,打開(kāi)camera也就是打開(kāi)對(duì)應(yīng)的設(shè)備文件節(jié)點(diǎn)
- Cameras run
首先,開(kāi)啟sensor基于i2c通信,發(fā)送控制信號(hào),三路camera對(duì)應(yīng)三個(gè)線程,當(dāng)視頻流觸發(fā)時(shí),通過(guò)poll機(jī)制監(jiān)測(cè)road camera對(duì)應(yīng)的文件句柄(video0_fd),執(zhí)行handle_camera_event處理(圖像幀預(yù)處理)
根據(jù)以上分析可得camera部分函數(shù)調(diào)用關(guān)系
Cameras_init(wide/road/driver camera)Set camera stateSet camera paramerter(grey_fraction,gain,exposure_time ,etc)Camera buf init(allocate related mem)set vipc_server to cameradallocate 4 frame_sizeget_model_yuv_tranform(do a 2x downsize)vipc_server create buffers for rgb and yuvCameras_open(wide/road/driver camera) Open video0_fd/video1_fdOpen ispQuery icp for MMU handlesRequest msg subscribe from video0_fdCamera_open(wide_cam)Open v4l2 sensor_fdCreate sessoinAccess sensorConfig isp/CSI PHYLink devices:start csiphy/isp/sensror Vipc_server start listen cameras Camera_run(wide/road/driver camera)start thread to process road camera Receive frame_data Fill frame data and yuv transformPublish "roadCameraState" msg including frame dataStart devices by send i2c sinnal to sensorOpen poll events to monitor video stream and callback processSet per frame parameter- 總結(jié)
前面的分析,在load模型前,camera數(shù)據(jù)流部分按照系統(tǒng)層級(jí)劃分可分為
硬件層:基于高通驍龍821 SOC,前視采用Sony Imx298,Monitor采用ov8865,camera基于 I2C和處理器通信
驅(qū)動(dòng)層:基于高通定制的V4L2視頻框架, 最終camera抽象為video文件節(jié)點(diǎn),供用戶層調(diào)用
應(yīng)用層:監(jiān)測(cè)camera數(shù)據(jù)流變化,通過(guò)設(shè)備文件讀寫(xiě)
通信層:源碼中,camera數(shù)據(jù)流以兩種方式和模型層通信,即Client/Server模式和
Subscriber/Publish模式前者主要用于傳輸圖像數(shù)據(jù),后者用于消息節(jié)點(diǎn)通信
對(duì)應(yīng)的camera流程圖如圖所示
5.2 Supercombo模型
關(guān)于模型分析這部分,我們主要從整體去分析supercombo模型的網(wǎng)絡(luò)結(jié)構(gòu),從宏觀上了解Openpilot模型這部分的工作。實(shí)際上一個(gè)模型從設(shè)計(jì)到應(yīng)用于量產(chǎn)產(chǎn)品中,至少包括兩個(gè)部分,
因此,更多深入的細(xì)節(jié)方面,后續(xù)我們會(huì)單獨(dú)推出兩個(gè)系列,重點(diǎn)說(shuō)明我們?cè)谀P蛷?fù)現(xiàn)和模型部署方面的工作。
通過(guò)netron將源碼中supercombo.onnx模型文件打開(kāi),可以看出,整體模型結(jié)構(gòu)還是比較精簡(jiǎn)的,分為Backone,GRU,Head三部分。
- Model input
從模型輸入可以看出,網(wǎng)絡(luò)圖像Input size: 12, 128(H), 256(W),格式為YUV420,具體轉(zhuǎn)換過(guò)程
- 原始輸入三通道RGB(256*512*3),每幀RGB轉(zhuǎn)換成6通道YUV格式(6*128*256)
- 取兩個(gè)連續(xù)幀作為模型輸入,因此,輸入大小為(12*128*256)
- Backbone
網(wǎng)絡(luò)backbone部分,采用了Google團(tuán)隊(duì)的Efficientnet-B2結(jié)構(gòu)(EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks)。該結(jié)構(gòu)采用復(fù)合縮放策略,主要特點(diǎn)是效果好,速度快。卷積部分下采樣5次,為了減少參數(shù)量,有幾個(gè)conv是采用group conv,激活函數(shù)函數(shù)采用Elu
- GRU部分
網(wǎng)絡(luò)同時(shí)引入了時(shí)序結(jié)構(gòu)(GRU),把歷史信息encode在 h_t中,輸入狀態(tài)信息(desire)到模型;輸出Pose, desire_predict, plan, lead(object), lane等信息,經(jīng)過(guò)我們后續(xù)模型復(fù)現(xiàn)驗(yàn)證,GRU對(duì)整個(gè)模型起到了比較重要作用(后續(xù)可關(guān)注我們的模型復(fù)現(xiàn)系列)
- Head部分
Head部分主要輸出三部分policy信息,具體地
- 左側(cè)frame policy 出Pose, meta
- 中間temporal policy 出planning, lead信息
- 右側(cè)temporal policy 出lanes信息
- Model output
接下來(lái),我們來(lái)分析一下模型輸出數(shù)據(jù)含義,以及它是如何形成形成輸出的message的。
首先,關(guān)于損失函數(shù),模型輸出了自車(chē)多個(gè)未來(lái)軌跡預(yù)測(cè),軌跡預(yù)測(cè)損失函數(shù)采用MPH(Multiple Hypothesis Prediction)方法,此處參考?https://github.com/commaai/openpilot/discussions/19535
這里的MPH方法,可以參考Multimodal Trajectory Predictions for Autonomous Driving using Deep Convolutional Networks
文章中方法和MPH類似,這里的multimodal應(yīng)該指的自車(chē)多個(gè)未來(lái)軌跡預(yù)測(cè)
整個(gè)模型輸出包含自車(chē)的plan,lane_lines,road_edge,lead,desire_state,metadata,pose等多個(gè)信息,詳細(xì)的框架圖如圖所示
- 網(wǎng)絡(luò)輸出到建立消息的過(guò)程
- plan的每個(gè)group最后一個(gè)量表征該plan group的好壞,選擇概率最大的一個(gè)作為best plan
- lead的每個(gè)group最后三個(gè)量表征該lead group的好壞,分別對(duì)應(yīng)三個(gè)t_offset,對(duì)于每個(gè)t_offset選擇值最大的一個(gè)作為該t_offset下的best lead。
- laneline采用x方向的anchor方法,在0-192m設(shè)置33個(gè)anchor,對(duì)應(yīng)的時(shí)間t來(lái)自best plan。
- 對(duì)plan處理時(shí)采用時(shí)間t的anchor方法,在0-10s設(shè)置33個(gè)anchor
綜合以上分析,我們可以得到一個(gè)比較清晰supercombo模型網(wǎng)絡(luò)結(jié)構(gòu)框圖,
5.3 DMS模型
- 模型輸入格式同樣為YUV,大小(6*320*160)
- Backbone部分,與supercombo模型類似地,dms模型也采用efficientNet的結(jié)構(gòu)
- Head也分成三個(gè)部分,分別為face/eye/summary,值得注意的是,eye head中的前面兩個(gè)(1,8)結(jié)果未放到輸出的msg結(jié)果中(猜測(cè)可能為之前用,現(xiàn)在已經(jīng)deprecated的descriptor)
整體的網(wǎng)絡(luò)結(jié)構(gòu)如圖所示
DMS算法梳理
- Monitor系統(tǒng)僅在接收到driverState時(shí)更新driverMonitoringState
- carState主要提供driver_engaged信息,在driver未操作情況下,
- 首先,在接收到modelV2時(shí)更新pose/blink cfactor,作為判斷distracted的閾值
- 然后,由driverState的結(jié)果計(jì)算pose/blink,計(jì)算歷史所有pose的mean/var
- 最后,計(jì)算awareness,給出不同的alerts
- controlsd接收driverMonitoringState的events及awarenessStatus結(jié)果,當(dāng)awarenessStatus<0時(shí),control端會(huì)給出強(qiáng)制減速指令
算法流程框架圖如圖所示
5.4 Localization算法
首先,介紹一下openpilot坐標(biāo)系
坐標(biāo)系具體信息可參考:?https://github.com/commaai/openpilot/tree/master/common/transformations
為便于理解,大致示意圖如下:
- view frame為相機(jī)坐標(biāo)系,右方為X軸,下方為Y軸,前方為Z軸,為示意將其放在右側(cè)
- device frame位于相機(jī)坐標(biāo)處,前方為X軸,右方為Y軸,下方為Z軸
- car frame為device frame下方的在road平面上的坐標(biāo)系
- calibrated frame為在相機(jī)處的,以car frame的pitch/yaw,device frame的roll組成的坐標(biāo)系,也為model輸出幀
localizationd模塊部分實(shí)現(xiàn)功能
- 接收模型輸出cameraOdometry進(jìn)行在線標(biāo)定,(實(shí)際上為device frame-calibrated/car frame之間的轉(zhuǎn)換關(guān)系),此處的標(biāo)定不考慮roll情況
- 接收ublox gnss結(jié)果
- 根據(jù)gnss、cameraOdometry、imu等傳感器信息通過(guò)卡爾曼濾波進(jìn)行最有狀態(tài)估計(jì),得到精確定位
- 根據(jù)定位及carState對(duì)car Params進(jìn)行更新
Calibrationd相關(guān)
- 需滿足條件Straight and fast (25km/h)
- Rpy, trans from ModelV2 camera odometry
- 實(shí)際上是較簡(jiǎn)單的加權(quán)平均,結(jié)合有效性判斷
- 實(shí)際上不考慮roll
核心代碼部分
- 在基本直線運(yùn)動(dòng)情況下,根據(jù)trans直接計(jì)算rpy
- rpys保存至多50個(gè)rpy,對(duì)rpys和new_rpy進(jìn)行加權(quán)平均(共100個(gè))記錄到rpys中,最終rpy結(jié)果為前valid_blocks個(gè)rpy的均值
- 在update_status()中,對(duì)更新的rpy進(jìn)行有效性判斷,并在前valid_blocks個(gè)rpy差值過(guò)大(2 deg)時(shí),重新reset到前一次的rpy結(jié)果
Localization
- 接收gps/gyro/accelerator/vEgo/cameraOdometry/liveCalibration,通過(guò)KF得到最終的定位結(jié)果
- 如果event的時(shí)間與kf時(shí)間差過(guò)大,current_time - filter_time > 10時(shí),reset KF到初始狀態(tài)
- 除senseEvents中更新時(shí)用sensor帶的timestamp,其余用sm log對(duì)應(yīng)的monoTime;若sensor time與logMonoTime差大于100ms,舍棄該sensor reading
- 僅在接收到cameraOdometry時(shí)發(fā)送liveLocationKalman消息
根據(jù)以上分析,得到整體的算法流程如圖所示
5.5 Planner/Controls算法
Radard部分作用
- 首先對(duì)RadarData中的點(diǎn)進(jìn)行track以及Kalman Filter的update,再利用fastcluster算法合并鄰近的track
- 把modelV2感知模型結(jié)果和radar信息融合,具體的融合算法思路
- match_vision_to_cluster()方程中,對(duì)模型結(jié)果中的lead和clusters,計(jì)算d/y/v的laplacian_cdf乘積,選取最大的作為匹配的cluster
- 若有匹配的cluster,則設(shè)radar cluster為lead結(jié)果;若無(wú)則設(shè)模型輸出的lead為最終結(jié)果
- 在v_ego較小且目標(biāo)cluster較近(yRel<1.5, dRel<25),如果此時(shí)比先前得到的lead結(jié)果更近時(shí),override先前結(jié)果
- modelV2的第一個(gè)lead,get_lead()時(shí)設(shè)置參數(shù)low_speed_override=True,第二個(gè)設(shè)為False
整體的算法流程圖
Plannerd/Control算法分析
- Plannerd中包含兩個(gè)方向,即橫向和縱向的plan,兩者互相獨(dú)立
- Lateral控制會(huì)輸入感知模型信息
- Longitudinal控制只有radar信息(但是radarState也有融合結(jié)果?)
- MPC(model predictive control)使用ACADO(Automatic Control and Dynamic Optimization) Toolkit進(jìn)行解算,MPC核心代碼參考:controls/lib/lateral_planner.py#L180
- Longitudinal方向采用PID控制
- Lateral方向根據(jù)車(chē)型,采用不同控制算法,包括PID,LQR,INDI等
- 車(chē)輛的控制信號(hào)通過(guò)CAN發(fā)送給車(chē)輛控制器
算法流程圖
6.后記
本文對(duì)Openpilot開(kāi)源項(xiàng)目進(jìn)行了整體介紹,包括系統(tǒng)架構(gòu),硬件配置,安全規(guī)范體系,生態(tài)體系等。為了更深入的了解它,我們還重點(diǎn)分析了軟件算法,包括camera數(shù)據(jù)流,感知模型,定位以及規(guī)控。后續(xù)我們會(huì)基于此進(jìn)行實(shí)車(chē)評(píng)測(cè),看實(shí)際功能表現(xiàn)如何,并進(jìn)行量化性能分析和一些典型場(chǎng)景分析,歡迎持續(xù)關(guān)注后續(xù)更新。
參考
https://github.com/commaai
https://blog.comma.ai/end-to-end-lateral-planning/
https://blog.comma.ai/towards-a-superhuman-driving-agent/
https://desosa.nl/projects/openpilot/2020/03/11/from-vision-to-architecture.html
comma AI - 知乎
comma.openpilot 的規(guī)劃控制 - 知乎
comma.openpilot底盤(pán)接口及其實(shí)現(xiàn) - 知乎
https://www.its404.com/article/yufeilongyuan/122217990
https://www.thedrive.com/tech/36604/we-tested-openpilot-the-1199-device-that-adds-entry-level-autonomy-to-your-car
https://medium.com/@chengyao.sh
總結(jié)
以上是生活随笔為你收集整理的Openpilot EP1:Openpilot开源项目深度解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 文本三剑客之sed命令--文本替换;gr
- 下一篇: 伺服选型计算