⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dgpslab.m

📁 这是国外关于卫星导航方面一书的源代码
💻 M
📖 第 1 页 / 共 2 页
字号:
h=waitbar(0,'Processing the vectors Reference->Rover');

for t=1:nobs1          % Schleife 黚er alle Beobachtungen ###############################
   
clear as2 ls2z ls2 vvs2;
   
versatz=0;   

isat=0;             % number of double diff.: simultan auf beiden Stationen beob. Satelliten

used_obs2=0;        % Beob.z鋒ler f黵 die Anzahl von L2-Beob. w鋒rend 1 Epoche


for ksat=1:satmask1(t) % Schleife 黚er alle beobachteten Satelliten #####################
   
while s1c1(ksat+versatz)==0,
   versatz=versatz+1;         % fehlende Beobachtungen innerhalb einer Zeile 黚erspringen
end

% 蹷ERPR蹻EN, OB AUF S1 EMPF. SAT AUCH AUF S2 DA:

% Zu Beob. in S1C1 passende Beob. in S2C1:
rovmask=(s2epo(t,:)==s1epo(t,ksat+1+versatz));  % Maske auf Zeile in Rover (dieselbe epoche): Suche nach demselben Sat. dort

if sum(rovmask)>0         % ->>> nur wenn Sat auch auf Rover (C/A) vorhanden, weitermachen ...
   % Zur Erkl鋜ung: Von einem Satelliten wird als erstes C/A getracked, daher
   % erscheint die Satellitennummer in S1EPO und in S2EPO, sobald C/A-Beob. zu dem Sat. vorhanden!
   
rovindx=find(rovmask)-1; % an welcher Stelle in der Zeile bei S1C2 sich dieselbe Sat.nr. befindet

if mit_p2==0 | (mit_p2==1 & s2p2(t,rovindx)~=0 & s1p2(t,ksat+versatz)~=0)  
                          % ->>> nur wenn C/A-L鰏ung oder auch P2-Beob auf Ref und Rov vorhanden, weitermachen ...

isat=isat+1;       % number of double diff.: simultan auf beiden Stationen beob. Satelliten

% richtige PRN aus Eph raussuchen (einfach die erste passende aus S1EPH)
ephsatz=1;           
while s1eph(ephsatz)~=s1epo(t,ksat+1+versatz)
   ephsatz=ephsatz+24;        
end

% Koordinaten auch f黵 S2, d.h. mit denselben eph, aber mit s2c1 !!!
[s1x(t,isat),s1y(t,isat),s1z(t,isat),s1dts(t,isat),s1rel(t,isat)]=eph2xyzn(s1epoms(t,1),s1c1(t,ksat+versatz),s1eph(ephsatz:(ephsatz+23)));
[s2x(t,isat),s2y(t,isat),s2z(t,isat),s2dts(t,isat),s2rel(t,isat)]=eph2xyzn(s2epoms(t,1),s2c1(t,rovindx),s1eph(ephsatz:(ephsatz+23)));

[s1b(t,isat),s1l(t,isat),s1h(t,isat)]=xyz2blh(s1x(t,isat),s1y(t,isat),s1z(t,isat));
[s2b(t,isat),s2l(t,isat),s2h(t,isat)]=xyz2blh(s2x(t,isat),s2y(t,isat),s2z(t,isat));

% Erdrot.korr. Empf.koord: sS1_0,dOmega_e,Xe0,Ye0,Ze0 je (t,isat)(nicht indizieren, aber je s2 und s1)
%
% ber. range je Satellit fuer beide Punkte
rs1=sqrt((s1x(t,isat)-xs1)^2+(s1y(t,isat)-ys1)^2+(s1z(t,isat)-zs1)^2);
% Winkel aus Erdrotation
dos1=rs1*omega_e/c0;
% um Erdrot. und um Antennenh鰄e korr. Empf.koord
xs10=xs1*cos(dos1)-ys1*sin(dos1)+ants1dx;
ys10=ys1*cos(dos1)+xs1*sin(dos1)+ants1dy;
zs10=zs1+ants1dz;

