TVC姿态控制
假设我们的喷嘴是矢量喷口,则我们可以用$\delta_z$和$\delta_y$表达喷管的偏角。则$\delta_\phi$和$\delta_\omega$分别表达俯仰和偏航的等效角。对应的$\phi$和$\omega$对应俯仰角和偏航角,那么我们可以得到:
而从等效角对应到具体角度可以用一个传递函数完成。
其中的G1可以是PID控制器。假设G1是积分系统。设输入信号为:
和输出信号:
则可以有:
其中的$\phi(t)$为准坐标系到坐标系的转换矩阵。
两边同时取逆,可以得到:
对两边进行拉普拉斯变换。
如果输入信号是二阶震荡信号可以有:
定义G2为延迟传递矩阵,可得:
则一阶惯性伺服系统为:
二阶惯性伺服系统:
综上所述可以得到TVC开环传递公式:
到目前为止我们已经清楚的了解到TVC控制的数学原理,为了可以精准控制姿态,我们需要对传递函数进行数学建模。接下来是具体控制器的运行过程。
通过此算法可以保证推力矢量的稳定可控,接下来解释一下钱学森弹道
钱学森弹道
钱学森弹道是一个抛物线路径,曲线方程为:
其中Y为纵向位移,X为横向位移,其中的abcd为常数,用于控制终点。
这个公式的用处不大,我们需要利用一些简单方法进行推导:
水平方向上,假设不考虑空气阻力的情况,导弹的初始水平速度为 $v_{0x} = v_0 \cos\theta_0 $。
考虑空气阻力的情况下,水平速度的变化率可由以下方程表示:
其中m为导弹质量,v是导弹瞬时速度 $v = \sqrt{v_x^2 + v_y^2}$。
由于空气阻力会减小水平速度,所以速度方程为:
水平位移xt由速度积分得出:
假设 t=0时x=0,则$C = \frac{m v_{0x}}{c_d}$,所以:
竖直方向上,导弹初始速度为 $v_{0y} = v_0 \sin\theta_0$,受重力 mg 和空气阻力Fd的共同作用。
竖直速度的变化率为:
同样的,通过解微分方程,可以得到竖直速度 $v_y(t)$ 和竖直位移 y(t)的表达式。由于过程较为复杂,我们给出解的形式:
竖直位移 y(t) 为速度的积分:
同样假设 y(0) = 0,可以求得:
为了得到导弹的轨迹方程 y(x),我们需要消去时间 t。通过解水平方程 x(t) 得到 t 作为 x 的函数:
将其代入竖直位移方程 y(t),即可得到y关于x的表达式:
简化得到最终的轨迹方程:
在空气阻力较小的情况下,即$ c_d \to 0$,轨迹方程可进一步简化为常见的抛物线形式:
对于有空气阻力确定落点的情况下:
初始速度 $v_0$ 和 发射角度 $\theta_0$ 已知,空气阻力 $F_d = c_d v^2$,其中 $c_d$ 是阻力系数,v 是速度。
2. 弹道方程
弹道方程的垂直和水平分量分别为:
其中,$v_x$和 $v_y$ 是速度的水平和垂直分量。
接下来用python代码完成路径仿真:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| import numpy as np import matplotlib.pyplot as plt
g = 9.81 c_d = 0.005 m = 100 dt = 0.01
v0_values = [50, 70, 90] theta_values = [30, 45, 60]
plt.figure(figsize=(10, 6))
for v0 in v0_values: for theta0 in theta_values: theta_rad = np.radians(theta0)
v_x = v0 * np.cos(theta_rad) v_y = v0 * np.sin(theta_rad) x, y = 0, 0
x_vals = [] y_vals = []
while y >= 0: v = np.sqrt(v_x ** 2 + v_y ** 2)
v_x -= (c_d / m) * v * v_x * dt v_y -= (g + (c_d / m) * v * v_y) * dt
x += v_x * dt y += v_y * dt
x_vals.append(x) y_vals.append(y)
plt.plot(x_vals, y_vals, label=f'v0 = {v0} m/s, θ = {theta0}°')
plt.scatter(x, 0, color='red') plt.text(x, 0, f'({x:.1f}, 0)', fontsize=9, ha='right', color='red')
plt.title('ballistic trajectory') plt.xlabel('distance (m)') plt.ylabel('height (m)') plt.legend() plt.grid(True)
plt.show()
|
不要疑惑,钱学森弹道在突破大气层过程是图中的轨道,剩下的大气层打水漂过程我们无法完全仿真,因为需要考虑空气阻力,飞行器姿态控制,所以我们只能假设一下。
修改一下初始位置得到:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| import numpy as np import matplotlib.pyplot as plt
g = 9.81 c_d = 0.005 m = 100 dt = 0.01
v0_values = [50, 70, 90] theta_values = [30, 45, 60]
plt.figure(figsize=(12, 8))
for v0 in v0_values: for theta0 in theta_values: theta_rad = np.radians(theta0)
v_x = v0 * np.cos(theta_rad) v_y = v0 * np.sin(theta_rad) x, y = 0, 100000
x_vals = [] y_vals = []
while y >= 0: v = np.sqrt(v_x ** 2 + v_y ** 2)
v_x -= (c_d / m) * v * v_x * dt v_y -= (g + (c_d / m) * v * v_y) * dt
x += v_x * dt y += v_y * dt
x_vals.append(x) y_vals.append(y)
plt.plot(x_vals, y_vals, label=f'v0 = {v0} m/s, θ = {theta0}°')
plt.scatter(x, 0, color='red') plt.text(x, 0, f'({x:.1f}, 0)', fontsize=9, ha='right', color='red')
plt.title('ballistic trajectory') plt.xlabel('distance (m)') plt.ylabel('height (m)') plt.legend() plt.grid(True)
plt.show()
|