Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методическое пособие 366

.pdf
Скачиваний:
6
Добавлен:
30.04.2022
Размер:
1.03 Mб
Скачать

ствия выполняются для оставшихся двух координат центра масс тела и для трѐх угловых степеней свободы: yy=yx-(m+h);

Yplane_title = uicontrol( ...

"parent"

, fig,...

"style"

, "text",...

"string"

, "Yplane",...

"units"

, "pixels",...

"position"

, [xs yy+h lslider h],...

"fontunits"

, "points",...

"fontsize"

, 9,...

"horizontalalignment" , "center", ...

"background"

, [1 1 1], ...

"tag"

, "YplaneTitle" ...

);

 

Slider_Yplane=uicontrol("parent",fig,.. "style","slider",..

"Min",0,.. "Max",100,.. "Value",0,.. "units","pixels",..

"position"

, [xs yy lslider h],...

"tag"

, "Yplane", ...

"callback"

, "update_yplane()" ...

);

 

Value_Yplane = uicontrol("parent",fig,..

"Position" , [xv yy lv h],...

"Style" , "text",...

"String" , "70",...

"BackgroundColor",[1 1 1]);

yh=yy-(m+h);

Height_title = uicontrol( ...

"parent"

, fig,...

"style"

, "text",...

 

19

"string"

, "Height",...

"units"

, "pixels",...

"position"

, [xs yh+h lslider h],...

"fontunits"

, "points",...

"fontsize"

, 9,...

"horizontalalignment" , "center", ...

"background"

, [1 1 1], ...

"tag"

, "HeightTitle" ...

);

 

Slider_Height=uicontrol("parent",fig,.. "style","slider",..

"Min",0,.. "Max",100,.. "Value",0,.. "units","pixels",..

"position"

, [xs yh lslider h],...

"tag"

, "Height", ...

"callback"

, "update_height()" ...

);

 

Value_Height = uicontrol("parent",fig,..

"Position" , [xv yh lv h],...

"Style" , "text",...

"String" , "70",...

"BackgroundColor",[1 1 1]);

yt=yh-(m+h);

Theta_title = uicontrol( ...

"parent"

, fig,...

"style"

, "text",...

"string"

, "Theta",...

"units"

, "pixels",...

"position"

, [xs yt+h lslider h],...

"fontunits"

, "points",...

 

20

"fontsize" , 9,...

"horizontalalignment" , "center", ...

"background"

, [1 1 1], ...

"tag"

, "ThetaTitle" ...

);

 

Slider_Theta=uicontrol("parent",fig,.. "style","slider",..

"Min",0,.. "Max",100,.. "Value",70,.. "units","pixels",..

"position"

, [xs yt lslider h],...

"tag"

, "Theta", ...

"callback"

, "update_theta()" ...

);

 

Value_Theta = uicontrol("parent",fig,..

"Position" , [xv yt lv h],...

"Style" , "text",...

"String" , "70",...

"BackgroundColor",[1 1 1]);

yphi=yt-(m+h);

Phi_title = uicontrol( ...

"parent"

, fig,...

"style"

, "text",...

"string"

, "Phi",...

"units"

, "pixels",...

"position"

, [xs yphi+h lslider h],...

"fontunits"

, "points",...

"fontsize"

, 9,...

"horizontalalignment" , "center", ...

"background"

, [1 1 1], ...

"tag"

, "PhiTitle" ...

);

 

 

21

Slider_Phi=uicontrol("parent",fig,.. "style","slider",..

"Min",0,.. "Max",100,.. "Value",70,.. "units","pixels",..

"position"

, [xs yphi lslider h],...

"tag"

, "Phi", ...

"callback"

, "update_phi()" ...

);

 

Value_Phi = uicontrol("parent",fig,..

"Position" , [xv yphi lv h],...

"Style" , "text",...

"String" , "70",...

"BackgroundColor",[1 1 1]);

ypsi=yphi-(m+h);

Psi_title = uicontrol( ...

"parent"

, fig,...

"style"

, "text",...

"string"

, "Psi",...

"units"

, "pixels",...

"position"

, [xs ypsi+h lslider h],...

"fontunits"

, "points",...

"fontsize"

, 9,...

"horizontalalignment" , "center", ...

"background"

, [1 1 1], ...

"tag"

, "PsiTitle" ...

);

 

Slider_Psi=uicontrol("parent",fig,.. "style","slider",.. "Min",0,..

22

"Max",100,.. "Value",70,.. "units","pixels",..

"position"

, [xs ypsi lslider h],...

"tag"

, "Psi", ...

"callback"

, "update_psi()" ...

);

 

