日本无码免费高清在线|成人日本在线观看高清|A级片免费视频操逼欧美|全裸美女搞黄色大片网站|免费成人a片视频|久久无码福利成人激情久久|国产视频一二国产在线v|av女主播在线观看|五月激情影音先锋|亚洲一区天堂av

  • 手機(jī)站
  • 小程序

    汽車測試網(wǎng)

  • 公眾號
    • 汽車測試網(wǎng)

    • 在線課堂

    • 電車測試

百度Apollo7.0 規(guī)劃算法框架解析(干貨)

2022-02-07 15:30:29·  來源:智車科技  作者:Steve  
 
本篇文章想和大家分享一下Apollo7.0最新的規(guī)劃算法。由于Apollo的planning整體代碼都相當(dāng)龐大,一開始還是理清其框架,再分算法塊逐個(gè)擊破這樣效果更好。這篇文
本篇文章想和大家分享一下Apollo7.0最新的規(guī)劃算法。由于Apollo的planning整體代碼都相當(dāng)龐大,一開始還是理清其框架,再分算法塊逐個(gè)擊破這樣效果更好。
這篇文章希望能帶領(lǐng)讀者理清planning的整體框架,梳理數(shù)據(jù)流,以主要場景為例,一直分析到task (apollo planning 的主要算法所在處)邏輯前的準(zhǔn)備工作、輸入如何構(gòu)造的,之后再深入看task內(nèi)部的細(xì)節(jié)也更容易理解。
特別注意,本文中的流程圖均為作者花費(fèi)了大量時(shí)間梳理而來,以便讀者能夠更易理解planning的整體框架,抓住重點(diǎn)不被細(xì)節(jié)帶跑偏。
planning 的輸入輸出
讀懂一個(gè)模塊,首先必然是了解其的上下游,即輸入輸出是什么。熟悉Apollo CyberRT框架的小伙伴都知道在該框架下,輸入輸出由Reader和Writer構(gòu)成,并定義在每個(gè)模塊的component文件中。除此之外,CyberRT框架定義了兩種模式,分別為消息觸發(fā)和時(shí)間觸發(fā),而planning中采用的為消息觸發(fā),因此必須接到特定的上游消息后,才會(huì)進(jìn)入內(nèi)部主邏輯,而消息觸發(fā)的上游消息,定義為component中Process()函數(shù)的入?yún)ⅰ?

因此總結(jié)來看,planning的上下游關(guān)系總結(jié)為下圖:
這里再重復(fù)一下,planning的輸入分為Reader和Process()入?yún)⒌脑蛟谟?,planning依賴于Process()的三個(gè)上游輸入,只有同時(shí)接到這三個(gè)輸入,才會(huì)觸發(fā)planning的主邏輯,即是planning正常啟動(dòng)的必要條件。而Reader則不是,其中部分上游還依賴于配置參數(shù)是否打開,具體可以查看Apollo的源碼。
planning的輸出就比較簡單了,主要是給控制的ADCTrajectory數(shù)據(jù),包含了一條帶時(shí)間、速度的軌跡點(diǎn)集,具體的格式定義可以查看對應(yīng)的proto文件。
planning 整體框架

上面兩張流程圖是我整理的Apollo規(guī)劃算法的框架,整體框架和之前并無太大變化。主框架分為兩個(gè)線程,子線程ReferenceLineProvider以20HZ的頻率運(yùn)行,用于計(jì)算planning中最重要的數(shù)據(jù)結(jié)構(gòu)reference_line;主線程上還是基于場景劃分的思路,多數(shù)場景下還是采用基于ReferenceLine的規(guī)劃算法,對于泊車相關(guān)場景,則利用open space算法。目前Apollo的場景劃分為了16種,在proto文件中可以查看到。在Apollo 7.0中,新增了deadend_turnaround場景,用于無人車遇到斷頭路時(shí),采用openspace的方法進(jìn)行調(diào)頭的軌跡規(guī)劃,后續(xù)我會(huì)詳細(xì)看一下里面的算法實(shí)現(xiàn)細(xì)節(jié)。