% Erdrot.korr. Empf.koord: sS2_0,dOmega_e,Xe0,Ye0,Ze0 je (t,isat)(nicht indizieren, aber je s2 und s1)
%
% ber. range je Satellit fuer beide Punkte
rs2=sqrt((s2x(t,isat)-xs2)^2+(s2y(t,isat)-ys2)^2+(s2z(t,isat)-zs2)^2); % Sat.koord-Rec.koord
% Winkel aus Erdrotation
dos2=rs2*omega_e/c0;                                                   % [m*rad/s/(m/s)=rad]
% um Erdrot. und um Antennenh鰄e korr. Empf.koord
xs20=xs2*cos(dos2)-ys2*sin(dos2)+ants2dx;
ys20=ys2*cos(dos2)+xs2*sin(dos2)+ants2dy;
zs20=zs2+ants2dz;

% Ausgleichungsansatz:
% Verbesserungsgleichung (Zeile A-Matrix & Absolutglied): Ss2,w,A*x (t,isat)
% (nur w und A bzgl. Sat indizieren, Rest wird nicht wieder gebraucht, allerdings je s2 und s1)

ss1=sqrt((s1x(t,isat)-xs10)^2+(s1y(t,isat)-ys10)^2+(s1z(t,isat)-zs10)^2);
ss2=sqrt((s2x(t,isat)-xs20)^2+(s2y(t,isat)-ys20)^2+(s2z(t,isat)-zs20)^2); % Sat.koord-Rec.koord

% Richtungskosinusse
rcs1(isat,1)=(s1x(t,isat)-xs10)/ss1;            
rcs1(isat,2)=(s1y(t,isat)-ys10)/ss1;
rcs1(isat,3)=(s1z(t,isat)-zs10)/ss1;
rcs2(isat,1)=(s2x(t,isat)-xs20)/ss2;
rcs2(isat,2)=(s2y(t,isat)-ys20)/ss2;
rcs2(isat,3)=(s2z(t,isat)-zs20)/ss2;

lss1(isat)=ss1;
lss2(isat)=ss2;         

% ---------------------A-Matrix & L-Vektor-----------------------------------------------

% Referenzsatellit: Hier m黶ste theoretisch der Auswahlalgorithmus stehen
% wenn isat=1, Bildung von REFSAT-Variablen, wenn isat>1 Bildung von A-Matrix und l-Vektor

if isat==1
refs=lss1(1)-lss2(1);	
refx=rcs2(1,1);
refy=rcs2(1,2);
refz=rcs2(1,3);
refs1indx=ksat+versatz;        % Wo Refsat in s1c1 steht
refs2indx=rovindx;             % Wo Refsat in s2c1 steht
end     % Ende des IF-Blocks [if isat==1]

% Die 黚rigen Satelliten ...

if isat>1
as2(isat-1,1)=-rcs2(isat,1)+refx;
as2(isat-1,2)=-rcs2(isat,2)+refy;
as2(isat-1,3)=-rcs2(isat,3)+refz;

if mit_p2==0         % Einfrequenzl鰏ung (C/A)
ls2z(isat-1)=lss1(isat)-lss2(isat)-refs+(s2c1(t,rovindx)-s2c1(t,refs2indx)-s1c1(t,ksat+versatz)+s1c1(t,refs1indx));
used_obs2=used_obs2+1;

elseif mit_p2==1     % ionosph鋜enfreie L鰏ung (C/A+P2 bzw. P1+P2)
   
ls2z(isat-1)=lss1(isat)-lss2(isat)-refs+ ...
   ((f2pr1*s2c1(t,rovindx)     -f2pr2*s2p2(t,rovindx))- ...
    (f2pr1*s2c1(t,refs2indx)   -f2pr2*s2p2(t,refs2indx))- ...
    (f2pr1*s1c1(t,ksat+versatz)-f2pr2*s1p2(t,ksat+versatz))+ ...
    (f2pr1*s1c1(t,refs1indx)   -f2pr2*s1p2(t,refs1indx)));
used_obs2=used_obs2+1;

else
     warndlg(['Break in program DGPSLAB.M during the check of the variable "mit_p2".',...
             ' It can only get the values "0" or "1" !' ...
             ' Wrong option setting. Please check.'], ...   
       'GPSLab: Break -  1999 zeb');
    return;

