C/C++ 项目:分别用精密星历和广播星历计算卫星坐标
创作时间:
作者:
@小白创作中心
C/C++ 项目:分别用精密星历和广播星历计算卫星坐标
引用
CSDN
1.
https://blog.csdn.net/Gou_Hailong/article/details/137250172
本文介绍了一个C/C++项目,该项目能够使用精密星历和广播星历计算卫星坐标,并将两种方法的结果进行比较。文章详细介绍了项目的目录结构、核心代码、使用方法以及如何使用Matlab进行结果可视化。
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
/**
* @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
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
Part.II 使用方法
所需软件:CMake + VS Studio
所需矩阵库:Eigen(放心,压缩包里有)
为了防止不必要的歧义,下面将项目的根目录称为『当前目录』
- 在
src目录下新建build文件夹 - 打开CMake,源码路径设置为当前目录,
build路径设置为src/build - 点击
Configure,之后配置根据自己实际情况配,配好点击Finish - 会报错,不要急,把 『Eigen目录』赋给
Third_Eigen_ROOT,再次点击Configure - 依次点击
Generate和Open Project,打开项目 - 将解决方案配置改为
RelWithDebInfo(其实改不改无所谓,程序本身体量很小),将app_run设为启动项目,run.cpp就是主程序 - 将
wdir和sdir分别改为你的路径(最好是绝对路径) - 将
out文件夹改名为out1(备份),新建一个out文件夹 - 快捷键
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);
扩展阅读
- GNSS 导航电文的解读
- 分别用精密星历和广播星历计算卫星坐标 – 对 GNSS 第一次编程的总结
- GPS广播星历和精密星历的下载
- CDDIS网站下 GNSS 相关的数据产品下载+命名方式解读+文件格式说明文件下载地址
热门推荐
“废旧酒瓶改造出七十二变”,玻璃的可持续被这家酒企整明白了
5种紫色食物,抗氧化、抗衰老、护血管!但你可能一直“吃错”了
中国航母的舷号,为何从16号开始?“辽宁舰”舷号16的三种说法
30分钟内做出4人份量的晚餐:3个家常菜,有菜有肉有汤
调制技术与信道编码:协同工作,提高通信效率的终极指南
不能忽视的声音嘶哑
土豆排骨,这道看似简单的家常菜,实则蕴含着无限的温情与匠心
电动汽车前驱与后驱的对比结果如何?
患病加菲猫被弃未开门医院外,流浪小梨花被宠成“掌中宝”
猪排腌制方法与调料配方
全频扬声器和中低音扬声器的区别解析
北京“公园礼物”,帮你把美好记忆打包“带走”
内容杂糅与叙事过载——《唐探1900》的类型困境
怎么克服全麻前的恐惧
从古诗中取出的闺蜜网名 好记46个
荷乙焦点战:海尔蒙特能否击退埃门,巩固排名优势?
发财树烂根还能救吗?教你三个方法,再次生根并不难
这花种不得,一株也不行!
小猫咪洗澡频率(如何为你的猫咪选定最合适的洗澡频率)
绿卡递交I-485前如何开具FBI无犯罪记录证明?
明日方舟水月肉鸽隐藏结局3触发攻略
嵌入式入门全攻略:从零基础到项目实战的学习路线图
盐池县:靶向发力培养村级后备干部 让乡村振兴“后继有人”
苏轼和哪吒直播间卖灯笼!《元宵奇妙游》赋能传统文化新表达
改变车齿比的方法有哪些?如何根据车辆性能调整齿比?
预算不够也能装?教你如何挑性价比高的装修材料!
“郭富城每天只吃一顿”冲上热搜!对健康有利吗?有更好的替代方案吗?
嘴唇干燥起皮,不只是缺水!这四大脾胃问题才是根本原因
如何用 STM32CubeMX 创建项目并导入 Keil5
数据库备份相关概念详解:冷备份、热备份、完全备份、增量备份与差量备份