4.2 Стабилизация ракеты
В примере рассматривается стабилизация ракеты путем поворота маршевой двигательной установки (МДУ) во время старта ракеты при наличии силового возмущения от кабеля бортового разъемного соединения (БРС) - на ракету в течение определенного времени (после старта до отсоединения БРС) действует сила от кабеля БРС, отклоняющая корпус ракеты от требуемого положения.
Модель расчета старта ракеты сформирована в соответствии с представленным на рис.11 эскизом и состоит из 3 звеньев: ракета, маршевая двигательная установка (МДУ), стартовый стол (СС). Шарнир «ракета – МДУ» допускает поворот МДУ относительно ракеты по углам рыскания и тангажа.

Рис. 11. Эскиз ракеты
Управление ракетой по тангажу и рысканию осуществляется поворотом маршевого двигателя. Для управления используется классический регулятор следующего вида:

где
– угол поворота двигателя в плоскости тангажа/рыскания;



Поворот двигателя осуществляется следящим приводом, работа которого моделируется дифференциальным каналом управления и описывается дифференциальным уравнением вида:

где
– регулируемая характеристика и ее производные по времени;


Исходные данные для расчета:
− масса конструкции ракеты (без МДУ) 100 [t],
− масса МДУ 2 [t],
− тяга МДУ 130 [tf],
− сила натяжения в кабеле БРС 5000 [kgf],
− время до отсоединения БРС после отрыва ракеты от стола 2 [s],
− высота ракеты 30 [m],
− радиус ракеты 1.5 [m],
− коэффициент
в системе управления 9.8,

− коэффициент
в системе управления 1.57 [s],