Value_Psi = uicontrol("parent",fig,..

"Position" , [xv ypsi lv h],...

"Style" , "text",...

"String" , "70",...

"BackgroundColor",[1 1 1]);

После выполнения этих команд в графическом окне появится 6 ползунков, расположенных друг под другом (это достигается путѐм задания соответствующих параметров yx, yy, yh, yt, yphi, ypsi), которые соответствуют шести обобщѐнным координатам. Далее идѐт описание элементов графического интерфейса в виде кнопок, при нажатии на которые вызываются соответствующие функции:

ybtn= ypsi -(m+h);wb=40;eb=13;

(задаются вспомогательные параметры, определяющие местоположение, размеры кнопок, а также интервал между ними)

Start = uicontrol("parent",fig, .. "Position" , [xs ybtn wb h],...

"Style" , "pushbutton",...

"String" , "Start",...

"callback" , "body_start()");

(появляется кнопка (тип графического элемента определяется значением в поле Style: значение pushbutton означает, что создаѐтся кнопка) с надписью Start (что указано в поле String), местоположение кнопки и еѐ размеры, как и прежде, указаны в поле position (параметры, определяющие местоположение, подобраны таким образом, что кнопка находится чуть ниже ниж-

23

него ползунка, левая граница ползунка и кнопки совпадает (за

это отвечает параметр xs), а правая граница кнопки находится

левее правой границы ползунка (так как длина кнопки wb

меньше длины ползунка lslider)); в поле callback указана функ-

ция, которая будет выполняться при нажатии на эту кнопку,

эта функция будет описана ниже)

Stop = uicontrol("parent",fig, ..

"Position" , [xs+wb+eb ybtn wb h],...

"Style" , "pushbutton",...

"String" , "Stop",...

"callback" , "body_stop()");

(справа от кнопки с надписью Start появляется кнопка с надпи-

сью Stop (по сравнению с предыдущим значением в поле Posi-

tion изменился только первый параметр, так что кнопка Stop

будет сдвинута относительно кнопки Start на интервал eb); при

нажатии на кнопку активируется функция body_stop, описание

которой будет приведено ниже)

Reinit = uicontrol("parent",fig, ..

"Position" , [xs+2*(wb+eb) ybtn wb h],...

"Style" , "pushbutton",...

"String" , "Reinit",...

"callback" , "body_reinit()");

(ещѐ правее с интервалом eb от кнопки Stop появляется кнопка

Reinit, при нажатии на которую активируется функция

body_reinit)

Xplot = uicontrol("parent",fig, ..

"Position" , [xs ybtn-h-eb wb h],...

"Style" , "pushbutton",...

"String" , "Xplot",...

"callback" , "plot_Xplane()");

Yplot = uicontrol("parent",fig, ..

"Position" , [xs+wb+eb ybtn-h-eb wb h],...

"Style" , "pushbutton",...

"String" , "Yplot",...

24

"callback" , "plot_Yplane()");

HEIplot = uicontrol("parent",fig, ..

"Position" , [xs+2*(wb+eb) ybtn-h-eb wb h],...

"Style" , "pushbutton",...

"String" , "HEIplot",...

"callback" , "plot_Height()");

Tplot = uicontrol("parent",fig, ..

"Position" , [xs ybtn-2*(h+eb) wb h],...

"Style" , "pushbutton",...

"String" , "Tplot",...

"callback" , "plot_Theta()");

PHIplot = uicontrol("parent",fig, ..

"Position" , [xs+wb+eb ybtn-2*(h+eb) wb h],...

"Style" , "pushbutton",...

"String" , "PHIplot",...

"callback" , "plot_Phi()");

PSIplot = uicontrol("parent",fig, ..

"Position" , [xs+2*(wb+eb) ybtn-2*(h+eb) wb h],...

"Style" , "pushbutton",...

"String" , "PSIplot",...

"callback" , "plot_Psi()");

(создаются 2 таких же ряда кнопок строго под вышеописанны-

ми и всѐ с тем же интервалом eb по вертикали и горизонтали;

как видно из названий, при нажатии на каждую из этих шести

кнопок строятся графики каждой из 6 обобщѐнных координат;

функции, вызываемые нажатием на эти кнопки, описаны ниже)

