引法仿真:Python實(shí)現(xiàn)與脫靶量評(píng)估)
簡(jiǎn)介面向飛行器制導(dǎo)與控制方向的科研人員與工程師這份三維比例導(dǎo)引法仿真代碼包可實(shí)現(xiàn)三維空間內(nèi)對(duì)靜止目標(biāo)和機(jī)動(dòng)目標(biāo)的攻擊制導(dǎo)仿真覆蓋從目標(biāo)運(yùn)動(dòng)建模到導(dǎo)引指令生成的完整鏈路。包內(nèi)含5個(gè)Matlab腳本文件與1份代碼說(shuō)明文檔共6個(gè)文件整體壓縮包僅5KB輕量便捷便于快速部署與二次開(kāi)發(fā)。代碼按比例導(dǎo)引算法、彈道數(shù)值積分和目標(biāo)運(yùn)動(dòng)模型分層組織Runge-Kutta積分器負(fù)責(zé)三維彈道遞推正弦/方波機(jī)動(dòng)目標(biāo)模型用于模擬不同運(yùn)動(dòng)特性比例導(dǎo)引律模塊支持導(dǎo)引系數(shù)等關(guān)鍵參數(shù)調(diào)整可靈活切換靜止/機(jī)動(dòng)場(chǎng)景開(kāi)展對(duì)比分析與參數(shù)優(yōu)化。已有712人學(xué)習(xí)下載適合需要搭建三維制導(dǎo)仿真環(huán)境、驗(yàn)證或改進(jìn)制導(dǎo)律性能的讀者。1. 三維比例導(dǎo)引法仿真為什么二維調(diào)好的參數(shù)一進(jìn)三維就翻車三維比例導(dǎo)引法仿真這個(gè)方向真正要解決的問(wèn)題不是把二維的比例導(dǎo)引公式抄進(jìn)三維坐標(biāo)系而是當(dāng)彈目相對(duì)視線在空間中持續(xù)旋轉(zhuǎn)時(shí)制導(dǎo)指令還能不能始終垂直于視線、把視線角速率穩(wěn)穩(wěn)壓回零。我在搭建制導(dǎo)仿真環(huán)境時(shí)常遇到一種現(xiàn)象二維平面里調(diào)好的導(dǎo)航比和過(guò)載限制一搬進(jìn)三維場(chǎng)景目標(biāo)剛開(kāi)始做橫向機(jī)動(dòng)末端彈道就走成明顯的S形脫靶量比預(yù)期大一個(gè)量級(jí)。這篇筆記會(huì)從三維比例導(dǎo)引的矢量形式講起給出一套可以直接復(fù)現(xiàn)的Python仿真代碼把坐標(biāo)系、制導(dǎo)指令、目標(biāo)機(jī)動(dòng)和脫靶量評(píng)估串成一條完整鏈路適合正在搭制導(dǎo)仿真環(huán)境、或者想驗(yàn)證某條制導(dǎo)律是否值得往下投入的開(kāi)發(fā)者。三維比例導(dǎo)引法仿真的核心判斷很簡(jiǎn)單視線角速率歸零彈道自然趨向碰撞。麻煩的是三維空間里視線角速率是一個(gè)矢量方向隨時(shí)在變用拆平面、分通道的思維去算早晚要吃耦合的虧。2. 三維比例導(dǎo)引的關(guān)鍵用矢量代替“方位角高低角”的雙通道拆解2.1 為什么不能直接拆成水平面和鉛垂面二維平面里的比例導(dǎo)引寫(xiě)成線性形式就是加速度指令等于導(dǎo)航比乘接近速度再乘視線角速度即指令和視線角速度成正比。有人把這個(gè)形式直接延拓到三維水平面算一個(gè)視線方位角變化率鉛垂面算一個(gè)視線高低角變化率兩個(gè)通道各自獨(dú)立計(jì)算指令。這個(gè)做法在小視線旋轉(zhuǎn)、目標(biāo)機(jī)動(dòng)不強(qiáng)、飛行時(shí)間短的場(chǎng)景下能湊合但一旦目標(biāo)做出橫向機(jī)動(dòng)三維空間中視線方向的變化不再被兩個(gè)通道獨(dú)立描述兩個(gè)平面上的視線角速率其實(shí)是同一條視線旋轉(zhuǎn)矢量在不同坐標(biāo)軸上的投影它們之間天然存在耦合。拆通道的典型癥狀是水平面彈道單獨(dú)看正常鉛垂面彈道單獨(dú)看也正常放到三維里末端彈道會(huì)出現(xiàn)擺尾。原因是通道間丟掉的耦合項(xiàng)在目標(biāo)機(jī)動(dòng)時(shí)貢獻(xiàn)了額外的視線旋轉(zhuǎn)兩個(gè)通道的指令各自為政合起來(lái)之后指令方向不再嚴(yán)格垂直于視線。我做仿真時(shí)判斷是否該用矢量形式的依據(jù)很簡(jiǎn)單飛行時(shí)間超過(guò)10秒、目標(biāo)過(guò)載超過(guò)2g或者初始視線角和導(dǎo)彈速度方向偏差較大三個(gè)條件占一個(gè)就不建議拆平面。2.2 視線旋轉(zhuǎn)角速度與真比例導(dǎo)引指令的矢量形式三維比例導(dǎo)引法仿真里最值得花時(shí)間理解的是視線旋轉(zhuǎn)角速度怎么用矢量算出來(lái)。定義從導(dǎo)彈指向目標(biāo)的相對(duì)位置矢量為R彈目相對(duì)速度為V_rel那么視線單位矢量為R_hat R / ||R||。對(duì)R_hat求時(shí)間的導(dǎo)數(shù)會(huì)得到視線方向的變化率這個(gè)變化率一定垂直于視線本身。經(jīng)過(guò)矢量恒等式整理可以把視線旋轉(zhuǎn)角速度寫(xiě)成一個(gè)很簡(jiǎn)潔的表達(dá)式[ \boldsymbol{\omega}{LOS} \frac{\boldsymbol{R} \times \boldsymbol{V}{rel}}{\lVert \boldsymbol{R} \rVert^2} ]這個(gè)矢量就是三維空間中視線瞬時(shí)旋轉(zhuǎn)軸的方向和角速度大小。它不需要顯式計(jì)算視線方位角和高低角也不會(huì)遇到角度跨越正負(fù)180度時(shí)差分爆炸的問(wèn)題。再定義接近速度[ V_c -\frac{\boldsymbol{R} \cdot \boldsymbol{V}_{rel}}{\lVert \boldsymbol{R} \rVert} ]迎頭攔截場(chǎng)景里R與V_rel方向接近相反點(diǎn)積為負(fù)V_c為正物理含義是彈目距離縮短的速率。有了omega_LOS和V_c三維真比例導(dǎo)引指令寫(xiě)成[ \boldsymbol{a}{cmd} N \cdot V_c \cdot (\boldsymbol{\omega}{LOS} \times \hat{\boldsymbol{R}}) ]這條指令天然垂直于視線方向同時(shí)包含俯仰和偏航兩個(gè)通道的修正量不需要在代碼里區(qū)分水平面和鉛垂面。叉積順序不能換換掉指令方向就反了這個(gè)問(wèn)題在后面的避坑章節(jié)細(xì)說(shuō)。2.3 導(dǎo)航比N怎么選從3到5的邊界導(dǎo)航比N是比例導(dǎo)引唯一真正需要調(diào)的增益它決定了系統(tǒng)對(duì)視線旋轉(zhuǎn)的放大程度。理論上N大于2時(shí)理想條件下脫靶量有界N等于3時(shí)在很多簡(jiǎn)化條件下具備較好的收斂特性工程上取4是常見(jiàn)折中。N太小彈道平緩但末端修正能力弱N太大響應(yīng)快但對(duì)視線角速度測(cè)量噪聲極敏感導(dǎo)引頭稍微抖一下指令就劇烈擺動(dòng)。N取值響應(yīng)特性噪聲敏感度工程適用性2以下理論不穩(wěn)定區(qū)間收斂性差低不選用3經(jīng)典理論值彈道平緩較低適合低噪聲數(shù)學(xué)仿真4收斂速度和穩(wěn)定性均衡中等仿真基線的默認(rèn)值5及以上對(duì)快速機(jī)動(dòng)響應(yīng)更猛明顯放大慎用需評(píng)估測(cè)量噪聲我在仿真里默認(rèn)把N固定在4先跑通無(wú)機(jī)動(dòng)場(chǎng)景確認(rèn)彈道合理再做參數(shù)掃描對(duì)比N3和N5的差異。不要在剛開(kāi)始調(diào)參時(shí)就動(dòng)N否則彈道異常時(shí)根本分不清是制導(dǎo)律寫(xiě)錯(cuò)了還是參數(shù)不合適。3. 用Python把三維比例導(dǎo)引法仿真跑起來(lái)狀態(tài)定義與核心代碼3.1 狀態(tài)向量、坐標(biāo)系的定義三維比例導(dǎo)引法仿真我一般用慣性直角坐標(biāo)系不引入地球曲率和旋轉(zhuǎn)x軸取初始視線方向附近即可。仿真狀態(tài)一共12維導(dǎo)彈位置3維、導(dǎo)彈速度3維、目標(biāo)位置3維、目標(biāo)速度3維。重力在這個(gè)簡(jiǎn)化模型里不單獨(dú)建模把它理解為已經(jīng)被彈體配平和升力補(bǔ)償?shù)舴抡嬷豢己酥茖?dǎo)段的空間運(yùn)動(dòng)關(guān)系。狀態(tài)分量含義初始值示例y[0:3]導(dǎo)彈位置[0, 0, 0]y[3:6]導(dǎo)彈速度[300, 0, 30]y[6:9]目標(biāo)位置[6000, 400, -200]y[9:12]目標(biāo)速度[-200, 0, 0]這個(gè)初始場(chǎng)景是典型的迎頭攔截目標(biāo)從大約6公里外朝導(dǎo)彈方向飛來(lái)但初始視線方向和導(dǎo)彈速度方向有偏差制導(dǎo)系統(tǒng)從一開(kāi)始就需要持續(xù)修正彈道。導(dǎo)彈速度設(shè)為300米每秒左右目標(biāo)速度200米每秒接近速度約500米每秒預(yù)估十幾秒內(nèi)會(huì)相遇。3.2 制導(dǎo)指令與運(yùn)動(dòng)學(xué)更新代碼核心仿真函數(shù)用SciPy的solve_ivp做自適應(yīng)步長(zhǎng)積分制導(dǎo)指令在每個(gè)積分步里實(shí)時(shí)計(jì)算。完整代碼如下import numpy as np from scipy.integrate import solve_ivp G 9.8 def los_rates(R, V_rel): 由相對(duì)位置和相對(duì)速度計(jì)算視線單位矢量、視線角速度、接近速度 r np.linalg.norm(R) R_hat R / r omega_los np.cross(R, V_rel) / (r * r) v_c -np.dot(R, V_rel) / r return R_hat, omega_los, v_c def deriv(t, y, N4.0, a_max30.0 * G): r_m y[0:3] v_m y[3:6] r_t y[6:9] v_t y[9:12] R r_t - r_m # 導(dǎo)彈指向目標(biāo)的相對(duì)位置矢量 V_rel v_t - v_m # 彈目相對(duì)速度矢量 R_hat, omega_los, v_c los_rates(R, V_rel) a_cmd N * v_c * np.cross(omega_los, R_hat) # 真比例導(dǎo)引指令 # 去掉沿速度方向的分量保持導(dǎo)彈速度大小穩(wěn)定 v_norm np.linalg.norm(v_m) if v_norm 1e-6: v_hat v_m / v_norm a_cmd a_cmd - np.dot(a_cmd, v_hat) * v_hat # 法向過(guò)載限幅 a_norm np.linalg.norm(a_cmd) if a_norm a_max: a_cmd a_cmd * (a_max / a_norm) # 目標(biāo)做常值橫向機(jī)動(dòng)3g偏y軸方向 a_t np.array([0.0, 3.0 * G, 0.0]) dy np.zeros(12) dy[0:3] v_m dy[3:6] a_cmd dy[6:9] v_t dy[9:12] a_t return dy代碼里最關(guān)鍵的邏輯是a_cmd那行先由相對(duì)位置和相對(duì)速度算出視線角速度矢量再叉乘視線單位矢量得到垂直視線方向的加速度指令。投影那行容易被忽略a_cmd原本只保證垂直于視線不一定垂直于導(dǎo)彈速度直接積分會(huì)讓速度大小虛高所以要先扣掉沿速度方向的分量。過(guò)載限幅放在投影之后確保最終指令的法向過(guò)載不超過(guò)設(shè)定值。參數(shù)上N默認(rèn)取4a_max取30倍重力加速度代表導(dǎo)彈最大可用法向過(guò)載約30g。解析解算完成后如果導(dǎo)彈速度模長(zhǎng)在彈道中段明顯偏離初始值優(yōu)先檢查投影那步是否被誤刪。3.3 初始場(chǎng)景與參數(shù)表先跑通一次迎頭攔截單次仿真用solve_ivp跑30秒輸出時(shí)間序列設(shè)密一點(diǎn)便于后續(xù)看脫靶量和彈道形態(tài)y0 np.zeros(12) y0[0:3] [0, 0, 0] y0[3:6] [300, 0, 30] y0[6:9] [6000, 400, -200] y0[9:12] [-200, 0, 0] sol solve_ivp(deriv, [0, 30], y0, t_evalnp.linspace(0, 30, 3000), args(4.0, 30.0 * G), rtol1e-6, atol1e-9)rtol設(shè)到1e-6、atol設(shè)到1e-9看起來(lái)比常規(guī)仿真嚴(yán)苛但制導(dǎo)末端視線角速度變化很快精度不夠時(shí)脫靶量結(jié)果會(huì)不穩(wěn)定。跑完之后先檢查一件事導(dǎo)彈速度模長(zhǎng)是否全程接近初始值如果是說(shuō)明投影邏輯正常接下來(lái)看彈目距離隨時(shí)間是否單調(diào)下降并在末端出現(xiàn)清晰的最小值。注意這里的速度投影只適用于導(dǎo)彈無(wú)推力、速度大小近似恒定的簡(jiǎn)化模型。如果你的仿真里導(dǎo)彈有持續(xù)推力、速度大小本來(lái)就會(huì)變化請(qǐng)刪掉投影那行讓加速度直接積分。4. 加目標(biāo)機(jī)動(dòng)與脫靶量評(píng)估從單次彈道到蒙特卡洛4.1 目標(biāo)機(jī)動(dòng)模型常值、蛇形與定時(shí)開(kāi)啟真實(shí)目標(biāo)不會(huì)老老實(shí)實(shí)勻速直線飛制導(dǎo)仿真里最常用的三種機(jī)動(dòng)模型是常值橫向過(guò)載、蛇形機(jī)動(dòng)和定時(shí)開(kāi)啟機(jī)動(dòng)。常值過(guò)載模擬目標(biāo)持續(xù)規(guī)避蛇形機(jī)動(dòng)模擬周期性搖擺規(guī)避定時(shí)開(kāi)啟則用來(lái)研究機(jī)動(dòng)起始時(shí)刻對(duì)脫靶量的影響。def target_accel(mode, t, v_t): 目標(biāo)加速度模型const常值、weave蛇形、step定時(shí)開(kāi)啟 G 9.8 if mode const: return np.array([0.0, 3.0 * G, 0.0]) elif mode weave: return np.array([0.0, 3.0 * G * np.sin(0.6 * t), 0.0]) elif mode step: return np.array([0.0, 3.0 * G, 0.0]) if t 2.0 else np.zeros(3) return np.zeros(3)把目標(biāo)加速度直接加在目標(biāo)速度的導(dǎo)數(shù)上會(huì)讓目標(biāo)速度大小逐漸改變。如果希望目標(biāo)速度大小恒定需要對(duì)a_t做同樣的投影處理去掉沿目標(biāo)速度方向的分量只保留法向部分。常值3g橫向機(jī)動(dòng)在十幾秒的攔截時(shí)間里足夠把目標(biāo)軌跡拉出一道明顯弧線用來(lái)區(qū)分不同制導(dǎo)律的末端修正能力非常合適。4.2 脫靶量怎么算距離序列最小值與事件檢測(cè)兩種方式脫靶量定義為飛行過(guò)程中彈目距離的最小值。最直接的方式是仿真結(jié)束后從輸出序列里找最短距離但輸出點(diǎn)再密也是離散采樣可能錯(cuò)過(guò)真正的最近點(diǎn)。更可靠的方式是用事件檢測(cè)讓積分器在彈目距離變化率從負(fù)轉(zhuǎn)正的那一刻停下來(lái)那個(gè)時(shí)刻的彈目距離就是精確的脫靶量。def miss_event(t, y): R y[6:9] - y[0:3] V_rel y[9:12] - y[3:6] return np.dot(R, V_rel) miss_event.terminal True miss_event.direction 1 sol solve_ivp(deriv, [0, 30], y0, t_evalnp.linspace(0, 30, 3000), events[miss_event], args(4.0, 30.0 * G), rtol1e-6, atol1e-9)事件函數(shù)的返回值是彈目距離隨時(shí)間的變化率direction設(shè)為1表示只在變化率從負(fù)變正時(shí)觸發(fā)這個(gè)瞬間就是距離最小的時(shí)刻。觸發(fā)后從sol.t_events[0]取出時(shí)間再算該時(shí)刻的彈目距離即可。作為對(duì)比也可以直接用距離序列的min值驗(yàn)證兩者差異一般不會(huì)超過(guò)幾米。彈道可視化建議畫(huà)兩個(gè)圖一個(gè)是彈目距離隨時(shí)間的曲線看距離是否平滑下降并在末端拐頭另一個(gè)是三維彈道軌跡直觀檢查末端是否出現(xiàn)S形擺動(dòng)。判斷制導(dǎo)質(zhì)量的標(biāo)準(zhǔn)很簡(jiǎn)單視線角速度在末端收斂到零附近脫靶量在可用過(guò)載約束下盡可能小。4.3 蒙特卡洛批量仿真看均值而不是看單次單次仿真只能說(shuō)明這條彈道沒(méi)問(wèn)題不能說(shuō)明制導(dǎo)律可靠。常見(jiàn)做法是加蒙特卡洛批量仿真對(duì)初始導(dǎo)彈速度、目標(biāo)初始位置添加隨機(jī)擾動(dòng)統(tǒng)計(jì)脫靶量的均值和95分位值rng np.random.default_rng(2024) misses [] for i in range(50): y0_new y0.copy() y0_new[3:6] rng.normal(0, 5, 3) # 導(dǎo)彈初始速度擾動(dòng) y0_new[6:9] rng.normal(0, 10, 3) # 目標(biāo)初始位置擾動(dòng) sol solve_ivp(deriv, [0, 30], y0_new, events[miss_event], args(4.0, 30.0 * G), rtol1e-6, atol1e-9) if sol.t_events[0].size 0: t_miss sol.t_events[0][0] r_m sol.sol(t_miss)[0:3] r_t sol.sol(t_miss)[6:9] misses.append(np.linalg.norm(r_t - r_m)) else: misses.append(np.inf) # 沒(méi)有觸發(fā)最近點(diǎn)說(shuō)明仿真時(shí)間內(nèi)未命中 misses np.array(misses) print(fmean miss {misses.mean():.2f} m, p95 {np.percentile(misses, 95):.2f} m)蒙特卡洛結(jié)果里均值代表典型性能p95代表差條件下的邊界性能。如果p95遠(yuǎn)大于均值說(shuō)明存在少數(shù)場(chǎng)景脫靶量特別大需要用分位數(shù)回放那些彈道找出是哪個(gè)初始條件導(dǎo)致的。這是制導(dǎo)律評(píng)估最實(shí)用的一個(gè)習(xí)慣比只看單次彈道可靠得多。5. 三維比例導(dǎo)引法仿真的5個(gè)常見(jiàn)坑與排查方法5.1 叉積順序搞反指令反向彈道像開(kāi)花現(xiàn)象仿真一開(kāi)始導(dǎo)彈就朝遠(yuǎn)離目標(biāo)的方向飛彈道快速發(fā)散日志里的指令幅值一直頂在限幅值上。原因視線角速度公式里R和V_rel的叉積順序反了或者最終指令里omega_LOS和R_hat的叉積順序反了。比例導(dǎo)引指令的方向?qū)Ψ?hào)極其敏感任何一處叉積順序調(diào)換都會(huì)讓指令方向旋轉(zhuǎn)180度制導(dǎo)變成“逃逸導(dǎo)引”。解決先區(qū)分兩處叉積omega_LOS cross(R, V_rel) / (r * r)指令是cross(omega_LOS, R_hat)。如果你把前者改成cross(V_rel, R)或者把后者改成cross(R_hat, omega_LOS)只改其中任何一處指令方向就反了。排查時(shí)把目標(biāo)速度設(shè)為零初始時(shí)刻讓導(dǎo)彈速度方向和視線方向有偏差如果導(dǎo)彈越飛越遠(yuǎn)基本就是叉積順序問(wèn)題。5.2 用角度差分代替矢量視線角跨正負(fù)180度跳變現(xiàn)象彈道中段正常某個(gè)時(shí)刻指令突然出現(xiàn)尖峰彈道劇烈擺動(dòng)尖峰時(shí)刻往往對(duì)應(yīng)目標(biāo)穿越某個(gè)坐標(biāo)平面的瞬間。原因有人為了沿用二維公式先用atan2算出視線方位角和高低角再對(duì)角度做差分得到角速度。三維空間中角度會(huì)跨正負(fù)180度邊界前一幀是179度后一幀變成負(fù)179度差分結(jié)果變成358度相當(dāng)于一個(gè)巨大的假角速度制導(dǎo)指令瞬間爆表。解決直接用矢量的叉積算視線角速度不要顯式計(jì)算視線角。atan2的結(jié)果只能用于事后繪圖和人工閱讀不能用于制導(dǎo)指令計(jì)算。即使必須在某個(gè)環(huán)節(jié)用角度也要對(duì)差分前的角度序列做unwrap處理把跳變修正回來(lái)。5.3 加速度指令直接積分速度從300漲到600現(xiàn)象仿真跑完檢查狀態(tài)量發(fā)現(xiàn)導(dǎo)彈速度模長(zhǎng)從初始的300米每秒漲到600甚至更高但導(dǎo)彈并沒(méi)有推力模型。原因比例導(dǎo)引指令垂直于視線但不一定垂直于導(dǎo)彈速度。把a(bǔ)_cmd直接加進(jìn)dv/dt時(shí)a_cmd沿導(dǎo)彈速度方向的分量也在改變速度大小造成了速度虛高。解決在指令限幅前加上一行投影把a(bǔ)_cmd沿速度方向的分量去掉只保留垂直于速度的法向分量。代碼里就是a_cmd a_cmd - dot(a_cmd, v_hat) * v_hat。注意這個(gè)處理對(duì)應(yīng)速度大小恒定的簡(jiǎn)化假設(shè)如果模型里導(dǎo)彈有推力、速度本來(lái)就該變化則不能投影。5.4 固定步長(zhǎng)仿真脫靶量隨步長(zhǎng)變結(jié)果不穩(wěn)定現(xiàn)象同一套參數(shù)積分步長(zhǎng)設(shè)0.1秒時(shí)脫靶量是15米改成0.01秒變成2米結(jié)果無(wú)法復(fù)現(xiàn)。原因比例導(dǎo)引末端的視線角速度增長(zhǎng)是非線性的彈目距離越近角速度變化越劇烈。固定步長(zhǎng)積分在這種場(chǎng)景下會(huì)漏掉視線角速度快速變化的細(xì)節(jié)脫靶量自然不穩(wěn)定。解決用自適應(yīng)步長(zhǎng)積分器方法是solve_ivp默認(rèn)的RK45而不是自己寫(xiě)固定步長(zhǎng)遞推。t_eval只是輸出采樣點(diǎn)不參與積分步長(zhǎng)控制。脫靶量精確評(píng)估用事件檢測(cè)找最近點(diǎn)不要在固定步長(zhǎng)上糾結(jié)。5.5 常值機(jī)動(dòng)下脫靶量大先查過(guò)載飽和再懷疑制導(dǎo)律現(xiàn)象目標(biāo)無(wú)機(jī)動(dòng)時(shí)脫靶量1米加一個(gè)3g常值橫向機(jī)動(dòng)后脫靶量變成50米有人立刻得出結(jié)論“比例導(dǎo)引不能對(duì)抗機(jī)動(dòng)目標(biāo)”。原因很多時(shí)候不是制導(dǎo)律的問(wèn)題而是場(chǎng)景超過(guò)了導(dǎo)彈的可用過(guò)載。目標(biāo)3g機(jī)動(dòng)在末端產(chǎn)生的需用過(guò)載可能遠(yuǎn)大于30g指令持續(xù)頂在限幅值上自然無(wú)法把視線角速率壓回零。解決先統(tǒng)計(jì)整個(gè)仿真過(guò)程中指令限幅激活的時(shí)間占比。如果限幅活躍時(shí)間超過(guò)20%優(yōu)先提高最大過(guò)載、縮短初始攔截距離、或者調(diào)整初始幾何關(guān)系再看結(jié)果。排除過(guò)載飽和之后脫靶量依然明顯偏大時(shí)才考慮把制導(dǎo)律升級(jí)為增廣比例導(dǎo)引下一章講這個(gè)做法。6. 進(jìn)階增廣比例導(dǎo)引、一階滯后與雙變量掃參6.1 加目標(biāo)加速度補(bǔ)償APN真比例導(dǎo)引對(duì)常值目標(biāo)機(jī)動(dòng)存在穩(wěn)態(tài)誤差工程上常用增廣比例導(dǎo)引在指令里加入目標(biāo)加速度補(bǔ)償項(xiàng)。只需要改一行代碼# 目標(biāo)加速度在視線垂直平面上的投影 a_t_perp a_t - np.dot(a_t, R_hat) * R_hat a_cmd N * v_c * np.cross(omega_los, R_hat) 0.5 * N * a_t_perp補(bǔ)償項(xiàng)讓制導(dǎo)指令提前抵消目標(biāo)的機(jī)動(dòng)趨勢(shì)而不是等視線角速率變大后再追趕。6.2 一階自動(dòng)駕駛儀滯后怎么引入理想過(guò)載假設(shè)里指令加速度瞬時(shí)生效實(shí)際系統(tǒng)里自動(dòng)駕駛儀和彈體響應(yīng)有滯后。在狀態(tài)向量里增加3維實(shí)際加速度a_real指令經(jīng)過(guò)一階慣性環(huán)節(jié)后再作用于運(yùn)動(dòng)學(xué)d_a_real (a_cmd - a_real) / tautau取0.3秒左右代表比較明顯的響應(yīng)延遲。滯后會(huì)讓脫靶量變差對(duì)比理想過(guò)載和滯后模型的差異能判斷制導(dǎo)律對(duì)彈體響應(yīng)速度的依賴程度。6.3 雙變量掃參N與目標(biāo)過(guò)載的脫靶量表格把N取3、4、5目標(biāo)過(guò)載取1g、3g、5g跑9組仿真輸出一張脫靶量表格能直觀看出參數(shù)邊界。我一般會(huì)先跑無(wú)機(jī)動(dòng)基線再加機(jī)動(dòng)和噪聲擾動(dòng)逐層疊加避免一上來(lái)就懷疑算法最后發(fā)現(xiàn)是參數(shù)沒(méi)對(duì)上。這套仿真流程跑順之后換坐標(biāo)轉(zhuǎn)換、加氣動(dòng)模型、接導(dǎo)引頭噪聲都是水到渠成的事。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取