You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
195 lines
5.7 KiB
195 lines
5.7 KiB
|
|
|
|
% Copyright (C) 1993-2011, by Peter I. Corke
|
|
%
|
|
% This file is part of The Robotics Toolbox for Matlab (RTB).
|
|
%
|
|
% RTB is free software: you can redistribute it and/or modify
|
|
% it under the terms of the GNU Lesser General Public License as published by
|
|
% the Free Software Foundation, either version 3 of the License, or
|
|
% (at your option) any later version.
|
|
%
|
|
% RTB is distributed in the hope that it will be useful,
|
|
% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
% GNU Lesser General Public License for more details.
|
|
%
|
|
% You should have received a copy of the GNU Leser General Public License
|
|
% along with RTB. If not, see <http://www.gnu.org/licenses/>.
|
|
function [sys,x0,str,ts] = flyerplot3(t,x,u,flag,s,plot,enable)
|
|
% Flyer plot, lovingly coded by Paul Pounds, first coded 17/4/02
|
|
% version 2 2004 added scaling and ground display
|
|
% version 3 2010 improved rotor rendering and fixed mirroring bug
|
|
%
|
|
% Displays X-4 flyer position and attitude in a 3D plot.
|
|
% GREEN ROTOR POINTS NORTH
|
|
% BLUE ROTOR POINTS EAST
|
|
|
|
% PARAMETERS
|
|
% s defines the plot size in meters
|
|
% swi controls flyer attitude plot; 1 = on, otherwise off.
|
|
|
|
% INPUTS
|
|
% 1 Center X position
|
|
% 2 Center Y position
|
|
% 3 Center Z position
|
|
% 4 Yaw angle in rad
|
|
% 5 Pitch angle in rad
|
|
% 6 Roll angle in rad
|
|
|
|
% OUTPUTS
|
|
% None
|
|
ts = [-1 0];
|
|
|
|
switch flag,
|
|
case 0
|
|
[sys,x0,str,ts] = mdlInitializeSizes(ts,plot,enable); % Initialization
|
|
case 3
|
|
sys = mdlOutputs(t,u,s,plot,enable); % Calculate outputs
|
|
case {1,2, 4, 9} % Unused flags
|
|
sys = [];
|
|
otherwise
|
|
error(['unhandled flag = ',num2str(flag)]); % Error handling
|
|
end
|
|
|
|
|
|
% Initialize
|
|
function [sys,x0,str,ts] = mdlInitializeSizes(ts,plot,enable)
|
|
% Call simsizes for a sizes structure, fill it in, and convert it
|
|
% to a sizes array.
|
|
sizes = simsizes;
|
|
sizes.NumContStates = 0;
|
|
sizes.NumDiscStates = 0;
|
|
sizes.NumOutputs = 0;
|
|
sizes.NumInputs = 6;
|
|
sizes.DirFeedthrough = 1;
|
|
sizes.NumSampleTimes = 1;
|
|
sys = simsizes(sizes);
|
|
x0 = [];
|
|
str = []; % Set str to an empty matrix.
|
|
ts = [0.05 0];
|
|
|
|
if enable == 1
|
|
figure(plot);
|
|
clf;
|
|
%colordef(1,'none');
|
|
end
|
|
% End of mdlInitializeSizes.
|
|
|
|
|
|
function sys = mdlOutputs(t,u,s,plot,enable)
|
|
global a1s b1s
|
|
|
|
name = strcat('flyer_movie',num2str((t/0.125)*2+1),'r.bmp'); %odds
|
|
%name = strcat('flyer_movie',num2str(160-(t/0.125)*2),'l.bmp'); %evens
|
|
|
|
|
|
if size(a1s) == [0 0];
|
|
a1s = [0 0 0 0];
|
|
b1s = [0 0 0 0];
|
|
end
|
|
|
|
d = 0.315; %Hub displacement from COG
|
|
r = 0.165; %Rotor radius
|
|
N = 1;
|
|
S = 2;
|
|
E = 3;
|
|
W = 4;
|
|
D(:,N) = [d;0;0]; %displacements
|
|
D(:,S) = [-d;0;0];
|
|
D(:,E) = [0;d;0];
|
|
D(:,W) = [0;-d;0];
|
|
C(:,N) = [s(1)/4;0;0]; %Attitude center displacements
|
|
C(:,S) = [-s(1)/4;0;0];
|
|
C(:,E) = [0;s(1)/4;0];
|
|
C(:,W) = [0;-s(1)/4;0];
|
|
|
|
if enable == 1
|
|
%draw ground
|
|
figure(plot);
|
|
clf;
|
|
if length(s) == 1
|
|
axis([-s s -s s 0 s]);
|
|
else
|
|
axis([-s(1) s(1) -s(1) s(1) 0 s(2)])
|
|
s = s(1);
|
|
end
|
|
hold on;
|
|
|
|
plot3([-s -s],[s -s],[0 0],'-b')
|
|
plot3([-s s],[s s],[0 0],'-b')
|
|
plot3([s -s],[-s -s],[0 0],'-b')
|
|
plot3([s s],[s -s],[0 0],'-b')
|
|
plot3([s -s],[-s s],[0 0],'-b')
|
|
plot3([-s s],[-s s],[0 0],'-b')
|
|
|
|
%READ STATE
|
|
z = [u(1);u(2);u(3)];
|
|
n = [u(4);u(5);u(6)];
|
|
|
|
%PREPROCESS ROTATION MATRIX
|
|
phi = n(1); %Euler angles
|
|
the = n(2);
|
|
psi = n(3);
|
|
|
|
R = [cos(the)*cos(phi) sin(psi)*sin(the)*cos(phi)-cos(psi)*sin(phi) cos(psi)*sin(the)*cos(phi)+sin(psi)*sin(phi); %BBF > Inertial rotation matrix
|
|
cos(the)*sin(phi) sin(psi)*sin(the)*sin(phi)+cos(psi)*cos(phi) cos(psi)*sin(the)*sin(phi)-sin(psi)*cos(phi);
|
|
-sin(the) sin(psi)*cos(the) cos(psi)*cos(the)];
|
|
|
|
%Manual Construction
|
|
%Q3 = [cos(psi) -sin(psi) 0;sin(psi) cos(psi) 0;0 0 1]; %Rotation mappings
|
|
%Q2 = [cos(the) 0 sin(the);0 1 0;-sin(the) 0 cos(the)];
|
|
%Q1 = [1 0 0;0 cos(phi) -sin(phi);0 sin(phi) cos(phi)];
|
|
%R = Q3*Q2*Q1; %Rotation matrix
|
|
|
|
%CALCULATE FLYER TIP POSITONS USING COORDINATE FRAME ROTATION
|
|
F = [1 0 0;0 -1 0;0 0 -1];
|
|
|
|
%Draw flyer rotors
|
|
t = [0:pi/8:2*pi];
|
|
for j = 1:length(t)
|
|
circle(:,j) = [r*sin(t(j));r*cos(t(j));0];
|
|
end
|
|
|
|
for i = [N S E W]
|
|
hub(:,i) = F*(z + R*D(:,i)); %points in the inertial frame
|
|
|
|
q = 1; %Flapping angle scaling for output display - makes it easier to see what flapping is occurring
|
|
Rr = [cos(q*a1s(i)) sin(q*b1s(i))*sin(q*a1s(i)) cos(q*b1s(i))*sin(q*a1s(i)); %Rotor > Plot frame
|
|
0 cos(q*b1s(i)) -sin(q*b1s(i));
|
|
-sin(q*a1s(i)) sin(q*b1s(i))*cos(q*a1s(i)) cos(q*b1s(i))*cos(q*a1s(i))];
|
|
|
|
tippath(:,:,i) = F*R*Rr*circle;
|
|
plot3([hub(1,i)+tippath(1,:,i)],[hub(2,i)+tippath(2,:,i)],[hub(3,i)+tippath(3,:,i)],'b-')
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
% %Draw flyer
|
|
plot3([hub(1,N) hub(1,S)],[hub(2,N) hub(2,S)],[hub(3,N) hub(3,S)],'-b')
|
|
plot3([hub(1,E) hub(1,W)],[hub(2,E) hub(2,W)],[hub(3,E) hub(3,W)],'-b')
|
|
plot3([hub(1,N)],[hub(2,N)],[hub(3,N)],'og')
|
|
plot3([hub(1,S)],[hub(2,S)],[hub(3,S)],'or')
|
|
plot3([hub(1,E)],[hub(2,E)],[hub(3,E)],'oc')
|
|
plot3([hub(1,W)],[hub(2,W)],[hub(3,W)],'or')
|
|
|
|
|
|
%Tracking lines
|
|
plot3([z(1) 0],[-z(2) 0],[0 0],'--k')
|
|
plot3([z(1)],[-z(2)],[0],'xk')
|
|
% plot3([-s -s],[s s],[-z(3) 0],'--r')
|
|
% plot3([-s],[s],[-z(3)],'xr')
|
|
xlabel('x');
|
|
ylabel('y');
|
|
zlabel('z (height above ground)');
|
|
end
|
|
|
|
%saveas(1,name);
|
|
|
|
sys = [];
|
|
% End of mdlOutputs.
|