This commit is contained in:
KenanZhu111 committed 2024-09-20 13:34:44 +08:00
commit 68362e984a
26 files changed
+400695

No files matched your search

File diff suppressed because it is too large. Load diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

@@ -0,0 +1,170 @@
% 打开坐标文件
file=fopen('LLA_result_for_Matlab.txt');
sPRN = [];
satX = [];
satY = [];
satZ = [];
P_t1 = [];
P_t2 = [];
H = [];
TGD = [];
Dt = [];
sat_num = [];
C_V = 299792458;
f1 = 1575.42;
f2 = 1227.60;
satnum = 0;
eponum = 0;
% 设置测站粗略坐标和精确的经纬高数据
apX = -4052052.8310;
apY = 4212835.9820;
apZ = -2545104.4760;
apB = -0.4131213;%纬度
apL = 2.3367431;%经度
apH = 603.235;
% 逐行读取文件
while ~feof(file)
line = fgets(file);
flag_epo = extractBetween(line,1 ,1 );
% 判断历元标识
if strcmp(flag_epo, ">") == 1
eponum = str2double(extractBetween(line,2 ,5 ));
while eponum <= 2880
flag_sat = extractBetween(line,1 ,1);
% 判断卫星标识,读取卫星PRN号和XYZ坐标
if strcmp(flag_sat, "G") == 1
satnum = satnum + 1;
P_t1(eponum, satnum) = str2double(extractBetween(line,11 + 16 + 16 + 16 ,25 + 16 + 16 + 16 ));
if P_t1(eponum, satnum) ~= 0
sPRN(eponum, satnum) = str2double(extractBetween(line,2 ,3 ));
satX(eponum, satnum) = str2double(extractBetween(line,11 ,25 ));
satY(eponum, satnum) = str2double(extractBetween(line,11 + 16 ,25 + 16 ));
satZ(eponum, satnum) = str2double(extractBetween(line,11 + 16 + 16 ,25 + 16 + 16 ));
P_t1(eponum, satnum) = str2double(extractBetween(line,11 + 16 + 16 + 16 ,25 + 16 + 16 + 16 ));
P_t2(eponum, satnum) = str2double(extractBetween(line,11 + 16 + 16 + 16 + 16 ,25 + 16 + 16 + 16 + 16));
H(eponum, satnum) = str2double(extractBetween(line,11 + 16 + 16 + 16 + 16 + 16 ,25 + 16 + 16 + 16 + 16 + 16));
TGD(eponum, satnum) = str2double(extractBetween(line,11 + 16 + 16 + 16 + 16 + 16 + 16 ,25 + 16 + 16 + 16 + 16 + 16 + 16));
Dt(eponum, satnum) = str2double(extractBetween(line,11 + 16 + 16 + 16 + 16 + 16 + 16 + 16,25 + 16 + 16 + 16 + 16 + 16 + 16 + 17));
line = fgets(file);
end
if P_t1(eponum, satnum) == 0
satnum = satnum - 1;
line = fgets(file);
end
end
% 开头字符不是G,但是是>,判断为一个历元的起点,进行数据读取
if strcmp(flag_sat, "G") == 0 && strcmp(flag_sat, ">") == 1
satnum = 0;
line = fgets(file);
continue;
end
% 开头字符既不是G,也不是>,判断为历元结束标志,跳出循环
if strcmp(flag_sat, "G") == 0 && strcmp(flag_sat, ">") == 0 && ~feof(file)
sat_num(eponum) = satnum;
satnum = 0;
break;
end
end
end
if strcmp(flag_epo, ">") == 0
continue;
end
end
fclose(file);
% 平差计算测站位置和接收机钟差解算
for i = 1:1:eponum
if sat_num(i) >= 4
X = zeros(4, 1);
P = zeros(sat_num(i), sat_num(i));
B = zeros(sat_num(i), 4);
l = zeros(sat_num(i), 1);
X_R = zeros(3, 1);
DeltaXYZ = zeros(3, 1);
% 每个历元构成系数矩阵
for j = 1:1:sat_num(i)
R = sqrt((satX(i, j)-apX)^2+(satY(i, j)-apY)^2+(satZ(i, j)-apZ)^2);
B(j, 1) = -((satX(i, j) - apX) / R);
B(j, 2) = -((satY(i, j) - apY) / R);
B(j, 3) = -((satZ(i, j) - apZ) / R);
B(j, 4) = 1;
dtrop = 2.47/sind(H(i, j))+0.0121;
% % % % % % % 理想化的Saastamoinen模型/对流层改正
% P0 = 1013.25; e0 = 11.69; T0 = 288.15;
% % 求大气压强
% p = P0 * (1.0 - 0.0068 / T0 / apH)^5;
% % 求开尔文温度
% T = 288.15 - 0.0068 * apH;
% % 水汽压计算
% if apH > 11000
% e = 0;
% end
% if apH <= 11000
% e = e0 * (1.0 - 0.0068 * apH / T0)^4;
% end
% % 静力学延迟
% dtrop = 0.002277 * p / (1.0 - 0.00266 * cosd(2 * H(i, j)) - 0.00028 * apH * 1e-3) ;
% % % % % % % % % % % % % % % % % % % % % % % % %
if P_t2(i, j) ~= 0
% 双频组合消除电离层延迟
P_t = (f1^2) / (f1^2 - f2^2) * P_t1(i, j) - (f2^2) / (f1^2 - f2^2) * P_t2(i, j);
end
if P_t2(i, j) == 0
P_t = P_t1(i, j);
end
l(j, 1) = P_t - R + C_V * Dt(i,j) - dtrop;
if H(i, j)<5;
H(i, j) = H(i, j);
end;
P(j, j) = sind(H(i, j))^2;
end
apX_R = apX;%迭代坐标传参
apY_R = apY;
apZ_R = apZ;
% 平差计算得到改正数并进行迭代计算
while abs(apX_R - X_R(1,1)) > 0.0001 && abs(apY_R - X_R(2,1)) > 0.0001 && abs(apZ_R - X_R(3,1)) > 0.0001
apX_R = X(1,1);
apY_R = X(2,1);
apZ_R = X(3,1);
Q=inv(B.'*P*B);
D_X=Q*B.'*P*l;%坐标改正数
X(1,1) = apX + D_X(1,1);
X(2,1) = apY + D_X(2,1);
X(3,1) = apZ + D_X(3,1);%改正后测站坐标
X_R(1,1) = X(1,1);
X_R(2,1) = X(2,1);
X_R(3,1) = X(3,1);
end
GDOP(1,i) = sqrt(trace(Q));
StationCLK(1,i) = D_X(4, 1);
DeltaXYZ(1,1) = X(1,1) - apX;
DeltaXYZ(2,1) = X(2,1) - apY;
DeltaXYZ(3,1) = X(3,1) - apZ;
S = [
-sin(apL), cos(apL), 0;
-sin(apB)*cos(apL), -sin(apB)*sin(apL), cos(apB);
cos(apB)*cos(apL), cos(apB)*sin(apL), sin(apB)
];
ENU_R = S * DeltaXYZ;
ENU(1,i) = ENU_R(1,1);
ENU(2,i) = ENU_R(2,1);
ENU(3,i) = ENU_R(3,1);
end
end
@@ -0,0 +1,170 @@
% 打开坐标文件
file=fopen('LLA_result_for_Matlab.txt');
sPRN = [];
satX = [];
satY = [];
satZ = [];
P_t1 = [];
P_t2 = [];
H = [];
TGD = [];
Dt = [];
sat_num = [];
C_V = 299792458;
f1 = 1575.42;
f2 = 1227.60;
satnum = 0;
eponum = 0;
% 设置测站粗略坐标和精确的经纬高数据
apX = -4052052.8310;
apY = 4212835.9820;
apZ = -2545104.4760;
apB = -0.4131213;%纬度
apL = 2.3367431;%经度
apH = 603.235;
% 逐行读取文件
while ~feof(file)
line = fgets(file);
flag_epo = extractBetween(line,1 ,1 );
% 判断历元标识
if strcmp(flag_epo, ">") == 1
eponum = str2double(extractBetween(line,2 ,5 ));
while eponum <= 2880
flag_sat = extractBetween(line,1 ,1);
% 判断卫星标识,读取卫星PRN号和XYZ坐标
if strcmp(flag_sat, "G") == 1
satnum = satnum + 1;
P_t1(eponum, satnum) = str2double(extractBetween(line,11 + 16 + 16 + 16 ,25 + 16 + 16 + 16 ));
if P_t1(eponum, satnum) ~= 0
sPRN(eponum, satnum) = str2double(extractBetween(line,2 ,3 ));
satX(eponum, satnum) = str2double(extractBetween(line,11 ,25 ));
satY(eponum, satnum) = str2double(extractBetween(line,11 + 16 ,25 + 16 ));
satZ(eponum, satnum) = str2double(extractBetween(line,11 + 16 + 16 ,25 + 16 + 16 ));
P_t1(eponum, satnum) = str2double(extractBetween(line,11 + 16 + 16 + 16 ,25 + 16 + 16 + 16 ));
P_t2(eponum, satnum) = str2double(extractBetween(line,11 + 16 + 16 + 16 + 16 ,25 + 16 + 16 + 16 + 16));
H(eponum, satnum) = str2double(extractBetween(line,11 + 16 + 16 + 16 + 16 + 16 ,25 + 16 + 16 + 16 + 16 + 16));
TGD(eponum, satnum) = str2double(extractBetween(line,11 + 16 + 16 + 16 + 16 + 16 + 16 ,25 + 16 + 16 + 16 + 16 + 16 + 16));
Dt(eponum, satnum) = str2double(extractBetween(line,11 + 16 + 16 + 16 + 16 + 16 + 16 + 16,25 + 16 + 16 + 16 + 16 + 16 + 16 + 16));
line = fgets(file);
end
if P_t1(eponum, satnum) == 0
satnum = satnum - 1;
line = fgets(file);
end
end
% 开头字符不是G,但是是>,判断为一个历元的起点,进行数据读取
if strcmp(flag_sat, "G") == 0 && strcmp(flag_sat, ">") == 1
satnum = 0;
line = fgets(file);
continue;
end
% 开头字符既不是G,也不是>,判断为历元结束标志,跳出循环
if strcmp(flag_sat, "G") == 0 && strcmp(flag_sat, ">") == 0 && ~feof(file)
sat_num(eponum) = satnum;
satnum = 0;
break;
end
end
end
if strcmp(flag_epo, ">") == 0
continue;
end
end
fclose(file);
% 平差计算测站位置和接收机钟差解算
for i = 1:1:eponum
if sat_num(i) >= 4
X = zeros(4, 1);
P = zeros(sat_num(i), sat_num(i));
B = zeros(sat_num(i), 4);
l = zeros(sat_num(i), 1);
X_R = zeros(3, 1);
DeltaXYZ = zeros(3, 1);
% 每个历元构成系数矩阵
for j = 1:1:sat_num(i)
R = sqrt((satX(i, j)-apX)^2+(satY(i, j)-apY)^2+(satZ(i, j)-apZ)^2);
B(j, 1) = -((satX(i, j) - apX) / R);
B(j, 2) = -((satY(i, j) - apY) / R);
B(j, 3) = -((satZ(i, j) - apZ) / R);
B(j, 4) = 1;
dtrop = 2.47/sind(H(i, j))+0.0121;
% % % % % % % 理想化的Saastamoinen模型/对流层改正
% P0 = 1013.25; e0 = 11.69; T0 = 288.15;
% % 求大气压强
% p = P0 * (1.0 - 0.0068 / T0 / apH)^5;
% % 求开尔文温度
% T = 288.15 - 0.0068 * apH;
% % 水汽压计算
% if apH > 11000
% e = 0;
% end
% if apH <= 11000
% e = e0 * (1.0 - 0.0068 * apH / T0)^4;
% end
% % 静力学延迟
% dtrop = 0.002277 * p / (1.0 - 0.00266 * cosd(2 * H(i, j)) - 0.00028 * apH * 1e-3) ;
% % % % % % % % % % % % % % % % % % % % % % % % %
if P_t2(i, j) ~= 0
% 双频组合消除电离层延迟
P_t = (f1^2) / (f1^2 - f2^2) * P_t1(i, j) - (f2^2) / (f1^2 - f2^2) * P_t2(i, j);
end
if P_t2(i, j) == 0
P_t = P_t1(i, j);
end
l(j, 1) = P_t - R + C_V * Dt(i,j) - dtrop;
if H(i, j)<5;
H(i, j) = H(i, j);
end;
P(j, j) = sind(H(i, j))^2;
end
apX_R = apX;%迭代坐标传参
apY_R = apY;
apZ_R = apZ;
% 平差计算得到改正数并进行迭代计算
while abs(apX_R - X_R(1,1)) > 0.0001 && abs(apY_R - X_R(2,1)) > 0.0001 && abs(apZ_R - X_R(3,1)) > 0.0001
apX_R = X(1,1);
apY_R = X(2,1);
apZ_R = X(3,1);
Q=inv(B.'*P*B);
D_X=Q*B.'*P*l;%坐标改正数
X(1,1) = apX + D_X(1,1);
X(2,1) = apY + D_X(2,1);
X(3,1) = apZ + D_X(3,1);%改正后测站坐标
X_R(1,1) = X(1,1);
X_R(2,1) = X(2,1);
X_R(3,1) = X(3,1);
end
GDOP(1,i) = sqrt(trace(Q));
StationCLK(1,i) = D_X(4, 1);
DeltaXYZ(1,1) = X(1,1) - apX;
DeltaXYZ(2,1) = X(2,1) - apY;
DeltaXYZ(3,1) = X(3,1) - apZ;
S = [
-sin(apL), cos(apL), 0;
-sin(apB)*cos(apL), -sin(apB)*sin(apL), cos(apB);
cos(apB)*cos(apL), cos(apB)*sin(apL), sin(apB)
];
ENU_R = S * DeltaXYZ;
ENU(1,i) = ENU_R(1,1);
ENU(2,i) = ENU_R(2,1);
ENU(3,i) = ENU_R(3,1);
end
end