2026-06-20 21:43
vgg() 函数 5 行代码(code.py:18-23),对应一个向量叉积公式: \[a_m = K_g \cdot \vec{v}_{rel} \times \vec{\omega}_{LOS}, \quad \vec{\omega}_{LOS} = \frac{\vec{r} \times \vec{v}_{rel}}{R^2}\] 逐行对应 R = np.linalg.norm(rel_pos) # R = |r|,弹目距离 if R < 1e-6: return np.zeros(3) # 防御性:避免 R=0 除零 omega = np.cross(rel_pos, rel_vel) / R ** 2 # 视线角速度矢量 ω_LOS return gain * np.cross(rel_vel, omega) # 指令加速度 = K_g · v_rel × ω_LOS 输入符号(在 run() 第 58 行调用): - rel_pos = pos_t - pos_m → 从导弹指向目标的视线矢量 \(\vec{r}\) - rel_vel = vel_t - vel_m → 相对速度 \(\vec{v}_{rel}\) 各步骤的几何含义 1) \(\vec{\omega}_{LOS} = (\vec{r} \times \vec{v}_{rel}) / R^2\) 视线角速度——视线方向转动的角速度。 - 大小:\(|\omega_{LOS}|\) = 视线每秒转多少弧度 - 方向:由右手定则,垂直于”\(\vec{r}\)–\(\vec{v}_{rel}\)“平面 物理判读: - 弹道瞄准完美(\(\vec{v}_{rel} \parallel \vec{r}\))→ \(\omega_{LOS} = 0\),无需修正 - 弹道有偏差 → \(\omega_{LOS} \neq 0\),需要修正 2) \(\vec{v}_{rel} \times \vec{\omega}_{LOS}\) 这一步决定导弹该往哪个方向转弯。 - 垂直于 \(\vec{v}_{rel}\) → 不改变”接近速度”,只转弯 - 垂直于视线法平面 → 旋转 \(\vec{v}_{rel}\) 的方向,把视线”拉直” 直觉:你在开车,前方有个移动的目标。如果方向盘不动,车头会逐渐偏离目标(视线在转)。你需要转动方向盘(产生横向加速度),让车头重新对准目标。VGG 的两次叉积就是这个”方向盘转角”的数学表达。 3) 乘以 \(K_g\)(增益) 转弯的”力度”。\(K_g\) 越大转弯越猛,\(K_g\) 越小转弯越温柔。 和 PN 的对比 公式 量级特征 PN \(N \cdot V_c \cdot \vec{\omega}_{LOS}\) 大小 ∝ \(V_c\)(接近速度),高速时很猛 VGG \(K_g \cdot \vec{v}{rel} \times \vec{\omega}{LOS}\) 大小 ∝ $ 数值后果直接对应你仿真里的差异: - APN:触顶 30g(≈ 294 m/s²),29.83s 命中 0.12m - VGG:峰值 ≈ 3 m/s²(K_g=3.5),要 44s 才命中 0.20m VGG 是软制导——收敛慢但过载需求低;APN 是硬制导——\(V_c\) 因子在高速接近时把指令放大。 为什么这个公式稳定(vs 之前的错误版本) 旧版:\(K_g \cdot \vec{v}_{rel} \times (\hat{r} \times \vec{v}_m)\) 问题:\(\hat{r} \times \vec{v}_m\) 在 \(\vec{v}_m \parallel \hat{r}\) 时 ≈ 0(初始几何就是这情况),整个公式退化失效。 新版:\(\vec{r} \times \vec{v}_{rel}\) - 分子:\(\vec{v}_{rel} \parallel \vec{r}\) 时为 0(物理上正确:无需修正),否则非零 - 分母:\(R^2\) 恒正,数值上无除零风险 - 任意初始几何下都良定义 简单说:这次的叉积顺序 \(\vec{r} \times \vec{v}_{rel}\) 让”零”对应”完美瞄准”这个物理零,结构上自然稳定。