Archived
UPDATE MANY NWE FUNCTIONS
Origin project is based on visual studio solution, so, when you load all the files in your editor, it can be cause errors. So, modify is a good choice
This commit is contained in:
1 parent
0f1a59c2aa
commit
37473233c2
7 files changed
+501
-175
No files matched your search
+9
-9
@@ -19,12 +19,12 @@
|
||||
pos_ts gps_pos(int sPRN, int best_epoch, double GPSsec,
|
||||
pnav_body nav_b, pobs_head obs_h, pos_ts pos_t)
|
||||
{
|
||||
double T_S = GPSsec - pos_t.deltat[sPRN];//计算信号发射时刻
|
||||
double T_S = GPSsec - pos_t.delta_t[sPRN];//计算信号发射时刻
|
||||
double n_0 = sqrt(GM) / pow(nav_b[best_epoch].sqrtA,3);
|
||||
double n = n_0 + nav_b[best_epoch].deltan; //计算卫星运行平均角速度
|
||||
double tk = T_S - nav_b[best_epoch].TOE;//计算归化时间
|
||||
if (tk > 32400)tk -= 604800;
|
||||
else if (tk < -32400)tk += 604800;//规划时间改正
|
||||
else if (tk < -32400)tk += 604800;//归化时间改正
|
||||
double Ms = nav_b[best_epoch].M0 + n * tk;//计算卫星发射时卫星的平近角M
|
||||
double Es = Ms, E0;//迭代计算偏近点角
|
||||
do
|
||||
@@ -51,14 +51,14 @@ pos_ts gps_pos(int sPRN, int best_epoch, double GPSsec,
|
||||
double X = x * cos(l) - y * cos(i) * sin(l);
|
||||
double Y = x * sin(l) + y * cos(i) * cos(l);
|
||||
double Z = y * sin(i);//卫星在地固系下的直角坐标
|
||||
pos_t.X[sPRN] = cos(Earth_e * pos_t.delta_t[sPRN]) * X + sin(Earth_e * pos_t.delta_t[sPRN]) * Y;
|
||||
pos_t.X[sPRN] = cos(Earth_e * pos_t.delta_t[sPRN]) * X + sin(Earth_e * pos_t.delta_t[sPRN]) * Y;
|
||||
pos_t.Y[sPRN] = -sin(Earth_e * pos_t.delta_t[sPRN]) * X + cos(Earth_e * pos_t.delta_t[sPRN]) * Y;
|
||||
pos_t.Z[sPRN] = Z;
|
||||
double R = sqrt(pow(pos_t.X[sPRN] - obs_h->apX, 2) + pow(pos_t.Y[sPRN] - obs_h->apY, 2) + pow(pos_t.Z[sPRN] - obs_h->apY, 2));
|
||||
double R = sqrt(pow(pos_t.X[sPRN] - obs_h->apX, 2) + pow(pos_t.Y[sPRN] - obs_h->apY, 2) + pow(pos_t.Z[sPRN] - obs_h->apZ, 2));
|
||||
pos_t.deltat[sPRN] = pos_t.delta_t[sPRN];
|
||||
pos_t.delta_t[sPRN] = R / C_V;
|
||||
double rela = 2*sqrt(GM) * nav_b[best_epoch].e * nav_b[best_epoch].sqrtA * sin(Es)/pow(C_V,2);
|
||||
pos_t.delta_clk[sPRN] = nav_b[best_epoch].sa0 + nav_b[best_epoch].sa1 * tk + nav_b[best_epoch].sa2 * pow(tk,2) - rela;
|
||||
pos_t.delta_t[sPRN] = R / C_V + pos_t.delta_clk[sPRN];
|
||||
return pos_t;
|
||||
}
|
||||
/* -------------------------------------------------------------------------- */
|
||||
@@ -105,7 +105,7 @@ void sat_gps_pos_clac(FILE * result_file,
|
||||
//计算近似的信号传播时间,接收机钟差已初始化为0(伪距/光速-接收机钟差+卫星钟差)
|
||||
pos_t.delta_t[sPRN] = (obs_b[i].obs_gps[j][Code2Type(C1C, obs_h->obstypenum_gps, obs_h->obscode_gps)] / C_V) - station.delta_TR + nav_b[best_epoch].sa0 + nav_b[best_epoch].sa1 * detat_toc + nav_b[best_epoch].sa2 * pow(detat_toc, 2);
|
||||
pos_t.deltat[sPRN] = 0.0;//判断收敛
|
||||
while (fabs(pos_t.delta_t[sPRN] - pos_t.deltat[sPRN]) > 0.00001){
|
||||
while (fabs(pos_t.delta_t[sPRN] - pos_t.deltat[sPRN]) > 1.0e-9){
|
||||
|
||||
pos_t = gps_pos(sPRN, best_epoch, GPSsec, nav_b, obs_h, pos_t);
|
||||
}
|
||||
@@ -139,9 +139,9 @@ void sat_gps_pos_clac(FILE * result_file,
|
||||
rah.A = rad2deg(tem4.A);
|
||||
rah.H = rad2deg(tem4.H);
|
||||
/* -------------------------------------------------------------------------- */
|
||||
if (blh.H < 0 ||nav_b[best_epoch].sHEA != 0)
|
||||
if (blh.H < 0 || rah.H < 10 ||nav_b[best_epoch].sHEA != 0)
|
||||
{
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -174,4 +174,4 @@ void sat_gps_pos_clac(FILE * result_file,
|
||||
fclose(result_file);
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
+4
-11
@@ -109,9 +109,9 @@ typedef struct nav_head
|
||||
//导航数据结构体
|
||||
typedef struct nav_body
|
||||
{
|
||||
//数据块第一行内容:
|
||||
int sPRN;//卫星PRN号
|
||||
//历元:TOC中卫星钟的参考时刻
|
||||
|
||||
int sPRN_GPS;//GPS卫星PRN
|
||||
int sPRN_BDS;//GPS卫星PRN
|
||||
int TOC_Y;//年
|
||||
int TOC_M;//月
|
||||
int TOC_D;//日
|
||||
@@ -122,43 +122,36 @@ typedef struct nav_body
|
||||
double sa1;//卫星钟偏
|
||||
double sa2;//卫星钟漂
|
||||
|
||||
//数据块第二行内容:
|
||||
double IODE;//数据、星历发布时间(数据期龄)
|
||||
double Crs;//轨道半径的正弦调和改正项的振幅(单位:m)
|
||||
double deltan;//卫星平均运动速率与计算值之差(rad/s)
|
||||
double M0;//参考时间的平近点角(rad)
|
||||
|
||||
//数据块第三行内容:
|
||||
double Cuc;//维度幅角的余弦调和改正项的振幅(rad)
|
||||
double e;//轨道偏心率
|
||||
double Cus;//轨道幅角的正弦调和改正项的振幅(rad)
|
||||
double sqrtA;//长半轴平方根
|
||||
|
||||
//数据块第四行内容:
|
||||
double TOE;//星历的参考时刻(GPS周内秒)
|
||||
double Cic;//轨道倾角的余弦调和改正项的振幅(rad)
|
||||
double OMEGA;//参考时刻的升交点赤经
|
||||
double Cis;//维度倾角的正弦调和改正项的振幅(rad)
|
||||
|
||||
//数据块第五行内容:
|
||||
double i0;//参考时间的轨道倾角(rad)
|
||||
double Crc;//轨道平径的余弦调和改正项的振幅(m)
|
||||
double omega;//近地点角距
|
||||
double deltaomega;//升交点赤经变化率(rad)
|
||||
|
||||
//数据块第六行内容:
|
||||
double IDOT;//近地点角距(rad/s)
|
||||
double L2code;//L2上的码
|
||||
double GPSweek;//GPS周,于TOE一同表示
|
||||
double L2Pflag;//L2,p码数据标记
|
||||
|
||||
//数据块第七行内容
|
||||
double sACC;//卫星精度
|
||||
double sHEA;//卫星健康状态
|
||||
double TGD;//sec
|
||||
double IODC;//钟的数据龄期
|
||||
|
||||
//数据块第八行内容
|
||||
double TTN;//电文发送时间
|
||||
double fit;//拟合区间
|
||||
double spare1;//空
|
||||
@@ -220,4 +213,4 @@ typedef struct obs_body
|
||||
}obs_body,*pobs_body;
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
#endif
|
||||
#endif
|
||||
+119
-9
@@ -57,6 +57,8 @@ extern int get_epochnum(FILE* fp_obs)
|
||||
/* -------------------------------- 读取O文件数据头 -------------------------------- */
|
||||
extern void read_o_h(FILE* fp_obs, pobs_head obs_h)
|
||||
{
|
||||
memset(obs_h->obscode_gps, 0, sizeof(obs_h->obscode_gps));
|
||||
memset(obs_h->obscode_bds, 0, sizeof(obs_h->obscode_bds));
|
||||
char buff[MAXRINEX] = { 0 };
|
||||
char flag = { 0 };
|
||||
char* lable = buff + 60;
|
||||
@@ -95,7 +97,7 @@ extern void read_o_h(FILE* fp_obs, pobs_head obs_h)
|
||||
{
|
||||
for (i = 0; i < obs_h->obstypenum_gps; i++)
|
||||
{
|
||||
obs_h->obscode_gps[i] = Type2Code(i, buff);
|
||||
obs_h->obscode_gps[i + 1] = Type2Code(i, buff);
|
||||
}
|
||||
}
|
||||
else if (obs_h->obstypenum_gps > 13)
|
||||
@@ -186,6 +188,12 @@ extern void read_o_b(FILE* fp_obs, pobs_epoch obs_e, pobs_body obs_b, int type_g
|
||||
//输入卫星数
|
||||
obs_e[n].sat_num = strtonum(buff, 33, 3);
|
||||
strncpy(&flag, buff + 0, 1);
|
||||
|
||||
memset(obs_e[n].sPRN, 0, sizeof(obs_e[n].sPRN));
|
||||
memset(obs_e[n].sPRN_GPS, 0, sizeof(obs_e[n].sPRN_GPS));
|
||||
memset(obs_e[n].sPRN_BDS, 0, sizeof(obs_e[n].sPRN_BDS));
|
||||
memset(obs_b[n].obs_gps, 0, sizeof(obs_b[n].obs_gps));
|
||||
memset(obs_b[n].obs_bds, 0, sizeof(obs_b[n].obs_bds));
|
||||
|
||||
for (i = 0; i < obs_e[n].sat_num; i++)
|
||||
{
|
||||
@@ -246,6 +254,10 @@ int getgpssatnum(FILE* fp_nav)
|
||||
//wchar_t * fgets ( wchar_t * str, int num, FILE * stream );
|
||||
while (fgets(buff, MAXRINEX, fp_nav))
|
||||
{
|
||||
if (strstr(lable, "END OF HEADER"))
|
||||
{
|
||||
flag = 1;
|
||||
}
|
||||
if (flag == 1)
|
||||
{
|
||||
while (fgets(buff, MAXRINEX, fp_nav))
|
||||
@@ -262,13 +274,43 @@ int getgpssatnum(FILE* fp_nav)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return gps_satnum;
|
||||
}
|
||||
|
||||
int getbdssatnum(FILE* fp_nav)
|
||||
{
|
||||
int bds_satnum = 0;
|
||||
int flag = 0;
|
||||
char buff[MAXRINEX];//用来存放读取到的字符串
|
||||
char satvar;
|
||||
char* lable = buff + 60;
|
||||
//fgets函数,读取一行,当读取结束后返回NULL指针,格式如下:
|
||||
//wchar_t * fgets ( wchar_t * str, int num, FILE * stream );
|
||||
while (fgets(buff, MAXRINEX, fp_nav))
|
||||
{
|
||||
if (strstr(lable, "END OF HEADER"))
|
||||
{
|
||||
flag = 1;
|
||||
}
|
||||
if (flag == 1)
|
||||
{
|
||||
while (fgets(buff, MAXRINEX, fp_nav))
|
||||
{
|
||||
strncpy(&satvar, buff + 0, 1);
|
||||
if (satvar != 'C')
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else if (satvar == 'C')
|
||||
{
|
||||
bds_satnum++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return gps_satnum;
|
||||
return bds_satnum;
|
||||
}
|
||||
|
||||
/* -------------------------------- 读取N文件数据头 -------------------------------- */
|
||||
@@ -347,23 +389,23 @@ void read_n_h(FILE* fp_nav, pnav_head nav_h)
|
||||
/* -------------------------------- 读取N文件数据块 -------------------------------- */
|
||||
void read_n_b(FILE* fp_nav, pnav_body nav_b)
|
||||
{
|
||||
int i_g = 0;//第i_g个GPS卫星数据
|
||||
int i_c = 0;//第i_c个BDS卫星数据
|
||||
int i_g = 0;//第i_g个卫星数据
|
||||
char buff[84] = { 0 };
|
||||
char flag = { 0 };//判断符号
|
||||
while (fgets(buff, MAXRINEX, fp_nav))
|
||||
{
|
||||
int j_g = 0;//数据块的第j_g行数据
|
||||
int j_c = 0;//数据块的第j_C行数据
|
||||
int j_c = 0;//数据块的第j_c行数据
|
||||
strncpy(&flag, buff + 0, 1);
|
||||
if(flag == 'G')
|
||||
{
|
||||
for (j_g = 0; j_g < 8; j_g++)//读取第i_g颗 GPS卫星广播星历("总共包含8行数据") 数据块的第j_g行数据
|
||||
for (j_g = 0; j_g < 8; j_g++)//读取总计第i_g颗 GPS卫星广播星历("总共包含8行数据") 数据块的第j_g行数据
|
||||
{
|
||||
switch (j_g)
|
||||
{
|
||||
case 0:
|
||||
nav_b[i_g].sPRN = (int)strtonum(buff, 1, 2);
|
||||
nav_b[i_g].sPRN_BDS = 0;
|
||||
nav_b[i_g].sPRN_GPS = (int)strtonum(buff, 1, 2);
|
||||
nav_b[i_g].TOC_Y = (int)strtonum(buff, 4, 4);
|
||||
nav_b[i_g].TOC_M = (int)strtonum(buff, 9, 2);
|
||||
nav_b[i_g].TOC_D = (int)strtonum(buff, 12, 2);
|
||||
@@ -428,9 +470,77 @@ void read_n_b(FILE* fp_nav, pnav_body nav_b)
|
||||
i_g++;
|
||||
continue;
|
||||
}
|
||||
else if(flag != 'G')
|
||||
else if(flag == 'C')
|
||||
{
|
||||
fgets(buff, MAXRINEX, fp_nav);
|
||||
for (j_c = 0; j_c < 8; j_c++)//读取总计第i_g颗 BDS卫星广播星历("总共包含8行数据") 数据块的第j_c行数据
|
||||
{
|
||||
switch (j_c)
|
||||
{
|
||||
case 0:
|
||||
nav_b[i_g].sPRN_GPS = 0;
|
||||
nav_b[i_g].sPRN_BDS = (int)strtonum(buff, 1, 2);
|
||||
nav_b[i_g].TOC_Y = (int)strtonum(buff, 4, 4);
|
||||
nav_b[i_g].TOC_M = (int)strtonum(buff, 9, 2);
|
||||
nav_b[i_g].TOC_D = (int)strtonum(buff, 12, 2);
|
||||
nav_b[i_g].TOC_H = (int)strtonum(buff, 15, 2);
|
||||
nav_b[i_g].TOC_Min = (int)strtonum(buff, 18, 2);
|
||||
nav_b[i_g].TOC_Sec = strtonum(buff, 21, 2);
|
||||
nav_b[i_g].sa0 = strtonum(buff, 23, 19);
|
||||
nav_b[i_g].sa1 = strtonum(buff, 23 + 19, 19);
|
||||
nav_b[i_g].sa2 = strtonum(buff, 23 + 19 + 19, 19);
|
||||
fgets(buff, MAXRINEX, fp_nav);
|
||||
break;
|
||||
case 1:
|
||||
nav_b[i_g].IODE = strtonum(buff, 4, 19);
|
||||
nav_b[i_g].Crs = strtonum(buff, 4 + 19, 19);
|
||||
nav_b[i_g].deltan = strtonum(buff, 4 + 19 + 19, 19);
|
||||
nav_b[i_g].M0 = strtonum(buff, 4 + 19 + 19 + 19, 19);
|
||||
fgets(buff, MAXRINEX, fp_nav);
|
||||
break;
|
||||
case 2:
|
||||
nav_b[i_g].Cuc = strtonum(buff, 4, 19);
|
||||
nav_b[i_g].e = strtonum(buff, 4 + 19, 19);
|
||||
nav_b[i_g].Cus = strtonum(buff, 4 + 19 + 19, 19);
|
||||
nav_b[i_g].sqrtA = strtonum(buff, 4 + 19 + 19 + 19, 19);
|
||||
fgets(buff, MAXRINEX, fp_nav);
|
||||
break;
|
||||
case 3:
|
||||
nav_b[i_g].TOE = strtonum(buff, 4, 19);
|
||||
nav_b[i_g].Cic = strtonum(buff, 4 + 19, 19);
|
||||
nav_b[i_g].OMEGA = strtonum(buff, 4 + 19 + 19, 19);
|
||||
nav_b[i_g].Cis = strtonum(buff, 4 + 19 + 19 + 19, 19);
|
||||
fgets(buff, MAXRINEX, fp_nav);
|
||||
break;
|
||||
case 4:
|
||||
nav_b[i_g].i0 = strtonum(buff, 4, 19);
|
||||
nav_b[i_g].Crc = strtonum(buff, 4 + 19, 19);
|
||||
nav_b[i_g].omega = strtonum(buff, 4 + 19 + 19, 19);
|
||||
nav_b[i_g].deltaomega = strtonum(buff, 4 + 19 + 19 + 19, 19);
|
||||
fgets(buff, MAXRINEX, fp_nav);
|
||||
break;
|
||||
case 5:
|
||||
nav_b[i_g].IDOT = strtonum(buff, 4, 19);
|
||||
nav_b[i_g].L2code = strtonum(buff, 4 + 19, 19);
|
||||
nav_b[i_g].GPSweek = strtonum(buff, 4 + 19 + 19, 19);
|
||||
nav_b[i_g].L2Pflag = strtonum(buff, 4 + 19 + 19 + 19, 19);
|
||||
fgets(buff, MAXRINEX, fp_nav);
|
||||
break;
|
||||
case 6:
|
||||
nav_b[i_g].sACC = strtonum(buff, 4, 19);
|
||||
nav_b[i_g].sHEA = strtonum(buff, 4 + 19, 19);
|
||||
nav_b[i_g].TGD = strtonum(buff, 4 + 19 + 19, 19);
|
||||
nav_b[i_g].IODC = strtonum(buff, 4 + 19 + 19 + 19, 19);
|
||||
fgets(buff, MAXRINEX, fp_nav);
|
||||
break;
|
||||
case 7:
|
||||
nav_b[i_g].TTN = strtonum(buff, 4, 19);
|
||||
nav_b[i_g].fit = strtonum(buff, 4 + 19, 19);
|
||||
nav_b[i_g].spare1 = strtonum(buff, 4 + 19 + 19, 19);
|
||||
nav_b[i_g].spare2 = strtonum(buff, 4 + 19 + 19 + 19, 19);
|
||||
break;
|
||||
}
|
||||
}
|
||||
i_g++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ extern int select_epoch(double SecofWeek, int sPRN, pnav_body nav_b, int gps_sat
|
||||
int i;
|
||||
for (i = 0; i < gps_satnum; i++)
|
||||
{
|
||||
if (sPRN == nav_b[i].sPRN)
|
||||
if (sPRN == nav_b[i].sPRN_GPS)
|
||||
{
|
||||
Min = fabs(SecofWeek - nav_b[i].TOE);
|
||||
if (Min <= min)
|
||||
|
||||
+2
-2
@@ -46,9 +46,9 @@ int Type2Code(int i, char buff[1000])
|
||||
int Code2Type(int typecode, int typenum, int typearr[36])
|
||||
{
|
||||
int pos;
|
||||
for(pos = 0; pos < typenum; pos++)
|
||||
for (pos = 0; pos < typenum; pos++)
|
||||
{
|
||||
if(typearr[pos] == typecode)
|
||||
if (typearr[pos] == typecode)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user