− коэффициент T1 привода поворота МДУ 0.08 [s],
− коэффициент T2 привода поворота МДУ 0.05 [s].
В расчете моделируется движение ракеты, на которую действуют:
− сила тяги МДУ;
− сила гравитации;
− сила от кабеля БРС;
Моделирование управляющего сигнала может производиться как непосредственно в проекте EULER, так и в отдельной модели, созданной в MATLAB/Simulink и включенной в проект EULER.
Файл rocket_EULER.elr содержит модель стабилизации ракеты. Моделирование управляющего поворотом МДУ сигнала выполняется непосредственно в EULER (текст файла приведен ниже).
Текст проекта rocket_EULER.elr
// Моделирование стабилизации ракеты при старте после возмущения от БРС.
// БРС - бортовое разъемное соединение.
// Стабилизация производится поворотом маршевой двигательной установки (МДУ).
//
// Исходные данные
scalar Mr "масса конструкции ракеты (без МДУ)"=100 [ t ];
scalar Mdu "масса МДУ"=2 [ t ];
scalar P "тяга МДУ"=130 [tf];
scalar F_brs "значение силы натяжения в кабеле БРС"=5000 [ kgf ];
scalar t_brs "время действия БРС после отрыва от стола"=2 [s];
scalar L "высота ракеты"=30 [ m ];
scalar R "радиус ракеты"=1.5 [ m ];
//
color color_base=index( 5 );
color color_rocket=index( 53 );
color color_MDU=index( 23 );
//
// Сигналы поворота МДУ
sensor signal_dZ "угол поворота МДУ вокруг оси Z"=var( 0 [deg] );
sensor signal_dX "угол поворота МДУ вокруг оси X"=var( 0 [deg] );
//
// Конструкция ракеты
point point1=point( 0 [ m ], 0 [ m ], 0 [ m ] );
point point2=point( R, 0 [ m ], 0 [ m ] );
point point3=point( R, 25 [ m ], 0 [ m ] );
point point4=point( 0 [ m ], L, 0 [ m ] );
line line1=polyLine( list( point1, point2, point3, point4 ), visible = hide: );
solid solid1=spin( line1, projectY, mass = Mr );
point pCr=point( 0 [ m ], L/2, 0 [ m ] );
body rocket "ракета"=body( color = color_rocket );
body rocket < ( solid1, pCr );
//
// МДУ
point point5=point( 0 [ m ], 1.5 [ m ], 0 [ m ] );
point point6=point( 0.75 [ m ], -1.5 [ m ], 0 [ m ] );
point point7=point( 0 [ m ], -1.5 [ m ], 0 [ m ] );
line line2=polyLine( list( point7, point6, point5 ), visible = hide: );
solid solid2=spin( line2, projectY, mass = Mdu );
body MDU "маршевая двигательная установка"=body( color = color_MDU );
body MDU < ( solid2 );
force force_P "тяга МДУ"=force( MDU, point5, projectY, P, list( ) );
joint joint_mdu "ракета - МДУ"=user( MDU, rocket, nodePoint( point5 ), noX:, noY:, noZ:, yesFiX:, noFiY:, yesFiZ: );
scalar T1 "первый коэффициент привода поворота МДУ"=0.08 [s];
scalar T2 "второй коэффициент привода поворота МДУ"=0.05 [s];
motion motion_Z "привод поворота МДУ вокруг оси Z"=differential2( joint_mdu.fiZ, signal_dZ, T2, T1 );
motion motion_X "привод поворота МДУ вокруг оси X"=differential2( joint_mdu.fiX, signal_dX, T2, T1 );
//
// Стартовый стол
point point8=point( 1 [ m ], 0 [ m ], 0 [ m ] );
point point9=point( 5 [ m ], 0 [ m ], 0 [ m ] );
point point10=point( 5 [ m ], -2 [ m ], 0 [ m ] );
point point11=point( 1 [ m ], -2 [ m ], 0 [ m ] );
line line3=polyLine( list( point8, point9, point10, point11 ), visible = hide: );
solid solid3=spin( line3, projectY, mass = 1 [ kg ] );
body base "стартовый стол"=body( color = color_base );
set ground = base;
body base < ( solid3 );
//
// Гравитация
gravity gravity1 "гравитация"=parallel( reverse( projectY ) );
//
// БРС
point point14=point( 1.5 [ m ], 24 [ m ], 0 [ m ] );
force force_brs "БРС"=force( rocket, point14, projectX, F_brs, list( time ), fixing = unlock: );
event event_brs_off "отрыв кабеля"=reformsBySensor( list( forcesOff( list( force_brs ) ) ), time, t_brs );
//
// Параметры движения ракеты
joint joint_base "стартовый стол - ракета"=user( rocket, base, nodePoint( point1 ), yesX:, yesY:, yesZ:, yesFiX:, yesFiY:, yesFiZ: );
sensor fiZ "поворот ракеты вокруг оси Z"=joint_base.fiZ;
sensor fiX "поворот ракеты вокруг оси X"=joint_base.fiX;
sensor wZ "угловая скорость ракеты вокруг оси Z"=derivative( joint_base.fiZ );
sensor wX "угловая скорость ракеты вокруг оси X"=derivative( joint_base.fiX );
//
// Система управления
scalar k_fi "коэффициент в системе управления"=9.8;
scalar k_w "коэффициент в системе управления"=1.57 [s];
sensor signal_dZ_1 "угол поворота МДУ вокруг оси Z"=k_fi*fiZ+k_w*wZ;
sensor signal_dX_1 "угол поворота МДУ вокруг оси Х"=k_fi*fiX+k_w*wX;
//
// Переопределение сигнала управления
sensor signal_dZ_2=currentValue( signal_dZ, signal_dZ_1 );
sensor signal_dX_2=currentValue( signal_dX, signal_dX_1 );
//
node node_Camera=nodePoint( pCr );
command dynam_RK4_p001 "команда расчета движения"=constRK4( 1.00000e+001 [ s ], 5.00000e-003 [ s ] );
//
/\///////////////////////////////////////////////////////////////////////////////////
/\ Список главных команд;
set dynamics = dynam_RK4_p001;
/\///////////////////////////////////////////////////////////////////////////////////
/\ Единицы измерения;
set units = SI;
Файл rocket_EULER_Simulink.elr (текст файла приведен ниже) содержит модель стабилизации ракеты с моделированием управляющего поворотом МДУ сигнала в DLL-модуле, который создан в MATLAB/Simulink. Входными данными этого модуля управления являются данные о движении ракеты (
– отклонение и скорость отклонения угла тангажа/рыскания от заданных значений). В соответствии с представленным алгоритмом в модуле формируется сигнал управления и его значение в виде выходного параметра возвращается в общую модель стабилизации ракеты (в программный комплекс EULER). Схема (алгоритм расчета) модуля управления в программном комплексе MATLAB/Simulink представлена на рис.12.