body_controls=[Slider_Xplane Value_Xplane

Slider_Yplane Value_Yplane

Slider_Height Value_Height

Slider_Theta Value_Theta

Slider_Phi Value_Phi

Slider_Psi Value_Psi]

(глобальная переменная, которая необходима для визуализа-

ции обобщѐнных координат тела при работе программы: она

25

помогает менять местоположение ползунка и текст справа от ползунка)

update_xplane(0) update_yplane(0) update_height(0) update_theta(0) update_phi(0) update_psi(0)

(инициализация: в качестве аргументов этих функций должны стоять начальные значения шести обобщѐнных координат, которые в данном случае полагаются нулями)

endfunction

Следующая функция отвечает за анимацию, если точнее, она преобразовывает координаты криволинейных четырѐхугольников, составляющих поверхность, которые были до интегрирования дифференциальных уравнений, в соответствующие координаты этих же точек, которые будут после интегрирования, а затем рисует тело с этими новыми координатами. function set_body(H, q)

(на входе – дескриптор графического объекта (поверхности) и вектор из обобщѐнных координат тела, полученный интегрированием дифференциальных уравнений движения)

O=H.user_data;

(вектор из обобщѐнных координат тела до интегрирования дифференциальных уравнений)

Data=H.data;

(структура с тремя матрицами размера 4х680, состоящими из координат вершин криволинейных четырѐхугольников, составляющих поверхность)

XYZ=[matrix(Data.x-O(1),1,-1) matrix(Data.y-O(2),1,-1) matrix(Data.z-O(3),1,-1)];

(матрица со всеми координатами вершин криволинейных четырѐхугольников, составляющих поверхность, переформиру-

26

ется таким образом, что первая строка состоит из X-координат вершин, вторая строка – из Y-координат, третья – из Z- координат. Также вычитанием координат центра масс достигается виртуальное смещение поверхности в начало координат, так как для нахождения координат точек, являющихся вершинами криволинейных четырѐхугольников, после интегрирования, необходимо разделить движение на поступательное и вращательное)

psi = q(11); theta = q(7); phi = q(9);

(углы ориентации тела, полученные после интегрирования дифференциальных уравнений)

XYZ=euler(psi,theta,phi)*eulerm1(O(6),O(4),O(5))*XYZ

(координаты преобразовываются с учетом вращения тела: матрица eulerm1(O(6),O(4),O(5)) представляет собой ориентацию неподвижной системы координат относительно системы, связанной с телом, до интегрирования; матрица euler(psi,theta,phi) представляет собой ориентацию системы координат, связанной с телом, после интегрирования, относительно неподвижной системы координат, таким образом, такое матричное произведение представляет собой взаимную ориентацию систем координат, связанных с телом, до и после интегрирования. Таким образом, после этого умножения получатся новые координаты, полученные только за счѐт вращения. Для получения искомых координат необходимо добавить только координаты центра масс, полученные после интегрирования)

drawlater()

(тело будет нарисовано позже, после получения окончательных координат)

Data.x=q(1)+matrix(XYZ(1,:),4,-1);

Data.y=q(3)+matrix(XYZ(2,:),4,-1);

Data.z=q(5)+matrix(XYZ(3,:),4,-1);

27

(добавляются координаты центра масс, полученные после интегрирования, и вектора переформируются так, чтобы они имели прежний вид, т.е. вид матриц 4х680)

H.user_data(1:6)=[q(1);q(3);q(5);q(7);q(9);q(11)]'

(сохраняются обобщѐнные координаты тела для следующего шага)

H.data=Data;

(координаты сохраняются в поле, которое отвечает за местоположение тела на рисунке)

drawnow()

(рисуем тело) endfunction

Следующая функция отвечает за изменение положения тела на рисунке при задании начальных условий (другими словами, эта функция позволяет при ручном передвижении ползунка получить тело на рисунке в соответствии с положением ползунка): function update_state(k, value)

Входные аргументы здесь – номер изменяемой компоненты вектора обобщѐнных координат k и value – значение этой компоненты.

global y1 state_changed init

(глобальные переменные, необходимые для работы программы: вектор состояния, признак изменения состояния тела и признак инициализации).

if or(k==(4:6)) then value=value*%pi/180;end

(если имеем дело с угловыми координатами тела, то переводим их из градусов в радианы)

y1(2*k-1)=value;

(в соответствующую компоненту вектора состояния помещается значение соответствующей обобщѐнной координаты)

if init then set_body(H,y1),

(если идѐт инициализация, то рисуем тело в соответствии с задаваемым при помощи перемещения ползунка положением)

28