武汉大学卫星导航原理课程作业
采用C++语言编译,实现rinex3.04格式的广播星历文件读取和卫星的位置解算。
- 根据所给定的广播星历文件,盘算当天多颗GPS卫星(3颗及以上)在24h内每隔30s在瞬时地心地固系下的坐标。
- 将上述盘算得到的GPS卫星位置与精密星历对比(15min间隔),评估广播星历盘算出的卫星位置的误差,绘制出卫星的轨道误差时序图。
- 广播星历文件:BRDC00IGS_R_20213480000_01D_MN.rnx
- 精密星历文件:WUM0MGXFIN_20213480000_01D_15M_ORB.SP3
- rinex 04格式说明文档。给出的广播星历文件格式为rinex 04,参数含义参照说明文档附录A5、A6。
一、广播星历文件的读取
1.首先读取所有内容,存储到lines容器里面,并记录下头文件竣事的位置,便于后续获取数据
- vector<string> lines;
- string end_of_header = " END OF HEADER";
- int end_of_line = 0;//文件头结束的位置
- void readfile(string filename)
- {
- int i = 0;
- ifstream infile(filename);
- if (!infile.is_open())
- {
- cerr << "open error!" << endl;
- }
- string line="0";
- while (getline(infile, line))
- {
- if (line == end_of_header)
- {
- end_of_line = i;
- }
- lines.push_back(line);
- i = i + 1;
- }
- infile.close();
- }//读取广播星历文件
复制代码 2.界说结构体并进行数据分配
二、卫星位置解算
1.盘算步骤:
2.时间转换和最佳历元选取
需要将世界时转换成GPS时,同时需要查找时间差最近的历元,以此历元的数据进行卫星位置解算,代码如下:
- double get_GPST(int Y, int M, int D, int H, int min, double S)
- {
- double y = 0;
- double m = 0;
- if (M <= 2)
- {
- y = Y - 1;
- m = M + 12;
- }
- else
- {
- y = Y;
- m = M;
- }
- double UT = 0;//世界时
- double MJD = 0;//简化儒略日
- UT = H + min / 60.0 + S / 3600.0;
- MJD = int(365.25*y) + int(30.6001*(m + 1)) + D + UT / 24 - 679019;
- int GPSweek = 0;
- double secofweek = 0;
- GPSweek = int((MJD - 44244) / 7);//GPS周
- secofweek = (MJD - 44244 - GPSweek * 7) * 86400;//GPS周秒
- return secofweek;
- }//计算GPS周内秒的函数
- int select_epoch(double secofweek,string PRN)
- {
- int n = 0;
- double min_s = 10000;
- double Min;
- for (int i = 0; i <= size(data) - 1; i++)
- {
- if (data[i].sPRN == PRN)
- {
- Min = fabs(secofweek - data[i].TOE);
- if (Min <= min_s)
- {
- n = i;
- min_s = Min;
- }
- }
- }
- return n;
- }//选择时间差最小的历元计算
- void caculate(int k,double secofweek)
- {
- double A = pow(data[k].sqrtA,2);
- double n0 = sqrt(u / pow(A, 3));
- double n = n0 + data[k].deltan;//计算卫星的平均角速度n
- double tk = secofweek - data[k].TOE;//计算规划时间
- if (tk > 302400)
- {
- tk = tk - 604800;
- }
- if (tk < -302400)
- {
- tk = tk + 604800;
- }//考虑跨周的影响
- double Mk = data[k].M0 + n * tk;//计算平近点角
- double E0 = 0;
- double E1 = Mk;
- while (abs(E1-E0)>1e-6)
- {
- E0 = E1;
- E1 = Mk + data[k].e*sin(E0);
- }//计算偏近点角
- double cosv = (cos(E1) - data[k].e) / (1 - data[k].e * cos(E1));
- double sinv = sqrt(1 - pow(data[k].e, 2))*sin(E1) / (1 - data[k].e * cos(E1));
- double Vk = atan2(sinv, cosv);
- double w = Vk + data[k].omega;
- double Ou = data[k].Cuc*cos(2 * w) + data[k].Cus*sin(2 * w);
- double Or = data[k].Crc*cos(2 * w) + data[k].Crs*sin(2 * w);
- double Oi = data[k].Cic*cos(2 * w) + data[k].Cis*sin(2 * w);
- double uk = w + Ou;
- double rk = A * (1 - data[k].e*cos(E1)) + Or;
- double ik = data[k].i0 + Oi + data[k].IDOT*tk;
- double xk1 = rk * cos(uk);
- double yk1 = rk * sin(uk);
- double Ok = data[k].OMEGA + (data[k].deltaomega - Oe)*tk - Oe * data[k].TOE;
- double xk = xk1 * cos(Ok) - yk1 * cos(ik)*sin(Ok);
- double yk = xk1 * sin(Ok) + yk1 * cos(ik)*cos(Ok);
- double zk = yk1 * sin(ik);
- position P;
- P.GPSweek = data[k].GPSweek;
- P.GPSsec = secofweek;
- P.x = xk;
- P.y = yk;
- P.z = zk;
- data_P.push_back(P);//把坐标数据添加到容器里面
- }
复制代码 三、结果文件保存
将盘算所得结果按照指定要求保存在文本文件中:
- void savefile()
- {
- ofstream outfile("广播星历.txt");
- outfile <<fixed<< setprecision(3);
- for (int i = 0; i <= size(data_P) - 1; i++)
- {
- outfile << data_P[i].GPSweek << " " << data_P[i].GPSsec << " " << data_P[i].x << " " << data_P[i].y << " " << data_P[i].z << endl;
- }
- }//将广播星历的数据写入文件
复制代码 武汉大学测绘学院在读本科生一枚,本次的内容就分享到这里了,渴望各人多多关注,后面会连续给各人分享更多的优质内容。本次作业的所有测试用例和源代码都可以免费下载,渴望各人点点关注支持一下。
【免费】武汉大学卫星导航原理课程作业-广播星历与卫星位置盘算.zip资源-CSDN文库
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |