現(xiàn)自適應(yīng)巡航控制模擬器:從原理到調(diào)參實(shí)戰(zhàn))
我做ACC仿真這個(gè)方向也算有幾年了剛開始時(shí)的確想過直接上現(xiàn)成的整車級(jí)仿真平臺(tái)但發(fā)現(xiàn)要么太重、要么根本沒法針對(duì)控制層做快速迭代。最后我從零搭了一套自適應(yīng)巡航控制ACC系統(tǒng)模擬器用Matlab實(shí)現(xiàn)了實(shí)時(shí)車輛跟隨可視化。這篇文章就把這套模擬器的完整思路、代碼結(jié)構(gòu)和調(diào)參經(jīng)驗(yàn)全部拆開講清楚希望能給正在做ACC算法驗(yàn)證、課程設(shè)計(jì)或者前期方案評(píng)估的人省點(diǎn)時(shí)間。1. 為什么自己搭A(yù)CC模擬器而不是直接用整車仿真平臺(tái)1.1 市面方案的三個(gè)痛點(diǎn)先說明一下我并不是否定現(xiàn)成工具的價(jià)值。Simulink里的自動(dòng)駕駛工具箱能做到四五十個(gè)自由度的高保真車輛動(dòng)力學(xué)仿真配合場(chǎng)景編輯器還能模擬傳感器融合、毫米波雷達(dá)回波、攝像頭目標(biāo)檢測(cè)那一整套東西。但這套東西放在我只想驗(yàn)證ACC控制策略這個(gè)場(chǎng)景里大概率是殺雞用牛刀。第一個(gè)痛點(diǎn)是學(xué)習(xí)曲線太陡。從場(chǎng)景構(gòu)建、傳感器配置到總線信號(hào)映射光是把一條簡(jiǎn)單的跟車工況跑通新手可能要折騰兩三天。而我要的其實(shí)很簡(jiǎn)單前車按給定速度剖面行駛自車通過ACC算法跟隨實(shí)時(shí)顯示兩車距離和相對(duì)速度的變化。用高保真平臺(tái)來做這個(gè)事大量精力都耗在了與算法驗(yàn)證無關(guān)的配置上。第二個(gè)痛點(diǎn)是模塊黑盒化。整車平臺(tái)里帶的一些ACC控制器模塊是封裝好的參數(shù)暴露得有限你很難真正看清控制器的每個(gè)中間變量。但做算法研究恰恰需要隨時(shí)查看期望加速度、期望間距、誤差項(xiàng)這些量。自己寫代碼就沒有這個(gè)問題所有變量都在工作空間里想看哪個(gè)看哪個(gè)。第三個(gè)痛點(diǎn)是計(jì)算開銷。跑一次高保真仿真尤其加了復(fù)雜場(chǎng)景和傳感器模型之后速度會(huì)明顯放慢。但ACC策略驗(yàn)證至少需要跑幾十組不同工況的參數(shù)掃描一個(gè)工況實(shí)時(shí)跑不起來的話調(diào)參效率會(huì)非常低。1.2 這套模擬器到底解決了什么問題基于上面的考慮我在某個(gè)模擬項(xiàng)目X里用Matlab寫了一個(gè)輕量級(jí)ACC模擬器。它的定位非常明確把精力集中在ACC上層決策算法和下層車輛響應(yīng)特性的模擬上不做復(fù)雜傳感器仿真不做高精度動(dòng)力學(xué)模型但保證控制策略驗(yàn)證所需的閉環(huán)鏈路完整。它能做到下面幾件事配置前車的速度剖面包括勻速、勻加速、勻減速、停車再起步等工況用恒定車頭時(shí)距策略計(jì)算期望間距通過PD控制器計(jì)算期望加速度用一階慣性環(huán)節(jié)模擬發(fā)動(dòng)機(jī)和制動(dòng)系統(tǒng)的實(shí)際響應(yīng)延遲在主循環(huán)里實(shí)時(shí)更新自車與目標(biāo)車的速度和位置并用動(dòng)畫實(shí)時(shí)顯示跟車過程仿真結(jié)束后繪制間距誤差、速度對(duì)比、加速度曲線方便做參數(shù)分析這套東西適合誰用呢如果你是學(xué)生正在做ACC相關(guān)的課程設(shè)計(jì)或畢設(shè)需要在論文里給出仿真驗(yàn)證如果你是工程師想快速驗(yàn)證一個(gè)新的控制算法比如MPC、模糊控制、滑??刂苹蛘吣阒皇菍?duì)ACC的工作原理好奇想具象地理解它那么這套模擬器都是很合適的起點(diǎn)。2. ACC控制算法拆解從跟車策略到車輛響應(yīng)2.1 先把ACC的分層架構(gòu)說清楚很多人第一次接觸ACC容易把它想成一個(gè)大號(hào)的定速巡航。實(shí)際上它可以拆成三個(gè)層次感知層負(fù)責(zé)獲取自車速度、與前車的相對(duì)距離、相對(duì)速度。在真實(shí)系統(tǒng)里這依賴毫米波雷達(dá)和攝像頭的數(shù)據(jù)融合但在我的模擬器里這些量直接從仿真狀態(tài)中讀取再人為疊加一點(diǎn)噪聲和延遲用來模擬傳感器的不完美特性。決策層是ACC的核心它根據(jù)感知信息計(jì)算出期望加速度。這一層又分兩步先確定期望車間距再計(jì)算達(dá)到這個(gè)間距所需要的加速度。大多數(shù)當(dāng)前量產(chǎn)ACC都采用恒定車頭時(shí)距策略后面我會(huì)詳細(xì)介紹。執(zhí)行層把期望加速度變成車輛的實(shí)際響應(yīng)。發(fā)動(dòng)機(jī)和制動(dòng)系統(tǒng)不可能瞬間響應(yīng)控制指令所以我把執(zhí)行層建模成一個(gè)一階慣性環(huán)節(jié)時(shí)間常數(shù)通常在0.3到0.6秒之間。這一步非常關(guān)鍵如果不加這個(gè)慣性環(huán)節(jié)控制效果會(huì)好到失真實(shí)際應(yīng)用時(shí)根本達(dá)不到。2.2 恒定車頭時(shí)距策略的數(shù)學(xué)邏輯恒定車頭時(shí)距策略簡(jiǎn)稱CTH是目前ACC最主流的跟車策略。它的核心思想是期望間距不是固定值而是隨著自車車速線性增大。期望間距的計(jì)算公式是d_des d0 tau * v_ego其中d0是最小安全間距也就是兩車都停住時(shí)也必須保持的距離一般取2到5米tau是車頭時(shí)距單位是秒代表自車按照當(dāng)前速度行駛需要經(jīng)過多少秒到達(dá)前車當(dāng)前位置。注意這個(gè)時(shí)距本質(zhì)上是一個(gè)時(shí)間間隔概念不是真正要求的物理距離。tau取1秒時(shí)如果自車以108km/h也就是30m/s行駛期望間距就是30加d0大概33米左右。tau取2.2秒時(shí)同樣的速度下間距要求會(huì)拉到接近70米。CTH策略的優(yōu)點(diǎn)在于車速越高跟車距離越大給了駕駛員足夠的反應(yīng)時(shí)間車速越低跟車距離越小不容易被旁車加塞。實(shí)際量產(chǎn)車的tau一般在0.8到2.2秒之間可調(diào)運(yùn)動(dòng)模式和舒適模式的差別很大程度就體現(xiàn)在這個(gè)參數(shù)上??刂颇繕?biāo)是讓實(shí)際間距d趨近于期望間距d_des同時(shí)讓相對(duì)速度趨近于零。所以控制誤差有兩項(xiàng)間距誤差e_distance d - d_des相對(duì)速度v_rel v_lead - v_ego。期望加速度的PD形式是a_des Kp * (d - d_des) Kd * (v_lead - v_ego)前車提速時(shí)相對(duì)速度為正自車需要加速跟上去前車減速時(shí)相對(duì)速度為負(fù)自車要減速保持安全距離。2.3 車輛縱向動(dòng)力學(xué)模型別小看這一步控制器算出來的期望加速度不能直接當(dāng)作車輛的實(shí)際加速度。我見過不少初學(xué)者的模擬器直接把a(bǔ)_des用在運(yùn)動(dòng)學(xué)積分里曲線確實(shí)好看但一到實(shí)車驗(yàn)證就崩了。原因在于車輛動(dòng)力系統(tǒng)的響應(yīng)延遲和加速度限制。在我的模擬器里實(shí)際加速度a_act通過一階慣性環(huán)節(jié)逼近期望加速度da_act/dt (a_des - a_act) / tau_vehtau_veh是執(zhí)行器響應(yīng)時(shí)間常數(shù)我默認(rèn)取0.4秒。這個(gè)值的意思是如果期望加速度從0突然變成2m/s^2車輛實(shí)際加速度約經(jīng)過1.2秒左右才能上升到接近目標(biāo)值。這個(gè)響應(yīng)特性在Sampling時(shí)間尺度上非常關(guān)鍵。同時(shí)我還對(duì)期望加速度做了幅值限制最大加速度2.0m/s^2最大減速度3.5m/s^2。這對(duì)應(yīng)一般的舒適性邊界。如果算法算出-6m/s^2的急剎需求控制器會(huì)飽和在-3.5仿真結(jié)果就會(huì)如實(shí)反映自車剎不住而產(chǎn)生碰撞風(fēng)險(xiǎn)。這里的碰撞風(fēng)險(xiǎn)其實(shí)是評(píng)估算法質(zhì)量的重要信號(hào)絕對(duì)不能通過放寬減速度限制來掩蓋。運(yùn)動(dòng)學(xué)更新就是最基礎(chǔ)的積分等式v_new v_old a_act * dt x_new x_old v_new * dt這套模型雖然簡(jiǎn)單但包含了做ACC算法驗(yàn)證最核心的兩個(gè)要素控制目標(biāo)明確、執(zhí)行響應(yīng)有約束。后面你替換成MPC也好、模糊控制也好模型框架都不用動(dòng)。3. Matlab代碼結(jié)構(gòu)初始化、主循環(huán)到實(shí)時(shí)動(dòng)畫的實(shí)現(xiàn)細(xì)節(jié)3.1 工程文件組織我不喜歡把所有代碼都堆在一個(gè)腳本里后期會(huì)很難維護(hù)。這套模擬器結(jié)合數(shù)據(jù)流劃分成幾個(gè)文件每個(gè)文件職責(zé)單一方便替換和復(fù)用。工程文件結(jié)構(gòu)大概是這樣init_params.m集中配置所有仿真參數(shù)包括ACC參數(shù)、車輛參數(shù)、工況定義generate_lead_profile.m生成前車的速度剖面返回v_lead時(shí)間序列acc_controller.m計(jì)算期望加速度輸入是當(dāng)前測(cè)量量輸出a_desupdate_vehicle.m根據(jù)期望加速度更新實(shí)際加速度、速度、位置run_simulation.m主循環(huán)驅(qū)動(dòng)整個(gè)仿真plot_results.m仿真結(jié)束后繪制結(jié)果曲線animate_visualization.m實(shí)時(shí)可視化跟車過程我特別建議把控制算法和數(shù)據(jù)存儲(chǔ)解耦。acc_controller.m里不負(fù)責(zé)保存歷史數(shù)據(jù)只管計(jì)算這樣以后想把PD換成MPC只需要在這個(gè)文件里改函數(shù)體其他地方完全不用動(dòng)。3.2 主循環(huán)的骨架代碼下面給出run_simulation.m的核心邏輯片段。這是整套模擬器的骨架。% 加載參數(shù) init_params; % 生成前車速度剖面60秒仿真1Hz更新前車指令 T 60; dt 0.05; N T / dt; t (0:N-1) * dt; % 預(yù)分配數(shù)組 x_ego zeros(1, N); v_ego zeros(1, N); a_ego zeros(1, N); x_lead zeros(1, N); v_lead zeros(1, N); x_ego(1) 0; v_ego(1) 15; x_lead(1) 35; v_lead(1) 15; % 前車速度剖面先勻速再加速再勻速最后急減速 v_lead_profile [ones(1, 100) * 15, ... 15 0.5*(0:99), ... ones(1, 400) * 65 * 0.44704 15, ... % 大約到21.5m/s max(0, 21.5 - 1.0*(0:59)), ... zeros(1, 400)]; for k 1:N-1 % 讀取前車當(dāng)前速度模擬感知前車狀態(tài) v_lead(k1) v_lead_profile(k1); x_lead(k1) x_lead(k) v_lead(k1) * dt; % 計(jì)算實(shí)際間距和相對(duì)速度這里可以加傳感器噪聲 d_meas (x_lead(k) - x_ego(k)) 0.2 * randn; v_rel_meas (v_lead(k) - v_ego(k)) 0.15 * randn; % ACC控制器 a_des acc_controller(d_meas, v_rel_meas, v_ego(k), tau, d0, Kp, Kd, a_max, a_min); % 執(zhí)行層一階慣性 a_ego(k1) a_ego(k) dt / tau_veh * (a_des - a_ego(k)); % 運(yùn)動(dòng)學(xué)更新 v_ego(k1) v_ego(k) a_ego(k1) * dt; x_ego(k1) x_ego(k) v_ego(k1) * dt; end注意我這個(gè)前車速度剖面只是為了說明數(shù)據(jù)流怎么走實(shí)際使用中我會(huì)把生成邏輯獨(dú)立到generate_lead_profile.m里避免主循環(huán)里堆太多東西。acc_controller.m的內(nèi)容也很簡(jiǎn)潔function a_des acc_controller(d_meas, v_rel_meas, v_ego, tau, d0, Kp, Kd, a_max, a_min) d_des d0 tau * v_ego; a_des Kp * (d_meas - d_des) Kd * v_rel_meas; a_des max(a_min, min(a_max, a_des)); end3.3 實(shí)時(shí)動(dòng)畫是怎么實(shí)現(xiàn)的實(shí)時(shí)可視化是這套模擬器的門面。沒有可視化的仿真看起來就是一堆數(shù)字在跳動(dòng)很難直觀感受到ACC是否跟上了前車。我的基本實(shí)現(xiàn)思路是把兩輛車畫成矩形前車用深色自車用淺色在迭代過程中不斷更新它們的位置同時(shí)動(dòng)態(tài)顯示當(dāng)前車間距、自車速度、期望間距。核心繪圖代碼結(jié)構(gòu)是這樣的。figure(Position, [100 100 1200 600]); for k 1:500:N-1 % 每0.5秒刷新一次畫面避免動(dòng)畫過快 clf; % 車道線和車輛位置 plot([-10 120], [0 0], k-, LineWidth, 2); hold on; % 前車矩形 rectangle(Position, [x_lead(k), 0.5, 4.5, 2], FaceColor, [0.3 0.3 0.3]); % 自車矩形 rectangle(Position, [x_ego(k), 0.5, 4.5, 2], FaceColor, [0.2 0.6 0.9]); % 間距標(biāo)注 d_now x_lead(k) - x_ego(k); text(min(x_lead(k), x_ego(k)) d_now/2, 3.5, ... sprintf(間距: %.1f m, d_now), HorizontalAlignment, center); % 速度信息面板 text(80, 8, sprintf(自車速度: %.1f m/s, v_ego(k))); text(80, 6.5, sprintf(前車速度: %.1f m/s, v_lead(k))); text(80, 5, sprintf(期望間距: %.1f m, d0 tau * v_ego(k))); axis equal; xlim([-10 max(120, x_lead(k)10)]); ylim([0 10]); grid on; drawnow; pause(0.02); end一定要加drawnow否則Matlab會(huì)認(rèn)為你還在準(zhǔn)備圖畫面不會(huì)刷新。如果要保存動(dòng)畫可以在循環(huán)里用getframe配合VideoWriter寫視頻文件這個(gè)我后面做測(cè)試時(shí)會(huì)用到。3.4 參數(shù)配置表所有關(guān)鍵參數(shù)一覽init_params.m里的參數(shù)建議集中管理我用一張表把主要參數(shù)列出來方便后續(xù)對(duì)照。參數(shù)符號(hào)默認(rèn)值說明采樣周期dt0.05s控制與仿真步長(zhǎng)仿真時(shí)長(zhǎng)T60s總仿真時(shí)間車頭時(shí)距tau1.5s決定期望間距的增長(zhǎng)速率最小安全間距d03m停車時(shí)保持的間距間距誤差增益Kp0.4PD控制的比例項(xiàng)增益相對(duì)速度增益Kd0.8PD控制的微分項(xiàng)增益最大期望加速度a_max2.0m/s^2舒適性上限最大期望減速度a_min-3.5m/s^2舒適性下限執(zhí)行器時(shí)間常數(shù)tau_veh0.4s一階慣性響應(yīng)時(shí)間采樣周期dt的選擇有一定講究。仿真步長(zhǎng)至少要比系統(tǒng)最小時(shí)間常數(shù)小一個(gè)數(shù)量級(jí)tau_veh是0.4秒dt取0.05秒差不多是1/8滿足要求。取太小比如0.001秒仿真速度會(huì)嚴(yán)重拖慢取太大比如0.2秒一階慣性環(huán)節(jié)的離散化誤差會(huì)明顯變大。4. 參數(shù)調(diào)優(yōu)實(shí)戰(zhàn)車頭時(shí)距、PID增益怎么選4.1 基準(zhǔn)工況設(shè)計(jì)調(diào)參之前必須先定工況否則你根本不知道改參數(shù)是為了優(yōu)化哪個(gè)場(chǎng)景下的表現(xiàn)。我在模擬器里設(shè)計(jì)了一個(gè)包含多段特征的基準(zhǔn)工況前車全程60秒速度剖面分為五個(gè)階段初始勻速15m/s行駛5秒然后以0.5m/s^2的加速度勻加速20秒到約25m/s保持勻速20秒最后以1.0m/s^2的減速度勻減速到停止停止后保持到最后。自車初始速度15m/s初始間距35米。這個(gè)工況覆蓋了ACC最常見的幾個(gè)場(chǎng)景穩(wěn)態(tài)跟車、前車加速、前車減速、前車剎停。一個(gè)合格的ACC算法在這種復(fù)合工況下應(yīng)該做到穩(wěn)態(tài)間距誤差在合理范圍內(nèi)、加減速平滑、最終停車后與前車保持不小于安全間距。4.2 三個(gè)參數(shù)的實(shí)際表現(xiàn)對(duì)比先說車頭時(shí)距tau。我分別跑了tau1.0s、1.5s、2.2s三組其他參數(shù)不變。結(jié)果非常直觀。車頭時(shí)距tau穩(wěn)態(tài)跟車間距前車急剎時(shí)最小間距主觀舒適性1.0s約18m接近碰撞最小間距僅4.2m跟車緊密加速頻繁1.5s約28m11.5m適中2.2s約40m18m很寬松但容易被加塞tau取1.0s時(shí)穩(wěn)態(tài)跟車距離確實(shí)更近公路上看起來更貼得住但前車減速時(shí)自車需要很大的減速度最小間距一度逼近安全邊界。tau取2.2s時(shí)前車減速幾乎毫無壓力但問題在于穩(wěn)態(tài)間距被拉得很大實(shí)際道路上旁邊的車很容易并線進(jìn)來導(dǎo)致系統(tǒng)頻繁切換目標(biāo)。綜合來看1.5s左右是比較均衡的起點(diǎn)。再說Kp。Kp直接決定了間距誤差的校正強(qiáng)度。我試過0.15、0.4、0.9三檔。Kp0.15時(shí)間距誤差要累積到很大才能產(chǎn)生足夠的加速度修正前車提速后自車要花十幾秒才能重新跟上去明顯太肉。Kp0.9時(shí)控制器變得非常激進(jìn)稍微有一點(diǎn)間距誤差就會(huì)產(chǎn)生很大的加速度請(qǐng)求整個(gè)系統(tǒng)的加速度曲線頻繁沖擊上下限前后抖動(dòng)明顯。Kp0.4附近是一個(gè)合理區(qū)間。最后是Kd。Kd的作用是阻尼相對(duì)速度變化。如果Kd太小說0.3自車接近前車時(shí)幾乎沒有減速預(yù)判會(huì)有沖過頭的感覺如果Kd太大會(huì)引發(fā)與前車相對(duì)速度測(cè)量噪聲的耦合我在后面章節(jié)會(huì)專門講這個(gè)問題。我調(diào)試下來的經(jīng)驗(yàn)是Kd取Kp的1.5到2倍左右能獲得相對(duì)平順的跟車效果。4.3 判斷跟車效果的三項(xiàng)量化指標(biāo)光看動(dòng)畫不夠最終評(píng)估必須量化。我自己常用的指標(biāo)有三個(gè)。間距誤差的均方根值也就是RMS誤差。它反映整體跟車精度。計(jì)算公式是把每個(gè)采樣時(shí)刻的實(shí)際間距與期望間距之差求平方和再平均開方。RMS誤差越小說明跟車精度越高一般控制在2米以內(nèi)算合格。最大加速度絕對(duì)值和抖振次數(shù)。這直接關(guān)系到乘客舒適性。我會(huì)統(tǒng)計(jì)一整段仿真中加速度絕對(duì)值的最大值當(dāng)它頻繁逼近設(shè)定限幅值時(shí)說明控制參數(shù)太激進(jìn)。最小車間距尤其是前車急減速工況下的最小間距。這是安全性的底線指標(biāo)。如果最小間距小于安全間距說明算法存在碰撞風(fēng)險(xiǎn)必須增加前饋或者限制控制增益。這三項(xiàng)指標(biāo)往往會(huì)互相矛盾間距誤差最小化需要增大Kp但Kp過大會(huì)導(dǎo)致舒適性下降間距更大化更安全但容易被加塞。調(diào)參的本質(zhì)就是在這三者之間找平衡點(diǎn)。我的建議是安全指標(biāo)優(yōu)先在保證最小間距不低于安全邊界的前提下再去優(yōu)化RMS誤差和舒適性。5. 仿真中的真實(shí)問題抖動(dòng)、急剎與噪聲延遲5.1 低速跟車時(shí)的加速度抖振問題第一組仿真跑完我注意到一個(gè)現(xiàn)象前車幾乎勻速行駛時(shí)自車加速度曲線仍然在兩三個(gè)采樣周期內(nèi)來回跳變幅度大概在正負(fù)0.3m/s^2之間??雌饋聿粐?yán)重但明顯不自然實(shí)車上會(huì)因?yàn)檫@種頻繁請(qǐng)求導(dǎo)致油門和剎車反復(fù)切換。排查后原因有兩點(diǎn)。第一相對(duì)速度測(cè)量值疊加了隨機(jī)噪聲而Kd乘以這個(gè)含噪信號(hào)時(shí)噪聲被放大后直接進(jìn)入加速度命令。第二采樣周期雖然只有0.05秒但前車速度剖面的輕微波動(dòng)在每一次控制周期里都被當(dāng)作有效信號(hào)處理導(dǎo)致控制器太敏感。解決辦法從兩方面入手。一是對(duì)前車速度信號(hào)做一次滑動(dòng)平均濾波窗口取0.25秒可以有效壓低高頻噪聲二是在加速度命令輸出前增加一個(gè)死區(qū)邏輯當(dāng)期望加速度絕對(duì)值小于0.2m/s^2時(shí)直接輸出0避免微小誤差反復(fù)觸發(fā)執(zhí)行器。這兩個(gè)改動(dòng)加進(jìn)去后抖振現(xiàn)象立刻消失跟車曲線變得平滑很多。5.2 前車急減速時(shí)自車剎不住的問題第二次排查的問題更嚴(yán)重。把前車減速度從1.0m/s^2提升到2.5m/s^2時(shí)自車在前車停止前并沒有完全剎停最小車間距跌到0附近。這說明純PD控制器本質(zhì)上是一個(gè)事后糾偏型控制器它必須等間距誤差或者相對(duì)速度誤差明顯出現(xiàn)之后才開始反應(yīng)。當(dāng)前車的減速強(qiáng)度超過了控制器能跟蹤的極限時(shí)碰撞風(fēng)險(xiǎn)就不可避免。我加了一個(gè)前饋補(bǔ)償項(xiàng)核心思想是利用當(dāng)前相對(duì)速度和間距去估算一個(gè)安全制動(dòng)需求。前饋加速度的近似計(jì)算方式a_ff -(v_rel^2) / (2 * max(d - safety_margin, 0.5))這個(gè)公式的邏輯很簡(jiǎn)單如果自車以當(dāng)前相對(duì)速度接近前車按運(yùn)動(dòng)學(xué)關(guān)系要在剩余間距內(nèi)把相對(duì)速度減到零所需的減速度就是這個(gè)值。safety_margin我取1米作為傳感器誤差的保守余量。把它疊加到PD控制輸出上期望加速度變成a_des Kp * (d - d_des) Kd * v_rel a_ff改完以后前車急減速工況下的最小車間距從接近0提升到了3到4米安全性顯著改善。這里也讓我體會(huì)到ACC算法要做到優(yōu)秀光靠反饋是不夠的前饋和運(yùn)動(dòng)學(xué)預(yù)測(cè)能力同樣關(guān)鍵。5.3 傳感器噪聲和測(cè)量延遲的影響模擬第三個(gè)問題不嚴(yán)重但很有代表性。我在測(cè)量環(huán)節(jié)加了噪聲和延遲后發(fā)現(xiàn)系統(tǒng)開始變得手忙腳亂自車明明在做很平穩(wěn)的跟車但控制命令里總是摻著高頻的毛刺。根源在于Kd對(duì)噪聲的放大。延時(shí)則會(huì)惡化控制系統(tǒng)的相位裕度讓系統(tǒng)變得更容易震蕩。我做了這樣一組對(duì)比同樣的PD參數(shù)在理想測(cè)量條件下跟車效果很好但加上0.1秒測(cè)量延遲和標(biāo)準(zhǔn)差0.2m的距離噪聲后速度誤差曲線明顯增粗。這說明ACC算法驗(yàn)證時(shí)忽略傳感器模型相當(dāng)于用一個(gè)過度理想的環(huán)境來測(cè)試得到的參數(shù)很可能在實(shí)際系統(tǒng)中完全不適用。所以在模擬器中給測(cè)量環(huán)節(jié)加入噪聲和延遲是必要的敬畏心。我在仿真里采用的方法是真實(shí)間距計(jì)算出來后先把它延遲0.1秒再加0.2m標(biāo)準(zhǔn)差的高斯隨機(jī)噪聲??刂浦芷诒3?.05秒這樣既能模擬傳感器的不完美又不至于把噪聲加得過分夸張導(dǎo)致仿真失去參考意義。寫在最后的一點(diǎn)實(shí)操心得把這套模擬器從零搭完并完成多個(gè)工況驗(yàn)證后我最深的體會(huì)是ACC控制算法的核心不在于代碼復(fù)雜度而在于你是否理解了控制目標(biāo)、車輛響應(yīng)特性和傳感器約束三者之間的關(guān)系。代碼很短但每一段背后都有現(xiàn)實(shí)中對(duì)應(yīng)的物理環(huán)節(jié)不做簡(jiǎn)化就看不透本質(zhì)過度簡(jiǎn)化又會(huì)得到不切實(shí)際的樂觀結(jié)果。如果你準(zhǔn)備在這個(gè)框架上繼續(xù)做擴(kuò)展比如換成MPC算法、加入隊(duì)列協(xié)同甚至多目標(biāo)切換建議先把這套模擬器完整跑一遍把所有變量都真正看一遍再動(dòng)手改。這樣后面遇到的每一個(gè)奇怪現(xiàn)象你都能快速判斷是控制問題、車輛模型問題還是測(cè)量環(huán)節(jié)的問題。