📄 proturn.m
字号:
function [profile,errflg] = ...
proturn(initpos,initvel,initacc,inidcmnb,turnamt,deltat)
if nargin<6,deltat=1;end
if nargin<5,error('insufficient number of input arguments'),end
[m,n]=size(initpos); if m>n, pos=initpos'; else, pos=initpos; end
[m,n]=size(initvel); if m>n, vel=initvel'; else, vel=initvel; end
vel(3) = 0;
errflg = 0;
dcmbn=inidcmnb';
eulvect=dcm2eulr(dcmbn);
phi=eulvect(1); theta=eulvect(2); psi=eulvect(3);
if abs(phi) < 1*pi/180,
error('bank angle less than 1 degree: too small for a turn!')
errflg = 2;
end
cntrpacc = abs(9.81*tan(phi));
profile(1,1:3) = pos;
r = (norm(vel))^2/cntrpacc;
omega = norm(vel)/r;
numstps=round(((turnamt*pi/180)/omega)/deltat);
if numstps<2,
errflg = 1;
fprintf(1,'turn cannot be simulated !\n')
error('specify smaller time step or smaller bank angle')
end
anginc=(-1)*sign(phi)*(turnamt*pi/180)/numstps;
velang=atan2(vel(2),vel(1));
beta=velang+(pi/2)*(-1)*sign(phi);
turnorg(1)=pos(1,1)+r*cos(beta);
turnorg(2)=pos(1,2)+r*sin(beta);
cumang=0; i=0;
for kk = 1:numstps,
i=i+1;
cumang = cumang + anginc;
profile(i,1)=turnorg(1)+r*cos(beta-pi+cumang);
profile(i,2)=turnorg(2)+r*sin(beta-pi+cumang);
profile(i,3)=pos(3);
rotmat=[cos(-anginc) sin(-anginc) 0;
-sin(-anginc) cos(-anginc) 0;
0 0 1];
vel=(rotmat*vel')';
profile(i,4:6) = vel;
accdvect=[turnorg(1:2) - profile(i,1:2)];
naccdvec=accdvect/norm(accdvect);
profile(i,7:8) = cntrpacc*naccdvec;
profile(i,9) = 0;
psi = psi - anginc;
dcmnb = eulr2dcm([phi theta psi]);
profile(i,10) = dcmnb(1,1);
profile(i,11) = dcmnb(1,2);
profile(i,12) = dcmnb(1,3);
profile(i,13) = dcmnb(2,1);
profile(i,14) = dcmnb(2,2);
profile(i,15) = dcmnb(2,3);
profile(i,16) = dcmnb(3,1);
profile(i,17) = dcmnb(3,2);
profile(i,18) = dcmnb(3,3);
end,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -