第2章 相对运动学基础:坐标系定义与运动方程推导

各位同学,欢迎来到第二章。上一章我们聊了比例导引法的整体轮廓,今天要扎进去讲基础——坐标系和相对运动方程。

说实话,我刚入行那会儿,觉得坐标系这东西太简单了,不就是三个轴嘛。直到有一次做半实物仿真,弹体姿态算出来全是错的,查了两天才发现——哦,坐标系定义反了。从那以后,我每次做仿真第一件事,就是把坐标系定义写清楚、画明白。

好,咱们开始。

2.1 为什么需要多个坐标系?

你想想看,导弹在空中飞,涉及的东西太多了:

  • 导弹自己的姿态(俯仰、偏航、滚转)
  • 导弹和目标的相对位置
  • 视线方向的变化
  • 地球引力、气动力等等

用一个坐标系描述所有东西?不现实。就像你描述一个人,既要说他在房间里的位置,又要说他脸朝哪边——你得用不同的参考系。

我个人习惯用三个坐标系:

  1. 惯性坐标系——描述绝对位置和速度
  2. 弹体坐标系——描述导弹自身的姿态
  3. 视线坐标系——描述导弹-目标之间的几何关系

核心思想:每个坐标系只干自己最擅长的事。惯性系管全局,弹体系管姿态,视线系管制导。

2.2 惯性坐标系(Inertial Frame)

惯性系,说白了就是一个不动的参考系。在导弹制导中,我们通常取发射点为原点,x轴指向正北(或目标方向),y轴指天,z轴按右手定则确定。

为什么叫「惯性」?因为牛顿定律在这个坐标系里成立。你算加速度、算力,都得回到惯性系。

小提示:实际工程中,我们常用地心地固系(ECEF)或北东地系(NED)作为惯性系。但为了教学简单,这里用发射点惯性系就够了。

2.3 弹体坐标系(Body Frame)

弹体系是固定在导弹上的坐标系。原点在导弹质心,x轴沿弹体纵轴向前,y轴向上(垂直于纵轴),z轴按右手定则指向右侧。

这个坐标系最大的用处——描述导弹的姿态角(俯仰角θ、偏航角ψ、滚转角φ)。

我记得有一次做仿真,把弹体系的y轴方向搞反了,结果算出来的攻角全是负的。嗯,这种低级错误,犯一次就记住了。

2.4 视线坐标系(Line-of-Sight Frame)

视线系是制导的核心。原点在导弹质心,x轴指向目标(即视线方向),y轴在包含视线的垂直平面内向上,z轴按右手定则确定。

为什么需要它?因为比例导引法的核心——控制视线角速率——就是在这个坐标系里定义的。

关键点:视线坐标系随着导弹和目标相对运动而旋转。它的角速度,就是制导律要控制的量。

2.5 坐标系之间的转换

有了三个坐标系,接下来就是它们之间的转换关系。说白了,就是旋转矩阵。

从惯性系到弹体系,需要经过三次旋转:

  1. 绕z轴转偏航角ψ
  2. 绕y轴转俯仰角θ
  3. 绕x轴转滚转角φ

从惯性系到视线系,只需要两次旋转:

  1. 绕z轴转视线方位角λaz
  2. 绕y轴转视线高低角λel

我的经验:旋转顺序很重要!不同顺序得到的结果完全不同。我建议你每次做转换前,先画个草图,把旋转顺序标清楚。

2.6 相对运动方程推导

好,重头戏来了。相对运动方程,描述的是导弹和目标之间的相对位置、速度随时间的变化。

设导弹位置为 rm,目标位置为 rt,则相对位置向量:

r = r_t - r_m

相对速度:

v = v_t - v_m

在视线坐标系中,相对位置向量可以写成:

r = [R, 0, 0]^T

其中R是导弹-目标距离。

对时间求导,得到相对运动方程:

dR/dt = -v_m * cos(η_m) + v_t * cos(η_t)
R * dλ/dt = v_m * sin(η_m) - v_t * sin(η_t)

这里:

  • ηm是导弹速度方向与视线方向的夹角
  • ηt是目标速度方向与视线方向的夹角
  • λ是视线角

注意:上面的方程假设导弹和目标都在同一平面内运动。实际三维情况会更复杂,但核心思想是一样的——距离变化率由速度在视线方向的分量决定,视线角速率由速度在垂直视线方向的分量决定。

2.7 知识体系总览

说了这么多,我画了一张图帮你理清思路:

相对运动学知识体系 惯性坐标系 描述绝对位置/速度 牛顿定律成立 弹体坐标系 描述导弹姿态 俯仰/偏航/滚转 视线坐标系 描述相对几何 制导律核心 坐标系转换 惯性系 → 弹体系:三次旋转(ψ, θ, φ) 惯性系 → 视线系:两次旋转(λ_az, λ_el) 相对运动方程 dR/dt = -v_m·cos(η_m) + v_t·cos(η_t) R·dλ/dt = v_m·sin(η_m) - v_t·sin(η_t)

2.8 一个简单的仿真验证

光说不练假把式。我写了一段Python代码,验证一下相对运动方程的正确性。假设导弹和目标都在x-y平面内运动:

import numpy as np
import matplotlib.pyplot as plt

# 初始条件
R0 = 5000.0          # 初始距离 5000m
lambda0 = np.radians(30)  # 初始视线角 30度
v_m = 300.0          # 导弹速度 300m/s
v_t = 200.0          # 目标速度 200m/s
eta_m0 = np.radians(20)   # 导弹速度方向与视线夹角
eta_t0 = np.radians(150)  # 目标速度方向与视线夹角

dt = 0.01
t_end = 10.0
n_steps = int(t_end / dt)

R = R0
lam = lambda0
R_history = [R]
lam_history = [np.degrees(lam)]

for i in range(n_steps):
    dR_dt = -v_m * np.cos(eta_m0) + v_t * np.cos(eta_t0)
    dlam_dt = (v_m * np.sin(eta_m0) - v_t * np.sin(eta_t0)) / R
    
    R += dR_dt * dt
    lam += dlam_dt * dt
    
    R_history.append(R)
    lam_history.append(np.degrees(lam))

print(f"10秒后距离: {R:.1f} m")
print(f"10秒后视线角: {lam_history[-1]:.2f} 度")

试试看:把上面的代码复制到你的环境里跑一下。你会发现,当导弹速度在视线方向的分量大于目标时,距离R会减小——这就是拦截的基本条件。

2.9 避坑指南

最后,分享几个我踩过的坑:

  • 角度单位搞混——我曾在仿真里把度当成弧度算,结果弹道飞到了天上去。记住,numpy的三角函数默认用弧度。
  • 旋转顺序搞错——不同领域的旋转顺序约定不一样。航空航天常用3-2-1顺序,但有些教材用1-2-3。做之前先确认。
  • 视线角定义模糊——视线方位角和视线高低角,哪个先转?我建议你统一用「先方位、后高低」的顺序。

重要提醒:坐标系定义是制导仿真的地基。地基歪了,上面盖的楼再漂亮也没用。花半小时把坐标系定义清楚,能省后面三天查bug的时间。

好,这一章就到这儿。坐标系和相对运动方程是后面所有内容的基础,建议你亲手推导一遍,再跑跑仿真代码。下一章我们聊比例导引法的核心——制导律本身。


公众号:蓝海资料掘金营,微信deep3321