C语言计算GPS卫星位置

news2024/12/24 8:40:10

1 概述

在用GPS信号进行导航定位以与制订观测计划时,都必须已知GPS卫星在空间的瞬间位置。卫星位置的计算是根据卫星电文所提供的轨道参数按一定的公式计算的。本节专门讲解观测瞬间GPS卫星在地固坐标系中坐标的计算方法。

2 卫星位置的计算

1. 计算卫星运行的平均角速度n

根据开普勒第三定律,卫星运行的平均角速度n0可以用下式计算:

式中μ为WGS-84坐标系中的地球引力常数,且μ=3.986005×1014m3/s2。平均角速度n0加上卫星电文给出的摄动改正数Δn,便得到卫星运行的平均角速度n

n=n0+Δn          (4-12)

2. 计算归化时间tk

首先对观测时刻t′作卫星钟差改正

t=t′-Δt

然后对观测时刻t归化到GPS时系

tk=t-toc                             (4-13)

式中tk称作相对于参考时刻toe的归化时间(读者注意:toc≠toe)。

3. 观测时刻卫星平近点角Mk的计算

Mk=M0+ntk                    (4-14)

式中M0是卫星电文给出的参考时刻toe的平近点角。

4. 计算偏近点角Ek

Ek=Mk+esinEk(Ek,Mk以弧度计)      (4-15)

上述方程可用迭代法进行解算,即先令Ek=Mk,代入上式,求出Ek再代入上式计算,因为GPS卫星轨道的偏心率e很小,因此收敛快,只需迭代计算两次便可求得偏近点角Ek

5. 真近点角Vk的计算

由于:

因此:

6.升交距角Φk的计算

ω为卫星电文给出的近地点角距。

7. 摄动改正项δu,δr,δi的计算

δu,δr,δi分别为升交距角u的摄动量,卫星矢径r的摄动量和轨道倾角i的摄动量。

8. 计算经过摄动改正的升交距角uk、卫星矢径rk和轨道倾角ik

9. 计算卫星在轨道平面坐标系的坐标

卫星在轨道平面直角坐标系(X轴指向升交点)中的坐标为

10. 观测时刻升交点经度Ωk的计算

升交点经度Ωk等于观测时刻升交点赤经Ω(春分点和升交点之间的角距)与格林泥治视恒星时GAST(春分点和格林尼治起始子午线之间的角距)之差,

Ωk=Ω-GAST       (4-23)

又因为:

         (4-24)

其中Ωoe为参与时刻toe的升交点的赤经;

是升交点赤经的变化率,卫星电文每小时更新一次Ω和toe。

此外,卫星电文中提供了一周的开始时刻tw的格林尼治视恒星时GASTw。由于地球自转作用,GAST不断增加,所以:

GAST=GASTwet        (4-25)

式中ωe=7.29211567×10-5rad/s为地球自转的速率;t为观测时刻。

由式(4-24)和(4-25),得:

由(4-13)式,得:

其中

的值可从卫星电文中获取。

11. 计算卫星在地心固定坐标系中的直角坐标

把卫星在轨道平面直角坐标系中的坐标进行旋转变换,可得出卫星在地心固定坐标系中的三维坐标:

12. 卫星在协议地球坐标系中的坐标计算

考虑极移的影响,卫星在协议地球坐标系中的坐标为

利用C语言程序实现

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <math.h>

#define u 3.986004418e+14

#define WE 7.292115e-6

struct canshu

{

int  prn, nian, yue, ri, shi, fen;//卫星PRN号,年,月,日,时,分

double miao;//秒

long double adoe, a0, a1, a2, mo, dn, e, ga, pio, io, w, pid, ii, cuc, cus,  cue, crs, crc, cis, cic, toe,  aodc, wn;

/*参数说明:ADOE值,a0 卫星钟偏差, a1 卫星钟漂移, a2 卫星钟频率漂移, M0 平近点角, Δn平运动差, e偏心率, a1/2半长轴的平方根, Ω0 轨道平面升交点经度,

i0  倾角, ω近地点角距, *Ω升交点速率,  IDot 倾角速率,  Cuc Cus 升交角距的摄动改正项, Crc Crs 地心距的摄动改正项,  Cic Cis 倾角的摄动改正项,

toe 参考历元*/

};

void wxzbjx(struct canshu *pt)

