国外镜像 leetcodeLCP eloquent scripting jestjs bower 直销系统源码 jquery的each遍历方法 jq遍历元素 idea导入多个项目 mysql连接 python日期转时间戳 python命令行参数 python调用自定义函数 java学习基础 java中的数据结构 java开发语言 m4a转mp3格式转换器 主板芯片组天梯图 神龙激活 tftpd64 java疯狂讲义 0x8002801c 免费书籍 spoonwep oem修改器 手机知识 无法打开搜索页 小工具 疯狂java 程序卸载 什么模拟器最好 古风头像女动漫 文章查重软件 mac版matlab 燃烧之血十字架 寂静城 ae蒙版和遮罩 linux解压缩命令 vue响应式原理
当前位置: 首页 > 学习教程  > 编程语言

编程实现利用广播星历计算卫星位置并与精密星历比较

2020/11/4 14:23:06 文章标签:

编程实现利用广播星历计算卫星位置并与精密星历比较 一、程序设计思想 本次程序设计思路较为清晰简单,即: 0、设计储存星历块结构、GPS时间结构 1、读取广播星历文件 2、将所读取文件中数据传入所设定结构数组中 3、按要求读入所需卫星时间、卫星编号 …

编程实现利用广播星历计算卫星位置并与精密星历比较

一、程序设计思想

本次程序设计思路较为清晰简单,即:
0、设计储存星历块结构、GPS时间结构
1、读取广播星历文件
2、将所读取文件中数据传入所设定结构数组中
3、按要求读入所需卫星时间、卫星编号
4(关键)、逐步进行计算,求得所需坐标
5、与精密星历进行比较,得出较差

其中,基本广播星历块、GPSTIME结构体已经给出,不再进行赘述。
对于本次作业,首先需要根据ReadBrodcastEphemeri文件中的读取文件的算法改成C/C++语言,再按要求读入所需卫星时间、卫星编号,随后对所读取的已知数据进行逐步计算,得出X、Y、Z。与精密星历进行比较的过程也比较简单,也再次不再赘述。

二、程序设计流程图

在这里插入图片描述

本设计将计算和读取文件分为两个函数,后面实践的时候发现合为一个虽然会使得结构有点乱,但更方便编写,遂将读取与计算合为一个函数。

三、与精密星历的较差

在此附上求得广播星历和读取的精密星历的结果
广播星历:-8648124.35697336
		15533253.82562644
		19725512.16283019
精密星历:-8648113.252  
		15533260.046  
		19725513.834
		
相差:	  -11.104
		-6.220
		-1.67

四、附上主要程序代码

//计算卫星运行的平均角速度
//step1
double n0 = sqrt(3.986005e+014) / pow((m_pGpsEphemeris[i].SqrtA), 3);
double n = n0 + m_pGpsEphemeris[i].Deltan;

//计算t 时刻卫星的平近点角
//step2
double M = m_pGpsEphemeris[i].M0 + n * (weekSecond - m_pGpsEphemeris[i].Toe);

//计算偏近点角
//step3
double E0 = 0, E = 0;
E = M + m_pGpsEphemeris[i].e * sin(E0);
while (abs(E - E0) >= pow(10, -12))
{
	E0 = E;
	E = M + m_pGpsEphemeris[i].e * sin(E0);
}

//计算真近点角
//step4
double f = atan(sqrt(1 - pow(m_pGpsEphemeris[i].e, 2)) * sin(E) / (cos(E) - m_pGpsEphemeris[i].e));

//计算升交角距(未经改正的)
//step5
double u_ = f + m_pGpsEphemeris[i].omega;

//计算卫星向径(未经改正的)
//step6
double r_ = pow(m_pGpsEphemeris[i].SqrtA, 2) * (1 - m_pGpsEphemeris[i].e * cos(E));

//计算摄动改正项
//step7
double DeltaU = m_pGpsEphemeris[i].Cuc * cos(2 * u_) + m_pGpsEphemeris[i].Cus * sin(2 * u_);
double DeltaR = m_pGpsEphemeris[i].Crc * cos(2 * u_) + m_pGpsEphemeris[i].Crs * sin(2 * u_);
double DeltaI = m_pGpsEphemeris[i].Cic * cos(2 * u_) + m_pGpsEphemeris[i].Cis * sin(2 * u_);

//进行摄动改正
//step8
double u = u_ + DeltaU;
double r = r_ + DeltaR;
double ii = m_pGpsEphemeris[i].i0 + m_pGpsEphemeris[i].IDOT * (weekSecond - m_pGpsEphemeris[i].Toe) + DeltaI;

//计算卫星在轨道平面坐标系中的位置
//step9
double x = r * cos(u);
double y = r * sin(u);

//计算升交点经度L
//step10
double L = m_pGpsEphemeris[i].OMEGA + m_pGpsEphemeris[i].OMEGAdot * (weekSecond - m_pGpsEphemeris[i].Toe) - weekSecond * we;

//计算卫星在瞬时地球坐标系下的坐标
//step11
double X = x * cos(L) - y * cos(ii) * sin(L);
double Y = x * sin(L) + y * cos(ii) * cos(L);
double Z = y * sin(ii);


本文链接: http://www.dtmao.cc/news_show_350132.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?