planning中的場景管理
Apollo中的規(guī)劃里的一個(gè)重要思想就是基于場景劃分來調(diào)用不同的task處理,而其中如何進(jìn)行場景分配便是實(shí)現(xiàn)該思想的核心。從上面的配置參數(shù)可以看到目前Apollo設(shè)定了16種場景,而場景下的具體切換邏輯也比較復(fù)雜,scenario_manager的具體流程邏輯如下圖所示:
在上圖紅框中的場景判斷中,我只畫了第一步的場景判斷,紅框內(nèi)的5種場景為大類,剩余的場景在這5大類中再細(xì)分做出判斷。另外需要注意的是,紅框內(nèi)的5種場景是有優(yōu)先級順序的,即如果判斷為某種場景后,后續(xù)的場景也就不再判斷。下面從這5種場景出發(fā),介紹一下Apollo中的場景判斷條件,以及每個(gè)大類場景下包含哪些細(xì)分的場景小類。
1. ParkAndGo
該場景的判斷條件為車輛是否靜止,并且距離終點(diǎn)10m以上,并且當(dāng)前車輛已經(jīng)off_lane或者不在城市道路上,在該場景下采用的是open_space相關(guān)的算法。個(gè)人感覺該場景在駛離目標(biāo)車道并正常規(guī)劃失敗導(dǎo)致的停車時(shí)會(huì)觸發(fā),利用open_space方法使其重新回到正常道路上,因此也是場景判斷中首先需要check的。
2. Intersection
在該場景下,又可細(xì)分四個(gè)場景。首先,根據(jù)先前計(jì)算的地圖中第一個(gè)遇到的overlap來確定大類型,是包含交通標(biāo)識的交叉口,還是其他交叉口。其次,若是包含交通標(biāo)識的交叉口,還細(xì)分為stop_sign、traffic_light以及yield_sign,具體結(jié)構(gòu)圖如下所示。
3. PullOver
PullOver場景即靠邊停車,需要滿足以下條件才可切換到該場景:
  • 不在change_line的時(shí)候,即reference_line只有一條
  • 當(dāng)前位置距離終點(diǎn)在一定范圍內(nèi)并且滿足pullover可以執(zhí)行的最短距離
  • 地圖中能夠找到pullover的位置
  • 終點(diǎn)的位置不在交叉路口附近
  • 能查找到最右邊車道的lane_type,并且該車道允許pullover
  • 只有從lane_follow場景下才能切換到pullover
大體邏輯如上述所示,具體的參數(shù)設(shè)置可以查看代碼。
4. ValetParking
ValetParking場景即代客泊車,判斷邏輯如下:
  • 從routing中得到target_parking_spot_id
  • 從地圖中搜索是否存在path能夠抵達(dá)該parking_spot
  • 查詢當(dāng)前位置至parking_spot的距離,滿足條件即可切換至該場景
5. DeadEnd
Apollo 7.0中新增的斷頭路場景,增加了"三點(diǎn)掉頭"功能,增加了駛?cè)腭偝龅哪芰?,擴(kuò)展了城市路網(wǎng)運(yùn)營邊界。"三點(diǎn)掉頭"功能基于open space planner框架,包含以下幾個(gè)部分:斷頭路場景轉(zhuǎn)換、開放空間ROI構(gòu)建、掉頭軌跡規(guī)劃。下列圖片展現(xiàn)了從進(jìn)入DeadEnd到駛離DeadEnd的整個(gè)過程,后續(xù)我也會(huì)詳細(xì)了解該算法實(shí)現(xiàn)邏輯。

上面就是Apollo中的場景切換及管理邏輯。在每個(gè)場景scenario下,還分為一個(gè)或多個(gè)stage,而每個(gè)stage下面,又劃分了多個(gè)task來完成相應(yīng)的規(guī)劃任務(wù)。以用到最多的lane_follow場景為例,它就包含了一個(gè)stage——lane_follow_default_stage,而在這個(gè)stage下包含了多個(gè)task,如下圖所示:
仔細(xì)查看lane_follow場景下的task,我們可以看出Apollo的規(guī)劃思路也是橫縱向解耦,先規(guī)劃path,再規(guī)劃speed。具體的,對于path來說,先做出是否需要lane_change或者lane_borrow的決策,再根據(jù)決策狀態(tài)來生成凸空間,最終基于reference_line及凸空間求解一個(gè)二次優(yōu)化問題,從而得到優(yōu)化后的path。對于speed來說,是基于ST圖進(jìn)行DP+QP的優(yōu)化方法,先利用DP來找到一個(gè)cost值最小的可行解,再利用QP對可行解進(jìn)行平滑,得到最終平滑后的ST圖點(diǎn)集。最終,基于s值對path和speed進(jìn)行融合,得到一條平滑的軌跡。
總結(jié)
至此,Apollo 7.0 planning的核心框架及核心算法的輸入都已經(jīng)解釋清楚了,總體來看Apollo規(guī)劃的整體思路非常清晰,但是細(xì)節(jié)部分真的需要花費(fèi)大量時(shí)間來理解,我覺得如果沒能將這套算法部署到實(shí)車上跑過的話,很多算法可能真的無法很好地理解。
我個(gè)人也陸陸續(xù)續(xù)看這套代碼有兩年多了,始終覺得很多細(xì)節(jié)都沒有深入理解透,代碼光看是肯定不行的,如果沒有條件在實(shí)車,或者是仿真里實(shí)際運(yùn)行,解決相應(yīng)場景下遇到的問題的話,是始終不能轉(zhuǎn)變?yōu)樽约旱闹R的,希望與大家共勉,也歡迎大家有任何疑問在評論區(qū)留言交流。
分享到:
 
反對 0 舉報(bào) 0 收藏 0 評論 0
滬ICP備11026917號-25