{

long double a, n0, n, t, tk, toc, mk, ek, vk, fik, uk, rk, ik;

long double xk, yk ,zk, lk;

long double XK, YK, ZK;

int temp;

pt->nian = pt->nian + 2000;

t = (long double)(((pt ->nian)- 1980) * 365 * 24 * 3600 + (pt ->yue - 1) * 30 * 24 * 3600 + pt ->ri

 * 24 * 3600 + pt->shi * 3600 + pt ->miao);

a = pt ->ga * pt ->ga;

n0 = sqrt(WE/(a*a*a));//平均角速度n0

n = n0 + pt ->dn;

tk = t - pt ->toe;

toc = pt ->a0 + pt ->a1 * (t - pt ->toe) + pt ->a2 * (t - pt->toe) * (t - pt ->toe);

tk = tk - pt ->toe;

mk = pt ->mo + n * tk;

ek = mk;

for(temp=0;temp<10;temp++)

{

ek=mk+ pt ->e * sin(ek);//利用迭代法求偏近点角ek  

}

vk = 2 * atan(sqrt((1+ pt ->e) / (1 - pt ->e))* (tan(ek)) / 2 );

fik = vk + pt ->w;

uk = fik + pt ->cuc * cos(2* fik) + pt ->cus * sin(2*fik);

rk = pt ->ga * pt ->ga * (1 - pt ->e * ek) + pt ->crc * cos(2* fik) + pt ->crs * sin(2*fik);

ik = pt ->io + pt ->cic * cos(2 * fik) + pt ->cis * sin(2* fik) + pt ->ii * tk;

xk = rk * cos(uk);

yk = rk * sin(uk);

zk = 0;

lk = pt ->pio + (pt ->pid - WE) * tk - WE * pt->toe;

XK = xk * cos(lk) - yk * cos(ik) * sin(lk);

YK = xk * sin(lk) + yk * cos(ik) * cos(lk);

ZK = yk * sin(ik);

printf("\n%d年%d月%d号%d时%.2f秒 %d号卫星的坐标:", pt->nian, pt->yue ,pt->ri , pt->shi ,pt->miao, pt->prn);

printf("\nXk = %.9f\nYk= %.9f\nZK = %.9f\n\n", XK, YK, ZK);

}

int main(void)

