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

Рис. 6. Эскиз ракеты
Управление ракетой по тангажу и рысканию осуществляется поворотом маршевого двигателя. Для управления используется классический регулятор следующего вида:
где
– угол поворота двигателя в плоскости тангажа/рыскания;
Поворот двигателя осуществляется следящим приводом, работа которого моделируется дифференциальным каналом управления и описывается дифференциальным уравнением вида:
где
– регулируемая характеристика и ее производные по времени;
Исходные данные для расчета:
− масса конструкции ракеты (без МДУ) 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 представлена на рис. 7.
Для задания новых значений коэффициентов в системе управления достаточно четвёртым аргументом:
sensor_array DLL=simulink( "rocket.dll", U, Y, "", step )
указать не пустую строку, а, например,
"K_fi_Value=5.3 [], K_w_Value=k_w []",
а до команды создания массива датчиков задать
scalar k_w=2.4 [].
В этом случае значение K_fi в модели станет равно 5.3, а значение K_w станет равно 2.4.

Рис. 7. Схема управляющего модуля в программном комплексе 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="fiZ [ rad ], wZ [ rad / s ], fiX [ rad ], wX [ rad /s ],";
string Y="signal_dZ_1 [ rad ], signal_dX_1 [ rad ],";
scalar step=1.00000e-03 [ s ];
sensor_array DLL=simulink( "rocket.dll", U, Y, "", step );//
// Переопределение сигнала управления
sensor signal_dZ_2=currentValue( signal_dZ, DLL.signal_dZ_1 );
sensor signal_dX_2=currentValue( signal_dX, DLL.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_Simulink.elr получены совпадающие результаты.
На рис. 8, рис. 9, рис. 10 представлены графики угла поворота МДУ вокруг оси Z, угла поворота ракеты вокруг оси Z и угловой скорости ракеты вокруг оси Z полученные при расчете моделей rocket_EULER.elr и rocket_EULER_Simulink.elr.

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

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

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