文章目录
- Part.I Introduction
- Chap.I rinex.h
- Chap.II gmain_body.h
- Part.II 使用方法
- 扩展阅读
Part.I Introduction
本文将介绍一个小项目的使用方法,此项目可用精密星历和广播星历计算卫星位置,并将两者结果做差,输出至文件。
其实 『分别用精密星历和广播星历计算卫星坐标』 是笔者在本科阶段的一次 GNSS 编程作业,当时就把自己的代码上传的 CSDN 上面了,没想到后来受到了许多朋友的关注。但是当时本科阶段写的代码,使用起来很麻烦,近期又有朋友来请教,并且现在看当时的代码,简直是一坨…,所以花了一晚上的时间对其进行了重构,现在看起来似乎没有那么糟糕了。
整个项目的文件树如下:
.
├─data
│ ├─2019_08_28
│ └─out
├─src
│ ├─app_run
│ └─LibGNSS
│ ├─gdata
│ ├─gexport
│ └─gproc
└─_doc└─imgs
其中
data
: 2019年08月28日的广播星历和精密星历,out
是一个参考输出结果(输出结果格式:sec x y z time,其中sec是天内秒,单位为s;xyz是坐标单位为m;time 是钟改正,单位为 1e-6 s)结果文件有:-
brdcxx.txt
:这是用广播星历计算出来的Gxx
号卫星的坐标
-
spxx.txt
:这是用精密星历计算出来的Gxx
号卫星的坐标
-
detxx.txt
:这是两者之间的差值
src
: 程序源码,包括一个LibGNSS
库和一个 app_doc
:Eigen
包和本文档所用到的图片。
整个项目实现的功能有:读取精密星历和广播星历、计算两个卫星计算卫星坐标并将计算结果存储到 txt 文件中,戳我下载
下面是部分文件内容
Chap.I rinex.h
/**
* @verbatimHistory-1.0 hlgou 2024-04-01 created-1.0 xxx 20xx-xx-xx do some changes@endverbatim
*
* @file rinex.h
* @brief BRDC(broadcast ephemeris) data structure
* @author hlgou.
* @date 2024-04-01
*/#ifndef RINEX_H
#define RINEX_H#include <string>#include "gexport/ExportLibGNSS.h"
namespace dawn
{struct LibGNSS_LIBRARY_EXPORT DATANODE{int PRN;//卫星的prn,double IODE;double a0, a1, a2;//钟差,钟漂double a_sqrt, e;//轨道参数double Cuc, Cus, Crc, Crs, Cic, Cis;//6个摄动参数double Dn, OMEGA, omega, i0, M0;double i_DOT, OMEGA_DOT, TGD;int GPS_WEEK, TOE, TIME;//GPS周,周内秒数,卫星发送时刻int SEC_DAY;//一天当中的多少秒};struct LibGNSS_LIBRARY_EXPORT DATALINE{int YEAR, MONTH, DAY, HOUR, MINITE, SECOND, TOC;//卫星钟的参考时刻(年月日时分秒)DATANODE nod[35];};struct LibGNSS_LIBRARY_EXPORT BRDC{ //广播星历DATALINE lin[30];double A[4], B[4], A0, A1;//电离层参数,多项式系数int T, W, LEAP_SEC, YEAR, MON, DAY;//UTC参考时刻,周,跳秒};}#endif
Chap.II gmain_body.h
/**
* @verbatimHistory-1.0 hlgou 2024-04-01 created-1.0 xxx 20xx-xx-xx do some changes@endverbatim
*
* @file gmain_body.h
* @brief Main process class.
* @author hlgou.
* @date 2024-04-01
*/#ifndef GMAIN_BODY_H
#define GMAIN_BODY_H#include <cmath>#include "gdata/rinex.h"
#include "gdata/sp3.h"using namespace std;namespace dawn
{class LibGNSS_LIBRARY_EXPORT t_gmain_body{public:void setFileNmame(string wdir, string f1, string f2, string sdir);//计算精密星历和广播星历的结果及其差值并保存,i 是第 i 颗星void processBatch();protected:int _decodeSp3();int _decodeBrdc();Point _subBrdc(int time);Point _brdcCaculate(int time, int j);double _subSp3(int time, int i, int j, int t);Point _sp3Caculate(int time, int j);int _find(string p, int num, string* prn);string _wdir; // 数据所在目录string _sdir; // 结果保存目录string _sp3_filename;string _brdc3_filename;SP3 _gsp3; // 精密星历结构体BRDC _gbrdc; // 广播星历结构体DATANODE _current_DN;};
}#endif
Part.II 使用方法
所需软件:CMake + VS Studio
所需矩阵库:Eigen(放心,压缩包里有)
为了防止不必要的歧义,下面将项目的根目录称为『当前目录』
首先解压Eigen.zip
,将其放在一个你不常动的目录中,将这个目录(或 这个目录/Eigen)称为『Eigen目录』
1、在src
目录下新建build
文件夹
2、打开 CMake
,源码路径设置为当前目录,build
路径设置为 src/build
3、点击 Configure
,之后配置根据自己实际情况配,配好点击 Finish
4、会报错,不要急,把 『Eigen目录』赋给 Third_Eigen_ROOT
,再次点击Configure
5、依次点击Generate
和Open Project
,打开项目
6、将解决方案配置改为RelWithDebInfo
(其实改不改无所谓,程序本身体量很小),将 app_run
设为启动项目,run.cpp
就是主程序
7、将 wdir
和 sdir
分别改为你的路径(最好是绝对路径)
8、将 out
文件夹改名为 out1
(备份),新建一个out
文件夹
9、快捷键F5
运行程序,在out
文件夹下等待程序运行结果,完事!
扩展阅读
- GNSS 导航电文的解读
- 分别用精密星历和广播星历计算卫星坐标 – 对 GNSS 第一次编程的总结
- GPS广播星历和精密星历的下载
- CDDIS网站下 GNSS 相关的数据产品下载+命名方式解读+文件格式说明文件下载地址