计算卫星位置的程序

合集下载

从广播星历计算卫星位置

从广播星历计算卫星位置

从广播星历计算卫星位置: 1. 计算卫星运动的平均角速度n首先根据广播星历中给出的参数A 计算出参考时刻TOE 的平均角速度0n :30)(A GM n =,式中,GM 为万有引力常数G 与地球总质量M 之积。

然后根据广播星历中给出的摄动参数n ∆计算观测时刻卫星的平均角速度n :n n n ∆+=0。

2. 计算观测瞬间卫星的平近点角M :)(0TOE t n M M -+=式中,0M 为参考时刻TOE 时的平近点角,由广播星历给出。

3. 计算偏近点角E :E e M E sin +=解上述方程可用迭代法或微分方程改正法。

4. 计算真近点角f⎪⎪⎩⎪⎪⎨⎧--=--=E e E e f Ee e Ef cos 1sin 1sin cos 1cos cos 2式中,e 为卫星轨道的偏心率,由广播星历给出。

5. 计算升交距角u ':f u +='ω式中,ω为近地点角距,由广播星历给出。

6. 计算摄动改正项i r u δδδ,,:广播星历中给出了下列6个摄动参数:is ic rs rc us uc C C C C C C ,,,,,,据此可以求出由于2J 项而引起的升交距角u 的摄动改正项u δ、卫星矢径r 的摄动改正项u δ和卫星轨道倾角i 的摄动改正项i δ。

计算公式如下:⎪⎩⎪⎨⎧'+'='+'='+'=u C u C u C u C u C u C is ic irs rc r us uc u 2sin 2cos 2sin 2cos 2sin 2cos δδδ 7. 计算0,,i r u ''进行摄动改正⎪⎪⎩⎪⎪⎨⎧-++=+-=+'=+'=)()cos 1(0TOE t dt di i i E a r r u u i r r u δδδδ 式中:a 为卫星轨道的长半径,2)(A a =,0i 为TOE 时刻的轨道倾角,由广播星历中的开普勒六参数给出,dtdi为i 的变化率,由广播星历中的摄动九参数给出。

物联网中的物体定位技术使用教程

物联网中的物体定位技术使用教程

物联网中的物体定位技术使用教程随着物联网的快速发展,物体定位技术作为其重要组成部分之一,得到了广泛应用。

物体定位技术通过无线通信、传感器技术和定位算法,可以准确追踪和定位物体的位置,为用户提供实时的数据和信息。

本篇文章将为您介绍物联网中的物体定位技术使用教程。

一、全球卫星导航系统(GNSS)全球卫星导航系统(Global Navigation Satellite System,GNSS)是目前最常用的物体定位技术之一。

它利用一组卫星通过全球覆盖的系统,提供精准的时间和位置信息。

目前最著名的GNSS系统是美国的GPS、俄罗斯的GLONASS和欧洲的Galileo系统。

在物联网中,物体定位通常使用GPS技术。

为了使用GPS技术定位物体,您需要准备一台支持GPS功能的设备,如智能手机、GPS跟踪器或无人机等。

以下是使用GNSS技术定位物体的步骤:1. 启动设备并打开GPS功能。

2. 设备将自动搜索可用的卫星信号。

通常,GPS设备需要接收至少4颗卫星的信号才能确定准确的位置。

3. 等待设备获得足够的卫星信号后,它将计算出物体所在的位置并显示在屏幕上。

二、蓝牙定位技术蓝牙定位技术是另一种在物联网中常用的物体定位方式。

它基于蓝牙技术,通过检测和测量蓝牙信号强度来确定设备的位置。

以下是使用蓝牙定位技术的步骤:1. 检查设备是否支持蓝牙定位功能,并确保其开启。

2. 在物体需要被定位的区域内安装蓝牙信标(Beacon)。

蓝牙信标是一种小型设备,可发送蓝牙信号,供其他设备检测和测量。

3. 使用配备蓝牙定位功能的设备(如智能手机或电脑)扫描信标。

4. 设备将测量信标的信号强度,并根据信号强度与设备之间的距离推算出设备的位置。

蓝牙定位技术在室内定位和室外定位方面具有较高的精度,常用于大型商场、展览馆和医院等室内环境中。

三、无线传感器网络(WSN)无线传感器网络(Wireless Sensor Network,WSN)是一种由多个无线传感器节点组成的网络,每个节点都配有传感器和通信模块。

卫星导航定位算法与程序设计_第4课_伪距单点定位数学模型

卫星导航定位算法与程序设计_第4课_伪距单点定位数学模型

5% 50% 95% 分布
5cm 10cm 20cm 50cm 1m 2m 5m 10m 20m 50m 100m
引用
定位精度与用户需求的关系
精密 工程 监控
地壳 形变 工程 监控
精密 大地 定位
工程与大 地定位
地理 信息 更新
地理 信息 更新
精密 交通 监控
交通 近海 自引导 监控 交通 导航
控制
卫星导航定位算法与程序设计
主讲: 刘晖 副教授
武汉大学卫星导航定位技术研究中心
课程讲授次序中的位置
软件设计相关 编程语言相关 定位算法相关
•建立起软件设计的宏观概念(战略层次); •巩固软件设计方法的知识; •训练从设计到实现的工作流程;
•掌握软件编程平台的使用(战术层次); •培养良好的编程习惯 •编程技巧的训练
GDOP – Geometry Dilution of Precision
PDOP – Position Dilution of Precision
TDOP – Time Dilution of Precision
HDOP – Horizontal Dilution of Precision
内容
GNSS定位技术回顾
定位技术的分类及发展 定位技术及其精度 定位精度与用户需求的关系 当前技术热点
伪距单点定位数学模型 伪距差分定位数学模型
概述
GNSS可提供全天候、高精度、高可用性、 高时效的三维空间定位
GNSS:3G+1C
3G:GPS、GLONASS、Galileo 1C:COMPASS
P ( X s X )2 (Ys Y )2 (Zs Z )2 atmos dt dT

三星M8800实现GPS定位导航教程

三星M8800实现GPS定位导航教程

【大硕原创】谁说小八不能定位导航?三星M8800实现GPS定位导航教程【大硕原创】三星M8800实现GPS定位导航教程(追加edenpang大侠撰写的一些使用经验)入手三星m8800之初并没有太在意小八是否有GPS定位导航的功能,被他吸引完全是高质量的摄影功能和不算太高的价格(当然不是指行货)。

然而,当把小八其他功能都挖掘的差不多的时候,网上关于小八是否有GPS模块以及是否能定位导航之争不由不让人心里痒痒,不管怎么说有GPS总是件令人愉悦的事情。

M8800原机自带了一个像垃圾一样的Google地图,其并非GPS导航,而是通过测算手机周边信号发射基站的位置来推断手机大致处于什么位置,这种定位非常不准确,而且由于每次都要在线下载地图,使得流量大增,因此Google地图可谓鸡肋中的鸡肋。

那么,M8800是否真的只能实用这种垃圾地图呢?关键在于小八有没有真正意义上的GPS模块。

事实证明,小八是有GPS模块的,这个证明的过程繁杂,在此不叙。

那么接下来就是如何通过软件实现小八的导航功能。

市面上流行的手机导航软件基本上只支持智能手机,对小八这个非智能手机来说丝毫没有可能用的上。

然而,上帝是眷顾众生滴,于是“乐图”出现了。

乐图的定位是利用软件提供地图读取,然后通过手机蓝牙与外置GPS模块连接,使得原本不具备GPS功能的手机享受这一功能。

不过由于乐图支持java,使得M8800也分享了能够使用GPS定位导航的快感。

这里有必要插叙一段,由于三星手机系统封闭,在最初的时候M8800使用乐图软件时不能读取记忆卡里的离线地图包,使得实用性大打折扣。

乐图论坛的管理员alvin注意到这一情况,经过反复测试、修改终于使m8800能够完美运行乐图导航软件并顺利读取记忆卡里的离线地图,直接为大家省了很多流量钱啊,在此谢谢alvin和乐图团队!我会一直支持乐图的!好,继续正题,首先下载m8800专用版的乐图软件(附件里有),装入手机(小八如何安装软件不在此文叙述之列,如有疑问请上网上自搜)。

卫星位置,速度,钟差和钟漂计算

卫星位置,速度,钟差和钟漂计算
8
tk = tk + 604800, 当tk < −302400 t , 其它情况 k
根据广播星历计算卫星位置(2/5)
4. 对平均运动角速度进行改正
n = n0 + ∆n
5. 计算平近点角
M k = M 0 + ntk
6. 计算偏近点角(利用下面的开普勒方程, 迭代求解)
M k = Ek − e sin Ek
cos Ω k = sin Ω R k 0
− sin Ωk cos ik cos Ω k cos ik sin ik
− ( x 'k sin Ωk + y 'k cos Ω k cos ik ) ( x 'k cos Ωk − y 'k sin Ωk cos ik ) 0
y 'k sin Ω k sin ik y 'k cos Ω k sin ik y 'k cos ik
x 'k = rk cos uk y 'k = rk sin uk
'k = r k cos uk − rk u k sin uk x 'k = r k sin uk + rk u k cos uk y
17
卫星运动速度计算②
=Ω −ω Ω k
=i + 2 ( Cis cos 2uk − Cis sin 2uk ) uk I k
toe , A , e, M 0 , ω , i0 , Ω ( IDOT ) , Ω ∆n, i Cus , Cuc , Crs , Crc , Cis , Cic toc , ClkBias, ClkDrift , ClkDriftRate

卫星导航定位算法与程序设计_第13课_卫星位置钟差计算

卫星导航定位算法与程序设计_第13课_卫星位置钟差计算
24
卫星位置的计算(2)
• 任意时刻t卫星位置的计算
– 原理:插值法 – 方法:拉格朗日插值法、切比雪夫多项式、三次样 条内插、三角多项式内插等 已知函数y f ( x)的n个结点x0 , x1 ,..., xn 及其对应的
函数值y0 , y1 ,..., yn 对于插值区间内的任一点x,其函数 值为 x xi f ( x) ( ) yk k 0 i 0 xk xi ik
xk rk cos uk yk rk sin uk
18
计算卫星位置(5/5)
14 计算改正后的升交点经度
Lk 0 earth t toe
15计算在地固坐标系下的位置
xk X Y RZ ( k ) Rx (ik ) yk Z 0
GM
e 7.2921151467 105 rad s
地球自转角速度
卫星星历
toe , A , e, M 0 , , i0 , n, i IDOT , Cus , Cuc , Crs , Crc , Cis , Cic toc , ClkBias, ClkDrift , ClkDriftRate
星历计算中常用常量和参数 星历参数详解
广播星历参数
精密星历参数
根据广播星历计算卫星位置等参数 根据精密星历计算卫星位置等参数 上机实习
星历计算中常用常数和符合
3.1415926535898
c 2.99792458 108 m s
真空中的光速
2
3.9860047 1014 m3 s
9
广播星历
A , e, M 0 , , i0 , toe , 轨道根数 n, i IDOT , Cus , Cuc , Crs , Crc , Cis , Cic 轨道摄动量

安卓导航之Oruxmaps系列教程

安卓导航之Oruxmaps系列教程

安卓导航之Oruxmaps系列教程一、初识ORUXMAPS。

Ourxmaps是个比较好用的安卓导航程序。

对于使用卫星图进行越野,比较适用。

ORUXMAPS,可以使用自己的地图,DIY自己的路线。

软件在网上随便百度一下就能找到。

如果不想太麻烦,搞地图源神马的,就不要去下载神马最新版本的了。

推荐下载5.5.3版本,自带GOOGLE地图源。

之后的可能因为版权神马的原因不带了。

喜欢自己搞地图源就无所谓神马版本了。

安装好的程序,图标如下(版本不同,图标可能不同):点击上面那个图标,就是上面那个,对,就是这个,点击打开,进入软件主界面:界面简洁明了。

上部是导航、地图管理;这条的下面是状态栏,标识了目前开启的内容,状态栏右侧是指北标记;主界面左侧是缩放、移动、测距工具栏;右侧是开启GPS,开启航迹记录,移动工具,雷达面板(数据界面)和3D视图;底部的参数是比例尺、地图层级、缩放比例。

点击菜单按钮(就是你的实体键,菜单键),弹出的主菜单:基本不需要细讲吧,都点击看看,全是汉语,应该很容易理解的。

好了,初始Ourxmaps的任务完毕。

二、ourxmaps基本操作安装程序就是为了应用,应用就是操作么,所以我们开始对这个软件进行操作,好废话啊。

恩,大段的开篇,必须废。

2.1主界面功能介绍这个好像上面初识的时候讲过了,将就下,主界面就这些东西。

不明白的对照上面的初始和实际程序参考,了解就好。

恩,再稍微细化点。

这个工具栏,第一个用于记录航迹,统计信息;第二个关于路点的一切;第三个关于航线的一切;第四个关于地图的一切。

后面在应用的时候会说到,这就不赘述了。

2.2数据界面介绍数据界面是什么?就是那个雷达图标点击进入后的界面。

不过标准好像不是叫数据界面,而是仪表盘,不过我喜欢这么叫,凭什么?因为是我在写教程,嘎嘎嘎嘎。

这个里面详细列举了各种参数。

不过仪表盘不是死的,可以自己做属于自己的仪表盘。

TC-1到TC-5一共五个标签页,里面分别有不同的参数给予。

卫星位置计算程序

卫星位置计算程序

#include<iostream>#include"math.h"#include"float.h"using namespace std;double kpro(double mk,double e){double f[2000],ek;int i=0;f[0]=mk;do{f[i+1]=mk+e*sin(f[i]);i++;}while(abs(f[i+1]-f[i])>=0.005);ek=f[i+1];return ek;}#define PI 3.14159265357589int main(void){doubletoc,a2,a1,a0,dotn,t1,m0,e,roota,toe,cic,crc,cis,crs,cuc,cus,omega0,omega,i0,omegadot,idot;double n,n0,dott,t,tk,mk,ek,vk,ak,u,r,i,uk,rk,ik,xk,yk,wk,we,x,y,z;int k,j;cout<<"输º?入¨?秒?数ºy据Y参?数ºy toc\n";cin>>toc;cout<<"输º?入¨?秒?数ºy据Y幂Y数ºy\n";cin>>k;toc=toc*pow(10,k);cout<<"输º?入¨?时º¡À钟¨®修T正y2 a2\n";cin>>a2;cout<<"输º?入¨?时º¡À钟¨®修T正y1 a1\n";cin>>a1;cout<<"输º?入¨?时º¡À钟¨®修T正y0 a0\n";cin>>a0;cout<<"输º?入¨?摄¦?动¡¥改?正y数ºy dn\n";cin>>dotn;cout<<"输º?入¨?观?测a时º¡À间? t'\n";cin>>t1;cout<<"输º?入¨?反¤¡ä常¡ê m0\n";cin>>m0;cout<<"输º?入¨?偏?心?率¨º e\n";cin>>e;cout<<"输º?入¨?长¡è半ã?径?平?方¤?根¨´ roota\n";cin>>roota;cout<<"输º?入¨?星?历¤¨²基¨´准Á?时º¡À间?系¦Ì数ºy toe\n";cin>>toe;cout<<"输º?入¨?星?历¤¨²基¨´准Á?时º¡À间?幂Y数ºy\n";cin>>j;toe=toe*pow(10,j);cout<<"输º?入¨?对?倾?角?余®¨¤弦¨©校¡ê正y值¦Ì cic\n";cin>>cic;cout<<"输º?入¨?对?轨¨¬道̨¤半ã?径?余®¨¤弦¨©校¡ê正y值¦Ì crc\n";cin>>crc;cout<<"输º?入¨?对?倾?角?正y弦¨©校¡ê正y值¦Ì cis\n";cin>>cis;cout<<"输º?入¨?对?轨¨¬道̨¤半ã?径?正y弦¨©校¡ê正y值¦Ì crs\n";cin>>crs;cout<<"输º?入¨?对?纬3度¨¨幅¤¨´角?余®¨¤弦¨©校¡ê正y值¦Ì cuc\n";cin>>cuc;cout<<"输º?入¨?对?纬3度¨¨幅¤¨´角?正y弦¨©校¡ê正y值¦Ì cus\n";cin>>cus;cout<<"输º?入¨?升¦y交?点Ì?经-度¨¨ omega0\n";cin>>omega0;cout<<"输º?入¨?近¨¹地Ì?点Ì?幅¤¨´角? omega\n";cin>>omega;cout<<"输º?入¨?倾?角? i0\n";cin>>i0;cout<<"输º?入¨?升¦y交?点Ì?经-度¨¨变À?化¡¥率¨º omegadot\n";cin>>omegadot;cout<<"输º?入¨?倾?角?率¨º Idot\n";cin>>idot;//计?算?平?均¨´角?速¨´度¨¨n0=sqrt(3.986005)*pow(10,7)/pow(roota,3);n=n0+dotn;cout<<"平?均¨´角?速¨´度¨¨是º?n:êo"<<n<<endl;//计?算?归¨¦化¡¥时º¡À间?dott=a0+a1*(t1-toc)+a2*(t1-toc)*a2*(t1-toc);t=t1-dott;tk=t-toe;if(tk>302400){tk=tk-604800;}else if(tk<-302400){tk=tk+604800;}cout<<"归¨¦化¡¥时º¡À间?是º?tk:êo"<<tk<<endl;//计?算?平?近¨¹点Ì?角?mk=m0+n*tk;cout<<"平?近¨¹点Ì?角?是º?mk:êo"<<mk<<endl;//计?算?偏?近¨¹点Ì?角?ek=kpro(mk,e);cout<<"偏?近¨¹点Ì?角?是º?ek "<<ek<<endl;//计?算?真?近¨¹点Ì?角?vk=atan((sqrt(1-e*e)*sin(ek))/(cos(ek)-e));if(cos(vk)>0 && sin(vk)>0 )vk=atan(sin(vk)/cos(vk));else if(sin(vk)>0 && cos(vk)<0)vk=acos(cos(vk));else if(sin(vk)<0 &&cos(vk)<0)vk=PI-asin(sin(vk));elsevk=2*PI-acos(cos(vk));cout<<"真?近¨¹点Ì?角?是º?vk:êo"<<vk<<endl;//计?算?距¨¤角?ak=vk+omega;cout<<"距¨¤角?是º?ak:êo"<<ak<<endl;//计?算?摄¦?动¡¥改?正y项?u=cuc*cos(2*ak)+cus*sin(2*ak);r=crc*cos(2*ak)+crs*sin(2*ak);i=cic*cos(2*ak)+cis*sin(2*ak);cout<<"摄¦?动¡¥改?正y项?:"<<"u:"<<u<<",r:"<<r<<",i:"<<i<<endl;//计?算?摄¦?动¡¥改?正y的Ì?升¦y交?距¨¤角?,ê?卫¨¤星?矢º?量¢?,ê?轨¨¬道̨¤倾?角?uk=ak+u;rk=roota*roota*(1-e*cos(ek))+r;ik=i0+tk*idot+i;cout<<"摄¦?动¡¥改?正y的Ì?升¦y交?距¨¤角?uk:"<<uk<<",卫¨¤星?矢º?量¢?rk:"<<rk<<",轨¨¬道̨¤倾?角?ik:"<<ik<<endl;//计?算?卫¨¤星?在¨²轨¨¬平?面?坐Á?标À¨º系¦Ì的Ì?坐Á?标À¨ºxk=rk*cos(uk);yk=rk*sin(uk);cout<<"卫¨¤星?在¨²轨¨¬平?面?坐Á?标À¨º系¦Ì的Ì?坐Á?标À¨º:êo"<<"xk:"<<xk<<",yk:"<<yk<<endl;//计?算?观?测a时º¡À刻¨¬升¦y交?点Ì?经-度¨¨we=7.292115147*pow(10,-5);wk=omega0+(omegadot-we)*tk-we*toe;cout<<"观?测a时º¡À刻¨¬升¦y交?点Ì?经-度¨¨:êo"<<wk<<endl;//计?算?卫¨¤星?在¨²低̨ª固¨¬系¦Ì下?坐Á?标À¨ºx=xk*cos(wk)-yk*cos(ik)*sin(wk);y=xk*sin(wk)+yk*cos(ik)*cos(wk);z=yk*sin(ik);cout<<"卫¨¤星?在¨²地Ì?固¨¬系¦Ì下?坐Á?标À¨º是º?:êo"<<"x:"<<x<<",y:"<<y<<",z:"<<z<<endl;return 0;}///////固定值版#include<iostream>#include"math.h"using namespace std;//迭̨¹代䨲法¤¡§计?算?偏?近¨¹点Ì?角?double kpro(double mk,double e){double f,t,m,ek;f=mk;do{m=f;t=mk+e*sin(m);f=t;}while((f-m)>10e-12);ek=f;return ek;}#define PI 3.141592655358979323846int main(void){//设¦¨¨置?参?数ºydoubletoc,a2,a1,a0,dotn,t1,m0,e,roota,toe,cic,crc,cis,crs,cuc,cus,omega0,omega,i0,omegadot,idot;double n,n0,dott,t,tk,mk,ek,vk,ak,u,r,i,uk,rk,ik,xk,yk,wk,we,x,y,z;//参?数ºy赋3值¦Ìtoc=1.801672*pow(10,-38);a2=0;a1=1.7053025658199999e-012;a0=0.00028600683435800001;dotn=4.1115998360700002e-009;t1=11404800.0;m0=1.2263973009600000;e=0.0053100715158500003;roota=5153.7127704599998;toe=0.0;cic=-9.6857547759999998e-008;crc=175.34375000000000;cis=-7.8231096267699997e-008;crs=-105.43750000000000;cuc=-5.5264681577700003e-006;cus=1.1192634701700000e-005;omega0=-2.9080127721900002;omega=-1.6819446292500000;i0=0.97432927738800001;omegadot=-7.7124641122299999e-009;ido t=1.8643633724999999e-010;//计?算?平?均¨´角?速¨´度¨¨n0=sqrt(3.986005)*pow(10,7)/pow(roota,3);n=n0+dotn;cout<<"平?均¨´角?速¨´度¨¨是º?n:êo"<<n<<endl;//计?算?归¨¦化¡¥时º¡À间?dott=a0+a1*(t1-toc)+a2*(t1-toc)*a2*(t1-toc);t=t1-dott;tk=t-toe;if(tk>302400){tk=tk-604800;}else if(tk<-302400){tk=tk+604800;}cout<<"归¨¦化¡¥时º¡À间?是º?tk:êo"<<tk<<endl;//计?算?平?近¨¹点Ì?角?mk=m0+n*tk;cout<<"平?近¨¹点Ì?角?是º?mk:êo"<<mk<<endl;//计?算?偏?近¨¹点Ì?角?ek=kpro(mk,e);cout<<"偏?近¨¹点Ì?角?是º?ek "<<ek<<endl;//计?算?真?近¨¹点Ì?角?vk=atan((sqrt(1-e*e)*sin(ek))/(cos(ek)-e));if(cos(vk)>0 && sin(vk)>0 )vk=atan(sin(vk)/cos(vk));else if(sin(vk)>0 && cos(vk)<0)vk=acos(cos(vk));else if(sin(vk)<0 &&cos(vk)<0)vk=PI-asin(sin(vk));elsevk=2*PI-acos(cos(vk));cout<<"真?近¨¹点Ì?角?是º?vk:êo"<<vk<<endl;//计?算?距¨¤角?ak=vk+omega;cout<<"距¨¤角?是º?ak:êo"<<ak<<endl;//计?算?摄¦?动¡¥改?正y项?u=cuc*cos(2*ak)+cus*sin(2*ak);r=crc*cos(2*ak)+crs*sin(2*ak);i=cic*cos(2*ak)+cis*sin(2*ak);cout<<"摄¦?动¡¥改?正y项?:"<<"u:"<<u<<",r:"<<r<<",i:"<<i<<endl;//计?算?摄¦?动¡¥改?正y的Ì?升¦y交?距¨¤角?,ê?卫¨¤星?矢º?量¢?,ê?轨¨¬道̨¤倾?角?uk=ak+u;rk=roota*roota*(1-e*cos(ek))+r;ik=i0+tk*idot+i;cout<<"摄¦?动¡¥改?正y的Ì?升¦y交?距¨¤角?uk:"<<uk<<",卫¨¤星?矢º?量¢?rk:"<<rk<<",轨¨¬道̨¤倾?角?ik:"<<ik<<endl;//计?算?卫¨¤星?在¨²轨¨¬平?面?坐Á?标À¨º系¦Ì的Ì?坐Á?标À¨ºxk=rk*cos(uk);yk=rk*sin(uk);cout<<"卫¨¤星?在¨²轨¨¬平?面?坐Á?标À¨º系¦Ì的Ì?坐Á?标À¨º:êo"<<"xk:"<<xk<<",yk:"<<yk<<endl;//计?算?观?测a时º¡À刻¨¬升¦y交?点Ì?经-度¨¨we=7.292115147*pow(10,-5);wk=omega0+(omegadot-we)*tk-we*toe;cout<<"观?测a时º¡À刻¨¬升¦y交?点Ì?经-度¨¨:êo"<<wk<<endl;//计?算?卫¨¤星?在¨²低̨ª固¨¬系¦Ì下?坐Á?标À¨ºx=xk*cos(wk)-yk*cos(ik)*sin(wk);y=xk*sin(wk)+yk*cos(ik)*cos(wk);z=yk*sin(ik);cout<<"卫¨¤星?在¨²地Ì?固¨¬系¦Ì下?坐Á?标À¨º是º?:êo"<<"x:"<<x<<",y:"<<y<<",z:"<<z<<endl;return 0;}。

卫星导航定位算法与程序设计_常用参数和公式讲解

卫星导航定位算法与程序设计_常用参数和公式讲解

《卫星导航定位算法与程序设计》课程常用参数和常用公式一览编制人:刘晖最后更新:2010年11月26日1、常用参考框架的几何和物理参数1.1 ITRFyy 主要的大地测量常数长半轴a=6.3781366×106m;地球引力常数(含大气层)GM=3.986004418×1014 m3/s2;地球动力因子J2=1.0826359×10-3;地球自转角速度ω=7.292115×10-5 rad/s。

扁率1/f =298.25642;椭球正常重力位U0=6.26368560×107 m2/s2;γ=9.7803278 m/s2;赤道正常重力e光速c=2.99792458×108 m/s。

1.2 GTRF主要的大地测量常数长半轴a=6.37813655×106 m;地球引力常数GM=3.986004415×1014 m3/s2;地球动力因子J2=1.0826267×10-3;扁率1/f =298.25769。

1.3 WGS84(Gwwww)主要的大地测量常数长半轴a=6.3781370×106 m;地球引力常数(含大气层)GM=3.986004418×1014 m3/s2;地球自转角速度ω=7.292115×10-5 rad/s。

扁率1/f =298.257223563;椭球正常重力位U0=62636860.8497 m2/s2;γ=9.7803267714m/s2;赤道正常重力e短半轴b=6356752.3142m;引力位二阶谐系数2,0C=-484.16685×10-6;第一偏心率平方2e=0.00669437999013;e'=0.006739496742227。

第二偏心率平方21.4 PZ90 主要的大地测量常数长半轴a=6.378136×106m;地球引力常数GM=3.9860044×1014 m3/s2;fM=3.5×108 m3/s2;地球大气引力常数a地球自转角速度ω=7.292115×10-5 rad/s。

实时卫星位置解算和多普勒频移计算

实时卫星位置解算和多普勒频移计算

实验01 实时卫星位置解算和多普勒频移计算一、目的1.理解实时卫星位置解算在GPS 接收机导航位置解算过程中的作用及完成卫星位置解算所需的条件。

2.了解卫星导航电文的格式、主要内容及各部分作用。

了解星历的内容、周期。

3.了解多普勒频移产生的原因、作用及根据已知条件预测多普勒频移的方法。

二、内容运行NewStar150 程序,获取可视卫星的实时导航数据(包括 GPS 时间、各卫星的星历等),分析星历的构成、周期,根据卫星的星历,推算出该卫星在 11 小时58 分后的ECEF 坐标系下的大致位置,验证卫星的额定轨道周期。

根据实验数据编程求解多普勒频移。

三、知识准备GPS 实时卫星位置解算方法,导航电文的格式和主要内容,星历表的构成。

多普勒频移计算方法。

四、实习过程1.运行NewStar150 程序,如图 1 所示获取当前可视卫星的星历信息,并作记录;2.分析星历的构成和周期;3.如图2 所示,选择GPS 时刻和卫星号,在“卫星位置信息”列表框中会出现所选卫星在所选的GPS 时刻对应的仰角、ECEF 坐标系下的三维坐标、所选时刻加一秒和加两秒后的GPS 时间所对应的ECEF 坐标系下的三维坐标以及接收机在ECEF 坐标系下的初始位置坐标,根据这些数据求解多普勒频移;4.根据卫星在所选GPS 时间发送的星历推算出这颗卫星在 11 小时58 分后的ECEF 坐标系下的大致位置,验证卫星的额定轨道周期;实验02 GPS接收机单点定位实验一、目的1.掌握GPS 接收机单点定位原理;2.理解将接收机和卫星钟差作为一个参量进行定位解算的原因和目的;3.理解钟差对于多普勒频移求解产生的影响;4.能够根据实验数据编写单点定位解算的相关程序。

二、内容运行NewStar150 程序,同时观测4 颗可视卫星的实时导航数据(包括GPS 时间、各卫星的星历等),实时传输误差、伪距等,建立接收机位置解算方程,解出接收机位置和钟差。

GPS卫星坐标计算

GPS卫星坐标计算

卫星定位技术与方法--根据广播星历参数计算卫星坐标作业报告指导教师:熊永良班级:测绘二班学生姓名:段海东学生学号: 2 0 0 8 0 7 8 3作业日期:2010 年12月08 日目录一. 已知数据 (2)二. 计算步骤 (2)1.平均角速度 (mean angular speed) (2)2.规化时刻(normal time) (3)3.平近点角(mean anomaly) (3)4.偏近点角(eccentric anomaly) (3)5.真近点角(true anomaly) (3)6.升交距角(argument of ascending node) (3)7. 轨道向径(Orbital radius) (3)8. 扰动改正(Perturbed correction) (4)10.卫星在升交点轨道直角坐标系中的坐标 (4)11. 升交点经度(Longitude of ascending node) (5)三. 源程序 (5)四.程序运行结果 (14)七.作业体会 (15)根据广播星历参数计算卫星坐标一. 已知数据: 根据以下的广播星历参数计算UTC2004年1月30日8点0分00秒—20分00秒,每隔一分钟的PRN7的卫星坐标。

Compute the coordinate of PRN7 with interval of 1 minute.Navigation data:卫星导航文件格式:二. 计算步骤:The steps for satellite coordinates1.平均角速度 (mean angular speed):∆n 由广播星历获得, GM=3.986005e+14 nn n ∆+=030a GM n =2.规化时刻(normal time):t0已知(由广播星历获得),t 为GPS 周秒3.平近点角(mean anomaly):M0已知(由广播星历获得)4.偏近点角(eccentric anomaly):迭代求解:初始值取E=M ,以弧度为单位5.真近点角(true anomaly):6.升交距角(argument of ascending node):ω近地点角距(argument of perigee)7. 轨道向径(Orbital radius ):k k t n M M ⋅+=0)cos 1(k k E e a r ⋅-⋅=e E E e V k kk --=cos sin 1arctan 2k k k E e M E sin ⋅+=0t t t k -=ωφ+=k 0V8. 扰动改正(Perturbed correction ):• 升交角距(Argument of ascending node )•• 轨道向径(Orbital radius )• 轨道顷角(Orbital inclination )是升交角距 (the argument of ascending node)9. 改正后升交角距、轨道向径、轨道倾角改正后升交角距(Corrected argument of ascending nod )改正后的轨道向径(Corrected orbital radius)改正后的轨道倾角(Corrected orbital inclination )10.卫星在升交点轨道直角坐标系中的坐标:如下图所示0φ00i 2sin 2cos φφδiS iC C C +=00r 2sin 2cos φφδrS rC C C +=00u 2sin 2cos φφδuS uC C C +=rk k )cosE e 1(a r δ+⋅-⋅=u0k u δφ+=ki 0k t )IDOT (i i ++=δ11. 升交点经度(Longitude of ascending node ):如下图所示12. 在地固坐标系中的卫星位置(Expressed in spheric coordinate system )三. 源程序:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.IO;using System.Text.RegularExpressions;kk k k k k sinu r y cosu r x ==s/rad 102921151467.7t t )(5-e 0e k e 0t ⨯=--Ω+Ω=ωωωλekk k k k k k k k k i y Z i y x Y i y x sin cos cos sin sin cos cos k k k k k =+=-=X λλλλnamespace Test{public partial class Form1 : Form{public Form1(){InitializeComponent();listView1.Columns.Add("序号", 40);listView1.Columns.Add("星历内容", 130);listView1.Columns.Add("导航数据", 130);listView1.GridLines = true; //显示表格线listView1.View = View.Details;//显示表格细节listView1.HeaderStyle = ColumnHeaderStyle.Clickable;//对表头进行设置listView2.Columns.Add("时间", 60);listView2.Columns.Add("x坐标", 150);listView2.Columns.Add("y坐标", 150);listView2.Columns.Add("z坐标", 150);listView2.GridLines = true; //显示表格线listView2.View = View.Details;//显示表格细节listView2.HeaderStyle = ColumnHeaderStyle.Clickable;//对表头进行设置}private void button1_Click(object sender, EventArgs e){//读取相对路径string str1 =AppDomain.CurrentDomain.SetupInformation.ApplicationBase;string filename = str1 + "navigation data.txt ";//读取卫星广播星历文件StreamReader myreader = new StreamReader(filename, Encoding.Default);string myinfo = myreader.ReadToEnd();myreader.Close();//把卫星广播星历里的D改为e,以便后续计算string mystring = myinfo;string myinfor = mystring;myinfor = mystring.Replace("D", "e");//把数据分开读入到一个数组中存储string[] split = new string[] { " " };string[] arrs = myinfor.Split(split,StringSplitOptions.RemoveEmptyEntries);double[] M = new double[arrs.Length];//星历代码string[] N = new string[arrs.Length];N[0] = "PRN"; N[1] = "Yer"; N[2] = "Mon"; N[3] = "day"; N[4] = "H"; N[5] = "M"; N[6] = "sec"; N[7] = "a0"; N[8] = "a1"; N[9] = "a2"; N[10] = "IODE"; N[11] = "Crs"; N[12] = "delta-n"; N[13] = "M0";N[14] = "Cuc"; N[15] = "e"; N[16] = "Cus"; N[17] = "sqrt(a)"; N[18] = "t0e"; N[19] = "Cic"; N[20] = "omega0"; N[21] = "Cis"; N[22] = "i0"; N[23] = "Crc"; N[24] = "omega"; N[25] = "omega-spot";N[26] = "IDOT"; N[27] = "Codes on L2 channel"; N[28] = "GPS Week"; N[29] = "L2 P data flag";N[30] = "SV accuracy"; N[31] = "SV health"; N[32] = "TGD"; N[33] = "IODC Issue of Data";N[34] = "Transmission time of message";//把卫星广播星历读入到数组中for (int i = 0; i < arrs.Length; i++){ListViewItem li = new ListViewItem();li.Text = (i + 1).ToString();li.SubItems.Add(N[i]);li.SubItems.Add(arrs[i]);listView1.Items.Add(li);M[i] = double.Parse(arrs[i]);}double t0e=460800.00;double t;double[] XK = new double[21];double[] YK = new double[21];double[] ZK = new double[21];for (int l = 0; l < 21;l++ ){//计算平均角速度double GM = 3986004.418e008;double n, n0;n0 = Math.Sqrt(GM / (Math.Pow(M[17], 6)));n = M[12] + n0;//规划时刻t=t0e+l*60;double tk = t-t0e;double Mk = M[13] + n * tk;// 迭代计算平近点角的计算double Ek, Ek1;Ek = Mk;Ek1 = Mk + M[15] * Math.Sin(Ek);do{Ek = Ek1;Ek1 = Mk + M[15] * Math.Sin(Ek);}while (Math.Abs(Ek1 - Ek) > 1e-15);//计算真近点角double Vk = Math.Atan(((Math.Sqrt(1 - M[15] * M[15]) * Math.Sin(Ek))) / (Math.Cos(Ek) - M[15]));//反正切值的象限处理double A1 = Math.Atan(((Math.Sqrt(1 - M[15] * M[15]) * Math.Sin(Ek))));double A2 = Math.Cos(Ek) - M[15];if (Vk < 0){if (A1 < 0 && A2 > 0){Vk += 2 * Math.PI;}if (A1 > 0 && A2 < 0){Vk += Math.PI;}}else{if (A1 <= 0 && A2 <= 0)Vk = Vk + Math.PI;}//计算升交角距double fk = Vk + M[24];//摄动改正值的计算double du = M[14] * Math.Cos(2 * fk) + M[16] * Math.Sin(2 * fk);double dr = M[23] * Math.Cos(2 * fk) + M[11] * Math.Sin(2 * fk);double di = M[19] * Math.Cos(2 * fk) + M[21] * Math.Sin(2 * fk);//摄动改正double uk = fk + du;double rk = Math.Pow(M[17], 2) * (1 - M[15] * Math.Cos(Ek))+ dr;double ik = M[22] + di + M[26] * tk;//计算卫星在升交点轨道直角坐标系的坐标double xk = rk * Math.Cos(uk);double yk = rk * Math.Sin(uk);//计算升交点经度double we = 7.2921151467e-05;double jdt = M[20] + (M[25] - we) * tk - we * M[18];//卫星在地固坐标系中的空间直角坐标XK[l] = xk * Math.Cos(jdt) - yk * Math.Cos(ik) * Math.Sin(jdt);YK[l] = xk * Math.Sin(jdt) + yk * Math.Cos(ik) * Math.Cos(jdt);ZK[l] = yk * Math.Sin(ik);}//输出卫星在地固坐标系中的空间直角坐标for (int i = 0; i < 21; i++){ListViewItem list = new ListViewItem();list.Text = "第" + i.ToString() + "分钟";list.SubItems.Add(XK[i].ToString());list.SubItems.Add(YK[i].ToString());list.SubItems.Add(ZK[i].ToString());listView2.Items.Add(list);}}private void button2_Click(object sender, EventArgs e) {//读取相对路径string str1 =AppDomain.CurrentDomain.SetupInformation.ApplicationBase;string filename = str1 + "navigation data.txt ";//读取卫星广播星历文件StreamReader myreader = new StreamReader(filename, Encoding.Default);string myinfo = myreader.ReadToEnd();myreader.Close();//把卫星广播星历里的D改为e,以便后续计算string mystring = myinfo;string myinfor = mystring;myinfor = mystring.Replace("D", "e");//把数据分开读入到一个数组中存储string[] split = new string[] { " " };string[] arrs = myinfor.Split(split, StringSplitOptions.RemoveEmptyEntries);//星历代码string[] N = new string[arrs.Length];N[0] = "PRN"; N[1] = "Yer"; N[2] = "Mon"; N[3] = "day"; N[4] = "H"; N[5] = "M"; N[6] = "sec"; N[7] = "a0"; N[8] = "a1"; N[9] = "a2"; N[10] = "IODE"; N[11] = "Crs"; N[12] = "delta-n"; N[13] = "M0";N[14] = "Cuc"; N[15] = "e"; N[16] = "Cus"; N[17] = "sqrt(a)"; N[18] = "t0e"; N[19] = "Cic"; N[20] = "omega0"; N[21] = "Cis"; N[22] = "i0"; N[23] = "Crc"; N[24] = "omega"; N[25] = "omega-spot";N[26] = "IDOT"; N[27] = "Codes on L2 channel"; N[28] = "GPS Week"; N[29] = "L2 P data flag";N[30] = "SV accuracy"; N[31] = "SV health"; N[32] = "TGD"; N[33] = "IODC Issue of Data";N[34] = "Transmission time of message";//把卫星广播星历文件内容输出到listView进行查看for (int i = 0; i < arrs.Length; i++){ListViewItem li = new ListViewItem();li.Text = (i + 1).ToString();li.SubItems.Add(N[i]);li.SubItems.Add(arrs[i]);listView1.Items.Add(li);}}}}四.程序运行结果:星历内容的读取、显示:卫星坐标计算结果:运行界面:作业体会:此次作业,收获颇多。

GPS卫星位置计算(C语言)

GPS卫星位置计算(C语言)

#include <stdio.h>#include <math.h>#include <stdlib.h>#define bGM84 3.986005e14#define bOMEGAE84 7.2921151467e-5void main(){long double roota=0.515365263176E+04; //轨道长半轴的平方根(根号a)long double toe=0.720000000000E+04; //观测时刻toelong double m0=-0.290282040486E+00; //参考时刻toe的平近点角long double e=0.678421219345E-02; //轨道偏心率elong double delta_n=0.451411660250E-08;//卫星的摄动改正数△nlong double smallomega=-0.258419417299E+01;//近地点角距ωlong double cus=0.912137329578E-05;//纬度幅角正弦调和项改正的振幅(弧度)long double cuc=0.189989805222E-06;//纬度幅角余弦调和项改正的振幅(弧度)long double crs=0.406250000000E+01;//轨道半径的余弦调和项改正的振幅(m)long double crc=0.201875000000E+03;//轨道半径的正弦调和项改正的振幅(m)long double cis=0.949949026108E-07;//轨道倾角的余弦调和项改正的振幅(弧度)long double cic=0.130385160446E-07;//轨道倾角的正弦调和项改正的振幅(弧度)long double idot=-0.253939149013E-09;//轨道倾角变化率Ilong double i0=0.958512160302E+00; //轨道倾角(弧度)long double bigomega0=-0.137835982556E+01;//升交点赤经long double earthrate=bOMEGAE84; //地球自转的速率welong double bigomegadot=-0.856928551657e-08;long double t=0.720000000000E+04; //加入卫星钟差改正的归化时间long double A;long double n0=0,n,tk;long double mk,ek,tak,ik,omegak,phik,uk,rk;long double corr_u,corr_r,corr_i;long double xpk,ypk,xk,yk,zk;int i;printf("输入的数据:\n");printf("√a=%e \n",roota);printf("toe=%e \n",toe);printf("e=%e \n",e);printf("i0=%e \n",i0);printf("ω=%e \n",smallomega);printf("△n=%e \n",delta_n);printf("Ω0=%e \n",bigomega0);printf("I=%e \n",idot);printf("Cuc=%e \n",cuc);printf("Cus=%e \n",cus);printf("Crc=%e \n",crc);printf("Crs=%e \n",crs);printf("Cic=%e \n",cic);printf("Cis=%e \n",cis);printf("\n\n输出的结果为:\n",e);A=roota*roota;n0=sqrt(bGM84/(A*A*A));//平均角速度n0printf("n0=%.10lf \n",n0);tk=t-toe;//相对于参考时刻toe的归化时间tkprintf("tk=%.10lf \n",tk);n=n0+delta_n;//加摄动改正后的卫星平均角速度printf(" n=%.10lf \n",n);mk=m0+n*tk;//卫星平近点角printf("mk=%.10lf \n",mk);ek=mk;for(i=0;i<10;i++) ek=mk+e*sin(ek);//利用迭代法求偏近点角ekprintf("ek=%.10lf \n",ek);tak=atan2(sqrt(1.0-e*e)*sin(ek),cos(ek)-e);//真近点角Vk的计算printf("Vk=%.10lf \n",tak);phik=tak+smallomega;//升交距角φk的计算printf("φk=%.10lf \n",phik);corr_u=cus*sin(2.0*phik)+cuc*cos(2.0*phik);//升交距角u的摄动改正δu printf("δu=%.10lf \n",corr_u);corr_r=crs*sin(2.0*phik)+crc*cos(2.0*phik);//卫星矢量r的摄动改正δr printf("δr=%.10lf \n",corr_r);corr_i=cis*sin(2.0*phik)+cic*cos(2.0*phik);//轨道倾角i的摄动改正δi printf("δi=%.10lf \n",corr_i);uk=phik+corr_u;//升交距角uprintf("uk=%.10lf \n",uk);rk=A*(1.0-e*cos(ek))+corr_r;//卫星矢量rprintf("rk=%.10lf \n",rk);ik=i0+idot*tk+corr_i;//轨道倾角iprintf("ik=%.10lf \n",ik);xpk=rk*cos(uk);//卫星在轨道平面坐标系的坐标ypk=rk*sin(uk);printf("xpk=%.10lf \n",xpk);printf("ypk=%.10lf \n",ypk);omegak=bigomega0+(bigomegadot-earthrate)*tk-earthrate*toe;//升交点经度Ωk的计算printf("Ωk=%.10lf \n\n",omegak);xk=xpk*cos(omegak)-ypk*sin(omegak)*cos(ik);//地心固定坐标系的直角坐标yk=xpk*sin(omegak)+ypk*cos(omegak)*cos(ik);zk=ypk*sin(ik);printf("Xk=%.4lf \n",xk);printf("Yk=%.4lf \n",yk);printf("Zk=%.4lf \n",zk);}。

GPS卫星定位坐标计算及程序设计

GPS卫星定位坐标计算及程序设计

Ai X i li 0
(3-5)
对式(3-5)求解,便得到接收机地心坐标的唯一

X i Ai1li
4.程序设计
• 1、GPS时间转换程序 • 2、利用广播星历计算卫星坐标程序 • 3、地面点近似坐标计算程序
5.实例计算和精度分析
• 以2009年5月7日南京工业大学江浦校区控 制网20号控制点观测数据为例,来说明如 何利用该程序计算卫星坐标和地面点的近 似坐标。该数据利用华测GPS接收机观测, 观测时间为2小时。
• 3.新儒略日(Modified Julian Day-MJD):从儒略 日中减去2400000.5天来得到,给出的是从1858年11 月17日子夜开始的天数。特点是数值比儒略日小。
• 4.年积日(Day Of Year-DOY):从当前1月1日开始 的天数。
• 5.GPS时(GPS Time):以1980年1月6日子夜为起点, 用周数和周内秒数来表示,为GPS系统内部计时法。
2.3GPS卫星的信号
• 导航电文 导航电文是包含有关卫星的星历、卫星工作状态 时间系统、卫星钟运行状态、轨道摄动改正、大 气折射改正和C/A码捕获P码等导航信息的数据码 (或D码),是利用GPS进行定位的数据基础。 导航电文的内容包括遥测码(TLW)、转换码 (HOW)、第一数据块、第二数据块和第三数据块 5部分。
RINEX数据格式
目前,RINEX格式已成为各厂商、学校、研究单 位在编制软件时采用的标准输入格式。RINEX格式 是纯ASCII码文本文件,共包含4个文件:
(1)观测数据文件:ssssdddf.yyo (2)导航文件:ssssdddf.yyn (3)气象数据文件:ssssdddf.yym (4)GLONASS数据文件:ssssdddf.yyg 其中:ssss——4个字母的测站名;

GPS卫星坐标实时解算及软件实现

GPS卫星坐标实时解算及软件实现
第 38 卷 第 34 期 2012 年12 月 文章编号: 1009-6825 ( 2012 ) 34-0233-02

西


SHANXI
ARCHITECTURE
Vol. 38 No. 34 Dec. 2012
· 233·
GPS 卫 星 坐 标 实 时 解 算 及 软 件 实 现
杨久东

宋如飞
( 河北联合大学矿业工程学院, 河北 唐山 06S 定位受很多方面的影响, 其中最主要的误差包括以下几
种: 卫星钟误差, 地球自转误差, 相对论误差, 电离层以及对流层 误差。 1 ) 卫星 钟 误 差。 卫 星 钟 误 差 主 要 是 由 于 卫 星 上 的 时 钟 与 GPS 标准时之间的差异所造成的, 其误差所造成的影响比较大, 当钟差时间达到 1 ms, 距离偏差便可达到 300 km。我们可以通过 发送二项式的系数实现钟误差的修正 。 这样一来二者之间的误 差就可以缩小到 20 ns 之间。 2 ) 地球自转误差。 GPS 用于定位的坐标系是随着地球自转 的协议地球坐标系, 当卫星在坐标系的某个位置发射信号, 随着 地球的自转, 当信号传至地面的接收机时, 卫星早已偏离原来的 发射位置了, 此时造成的误差便是地球自转误差 。 我们在精密定 位的时候必须把接收机接收卫星信号时刻的坐标系作为求解坐 标系, 把卫星发射信号的时刻作为求解卫星位置的时候用到的时 刻, 从而把求解卫星的位置转化到参考坐标系里的位置 。 3 ) 相对论误差。所谓的相对论误差也就是说卫星上的时钟相 对于卫星运行时的速度会产生一定的频率改变, 此时要想修正此 误差可以利用系数改进的方法, 将相对论误差缩小至 70 ns 以内。 4 ) 电离层及对流层误差。 电离层误差包括电离层折射误差 和电离层延迟误差。该误差在垂直的方向可达 50 m, 水平的方向 可达 150 m。目前, 对于电子密度大小以及变化规律我们无法用 严格的数学模型来描述, 因此, 常常利用电离层改正模型或双频 观测来修 正 电 离 层 误 差 。 对 流 层 误 差 在 垂 直 的 方 向 可 以 达 到 2. 5 m, 水平的方向可以达到 20 m。 对流层偏差也同样可以利用 经验模型进行修正。 GPS 星历中通过给定电离层对流层模型以 及模型参数来消除电离层和对流层误差 。实验资料表明, 利用模 对流层误差改进有效率为 型对电离层误差改进有效率达到 75% , 95% 。

GPS卫星位置的计算(C++程序计算)

GPS卫星位置的计算(C++程序计算)

GPS卫星位置的计算利用C++编写了一段能计算单一瞬时卫星坐标的程序,在运行程序之前,需做部分准备工作:(1)在F盘下建立一名为“单一卫星广播星历”的txt文件。

(2)从“广播星历.txt”文件中拷贝从卫星PRN号开始的8行数据到“单一卫星广播星历.txt”中(3)在编辑选项中,将全部的“D”替换为“E”。

下面为我所选取的一个广播星历:18 06 8 25 6 0 0.0-2.472363412380E-04-1.023*********E-12 0.000000000000E+001.410000000000E+02-1.721875000000E+01 4.502687555010E-09 1.413760604187E+00-7.990747690201E-07 7.598234573379E-03 1.118145883083E-05 5.153709835052E+034.536000000000E+05-1.303851604462E-08-1.095067942661E-01 1.527369022369E-079.571235745530E-01 1.640000000000E+02-2.656176299285E+00-8.0374********E-09-5.193073455211E-10 1.000000000000E+00 1.389000000000E+03 0.000000000000E+002.000000000000E+00 0.000000000000E+00-1.024*********E-08 1.410000000000E+024.464490000000E+05 4.000000000000E+00程序设计部分:#include<stdio.h>#include<math.h>int main(){int i = 0;double n[50], n0, nn, t, tk, Mk, Ek, Vk, Yk, Gu, Gr, Gi, uk, rk, ik, xk, yk, zk, X, Y, Z, Lk, UT, yy, mm, JD, gpsz;FILE *fp;fp = fopen("F:\\单一卫星广播星历.txt", "r");if (fp == NULL){printf ("文件打开失败!\n");return 0;}while (! feof (fp)){fscanf(fp, "%lf", &n[i]);i++;}n0 = (sqrt(3986005E+8))/pow(n[17], 3);nn = n0 + n[12];/*计算卫星运行的平均角速度*/UT = n[4] + (n[5] / 60) + (n[7] / 3600);/*民用日的时分秒化为实数时*/if (n[1] >= 80)/*广播星历中年只有后两位,化为4位,参考1980年1月6日0点*/ {if (n[1] == 80 && n[2] == 1 && n[3] < 6){n[1] = n[1] + 2000;}n[1] = n[1] + 1900;}else{n[1] = n[1] + 2000;}if (n[2] <= 2){yy = n[1] - 1;mm = n[2] + 12;}if (n[2] > 2){yy = n[1];mm = n[2];}JD = (int)(365.25 * yy) + (int)(30.6001 * (mm + 1)) + n[3] + (UT / 24) + 1720981.5;/*化为儒略日*/gpsz = (int)((JD - 2444244.5) / 7);/*计算GPS周*/t = (JD - 2444244.5 - 7 * gpsz) * 24 * 3600;/*得出GPS秒*/tk = t - n[18];/*tk1为中间值,用以判断tk与正负302400的关系,然后返回到tk上*/ while (tk > 302400 || tk < -302400){if (tk > 302400){tk = tk - 604800;}else{tk = tk + 604800;}}/*计算归化观测时间*/Mk = n[13] + nn * tk;/*观测时刻的卫星平近点角*/Ek = Mk;Ek = Mk + n[15] * sin(Ek);Ek = Mk + n[15] * sin(Ek);/*迭代两次计算观测时刻的偏近点角*/Vk = atan(sqrt(1 - n[15] * n[15]) * sin(Ek)) / (cos(Ek) - n[15]);/*真近点角*/Yk = Vk + n[24];/*升交距角*/Gu = n[14] * cos(2 * Yk) + n[16] * sin(2 * Yk);Gr = n[23] * cos(2 * Yk) + n[11] * sin(2 * Yk);Gi = n[19] * cos(2 * Yk) + n[21] * sin(2 * Yk);/*摄动改正项*/uk = Yk + Gu;rk = n[17] * n[17] * (1 - n[15] * cos(Ek)) + Gr;ik = n[22] + Gi + n[26] * tk;/*经摄动改正后的升交距角、卫星矢径、轨道倾角*/xk = rk * cos(uk);yk = rk * sin(uk);zk = 0;/*卫星在轨道坐标系的坐标*/Lk = n[20] + (n[25] - 7.29211515E-5) * tk - 7.29211515E-5 * n[18];/*观测时刻t的升交点经度*/X = xk * cos(Lk) - yk * cos(ik) * sin(Lk);Y = xk * sin(Lk) + yk * cos(ik) * cos(Lk);Z = yk * sin(ik);/*卫星在WGS-84坐标系的坐标*/printf("该卫星在WGS-84坐标系中的坐标为:\nX = %lf m\nY = %lf m\nZ = %lf m\n", X, Y, Z);fclose(fp);return 0;}计算结果:该卫星在WGS-84坐标系中的坐标为:X = 9223153.692525 mY = 24133486.931401 mZ = 6032585.919385 m。

android中gnssstatus的用法

android中gnssstatus的用法

android中gnssstatus的用法全文共四篇示例,供读者参考第一篇示例:GNSS是全球导航卫星系统的缩写,目前包括了美国的GPS系统、俄罗斯的GLONASS系统、欧洲的Galileo系统以及中国的北斗系统。

在Android系统中,提供了一系列的GNSS相关的API来帮助开发者实现位置定位功能,其中GNSSStatus就是其中之一。

GNSSStatus是Android系统中用于获取GNSS卫星信号状态的类,通过该类可以获取到当前设备接收到的卫星信息,包括卫星的ID、信号强度、卫星激活状态等。

开发者可以利用这些信息来实现位置定位、导航、轨迹记录等功能。

使用GNSSStatus的第一步是获取到系统的LocationManager实例,通过LocationManager的getGnssStatus()方法可以获取到GNSSStatus对象。

然后可以通过GNSSStatus对象的getSatelliteCount()方法获取当前接收到的卫星数量,通过getUsedInFixSatelliteCount()方法获取用于定位的卫星数量,通过getSvid()方法获取卫星的ID,通过getCn0DbHz()方法获取卫星的信号强度等信息。

除了获取具体的卫星信息外,GNSSStatus还提供了一些监听器用于监听卫星信号状态的变化。

可以通过LocationManager的addGnssStatusListener()方法添加监听器,当卫星信号状态发生变化时就会触发监听器中的相应方法,开发者可以在这些方法中实现自定义的逻辑。

GNSSStatus是Android系统中用于获取卫星信号状态的重要类,通过它可以获取到详细的卫星信息,帮助开发者实现位置定位功能。

开发者在使用GNSSStatus时应该注意及时注册监听器、处理卫星信号状态的变化,以确保定位功能的稳定和准确。

希望以上介绍能对开发者在Android应用中使用GNSSStatus有所帮助。

集思宝手持GPS使用教程

集思宝手持GPS使用教程
地图缩放功能
设备提供顺畅的地图缩放体验,用户可通过简单的操作放大 或缩小地图,以便更详细地查看特定区域或了解更广泛的地 理概貌。
自定义地图导入流程指南
准备自定义地图数据
用户需准备符合设备要求的自定 义地图数据,通常这些数据应为 特定的文件格式,如GPX、KML
等。
确认地图导入成功
使用数据线将集思宝手持GPS设 备与电脑连接,确保设备被正确
如果设备设置有密码锁, 请在屏幕上滑动以解锁。
检查电池和信号
确保设备电池电量充足, 并检查GPS信号是否正常 接收。
界面布局及功能介绍
主界面
显示当前位置、卫星信号 状态、时间日期等基本信 息。
菜单界面
通过点击设备屏幕下方的 菜单键进入,包含各种设 置和应用程序。
地图界面
展示当前位置的地图,支 持缩放、平移等操作。
地图制作
利用GPS记录的轨迹信息和相关地质数据,可以制作精确的地质 地图,为后续研究提供重要依据。
农业领域土地测量解决方案
1 2
土地面积测量
利用手持GPS围绕土地边界行走一圈,即可快速 测量出土地的面积,提高了测量的效率和准确性 。
土地边界确定
通过GPS定位功能,可以精确确定土地的边界位 置,避免了传统测量方法中可能出现的误差。
检查设备与电脑的连接是否正常 ;尝试更换数据线或更换电脑 USB端口;检查设备驱动程序是 否已正确安装。
售后服务支持政策
01
集思宝提供一年质保服务,自购买之日起一年内因非人为原因造成的 故障可享受免费维修或更换服务。
02
如遇设备故障,请先联系集思宝售后服务热线或在线客服进行咨询和 报修。
03
提供维修服务时,请确保将设备、配件、发票等齐全并妥善包装,以 免在运输过程中造成损坏。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算卫星位置
一、C语言程序
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define bGM84 3.986005e14
#define bOMEGAE84 7.2921151467e-5
void main()
{
long double roota=0.515365263176E+04; //轨道长半轴的平方根(根号a)
long double toe=0.720000000000E+04; //观测时刻toe
long double m0=-0.290282040486E+00; //参考时刻toe的平近点角
long double e=0.678421219345E-02; //轨道偏心率e
long double delta_n=0.451411660250E-08;//卫星的摄动改正数△n
long double smallomega=-0.258419417299E+01;//近地点角距ω
long double cus=0.912137329578E-05;//纬度幅角正弦调和项改正的振幅(弧度)long double cuc=0.189989805222E-06;//纬度幅角余弦调和项改正的振幅(弧度)long double crs=0.406250000000E+01;//轨道半径的余弦调和项改正的振幅(m)long double crc=0.201875000000E+03;//轨道半径的正弦调和项改正的振幅(m)long double cis=0.949949026108E-07;//轨道倾角的余弦调和项改正的振幅(弧度)long double cic=0.130385160446E-07;//轨道倾角的正弦调和项改正的振幅(弧度)long double idot=-0.253939149013E-09;//轨道倾角变化率I
long double i0=0.958512160302E+00; //轨道倾角(弧度)
long double bigomega0=-0.137835982556E+01;//升交点赤经
long double earthrate=bOMEGAE84; //地球自转的速率we
long double bigomegadot=-0.856928551657e-08;
long double t=0.720000000000E+04; //加入卫星钟差改正的归化时间
long double A;
long double n0=0,n,tk;
long double mk,ek,tak,ik,omegak,phik,uk,rk;
long double corr_u,corr_r,corr_i;
long double xpk,ypk,xk,yk,zk;
int i;
printf("输入的数据:\n");
printf("√a=%e \n",roota);
printf("toe=%e \n",toe);
printf("e=%e \n",e);
printf("i0=%e \n",i0);
printf("ω=%e \n",smallomega);
printf("△n=%e \n",delta_n);
printf("Ω0=%e \n",bigomega0);
printf("I=%e \n",idot);
printf("Cuc=%e \n",cuc);
printf("Crc=%e \n",crc);
printf("Crs=%e \n",crs);
printf("Cic=%e \n",cic);
printf("Cis=%e \n",cis);
printf("\n\n输出的结果为:\n",e);
A=roota*roota;
n0=sqrt(bGM84/(A*A*A));//平均角速度n0
printf("n0=%.10lf \n",n0);
tk=t-toe;//相对于参考时刻toe的归化时间tk
printf("tk=%.10lf \n",tk);
n=n0+delta_n;//加摄动改正后的卫星平均角速度
printf(" n=%.10lf \n",n);
mk=m0+n*tk;//卫星平近点角
printf("mk=%.10lf \n",mk);
ek=mk;
for(i=0;i<10;i++) ek=mk+e*sin(ek);//利用迭代法求偏近点角ek
printf("ek=%.10lf \n",ek);
tak=atan2(sqrt(1.0-e*e)*sin(ek),cos(ek)-e);//真近点角Vk的计算
printf("Vk=%.10lf \n",tak);
phik=tak+smallomega;//升交距角φk的计算
printf("φk=%.10lf \n",phik);
corr_u=cus*sin(2.0*phik)+cuc*cos(2.0*phik);//升交距角u的摄动改正δu printf("δu=%.10lf \n",corr_u);
corr_r=crs*sin(2.0*phik)+crc*cos(2.0*phik);//卫星矢量r的摄动改正δr printf("δr=%.10lf \n",corr_r);
corr_i=cis*sin(2.0*phik)+cic*cos(2.0*phik);//轨道倾角i的摄动改正δi printf("δi=%.10lf \n",corr_i);
uk=phik+corr_u;//升交距角u
printf("uk=%.10lf \n",uk);
rk=A*(1.0-e*cos(ek))+corr_r;//卫星矢量r
printf("rk=%.10lf \n",rk);
ik=i0+idot*tk+corr_i;//轨道倾角i
printf("ik=%.10lf \n",ik);
xpk=rk*cos(uk);//卫星在轨道平面坐标系的坐标
ypk=rk*sin(uk);
printf("ypk=%.10lf \n",ypk);
omegak=bigomega0+(bigomegadot-earthrate)*tk-earthrate*toe;//升交点经度Ωk的计算printf("Ωk=%.10lf \n\n",omegak);
xk=xpk*cos(omegak)-ypk*sin(omegak)*cos(ik);//地心固定坐标系的直角坐标
yk=xpk*sin(omegak)+ypk*cos(omegak)*cos(ik);
zk=ypk*sin(ik);
printf("Xk=%.4lf \n",xk);
printf("Yk=%.4lf \n",yk);
printf("Zk=%.4lf \n",zk);
}
二、计算结果
计算结果如截图所示:。

相关文档
最新文档