Рис. 12. Схема управляющего модуля в программном комплексе MATLAB/Simulink
Текст проекта rocket_EULER_Simulink.elr
//
// Сигналы поворота МДУ
sensor signal_dZ "угол поворота МДУ вокруг оси Z"=var( 0 [deg] );
sensor signal_dX "угол поворота МДУ вокруг оси X"=var( 0 [deg] );
//
// Конструкция ракеты
point point1=point( 0 [ m ], 0 [ m ], 0 [ m ] );
point point2=point( R, 0 [ m ], 0 [ m ] );
point point3=point( R, 25 [ m ], 0 [ m ] );
point point4=point( 0 [ m ], L, 0 [ m ] );
line line1=polyLine( list( point1, point2, point3, point4 ), visible = hide: );
solid solid1=spin( line1, projectY, mass = Mr );
point pCr=point( 0 [ m ], L/2, 0 [ m ] );
body rocket "ракета"=body( color = color_rocket );
body rocket < ( solid1, pCr );
//
// МДУ
point point5=point( 0 [ m ], 1.5 [ m ], 0 [ m ] );
point point6=point( 0.75 [ m ], -1.5 [ m ], 0 [ m ] );
point point7=point( 0 [ m ], -1.5 [ m ], 0 [ m ] );
line line2=polyLine( list( point7, point6, point5 ), visible = hide: );
solid solid2=spin( line2, projectY, mass = Mdu );
body MDU "маршевая двигательная установка"=body( color = color_MDU );
body MDU < ( solid2 );
force force_P "тяга МДУ"=force( MDU, point5, projectY, P, list( ) );
joint joint_mdu "ракета - МДУ"=user( MDU, rocket, nodePoint( point5 ), noX:, noY:, noZ:, yesFiX:, noFiY:, yesFiZ: );
scalar T1 "первый коэффициент привода поворота МДУ"=0.08 [s];
scalar T2 "второй коэффициент привода поворота МДУ"=0.05 [s];
motion motion_Z "привод поворота МДУ вокруг оси Z"=differential2( joint_mdu.fiZ, signal_dZ, T2, T1 );
motion motion_X "привод поворота МДУ вокруг оси X"=differential2( joint_mdu.fiX, signal_dX, T2, T1 );
//
// Стартовый стол
point point8=point( 1 [ m ], 0 [ m ], 0 [ m ] );
point point9=point( 5 [ m ], 0 [ m ], 0 [ m ] );
point point10=point( 5 [ m ], -2 [ m ], 0 [ m ] );
point point11=point( 1 [ m ], -2 [ m ], 0 [ m ] );
line line3=polyLine( list( point8, point9, point10, point11 ), visible = hide: );
solid solid3=spin( line3, projectY, mass = 1 [ kg ] );
body base "стартовый стол"=body( color = color_base );
set ground = base;
body base < ( solid3 );
//
// Гравитация
gravity gravity1 "гравитация"=parallel( reverse( projectY ) );
//
// БРС
point point14=point( 1.5 [ m ], 24 [ m ], 0 [ m ] );
force force_brs "БРС"=force( rocket, point14, projectX, F_brs, list( time ), fixing = unlock: );
event event_brs_off "отрыв кабеля"=reformsBySensor( list( forcesOff( list( force_brs ) ) ), time, t_brs );
//
// Параметры движения ракеты
joint joint_base "стартовый стол - ракета"=user( rocket, base, nodePoint( point1 ), yesX:, yesY:, yesZ:, yesFiX:, yesFiY:, yesFiZ: );
sensor fiZ "поворот ракеты вокруг оси Z"=joint_base.fiZ;
sensor fiX "поворот ракеты вокруг оси X"=joint_base.fiX;
sensor wZ "угловая скорость ракеты вокруг оси Z"=derivative( joint_base.fiZ );
sensor wX "угловая скорость ракеты вокруг оси X"=derivative( joint_base.fiX );
//
//
string U="sensor fiZ [ ], sensor fiX [ ], sensor wZ [ 1 / s ], sensor wX [ 1 / s ]";
string Y="sensor signal_dZ_1 [ ], sensor signal_dY_1 [ ]";
sensor_array signal_1=Simulink(Rocket.DLL, U, Y, "", 5e-3 [ s ]);
//
// Переопределение сигнала управления
sensor signal_dZ_2=currentValue( signal_dZ, signal_dZ_1 );
sensor signal_dX_2=currentValue( signal_dX, signal_dX_1 );
//
node node_Camera=nodePoint( pCr );
command dynam_RK4_p001 "команда расчета движения"=constRK4( 1.00000e+001 [ s ], 5.00000e-003 [ s ] );
//
/\///////////////////////////////////////////////////////////////////////////////////
/\ Список главных команд;
set dynamics = dynam_RK4_p001;
/\///////////////////////////////////////////////////////////////////////////////////
/\ Единицы измерения;
set units = SI;
В результате расчета старта ракеты при помощи моделей rocket_EULER.elr и rocket_EULER_SimInTech.elr получены совпадающие результаты.
На рис.15-15 представлены графики угла поворота МДУ вокруг оси Z, угла поворота ракеты вокруг оси Z и угловой скорости ракеты вокруг оси Z полученные при расчете моделей rocket_EULER.elr и rocket_EULER_SimInTech.elr.

Рис. 13. Угол поворота МДУ вокруг оси Z

Рис. 14. Угол поворота ракеты вокруг оси Z

Рис. 15. Угловая скорость ракеты вокруг оси Z