{

FILE *fp, *fp1, *fp2;

struct canshu a;

int i=0, hanhao = 1;  

long double temp1, temp2, temp3,  temp5, temp4, temp6, temp7;

char  ch, ch1;

if((fp1 = fopen("E:\\星历文件\\guangboxingli2.txt", "r")) == NULL)//请自定义星历文件位置与名称

{

printf("文件无法打开!");

exit(0);

}

else

{

if((fp2 = fopen("E:\\星历文件\\guangboxingli2fu.txt", "w")) == NULL)

{

printf("文件无法打开!");

exit(0);

}

else

{

while((ch1 = fgetc(fp1)) != EOF)

{

if(ch1 == '\n')

{

i ++;

}

putchar(ch1);

if(i == 15)

{

break;

}

}

while(!feof(fp1))

{

ch1=fgetc(fp1);

if(ch1 == 'D')

{

ch1 = 'e';

}

fputc(ch1,fp2);

}

fclose(fp1);

}

        fclose(fp2);

}

printf("以上是星历文件的头文件!\n");

system("pause");

printf("读取文件参数数据\n!");

if((fp = fopen("E:\\星历文件\\guangboxingli2fu.txt", "r")) == NULL)//创建计算结果文档

{

printf("文件无法打开!");

exit(0);

}

while(!feof(fp))

{

switch(hanhao)

{

case 1:

{

fscanf(fp,"\n%d%d%d%d%d%d%lf %le %le %le", &a.prn,  &a.nian, &a.yue, &a.ri, &a.shi,

  &a.fen, &a.miao, &a.a0, &a.a1, &a.a2);

printf("%d %d %d %d %d %d %lf %le %le %le", a.prn,  a.nian, a.yue, a.ri, a.shi,

  a.fen, a.miao, a.a0, a.a1, a.a2);

hanhao++;

}

case 2:

{

fscanf(fp,"%le %le %le %le", &a.adoe, &a.crs, &a.dn, &a.mo);

printf("\n%le %le %le %le", a.adoe, a.crs, a.dn, a.mo);

hanhao++;

}

case 3:

{

fscanf(fp,"%le %le %le %le", &a.cue, &a.e, &a.cus, &a.ga);

printf("\n%le %le %le %le", a.cue, a.e, a.cus, a.ga);

hanhao++;

}

case 4:

{

fscanf(fp,"%le %le %le %le", &a.toe, &a.cic, &a.pio, &a.cis);

printf("\n%le %le %le %le", a.toe, a.cic, a.pio, a.cis);

hanhao++;

}

case 5:

{

fscanf(fp,"%le %le %le %le", &a.io, &a.crc, &a.w, &a.pid);

printf("\n%le %le %le %le", a.io, a.crc, a.w, a.pid);

hanhao++;

}

case 6:

{

fscanf(fp,"%le %le %le %le", &a.ii, &temp1, &a.wn, &temp2);

printf("\n%le %le %le %le", a.ii, temp1, a.wn, temp2);

hanhao++;

}

case 7:

{

fscanf(fp,"%le %le %le %le", &temp3, &temp4, &temp5, &a.aodc);

printf("\n%le %le %le %le", temp3, temp1, temp5, a.aodc);

hanhao++;

}

case 8:

{

fscanf(fp,"%le", &temp6);

printf("\n%le", temp6);

if((ch=fgetc(fp)) != '\n')

{

fscanf(fp,"%le", &temp7);

printf(" %le\n", temp7);

}

}

}

wxzbjx(&a);

system("pause");

hanhao = 1;

}

fclose(fp);

return 0;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2203470.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何做好项目管理中的需求管理?

本人任职于某科技公司项目经理&#xff0c;主要帮助客户梳理现有的业务流程&#xff0c;借助公司自主研发的低代码平台实现流程的线上化&#xff0c;业务的数字化转型。 由于项目性质特殊&#xff0c;在实施期间&#xff0c;对于总体项目需要采用传统的瀑布式开发规划整个项目…

揭秘网络流量分析的秘密 WireShark使用教程

WireShark是一个网络包分析工具。该工具主要用来捕获网络数据包&#xff0c;并自动解析网络数据包&#xff0c;为用户显示数据包详细信息&#xff0c;供用户对数据包进行分析 网络管理员 使用WireShark来检查网络问题网络安全工程师 使用WireShark来检查咨询安全相关问题开发人…

腾讯云大牛亲码“redis深度笔记”在牛客网上火了,完整 PDF 开源

前言 作为这个时代码代码的秃头人员&#xff0c;对Redis肯定是不陌生的&#xff0c;如果连Redis都没用过&#xff0c;还真不好意思出去面试&#xff0c;指不定被面试官吊打多少次。 毕竟现在互联网公司和一些创业公司都要用到Redis&#xff0c;像亚马逊、谷歌、阿里、腾讯都要…

【大模型理论篇】精简循环序列模型(minGRU/minLSTM)性能堪比Transformer以及对循环神经网络的回顾

1. 语言模型之精简RNN结构 近期关注到&#xff0c;Yoshua Bengio发布了一篇论文《Were RNNs All We Needed?》&#xff0c;提出简化版RNN&#xff08;minLSTM和minGRU&#xff09;。该工作的初始缘由&#xff1a;Transformer 在序列长度方面的扩展性限制重新引发了对可在训练期…

6款支持多平台的电脑监控软件,电脑多屏监控软件

在当今信息化办公环境中&#xff0c;监控软件已成为企业提升工作效率、管理公司资源的关键工具。随着远程办公与多设备管理的兴起&#xff0c;具备多平台兼容性和强大功能的电脑监控软件&#xff0c;能够帮助管理者随时掌握员工的工作情况、数据安全以及企业运营状态。本文将推…

【全解析】从xinput1_3.dll的作用到解决xinput1_3.dll相关问题的深度探究

在计算机系统的运行过程中&#xff0c;我们有时会遇到各种各样的文件缺失问题&#xff0c;其中xinput1_3.dll文件的缺失是比较常见的一种情况。今天这篇文章将和大家聊聊从xinput1_3.dll的作用到解决xinput1_3.dll相关问题的深度探究&#xff0c;将电脑恢复正常。 xinput1_3.dl…

SROP验证

文章目录 SROPsignal机制 SROP的利用原理&#xff1a;获取shellsystem call chains条件&#xff1a;sigreturn 测试 例题&#xff1a; SROP signal机制 signal 机制是类 unix 系统中进程之间相互传递信息的一种方法。一般&#xff0c;我们也称其为软中断信号&#xff0c;或者软…

Flash 闪存技术基础与 SD NAND Flash 产品测试解析

本篇除了对flash闪存进行简单介绍外&#xff0c;另给读者推荐一种我本人也在用的小容量闪存。 自带坏块管理的SD NAND Flash&#xff08;贴片式TF卡&#xff09;&#xff0c;尺寸小巧&#xff0c;简单易用&#xff0c;兼容性强&#xff0c;稳定可靠&#xff0c;标准SDIO接口&a…

产品图册不会设计?这个网站有大量产品图册案例和模板。

​在当今这个视觉至上的时代&#xff0c;一本设计精美的产品图册无疑能为企业或个人品牌增色不少。产品图册不仅能直观地展示产品特点&#xff0c;还能传达品牌理念&#xff0c;从而吸引潜在客户。然而&#xff0c;对于很多企业或个人来说&#xff0c;设计一本专业水准的产品图…

10月10日

hh 绘制 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QMouseEvent> #include<QPaintEvent> #include<QPixmap> #include<QPainter> #include<QPen> #include<QColorDialog> QT_BEGIN_NAMESPACE namespace Ui {…

“ORA-01017(:用户名/口令无效; 登录被拒绝)”解决办法

目录 报错&#xff1a;ORA-01017&#xff08;&#xff1a;用户名/口令无效; 登录被拒绝&#xff09; 1.打开CMD命令窗&#xff0c;输入sqlplus / as sysdba 1&#xff09;修改密码 SQL>alter user 用户名 identified by 密码 alter user system identified by manager;2&…

27.数据结构与算法-图的遍历(DFS,BFS)

遍历定义与遍历实质 图的特点 图的常用遍历方法 深度优先搜索-DFS 邻接矩阵表示的无向图深度遍历实现 DFS算法效率分析 非连通图的遍历 广度优先搜索遍历-BFS 邻接表表示的无向图广度遍历实现 BFS算法效率分析 非连通图的广度遍历 DFS和BFS算法效率比较

多线程-初阶(2)BlockingQueueThreadPoolExecutor

学习目标&#xff1a; 熟悉wait和notify的线程休眠和启动 熟悉多线程的基本案例 1.单例模式的两种设置模式:懒汉模式和饿汉模式 2.阻塞队列(生产者消费者模型) 3.线程池 4.定时器 1.wait和notify 由于线程之间是抢占式执⾏的, 因此线程之间执⾏的先后顺序难以预知. 但是…

Kotlin顶层属性

kotlin顶层属性 属性可以单独放在一个文件中 file:JvmName("TestValue") // 指定顶层函数生成的类名, 如果不主动声明&#xff0c;默认&#xff08;当前文件名Kt&#xff09;var test_var 1val test_val 2const val test_const_val 3对应生成的java代码如下: 可…

grafana version 11.1.0 设置Y轴刻度为1

grafana 版本 # /usr/share/grafana/bin/grafana --version grafana version 11.1.0设置轴 Axis 搜索 Standard options 在"Decimals"中输入0&#xff0c;确保只显示整数

Kafka 的 Producer 如何实现幂等性

在分布式系统中&#xff0c;消息队列 Kafka 扮演着重要的角色。而确保 Kafka 的 Producer&#xff08;生产者&#xff09;的消息发送具有幂等性&#xff0c;可以极大地提高系统的可靠性和稳定性。那么&#xff0c;Kafka 的 Producer 是如何实现幂等性的呢&#xff1f;让我们一起…

Excel多级结构转成树结构形式

第一步&#xff1a;Excel文件的形式如下 第二步&#xff1a;转换成树结构可选形式 第三步&#xff1a;具体怎么实现&#xff1f; &#xff08;1&#xff09;、需要借助数据库中表来存储这些字段&#xff0c;一张表&#xff08;aa&#xff09;存Excel文件中的所有数据&#xff…

算法复杂度 (数据结构)

一. 数据结构前言 1.1 什么是数据结构 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的集合。没有一种单一的数据结构对所有用途都有用&#xff0c;所以我们要学各式各样的数据结构&#xff0c;如&#xff1…

如何选择医疗器械管理系统?盘谷医疗符合最新版GSP要求

去年12月7日&#xff0c;新版《医疗器械经营质量管理规范》正式发布&#xff0c;并于今年7月1日正式实施。新版GSP第五十一条提出“经营第三类医疗器械的企业&#xff0c;应当具有符合医疗器械经营质量管理要求的计算机信息系统&#xff0c;保证经营的产品可追溯”&#xff0c;…

Python的functools模块完全教程

在python中函数是一等公民。Java中则为类是一等公民。 当一个函数将另一个函数作为输入或返回另一个函数作为输出时&#xff0c;这些函数称为高阶函数。 functools模块是Python的标准库的一部分&#xff0c;它是为高阶函数而实现的&#xff0c;用于增强函数功能。 目录 一、…