駕駛決策規(guī)劃從零搭建:行為決策、運(yùn)動(dòng)規(guī)劃與工程避坑指南)
簡(jiǎn)介自動(dòng)駕駛決策規(guī)劃是自動(dòng)駕駛系統(tǒng)中的核心環(huán)節(jié)。這份PDF講義面向自動(dòng)駕駛初學(xué)者、高校相關(guān)專業(yè)學(xué)生及剛?cè)腴T的工程師清晰梳理預(yù)測(cè)、決策與規(guī)劃的整體架構(gòu)幫助讀者快速建立知識(shí)框架。資源包內(nèi)僅含1個(gè)PDF文件容量約7.3MB下載后即可閱讀截至目前已有136人學(xué)習(xí)/下載該資料適合作為自學(xué)入門或課程預(yù)習(xí)材料。內(nèi)容涵蓋自動(dòng)駕駛的定義、級(jí)別與分類、系統(tǒng)組成并梳理了從DARPA挑戰(zhàn)賽到Waymo、百度Apollo等標(biāo)志性發(fā)展歷程重點(diǎn)剖析預(yù)測(cè)決策規(guī)劃模塊的重要性與所需的課程基礎(chǔ)技能同時(shí)附有相關(guān)參考文獻(xiàn)。整份講義結(jié)構(gòu)緊湊、要點(diǎn)突出能幫助讀者在較短時(shí)間內(nèi)了解自動(dòng)駕駛決策規(guī)劃的研究背景與核心命題。1. 自動(dòng)駕駛決策規(guī)劃先想清楚“下一步做什么”再談怎么開新手最容易把決策規(guī)劃誤解成“給車找一條路”實(shí)際上它回答的是兩個(gè)遞進(jìn)問題在當(dāng)前路口、當(dāng)前車流、當(dāng)前信號(hào)下這輛車應(yīng)該做什么以及具體怎么走。前者是行為決策后者是運(yùn)動(dòng)規(guī)劃。一套能上路的決策規(guī)劃系統(tǒng)必須在幾百毫秒內(nèi)完成從場(chǎng)景理解到軌跡輸出的整個(gè)鏈路而且要保證這個(gè)輸出是可解釋、可審查、可回退的。這個(gè)模塊決定了乘客是覺得“這車像個(gè)老司機(jī)”還是“這車像個(gè)剛拿駕照的愣頭青”。本文面向想從零搭建或接手維護(hù)決策規(guī)劃模塊的工程師講清楚這套東西的內(nèi)部結(jié)構(gòu)、最小可復(fù)現(xiàn)的落地路徑以及那些只在實(shí)車和復(fù)雜場(chǎng)景里才會(huì)暴露的坑。2. 決策規(guī)劃在自動(dòng)駕駛鏈路里的位置上游吃什么、下游交什么2.1 與感知、預(yù)測(cè)、控制的邊界誰為誰服務(wù)自動(dòng)駕駛軟件棧里感知負(fù)責(zé)回答“周圍有什么”預(yù)測(cè)負(fù)責(zé)回答“這些東西接下來會(huì)怎么動(dòng)”決策規(guī)劃負(fù)責(zé)回答“我們接下來做什么、怎么動(dòng)”控制負(fù)責(zé)把規(guī)劃出來的軌跡真正執(zhí)行到轉(zhuǎn)向和加減速上。四個(gè)模塊的接口關(guān)系很明確感知輸出目標(biāo)列表和車道線預(yù)測(cè)輸出每個(gè)目標(biāo)未來數(shù)秒的軌跡概率決策規(guī)劃接收這些信息后生成一條滿足動(dòng)力學(xué)約束、交規(guī)和舒適性要求的軌跡下發(fā)給控制模塊跟蹤。這里有一個(gè)常見誤用很多人把預(yù)測(cè)并進(jìn)決策規(guī)劃里做理由是“我根據(jù)當(dāng)前距離直接決定跟車還是剎車就行了”。這在低速園區(qū)場(chǎng)景能糊弄過去一上城市快速路就翻車。原因在于決策規(guī)劃需要的是未來時(shí)域上的交互判斷而不是當(dāng)前時(shí)刻的瞬時(shí)距離。旁車道車輛未來2秒會(huì)不會(huì)切入、前車剎車燈亮起后會(huì)不會(huì)急停這些判斷如果全部堆進(jìn)決策模塊規(guī)則會(huì)迅速膨脹到無法維護(hù)。所以常見做法是保持預(yù)測(cè)作為獨(dú)立輸入源決策規(guī)劃只消費(fèi)預(yù)測(cè)結(jié)果自己專注在行為選擇和軌跡生成上。從數(shù)據(jù)流上看決策規(guī)劃的輸入至少包含四類高精地圖或等效的路線信息、本車狀態(tài)位置、速度、航向、加速度、障礙物預(yù)測(cè)軌跡、交通規(guī)則信息信號(hào)燈、標(biāo)志、路權(quán)。輸出只有一類一條帶時(shí)間戳的軌跡通常是未來6到8秒內(nèi)、每隔0.1秒一個(gè)路徑點(diǎn)每個(gè)點(diǎn)包含位置、速度、加速度和航向角。2.2 行為決策與運(yùn)動(dòng)規(guī)劃的分工一個(gè)管“做什么”一個(gè)管“怎么做”把決策規(guī)劃拆成兩層是我見過的所有工程化方案里最穩(wěn)的做法。行為決策層接收?qǐng)鼍俺橄蠼Y(jié)果輸出一個(gè)離散的行為指令比如“當(dāng)前車道跟車”“向左換道”“路口停車等待”“減速讓行”。運(yùn)動(dòng)規(guī)劃層接收這個(gè)指令輸出一條具體軌跡。拆開的核心原因是復(fù)雜度隔離行為決策要處理的是交規(guī)、路權(quán)、禮讓規(guī)則這種偏離散的邏輯而運(yùn)動(dòng)規(guī)劃要處理的是曲線、約束、優(yōu)化這種偏連續(xù)的計(jì)算兩者混在一起任何一方的改動(dòng)都會(huì)牽連另一方。兩層之間的接口需要精心設(shè)計(jì)。我一般把行為決策的輸出定義為一個(gè)結(jié)構(gòu)化的意圖元組包含三部分目標(biāo)參考線比如左換道的目標(biāo)車道中心線、行為類型跟車/巡航/停車/換道/繞障、約束條件最大速度限制、允許的橫向偏移范圍、最短完成時(shí)間。運(yùn)動(dòng)規(guī)劃拿到這個(gè)意圖元組后在參考線附近做軌跡采樣或優(yōu)化求解而不是直接從頭生成任意軌跡。這樣行為決策負(fù)責(zé)“選對(duì)”運(yùn)動(dòng)規(guī)劃負(fù)責(zé)“做穩(wěn)”。這里有一個(gè)值得反復(fù)強(qiáng)調(diào)的原則行為決策寧可保守運(yùn)動(dòng)規(guī)劃不可魯莽。因?yàn)樾袨闆Q策錯(cuò)了后果是走錯(cuò)路或者過度等待最多是效率損失運(yùn)動(dòng)規(guī)劃錯(cuò)了直接表現(xiàn)為碰撞或劇烈車身姿態(tài)變化。所以在系統(tǒng)設(shè)計(jì)上運(yùn)動(dòng)規(guī)劃必須有獨(dú)立于行為決策的安全兜底比如實(shí)時(shí)計(jì)算緊急制動(dòng)軌跡的能力防止上游邏輯出錯(cuò)時(shí)無路可走。表兩類方法的選型傾向維度規(guī)則式狀態(tài)機(jī)/決策樹學(xué)習(xí)式模仿學(xué)習(xí)/強(qiáng)化學(xué)習(xí)可解釋性高每條邏輯能回溯低黑匣子特征明顯開發(fā)周期快適合快速跑通慢需要數(shù)據(jù)閉環(huán)和訓(xùn)練設(shè)施長(zhǎng)尾覆蓋靠堆規(guī)則易膨脹靠數(shù)據(jù)理論上覆蓋更廣安全認(rèn)證更容易通過審查需要額外做形式化驗(yàn)證適用階段量產(chǎn)前的原型和早期落地?cái)?shù)據(jù)量積累后的體驗(yàn)優(yōu)化3. 搭建最小決策規(guī)劃框架狀態(tài)機(jī)、采樣與代價(jià)評(píng)估3.1 場(chǎng)景抽象把感知輸出變成決策能用的結(jié)構(gòu)化輸入在寫任何決策邏輯之前先要做場(chǎng)景抽象這是新手最容易跳過的環(huán)節(jié)。感知輸出的原始數(shù)據(jù)是目標(biāo)列表、車道線點(diǎn)集、紅綠燈狀態(tài)直接拿這些東西寫規(guī)則會(huì)寫成一團(tuán)亂麻。我一般把這個(gè)抽象層定義為場(chǎng)景快照Scene Snapshot在一個(gè)統(tǒng)一的數(shù)據(jù)結(jié)構(gòu)里把決策需要用到的要素全部整理好本車所在車道、左右相鄰車道是否可通行、前方最近障礙物的距離和速度、本車道限速、當(dāng)前信號(hào)燈狀態(tài)、路線規(guī)劃給出的下一段路徑方向。場(chǎng)景快照里最關(guān)鍵的是把障礙物映射到車道坐標(biāo)系下。注意這里我強(qiáng)調(diào)的是車道坐標(biāo)系而不是車輛坐標(biāo)系。車體坐標(biāo)系適合做控制不適合做決策因?yàn)闆Q策要回答的是“我在車道上的哪個(gè)位置、和前車差多少”這在車道坐標(biāo)系下直接就是一個(gè)縱向距離值。常見做法是把全局笛卡爾坐標(biāo)投影到參考線上得到每個(gè)目標(biāo)的縱向距離s和橫向偏移l這個(gè)(s,l)表示一旦建立跟車、換道、路口判斷全部變成了基于s和l的比較運(yùn)算邏輯瞬間清晰。場(chǎng)景抽象還有一個(gè)重要作用隔離感知噪聲。原始感知目標(biāo)的尺寸、速度時(shí)常抖動(dòng)直接用于決策會(huì)導(dǎo)致行為頻繁跳變。我在場(chǎng)景快照里會(huì)對(duì)目標(biāo)做時(shí)間濾波比如對(duì)前車距離做一階低通濾波對(duì)目標(biāo)存在的置信度設(shè)置閾值置信度不足的目標(biāo)只做威懾性減速不觸發(fā)換道等激進(jìn)決策。3.2 行為決策狀態(tài)機(jī)用最少的狀態(tài)覆蓋最多的場(chǎng)景狀態(tài)機(jī)是行為決策層最常見的工程實(shí)現(xiàn)沒有之一。核心思想是把駕駛行為建模成有限個(gè)狀態(tài)比如巡航、跟車、換道、停車等待、通過路口狀態(tài)之間通過遷移條件切換。它的優(yōu)勢(shì)是確定性強(qiáng)、可調(diào)試、符合人類對(duì)駕駛邏輯的認(rèn)知。下面是一個(gè)典型的狀態(tài)機(jī)骨架from enum import Enum from dataclasses import dataclass class BehaviorState(Enum): CRUISE 巡航 FOLLOW 跟車 LANE_CHANGE 換道 STOP_WAIT 停車等待 EMERGENCY_STOP 緊急停車 dataclass class SceneSnapshot: ego_speed: float # 本車速度 m/s lead_distance: float # 前車縱向距離 m lead_speed: float # 前車速度 m/s is_left_lane_free: bool is_right_lane_free: bool has_stop_signal: bool time_to_decision: float # 用于防止?fàn)顟B(tài)頻繁切換的駐留計(jì)時(shí) class BehaviorDecision: def __init__(self): self.state BehaviorState.CRUISE self.state_hold_time 0.0 # 當(dāng)前狀態(tài)已持續(xù)時(shí)間 def decide(self, snap: SceneSnapshot, dt: float) - BehaviorState: # 緊急停車優(yōu)先級(jí)最高不參與正常狀態(tài)遷移 if snap.lead_distance 2.0: return self._enter_state(BehaviorState.EMERGENCY_STOP, dt) # 根據(jù)前方車輛距離和速度判斷是否從巡航切入跟車 if self.state BehaviorState.CRUISE: if snap.lead_distance 30.0 and snap.lead_speed snap.ego_speed: return self._enter_state(BehaviorState.FOLLOW, dt) elif self.state BehaviorState.FOLLOW: # 跟車狀態(tài)加了駐留條件前車距離拉大到40米以上才退出 if snap.lead_distance 40.0 and snap.lead_speed snap.ego_speed: return self._enter_state(BehaviorState.CRUISE, dt) # 換道、路口的處理邏輯按同樣的模式擴(kuò)展 return self.state def _enter_state(self, new_state: BehaviorState, dt: float): if new_state ! self.state: self.state_hold_time 0.0 else: self.state_hold_time dt self.state new_state return self.state這段代碼的邏輯要點(diǎn)全在“駐留時(shí)間”state_hold_time這個(gè)變量上。自動(dòng)駕駛里有個(gè)非常典型的失控場(chǎng)景叫決策震蕩車在“跟車”和“巡航”之間以幾赫茲的頻率來回切換表現(xiàn)就是乘客感覺到車輛一直在輕微地一竄一竄。引入駐留時(shí)間后狀態(tài)切換必須滿足最低持續(xù)時(shí)間這個(gè)時(shí)間我一般設(shè)置在0.5到1.5秒之間具體取值取決于上游感知的抖動(dòng)程度。感知噪聲大就把駐留時(shí)間設(shè)長(zhǎng)一些代價(jià)是決策反應(yīng)變慢感知穩(wěn)定就設(shè)短一些保證車輛對(duì)動(dòng)態(tài)場(chǎng)景響應(yīng)及時(shí)。另一個(gè)要點(diǎn)是緊急停車狀態(tài)獨(dú)立于正常狀態(tài)機(jī)之外且優(yōu)先級(jí)最高。這樣設(shè)計(jì)是為了防止正常狀態(tài)遷移邏輯在極端場(chǎng)景下產(chǎn)生“死鎖”——比如前車急停時(shí)狀態(tài)機(jī)還在糾結(jié)是否符合換道條件而緊急停車已經(jīng)直接接管。工程上這叫降級(jí)路徑優(yōu)先是決策模塊的安全底線。3.3 運(yùn)動(dòng)規(guī)劃采樣生成候選軌跡并打分行為決策給出了意圖運(yùn)動(dòng)規(guī)劃要把意圖變成軌跡。最常見且對(duì)新手最友好的方法是采樣法在Frenet坐標(biāo)系下生成一批候選軌跡然后用代價(jià)函數(shù)逐一評(píng)價(jià)選代價(jià)最低的作為輸出。Frenet坐標(biāo)系在這里的優(yōu)勢(shì)是縱向運(yùn)動(dòng)速度控制和橫向運(yùn)動(dòng)車道內(nèi)偏移可以解耦計(jì)算生成軌跡的語義非常清晰。import numpy as np def generate_candidates(s0, s_dot0, l0, l_dot0, l_ddot0, dt0.1, horizon6.0, lateral_samples5): 生成橫向偏移采樣對(duì)應(yīng)的候選軌跡族 candidates [] # 橫向目標(biāo)偏移l_target從-2.0到2.0米覆蓋相鄰車道范圍 for l_target in np.linspace(-2.0, 2.0, lateral_samples): # 用五次多項(xiàng)式擬合橫向運(yùn)動(dòng)保證初始位置/速度/加速度連續(xù) l_traj np.poly1d(np.polyfit( [0, horizon], [l0, l_target], deg2 # 簡(jiǎn)化示例工程上會(huì)用五次多項(xiàng)式約束邊界狀態(tài) )) # 縱向采用梯形速度規(guī)劃目標(biāo)速度從當(dāng)前速度向限速過渡 s_dot_target min(s_dot0 2.0, 16.0) # 最大加速度2m/s^2, 限速16m/s s_traj np.zeros(int(horizon / dt) 1) for i, t in enumerate(np.arange(0, horizon dt, dt)): s_traj[i] s0 s_dot0 * t 0.5 * 2.0 * t * t candidates.append((s_traj, l_traj, l_target)) return candidates def evaluate_candidates(candidates, obstacles): best_cost float(inf) best_traj None for s_traj, l_traj, l_target in candidates: cost 0.0 # 代價(jià)1偏離參考線太多橫向偏移代價(jià) cost abs(l_target) * 1.5 # 代價(jià)2與障礙物的縱向距離越近代價(jià)越高 for obs in obstacles: if obs[s] s_traj[-1] and abs(obs[l] - l_target) 1.5: cost 10.0 / max(obs[s] - s_traj[0], 0.1) # 代價(jià)3速度越低代價(jià)越高鼓勵(lì)順暢通行 cost (16.0 - s_traj[-1] / horizon) * 0.2 if cost best_cost: best_cost cost best_traj (s_traj, l_traj) return best_traj, best_cost這個(gè)示例里的代價(jià)函數(shù)故意做得簡(jiǎn)單但三個(gè)代價(jià)項(xiàng)代表了運(yùn)動(dòng)規(guī)劃中最核心的權(quán)衡維度橫向偏差代價(jià)懲罰“亂并線”障礙物距離代價(jià)懲罰“貼臉走”速度代價(jià)懲罰“龜速”。實(shí)際工程里的代價(jià)函數(shù)會(huì)擴(kuò)展到十幾個(gè)量級(jí)比如加加速度舒適性、換道完成時(shí)間效率、與預(yù)測(cè)軌跡的交匯概率風(fēng)險(xiǎn)但整體框架都是這個(gè)采樣加打分的樣子。參數(shù)調(diào)整上最值得認(rèn)真調(diào)的是橫向采樣間隔和軌跡時(shí)長(zhǎng)。橫向采樣間隔決定車輛在車道內(nèi)的“細(xì)膩程度”間隔太大比如1米以上會(huì)漏掉最優(yōu)偏移間隔太小比如0.1米會(huì)導(dǎo)致相鄰候選軌跡差異極小代價(jià)函數(shù)對(duì)噪聲極其敏感軌跡輸出會(huì)抖。我常用的起始值是0.5米。軌跡時(shí)長(zhǎng)則決定了規(guī)劃的前瞻性6秒在城市道路夠用上了高速建議加到8秒以上太低會(huì)導(dǎo)致車輛對(duì)遠(yuǎn)距離風(fēng)險(xiǎn)毫無意識(shí)太高則計(jì)算量翻倍且遠(yuǎn)期軌跡在動(dòng)態(tài)場(chǎng)景里基本沒用。3.4 軌跡選擇的安全校驗(yàn)代價(jià)最低不等于安全采樣打分之后還差最后一道工序——安全校驗(yàn)。代價(jià)最低的軌跡只是在“相對(duì)好”里面排第一不代表它物理上安全。這一步要做三件事第一檢查軌跡上的每個(gè)點(diǎn)是否超出道路邊界超出就剔除第二檢查軌跡與控制能力是否匹配比如某個(gè)時(shí)刻要求的方向盤轉(zhuǎn)角超出車輛物理極限說明這條軌跡執(zhí)行不了第三也是最容易遺漏的檢查候選軌跡與障礙物預(yù)測(cè)軌跡是否存在時(shí)空交集。時(shí)空交集檢查是第四維度的檢查——不止看空間上是否經(jīng)過同一個(gè)位置還要看時(shí)間上是否同時(shí)到達(dá)。兩車經(jīng)過同一路口位置但時(shí)間錯(cuò)開2秒物理上是安全的只有空間和時(shí)間都重疊才算碰撞風(fēng)險(xiǎn)。我在做這項(xiàng)檢查時(shí)會(huì)把障礙物的預(yù)測(cè)軌跡也展開成未來數(shù)秒的路徑點(diǎn)序列然后逐幀對(duì)比本車候選軌跡和障礙物軌跡的位置差位置差同時(shí)小于縱向閾值和橫向閾值的幀標(biāo)記為風(fēng)險(xiǎn)幀。只要存在風(fēng)險(xiǎn)幀該候選軌跡直接否決不參與代價(jià)排序。4. 在仿真環(huán)境里跑通閉環(huán)模塊接口與評(píng)測(cè)指標(biāo)4.1 最小閉環(huán)的模塊連接順序有了決策、規(guī)劃模塊后下一步是把它們接到一個(gè)仿真閉環(huán)里跑通。閉環(huán)的意思是感知輸入仿真環(huán)境給的→ 預(yù)測(cè) → 決策 → 規(guī)劃 → 控制 → 車輛模型狀態(tài)更新 → 再回到感知輸入形成一個(gè)循環(huán)。很多新手在這里犯的錯(cuò)誤是只做開環(huán)測(cè)試——把一段錄好的感知數(shù)據(jù)喂給決策規(guī)劃看輸出軌跡是否合理然后就說“系統(tǒng)跑通了”。開環(huán)測(cè)試只能驗(yàn)證邏輯正確性完全驗(yàn)證不了時(shí)間延遲、執(zhí)行偏差和交互行為這三類閉環(huán)才能暴露的問題。我建議的最小閉環(huán)包含四個(gè)文件或模塊仿真接口從仿真器讀取本車狀態(tài)和障礙物信息、決策規(guī)劃節(jié)點(diǎn)消費(fèi)接口數(shù)據(jù)產(chǎn)出軌跡、控制器追蹤軌跡輸出油門剎車轉(zhuǎn)向、車輛模型仿真器內(nèi)置或自建簡(jiǎn)易自行車模型。模塊之間用統(tǒng)一的消息結(jié)構(gòu)傳遞數(shù)據(jù)決策規(guī)劃節(jié)點(diǎn)不關(guān)心上游是仿真器還是實(shí)車傳感器只認(rèn)固定的消息類型。接口先行這是讓決策規(guī)劃模塊之后能平滑遷移到實(shí)車的前提。4.2 仿真配置的典型參數(shù)與場(chǎng)景清單仿真器選擇不重要重要的是場(chǎng)景配置必須覆蓋決策模塊的核心邊界。我一般會(huì)建一個(gè)最小場(chǎng)景集包含五類前車急剎測(cè)試跟車狀態(tài)切換和緊急停車、旁車切入測(cè)試換道決策的時(shí)機(jī)、路口無保護(hù)左轉(zhuǎn)測(cè)試路權(quán)判斷和停車等待、行人橫穿測(cè)試減速讓行、前車低速蠕動(dòng)測(cè)試換道超車的收益判斷。這五個(gè)場(chǎng)景跑通了決策規(guī)劃主流程基本就站住了。表最小閉環(huán)仿真配置建議參數(shù)項(xiàng)建議取值說明仿真步長(zhǎng)10-20 ms控制周期一般比決策周期快5到10倍決策周期100 ms與下游控制解耦防止高頻率決策引發(fā)震蕩軌跡時(shí)長(zhǎng)6-8 s城市道路取6秒高速場(chǎng)景取8秒軌跡點(diǎn)間隔0.1 s太疏則控制插值誤差大太密則計(jì)算量大駐留時(shí)間0.5-1.5 s感知噪聲大取上限場(chǎng)景簡(jiǎn)單取下限安全距離閾值2.0-3.0 m低于這個(gè)距離強(qiáng)制觸發(fā)緊急停車4.3 評(píng)估決策規(guī)劃質(zhì)量的量化指標(biāo)閉環(huán)跑起來之后要回答“這套系統(tǒng)到底行不行”不能光靠肉眼在可視化界面里看方向盤抖不抖。我一直在用的評(píng)估指標(biāo)分成三層。安全層看最小TTC碰撞時(shí)間和最小縱向距離這兩個(gè)指標(biāo)低于閾值直接判定失敗沒有討價(jià)還價(jià)空間。舒適層看加速度變化率加加速度城市道路工況下超過4 m/s3乘客就會(huì)明顯不適。效率層看平均車速和完成特定路段的耗時(shí)用來衡量決策是否過于保守。這三個(gè)層次的指標(biāo)必須分開評(píng)價(jià)不能合成一個(gè)綜合分。合成分會(huì)掩蓋問題的本質(zhì)比如某段路平均車速很高但中間有一次急剎把乘客嚇得不輕綜合分可能顯示良好實(shí)際體驗(yàn)卻很糟糕。正確做法是每次仿真運(yùn)行后把三個(gè)指標(biāo)分別打點(diǎn)畫趨勢(shì)安全指標(biāo)一票否決舒適和效率指標(biāo)做調(diào)參依據(jù)。5. 決策規(guī)劃避坑指南五個(gè)高頻翻車現(xiàn)場(chǎng)與解決路徑5.1 決策震蕩車輛在路口和車流中反復(fù)猶豫現(xiàn)象是車輛在無保護(hù)左轉(zhuǎn)路口出現(xiàn)“走一步、停一步、再走一步、再停”的蠕行或者在同一段路上頻繁變換目標(biāo)車道乘客明顯感到車輛在“糾結(jié)”。原因在于行為決策層對(duì)連續(xù)時(shí)間上的場(chǎng)景變化過度敏感上一幀判“可以通過”下一幀感知到側(cè)方來車速度快立即切成“等待”再過一幀對(duì)方減速又切回“通過”。解決有三個(gè)關(guān)鍵點(diǎn)。第一給每個(gè)狀態(tài)遷移加上駐留時(shí)間這個(gè)前面代碼里已經(jīng)實(shí)現(xiàn)。第二引入決策歷史緩沖記錄過去1秒內(nèi)的決策序列只有連續(xù)3幀以上判定同一個(gè)行為才真正切換狀態(tài)。第三針對(duì)路口這種高復(fù)雜度場(chǎng)景設(shè)置獨(dú)立的決策狀態(tài)——進(jìn)入路口區(qū)域后鎖定“通過”或“等待”直到完全離開路口再恢復(fù)常規(guī)狀態(tài)機(jī)從機(jī)制上杜絕中途反悔。5.2 規(guī)劃軌跡“看起來平滑、執(zhí)行起來發(fā)飄”現(xiàn)象是可視化界面上軌跡曲線非常平滑但實(shí)車或高精度車輛模型執(zhí)行時(shí)方向盤頻繁修正車身出現(xiàn)輕微的左右搖擺。原因是采樣法生成的軌跡在空間上平滑但相鄰兩個(gè)決策周期的軌跡時(shí)間序列沒有連續(xù)性約束。上一幀規(guī)劃的末點(diǎn)和新一幀規(guī)劃的起點(diǎn)之間存在加速度跳變控制器在切換追蹤目標(biāo)時(shí)會(huì)產(chǎn)生抖動(dòng)。解決問題的手段叫軌跡延續(xù)性約束。具體做法是每次規(guī)劃時(shí)把上一幀輸出軌跡的后半段作為新一幀采樣的一個(gè)必選候選并且新軌跡的前三個(gè)點(diǎn)必須與上一幀軌跡的末端嚴(yán)格一致包括位置、速度和加速度。付出代價(jià)是動(dòng)態(tài)場(chǎng)景下的響應(yīng)會(huì)慢半拍換來的是執(zhí)行端極其明顯的穩(wěn)定收益。我傾向于把這個(gè)約束做成可配置項(xiàng)在換道這類主動(dòng)行為中暫時(shí)放寬在跟車巡航中嚴(yán)格執(zhí)行。5.3 預(yù)測(cè)與規(guī)劃不同步時(shí)間戳錯(cuò)位引發(fā)的“幽靈剎車”現(xiàn)象是車輛在高速巡航時(shí)突然無征兆地深踩剎車但周圍看起來什么都沒有。排查后發(fā)現(xiàn)是預(yù)測(cè)模塊輸出的障礙物軌跡帶的不是當(dāng)前時(shí)間戳而是上游感知模塊的緩存時(shí)間戳。決策規(guī)劃拿到的未來軌跡其實(shí)是幾百毫秒之前預(yù)測(cè)的結(jié)果前車早就不在那個(gè)位置了系統(tǒng)卻在為一個(gè)“幽靈位置”計(jì)算碰撞風(fēng)險(xiǎn)。解決方式是數(shù)據(jù)老化檢查。在決策規(guī)劃的消息入口處強(qiáng)制檢查每條輸入的時(shí)間戳與當(dāng)前系統(tǒng)時(shí)間之差超過200毫秒的場(chǎng)景目標(biāo)直接標(biāo)記為“陳舊數(shù)據(jù)”不參與碰撞判斷只參與威懾性減速。同時(shí)預(yù)測(cè)模塊輸出的未來軌跡必須帶完整的相對(duì)時(shí)間軸比如當(dāng)前時(shí)刻為該預(yù)測(cè)軌跡的0秒決策規(guī)劃按時(shí)間軸對(duì)齊取點(diǎn)而不是假設(shè)軌跡第一個(gè)點(diǎn)就是“當(dāng)前”點(diǎn)。5.4 換道決策不關(guān)心后方來車軌跡合理但場(chǎng)景致命現(xiàn)象是換道軌跡本身非常標(biāo)準(zhǔn)——曲率連續(xù)、橫向偏移順滑、目標(biāo)點(diǎn)選得很正但執(zhí)行過程中后方車輛高速逼近本車在匯入瞬間幾乎被追尾。原因是運(yùn)動(dòng)規(guī)劃層只對(duì)前向和側(cè)向障礙物做了代價(jià)評(píng)估后向障礙物完全漏掉了而行為決策層只判斷了“目標(biāo)車道是否空閑”沒有判斷“目標(biāo)車道后方的車輛是否允許我插入”。解決要在兩個(gè)層面同時(shí)補(bǔ)。行為決策層檢查目標(biāo)車道時(shí)不僅要看有沒有車還要計(jì)算后方來車的TTC和相對(duì)速度差只有相對(duì)速度差和距離同時(shí)滿足條件才發(fā)起換道。運(yùn)動(dòng)規(guī)劃層在生成換道軌跡時(shí)把目標(biāo)車道后方的預(yù)測(cè)軌跡納入代價(jià)評(píng)估如果換道過程中與后方車輛的距離持續(xù)縮小直接提高該候選軌跡的代價(jià)直到否決。5.5 參數(shù)失控規(guī)則和閾值像打補(bǔ)丁一樣越堆越多現(xiàn)象是隨著測(cè)試場(chǎng)景增加代碼里出現(xiàn)了大量孤立的閾值數(shù)字——某個(gè)路口的等待時(shí)間是“3秒”另一條路的變道提前量是“0.8秒”同一類場(chǎng)景的判定條件在不同文件里各寫一份。到后期沒有人敢改任何參數(shù)因?yàn)椴恢栏牧诉@個(gè)會(huì)不會(huì)破壞那個(gè)場(chǎng)景。這是決策規(guī)劃項(xiàng)目里最隱蔽的技術(shù)債。解決方式是參數(shù)治理從第一天做起。所有場(chǎng)景相關(guān)的閾值必須放入一個(gè)集中配置結(jié)構(gòu)按“場(chǎng)景類型-參數(shù)名-單位-默認(rèn)值-來源說明”五個(gè)字段管理來源說明里必須寫清楚這個(gè)參數(shù)是為哪個(gè)場(chǎng)景、什么現(xiàn)象引入的。同時(shí)建立回歸測(cè)試集每改一個(gè)參數(shù)就跑一遍全部仿真場(chǎng)景輸出指標(biāo)對(duì)比表自動(dòng)標(biāo)記退化項(xiàng)。這樣參數(shù)從“玄學(xué)”變成“可歸因的工程決策”。6. 進(jìn)階用數(shù)據(jù)回放和離線評(píng)測(cè)提升決策質(zhì)量而不是繼續(xù)堆規(guī)則把仿真跑通、坑踩過一遍之后決策規(guī)劃能力提升的瓶頸往往不在算法本身而在驗(yàn)證手段。實(shí)車路測(cè)成本高、周期長(zhǎng)純仿真場(chǎng)景又和真實(shí)路況有差距我這兩年最常用的進(jìn)階方法是數(shù)據(jù)回放把真實(shí)路測(cè)或?qū)嵻嚥杉膫鞲衅鲾?shù)據(jù)、障礙物列表和本車狀態(tài)完整記錄下來再離線把決策規(guī)劃模塊接上去跑一遍輸出新的決策軌跡和評(píng)估指標(biāo)。這么做有三個(gè)好處完全復(fù)現(xiàn)當(dāng)時(shí)的場(chǎng)景沒有安全風(fēng)險(xiǎn)可以反復(fù)調(diào)試參數(shù)觀看效果變化能夠量化評(píng)估“如果當(dāng)時(shí)換了決策邏輯車輛會(huì)怎么開”這個(gè)反事實(shí)問題。數(shù)據(jù)回放做久了自然會(huì)發(fā)現(xiàn)規(guī)則式?jīng)Q策的短板集中在高度交互場(chǎng)景——兩車同時(shí)爭(zhēng)搶一個(gè)路口、行人和車輛互相試探這類場(chǎng)景的“正確答案”是模糊的規(guī)則寫死反而顯得機(jī)械。這時(shí)候可以考慮引入學(xué)習(xí)式方法作為補(bǔ)充常見切入路徑是先用人類駕駛數(shù)據(jù)做模仿學(xué)習(xí)讓模型學(xué)習(xí)“老司機(jī)在交互場(chǎng)景下怎么選擇行為”然后用規(guī)則式系統(tǒng)做安全兜底學(xué)習(xí)模塊輸出只在規(guī)則系統(tǒng)判定為“模糊場(chǎng)景”時(shí)才生效。注意這個(gè)過程中要克制住“用學(xué)習(xí)式完全替換規(guī)則式”的沖動(dòng)以目前業(yè)界實(shí)踐看兩者共存才是工程上最可靠的狀態(tài)。我個(gè)人的習(xí)慣是每次測(cè)試新決策邏輯前先把對(duì)應(yīng)場(chǎng)景的數(shù)據(jù)回放包保存好改一個(gè)參數(shù)跑一次回歸把所有發(fā)生過“后悔藥時(shí)刻”的場(chǎng)景都記錄在案慢慢就積累成了團(tuán)隊(duì)自己的決策驗(yàn)證基準(zhǔn)。這套基準(zhǔn)比任何論文里的公開數(shù)據(jù)集都更能反映你們真實(shí)面對(duì)的問題也更能說服團(tuán)隊(duì)在決策規(guī)劃上持續(xù)投入。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取