end      % Ende des IF-Blocks [mit_p2==0]


end      % Ende des IF-Blocks [if isat>1]

end      % Ende if-Block [ if mit_p2==0 | (mit_p2==1 & s2p2(t,rovindx)~=0 & s1p2(t,ksat+versatz)~=0) ]
end		% Ende if-Block [ if sum(rovmask)>0 ], also ob Sat auf beiden Stat. gemessen.
end      % Ende der Schleife ueber alle Satelliten
%------------------------------------------------------------------------------------------------

% Sind zu dieser Epoche t mindestens 4 Sat. simultan auf beiden Stationen beob. worden?
if used_obs2>2

ls2=ls2z';                                      % Zeilen- in Spaltenvektor

% Ausgleichung: dXe,dYe,dZe,dte,s0,sigmas(=sqrt(diag(s0*inv(a'pa)))),GDOP(=sqrt(trace(inv(a'pa))))
% F黵 Differenz S2 gegen黚er S1; d.h. Vektor S1->S2

ns2=(as2'*as2)\eye(3);              % invertierte Normalgleichungsmatrix
rdops2(t)=sqrt(trace(ns2));         % RDOP
condngls2(t)=rcond(ns2);            % Konditionierung der Normalgleichungsmatrix
xxs2=ns2*as2'*ls2;                  % Unbekannte

% Ausgleichungszuschl鋑e in Vektor(t) 黚ernehmen
dxs2(t)=xxs2(1);
dys2(t)=xxs2(2);
dzs2(t)=xxs2(3);


if used_obs2>3       				% Nur wenn Redundanz vorhanden, Genauigkeitsma遝 berechnen 
vvs2=as2*xxs2-ls2;					% Residuen
sigs2=vvs2'*vvs2/(size(ls2,1)-size(xxs2,1));			% (sigma_0)^2
kxxs2=sigs2*ns2;						% Kovarianzmatrix der Unbekannten
sigxxs2=sqrt(diag(kxxs2));			% Standardabweichungen der Unbekannten
sigmas2(t)=sqrt(sigs2);				% sigma_0
sxs2(t)=sigxxs2(1);sys2(t)=sigxxs2(2);szs2(t)=sigxxs2(3);

elseif used_obs2==3     			% keine Redundanz

   sxs2(t)=0;sys2(t)=0;szs2(t)=0;
   sigmas2(t)=0;

else
       errordlg(['Error in the program DGPSLAB.M during the calculation of the difference vectors.',...
             ' There seems to be observed less than 4 satellites or the program failed.' ...
             ' Check S2EPO in comparison to S2C1 and check the program.'], ...   
       'GPSLab: Break -  1998 zeb');
       return;
end   % Ende if-Block Redundanz


% Geoz.kart. Koord. und H鰄en f黵 S2

s2_x(t)=xs2+dxs2(t);
s2_y(t)=ys2+dys2(t);
s2_z(t)=zs2+dzs2(t);
[b_s2(t),l_s2(t),hoe_s2(t)]=xyz2blh(s2_x(t),s2_y(t),s2_z(t));

% wir erhalten: gdop,sigma,condngl,dx,dy,dz,dt,sx,sy,sz,st
obs_is_used(t)=1;

else     % else zu [if used_obs2>2], d.h. wenn used_obs2<=2 :
   
obs_is_used(t)=0;
% ... nur diese eine Variable, um andere per Maske reduzieren zu k鰊nen (s.u.)

end      % Ende des IF-Blocks [if used_obs2>2]

%------------------------------------------------------------------------------------------------
waitbar(t/nobs1);   
end      % Ende der Schleife ueber alle Beobachtungen nobs1
%------------------------------------------------------------------------------------------------
close(h);

% Wo gibt's eine L鰏ung ??? Also wo mehr als 3 Sat. simultan ? (isat>3)
dgpsmask=(obs_is_used~=0);

% --- Reduzierung der Felder auf die Elemente mit berechneten L鰏ungen -----------------
s1c1=s1c1(logical(dgpsmask),:);   % ...durch Herausstreichen der anderen Beobachtungen
s1epo=s1epo(logical(dgpsmask),:); % -"-
s2c1=s2c1(logical(dgpsmask),:);   % -"-
s2epo=s2epo(logical(dgpsmask),:); % -"-

s1epoms=s1epoms(logical(dgpsmask),:); % -"-
s2epoms=s2epoms(logical(dgpsmask),:); % -"-

% bisher nicht, bei Gl鋞tung n鰐ig: s1l1,s2l1
b_s2=b_s2(logical(dgpsmask));  
l_s2=l_s2(logical(dgpsmask));  
hoe_s2=hoe_s2(logical(dgpsmask));  
s2_x=s2_x(logical(dgpsmask));
s2_y=s2_y(logical(dgpsmask));
s2_z=s2_z(logical(dgpsmask));
sigmas2=sigmas2(logical(dgpsmask));
sxs2=sxs2(logical(dgpsmask));
sys2=sys2(logical(dgpsmask));
szs2=szs2(logical(dgpsmask));
dxs2=dxs2(logical(dgpsmask));
dys2=dys2(logical(dgpsmask));
dzs2=dzs2(logical(dgpsmask));
condngls2=condngls2(logical(dgpsmask));
rdops2=rdops2(logical(dgpsmask));


satmask1=satmask1(logical(dgpsmask),:);
satmask2=satmask2(logical(dgpsmask),:);


% Berechnung der Koordinatendifferenzen und der Baseline-L鋘ge

dapp_h=app2_h-app1_h;  % H鰄endifferenz aus N鋒erungswerten
strdapph=num2str(dapp_h); % H鰄endifferenz aus N鋒erungswerten (String)
app_bsl=sqrt((xs2-xs1)^2+(ys2-ys1)^2+(zs2-zs1)^2); % Bsl-L鋘ge aus N鋒erungswerten
strappbsl=num2str(app_bsl); % Bsl-L鋘ge aus N鋒erungswerten (String)

delta_h=hoe_s2-app1_h;          % H鰄endifferenzen

delta_x=dxs2;              % Diff. in X
delta_y=dys2;              % Diff. in Y
delta_z=dzs2;              % Diff. in Z
 
bsl=sqrt((s2_x-xs1).^2+(s2_y-ys1).^2+(s2_z-zs1).^2); % Zeitreihe Baseline-L鋘ge

% Mittel/Ergebnisse, Beobachtungsstatistik

satnrs=s2epo(:,2:size(s2epo,2)); % ohne 1. Spalte (Epochen), nur Sat.nummern
satnrs=satnrs(:); % Vektor aus Matrix 
satnrs=satnrs(logical(satnrs>0)); % Nullen eliminieren (Verk黵zung des Vektors)

xxs2=median(delta_x)+xs2;
yys2=median(delta_y)+ys2;
zzs2=median(delta_z)+zs2;
[bbs2,lls2,hhs2]=xyz2blh(xxs2,yys2,zzs2);

% Berechnung der Mittelwerte 黚er die Zeitreihe

m_bsl=sqrt((xxs2-xs1)^2+(yys2-ys1)^2+(zzs2-zs1)^2);
strmbsl=num2str(m_bsl); % String f黵 Plotbeschriftung (Mittel/Median der Bsl-L鋘ge)

m_delta_h=hhs2-app1_h;
strmdh=num2str(m_delta_h); % String f黵 Plotbeschriftung (Mittel/Median der H鰄endiff.)

% Statistik

sxxs2=median(sxs2);
syys2=median(sys2);
szzs2=median(szs2);

[sbbs2,slls2,shhs2,dums,dumA,dumz]=dxyz2neu(sxxs2,syys2,szzs2,bbs2,lls2);
sbbs2=abs(sbbs2);
slls2=abs(slls2);
shhs2=abs(shhs2);

sig0=median(sigmas2);

rdmin=min(rdops2);
rdmax=max(rdops2);
rdmit=mean(rdops2);

[haufig2,n2]=hist(satnrs,1:32);
n2=n2(logical(haufig2>0));
haufig2=haufig2(logical(haufig2>0));

% Flag, da?Berechnung duchgef黨rt wurde und entsprechende Variable vorliegen

dgps_is_calc=1;

% Ende  ==================================================================================
% (c) iapg 1998 Zebhauser


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -