Advertisement

C/C++ 项目:分别用精密星历和广播星历计算卫星坐标

阅读量:

文章目录

  • Part.I Introduction

    • Chap.I rinex.h
    • Chap.II gmain_body.h
  • Part.II 使用方法

  • Part.III 使用 Matlab 绘图

    • Chap.I 结果展示
    • Chap.II 源码
  • 扩展阅读

Part.I Introduction

本文将介绍一个小项目的使用方法,此项目可用精密星历和广播星历计算卫星位置,并将两者结果做差,输出至文件。
在这里插入图片描述

其实 『分别用精密星历和广播星历计算卫星坐标』 是笔者在本科阶段的一次 GNSS 编程作业,当时就把自己的代码上传的 上面了,没想到后来受到了许多朋友的关注。但是当时本科阶段写的代码,使用起来很麻烦,近期又有朋友来请教,并且现在看当时的代码,简直是一坨…,所以花了一晚上的时间对其进行了重构,现在看起来似乎没有那么糟糕了。

整个项目的文件树如下:

复制代码
    .
    ├─data
    │  ├─2019_08_28
    │  └─out
    ├─src
    │  ├─app_run
    │  └─LibGNSS
    │      ├─gdata
    │      ├─gexport
    │      └─gproc
    └─_doc
    └─imgs
    
    
      
      
      
      
      
      
      
      
      
      
      
      
    
    AI写代码

其中

  • 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

复制代码
    /** * @verbatim
    History
     -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
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    AI写代码

Chap.II gmain_body.h

复制代码
    /** * @verbatim
    History
     -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
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    AI写代码

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、依次点击GenerateOpen Project,打开项目

6、将解决方案配置改为RelWithDebInfo(其实改不改无所谓,程序本身体量很小),将 app_run 设为启动项目,run.cpp 就是主程序
在这里插入图片描述

7、将 wdirsdir 分别改为你的路径(最好是绝对路径)
在这里插入图片描述

8、将 out 文件夹改名为 out1(备份),新建一个out 文件夹

9、快捷键F5运行程序,在out 文件夹下等待程序运行结果,完事!

Part.III 使用 Matlab 绘图

Chap.I 结果展示

在这里插入图片描述

Chap.II 源码

源码如下(注意改文件路径和文件名)

复制代码
    %% LOAD DATA
    wdir='A:\aWork\scripts\mGit\cpp\GNSS0\data\out\';
    f1=[wdir,'brdc01.txt'];
    f2=[wdir,'sp01.txt'];
    fs=[wdir,'_det01.txt'];
    Data1 = load(f1);
    Data2 = load(f2);
    Det = Data2 - Data1;
    Det(:,1)=Data1(:,1);
    
    %% PLOT BRDC and SP3
    plot(Data1(:,1),Data1(:,2));
    hold on;
    plot(Data2(:,1),Data2(:,2));
    set(gca,'FontName','Times New Roman');
    legend('BRDC','SP3');
    xlabel('Time (SOD)');
    ylabel('Vale (m)');
    
    %% PLOT difference value
    figure
    plot(Det(:,1),Det(:,2));
    hold on;
    plot(Det(:,1),Det(:,3));
    hold on;
    plot(Det(:,1),Det(:,4));
    set(gca,'FontName','Times New Roman');
    legend('X','Y','Z');
    xlabel('Time (SOD)');
    ylabel('Diff (m)');
    
    %% Save difference value
    fid=fopen(fs,'w'); 
    fprintf(fid,'%6d %20.6f %20.6f %20.6f %20.6f\r\n',Det');
    fclose(fid);
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    AI写代码

扩展阅读

全部评论 (0)

还没有任何评论哟~