带寻的系统的导弹模型¶
让我们来演示如何在导弹模型中添加寻的系统模型,该系统将在检测到目标时触发,并将控制对象带到空间中的理想点。
物体动力学模型¶
控制物体是一个普通的空气动力火箭,中间有机翼,尾部有方向舵。
对象模型的主要部分是刚体动力学的非线性表示法(块3DOF (Body Axes)
)。作用在火箭箭体上的空气动力和力矩是根据系数计算出来的,这些系数与马赫速度和攻角都有非线性关系。这些函数以表格的形式存储在模型中,在块2-D Lookup Table
中。
该模型还使用了航空航天系统调色板中的模块,如所有航空航天系统通用的标准大气模型。
滑翔机模型说明¶
动态机身模型由四个主要子系统和一个自动驾驶仪组成,自动驾驶仪通过舵的运动控制火箭的正常加速。大气、迎角和空速子系统计算大气条件对飞行高度的影响。舵驱动和传感器**子系统将自动驾驶仪模型与机身模型连接起来。空气动力和运动模型***计算作用在火箭机体上的力和力矩,然后计算运动模型。
大气和空速¶
该模型使用标准块ISA Atmosphere Model
- ISA 标准大气模型 (ISA)。附加块使用当前声速和速度头计算速度(以马赫为单位)Q
。
空气动力和系数¶
空气动力**子系统计算施加在火箭体轴上的力和力矩。然后对决定控制物体线性和角度运动的运动方程进行积分。
空气动力系数以表格形式存储,模拟过程中的瞬时值通过内插法确定。
自动驾驶仪型号¶
火箭的自动驾驶仪根据给定的正常加速度来控制高度舵。加速度计靠近火箭的机头,位于重心的前方。它的信号加上额外的阻尼被用来产生控制信号。
自动驾驶仪的系数是根据在预期范围内不同飞行条件下获得的几个线性化机身模型选定的。该模型还包括一个用于饱和控制(防风)的通道,以防止控制器在自动驾驶信号超出容差范围时达到饱和。
我们在本项目介绍的非线性模型中测试了以这种方式创建的自动驾驶仪。
制导回路¶
有两个子系统负责寻找和维持目标:
- 搜索/跟踪** - 返回导弹与目标之间当前相对运动参数的估计值
- 制导** - 计算追击模式下所需的正常加速度和搜索模式下所需的瞄准角
导引系统计算器¶
该子系统为不同的系统提供控制信号:
- 当目标捕获时间超过规定时间时发出自毁信号、
- 目标捕获模式下的设定视角、
- 盲飞模式(最终模式)下正常加速的固定指令、
- 系统的实际运行模式、
- 解除系统的信号。
拉丁文名称通常是代码生成器正常工作所需的折衷名称。
工作电脑通过变量Mode
(外部变量Режим
)控制所有机载系统的运行。该变量负责切换控制模式。在目标搜索期间,工作计算机通过向天线吊坠发送Sigma_d
信号,直接控制视线角*。当目标进入寻的波束(Acquire
或Захват
信号)的范围时,系统会暂停一段预设时间,然后进入闭环跟踪模式。在可能失去捕获的情况下,系统首先进入搜索模式,然后在指定时间后自毁。
第一个有限状态机发出移动和跟踪的控制指令,并在失去目标后超过允许的跟踪时间时向第二个有限状态机发出信号id_timeout
:
当目标接近时(如果系统处于RadarGuided
模式或超过待机时间),第二个分配器发出解除信号。
跟踪模式下的比例控制¶
在寻的器获取目标后至碰撞(或自解体)前,使用比例控制法则来控制导弹。该控制法则根据以下数据计算所需的法向加速度:
- 导弹与目标之间的接近速率测量值,如果寻的头配备雷达,可从多普勒跟踪装置获得、
- 视线角变化率(扫描率)的估计值。
跟踪子系统¶
该子系统检测和跟踪目标,控制天线方向,并根据控制法则使其保持在目标位置。跟踪环路tors
的时间常数为 0.05 秒,可根据所需的响应速度和抗噪能力进行调整。稳定环路负责修正天线波束偏移率,以考虑到人体的角速度。其系数根据陀螺仪的带宽进行选择。
除状态变量外,系统还输出目标角速度的估计值--天线波束位移速度与雷达获得的天线-目标角速度的平滑和。滤波器带宽等于自动驾驶仪带宽的一半。
整流罩误差¶
对于雷达制导导弹来说,整流罩是一个常见的误差源,它会影响接收延迟和模式。通常情况下,这种误差的大小是通过以天线方位角为输入的非线性函数计算出来的。我们的模型通过天线方位角 (Gimbal
) 与 "整流误差 "因子的失真大小之间的线性关系来近似计算这种影响。
在这个子系统中,还可以实现其他重要误差的模型,例如过载对陀螺仪运行的影响。通过这些模型可以检查跟踪和稳定环路控制器的可靠性。
启动和演示系统操作¶
现在我们来运行模型。在其 *Reverse 调用 * 中设置了以下初始参数:
- 目标以 328 米/秒的恒定速度在迎面而来的航线上飞行
- 目标位于天线发射点下方 500 米处
结果显示,在发射后 0.42 秒时捕获目标,0.63 秒时系统进入跟踪模式,3.27 秒时发生碰撞。
model_name = "aero_guidance";
model_name in [m.name for m in engee.get_all_models()] ? engee.open(model_name) : engee.load( "$(@__DIR__)/$(model_name).engee");
res = engee.run( model_name );
让我们将所需信号分开:
Mach_speed = collect(res["Атмосфера, Угол атаки и Воздушная скорость.Скорость (Мах)"]);
sigma_antenna = collect(res["Слежение и оценка скорости сканирования.Ориентация антенны"]);
sigma_target = collect(res["Ориентация на цель.1"]);
sigma_rad = collect(res["Sigma_rad"]);
alpha = collect(res["Incidence & Airspeed.α"]);
mode = collect(res["Вычислитель системы наведения (100 Hz).Режим"]);
misile_traj = collect(res["Планер и Автопилот.Xe,Ze"]);
target_traj = collect(res["Положение цели.Цель"]);
Az = collect(res["Аэродинамические силы и Модель движения.Ax,Az"]);
Az_d = collect(res["Az_d.1"]);
fin_demand = collect(res["Автопилот.Заданное положение руля"]);
fin_position = collect(res["Привод руля.B"]);
model_stop = collect(res["Подрыв.Остановка"]);
绘制状态变量图,将轨迹可视化:
gr()
plot(
plot( Az.time, [last.(Az.value) Az_d.value]./9.81, ls=[:solid :dash], ylabel="Нормальное ускорение [g]", label=["Истинное" "Заданное"], xlabel="Время [c]" ),
plot( alpha.time, rad2deg.(alpha.value), ylabel="Угол атаки [град]", xlabel="Время [c]", leg=false ),
plot( Mach_speed.time, Mach_speed.value, ylabel="Скорость [Мах]", xlabel="Время [c]", leg=false ),
plot( fin_demand.time, rad2deg.([fin_demand.value fin_position.value]), ls=[:solid :dash], ylabel="Работа руля [град]", label=["Управление" "Отклонение"], xlabel="Время [c]" ),
guidefont=font(8), lw=2, size=(800,400)
)
mode_change_idx = findall( diff(mode.value).>0 )
plot( sigma_target.time, rad2deg.(sigma_target.value), label="Ориентация на цель", ylimits=(-30,10), lw=2 )
plot!( sigma_antenna.time, rad2deg.(sigma_antenna.value), label="Ориентация антенны", ls=[:solid :dash], lw=2 )
vline!( [mode.time[mode_change_idx]], ls=:dash, label="Смена режима системы" )
plot!( guidefont=font(8), lw=2, size=(600,300), xlabel="Время [с]", ylabel="Ориентация на цель и угол антенны [град]" )
# Приведение разных сигналов к одному времени интегрирования
sample_time_factor = length(first.(target_traj.value)) / length(model_stop.value)
f_idx = 1:round(Int, findfirst(model_stop.value .> 0)*sample_time_factor)
plot( first.(target_traj.value)[f_idx], last.(target_traj.value)[f_idx], label="Цель", lw=2, ls=:dash )
plot!( first.(misile_traj.value)[f_idx], last.(misile_traj.value)[f_idx], label="Ракета", lw=2 )
plot!( guidefont=font(8), size=(600,400), xlabel="X[м]", ylabel="Z [м]" )
现在,我们可以轻松地在任何一组输入条件下运行模型,并研究其性能。
结论¶
我们建立了一个相对复杂的导弹瞄准系统模型,并对其轨迹进行了追踪。
[2] Lebedev A.A.,Chernobrovin L.S.无人驾驶飞行器的飞行动力学。М. - 1973.