121 lines
4.7 KiB
C++
Raw Permalink Normal View History

//
// Created by Wakanda_shaw on 2022/5/5.
//
#include "main_window.h"
#include "rtklib.h"
#include "iomanip"
#include "fstream"
#include "QDir"
#include <QTextCodec>
#include "UI/ui_main_window.h"
using namespace std;
void main_window::Read_Sat(const QString& Obs_path,const QString& Nav_path, const QString& Sat_path, Ui::main_window *ui, int IONN_MODEL) {
ofstream satpos_file(Sat_path.toStdString());
if(satpos_file){
/* 依此为PRN<<Epoch<<伪距<<伪距率<<卫星坐标<<卫星速度<<卫星钟差造成的误差<<信噪比 */
satpos_file<<"PRN"<<','<<"Tow"<<","<<"Psr"<<","<<"dual_cor"<<","<<"tgd_cor"<<","<<"d_Psr"<<","<<"ecef_X"<<","<<"ecef_Y"<<","<<"ecef_Z"<<
","<<"ecef_VX"<<","<<"ecef_VY"<<","<<"ecef_VZ"<<","<<"clk_err"<<","<<"L1_SNR"<<","<<"Carrier_phase"<<","<<"Satpos_var"<<","<<"clr_dtift"<<endl;
}
gtime_t ts,te,t;
int n;
obs_t obs={0};
nav_t nav={0};
sta_t sta={""};
QTextCodec *code = QTextCodec::codecForName("GB2312");//解决中文路径问题
//路径转换
string obs_path = code->fromUnicode(QDir::toNativeSeparators(Obs_path)).data();
string nav_path = code->fromUnicode(QDir::toNativeSeparators(Nav_path)).data();
const char *Obs = obs_path.c_str();
const char *Nav = nav_path.c_str();
double vmeas,dual_fre=0,tgd=0;
ts.time = 0;
te.time = 0;
n=readrnxt(Obs,1,ts,te,0.0,"-SYS=sys[G,C,E,J]",&obs,&nav,&sta);//读obs
n=readrnxt(Nav,1,ts,te,0.0,"-SYS=sys[G,C,E,J]",&obs,&nav,&sta);//读nav
n=sortobs(&obs);//得到epoch数目
uniqnav(&nav);//unique 1下
/* 设置一下参数 */
prcopt_t prcopt=prcopt_default;
prcopt.ionoopt = IONN_MODEL;
prcopt.tropopt = TROPOPT_SAAS;
prcopt.nf = 3;//(L1+L2+L5)
prcopt.navsys = SYS_CMP|SYS_GPS|SYS_GAL|SYS_QZS;
double P,P5,freq,range_rate,L1_snr,L2_snr, Carrier_phase,Satpos_var, clk_drift;
double epoch_time;
int epoch_length=0;
for(int i=0;i<n;i++){
int progress_value = 70+i/(n/30);
ui->progressBar->setValue(progress_value);
t = timeadd(obs.data[0].time,(double)i);
char str[64];
time2str(t,str,3);
epoch_time=time2gpst(t,NULL);
obs_t epoch_obs={0};
readrnxt(Obs,1,t,t,0.0,"-SYS=sys[G,C,E,J]",&epoch_obs,&nav,&sta);
epoch_length = epoch_obs.n;
/* 计算卫星位置 */
double *rs1,*dts1,*var;
int svh[MAXOBS];
rs1=mat(6,epoch_obs.n); dts1=mat(2,epoch_obs.n);var=mat(1,epoch_obs.n);
satposs(t,epoch_obs.data,epoch_obs.n,&nav,EPHOPT_BRDC,rs1,dts1,var,svh);
/* 当前epoch所观测到的数据进行遍历处理 */
for(int j =0;j<epoch_obs.n;j++){
int sta_error=0; // 用来检测
if(svh[j]<0){
cout<<"svh < 0"<<endl;
continue;
}
for(int k=0;k<6;k++){
if(rs1[k+j*6] == 0){
sta_error=1;
break;
}
}
if(sta_error==1){
continue;
}
// P=prange(epoch_obs.data+j,&nav,&prcopt,&vmeas);// 电离层/TGD修正后的伪距
P = epoch_obs.data[j].P[0];
ion_compensation(epoch_obs.data+j,&nav,&prcopt,&vmeas,&dual_fre,&tgd);
freq=sat2freq(epoch_obs.data[j].sat,epoch_obs.data[j].code[0],&nav);// 找到对应频率
range_rate = -epoch_obs.data[j].D[0]*CLIGHT/freq + CLIGHT*dts1[1+j*2];// 观测的伪距率
L1_snr = epoch_obs.data[j].SNR[0]*SNR_UNIT;//信噪比L1
Carrier_phase = epoch_obs.data[j].L[0]*CLIGHT/freq;
Satpos_var = var[j];
clk_drift = dts1[1+j*2]*CLIGHT;
/*
PRN<<Tow<<<<<<<<<<<<
*/
// cout<<uint(epoch_obs.data[j].sat)<<" "<<epoch_time+18<<" "<<fixed<<setprecision(10)<<P<<" "<<dual_fre<<","<<tgd<<","<<range_rate<<" "<<rs1[0+j*6]<<" "<<rs1[1+j*6]<<" "<<rs1[2+j*6]<<" "<<rs1[3+j*6]<<" "<<rs1[4+j*6]<<" "<<rs1[5+j*6]<<" "<<dts1[0+j*2]*CLIGHT<<" "<<L1_snr<<endl;
if(satpos_file){
satpos_file<<int(epoch_obs.data[j].sat)<<","<<epoch_time+18<<","<<fixed<<setprecision(10)<<P<<","<<dual_fre<<","<<tgd<<","<<range_rate<<","<<rs1[0+j*6]<<","<<rs1[1+j*6]<<","<<rs1[2+j*6]<<","<<rs1[3+j*6]<<","<<rs1[4+j*6]<<","<<rs1[5+j*6]<<","<<dts1[0+j*2]*CLIGHT<<","<<L1_snr<<
","<<Carrier_phase<<","<<Satpos_var<<","<<clk_drift<<endl;
}
}
free(rs1);
free(dts1);
free(var);
free(epoch_obs.data);
epoch_obs.data = NULL;
epoch_obs.n=epoch_obs.nmax=0;
}
satpos_file.close();
}