基于导航文件的GPS定位——python实现

模型建立:

# coding:utf-8import math as m
with open('brdm0320.22p','r') as f:data=f.readlines()# print(data)f.close()
#文件时间不同可取消此处注释
# def o_data_line():
#     for i in range(len(data)):
#         if data[i].find('END OF HEADER') != -1:
#             o_data_line = i + 1
#     return o_data_line
# print(o_data_line())
ff=[]
ff=data[207:3359]
# print(ff)# file_write_obj = open("GPS_data.txt", 'w')   # 新文件写入GPS_data
# for i in range(3359-207) :
#     file_write_obj.write(ff[i])   # 逐行写入
#     # file_write_obj.write('\n')
# file_write_obj.close()
# print("保存文件成功")#文件读取
with open('GPS_data.txt','r') as G:GPS_data=G.readlines()f.close()# print(GPS_data)
data_num=int(len(GPS_data)/8)         #数据组数
# print(data_num)
for j in range(data_num):for i in range(8):data_l = GPS_data[8 * j +i]if i==0:#卫星PRN号PRN=data_l[0:3]# 历元 TIMETIME=data_l[4:24]year = int(TIME[0:4])month = int(TIME[5:7])day = int(TIME[8:10])hour = int(TIME[11:13])minute = int(TIME[14:16])second = float(TIME[17:19])# print(TIME)# 卫星钟偏差(s)S=float(data_l[23:42])#卫星钟漂(s/s)S_s=float(data_l[42:62])print(S_s)# 卫星钟漂移速度(s / s * s)S_ss=float(data_l[62:81])elif i==1:IODE=float(data_l[4:23])C_rs=float(data_l[23:42])n=float(data_l[43:61])mo=float(data_l[61:81])elif i==2:C_uc=float(data_l[4:23])# print(C_uc)# print(float(row[4:23]))e=float(data_l[23:42])C_us=float(data_l[42:62])sqrt_A=float(data_l[62:81])elif i == 3:TEO=float(data_l[4:23])C_ic=float(data_l[23:42])OMEGA=float(data_l[42:61])C_is=float(data_l[62:81])elif i== 4:I_0=float(data_l[4:23])C_rc=float(data_l[23:42])w=float(data_l[43:61])OMEGA_DOT=float(data_l[62:81])elif i == 5:IDOT = float(data_l[4:23])L2_code = float(data_l[23:42])PS_week_num = float(data_l[42:62])L2_P_code = float(data_l[62:81])elif i == 6:# 卫星精度(m)=2# 卫星健康状态=0TGD = float(data_l[42:62])IODC = float(data_l[62:81])# print(IODC)elif i==7:pass
# print(PRN, S,S_s,S_ss,
#       IODE,C_rs,n,mo, C_uc,
#       e, C_us, sqrt_A,
#       TEO, C_ic, OMEGA,C_is,
#       I_0, C_rc, w, OMEGA_DOT,
#       IDOT,L2_code,PS_week_num,L2_P_code,
#       TGD,IODC)def CulLocation(PRN, year, month, day, hour, minute, second, S, S_s, S_ss, IDOT, C_rs, n, mo, C_uc, e, C_us, sqrt_A,TEO, C_ic, OMEGA, C_is, I_0, C_rc, w, OMEGA_DOT,t1):# 1.计算卫星运行平均角速度 GM:WGS84下的引力常数 =3.986005e14,a:长半径GM = 398600500000000n_0 = m.sqrt(GM) / m.pow(sqrt_A, 3)n = n_0 + n# 2.计算归化时间t_k 计算t时刻的卫星位置  UT:世界时 此处以小时为单位UT = hour + (minute / 60.0) + (second / 3600);if month <= 2:year = year - 1month = month + 12  # 1,2月视为前一年13,14月# 需要将当前需计算的时刻先转换到儒略日再转换到GPS时间JD = (365.25 * year) + int(30.6001 * (month + 1)) + day + UT / 24 + 1720981.5;WN = int((JD - 2444244.5) / 7);  # WN:GPS_week number 目标时刻的GPS周t_oc = (JD - 2444244.5 - 7.0 * WN) * 24 * 3600.0;  # t_GPS:目标时刻的GPS秒# 对观测时刻t1进行钟差改正,注意:t1应是由接收机接收到的时间if t1 is None:t_k = 0else:δt = a_0 + a_1(t1 - t_oc) + a_2(t1 - t_oc) ^ 2t = t1 - δtt_k = t - TEOif t_k > 302400:t_k -= 604800else :t_k += 604800# 3.平近点角计算M_k = M_0+n*t_kprint(mo)M_k = mo + n * t_k  # 实际应该是乘t_k,但是没有接收机的观测时间,所以为了练手设t_k=0# 4.偏近点角计算 E_k  (迭代计算) E_k = M_k + e*sin(E_k)E = 0;E1 = 1;count = 0;while abs(E1 - E) > 1e-10:count = count + 1E1 = E;E = M_k + e * m.sin(E);if count > 1e8:print("计算偏近点角时未收敛!")break# 5.计算卫星的真近点角V_k = m.atan((m.sqrt(1 - e * e) * m.sin(E)) / (m.cos(E) - e));# 6.计算升交距角 u_0(φ_k), ω:卫星电文给出的近地点角距u_0 = V_k + w# 7.摄动改正项 δu、δr、δi :升交距角u、卫星矢径r和轨道倾角i的摄动量δu = C_uc * m.cos(2 * u_0) + C_us * m.sin(2 * u_0)δr = C_rc * m.cos(2 * u_0) + C_rs * m.sin(2 * u_0)δi = C_ic * m.cos(2 * u_0) + C_is * m.sin(2 * u_0)# 8.计算经过摄动改正的升交距角u_k、卫星矢径r_k和轨道倾角 i_ku = u_0 + δur = m.pow(sqrt_A, 2) * (1 - e * m.cos(E)) + δri = I_0 + δi + IDOT * (t_k);  # 实际乘t_k=t-t_oe# 9.计算卫星在轨道平面坐标系的坐标,卫星在轨道平面直角坐标系(X轴指向升交点)中的坐标为:x_k = r * m.cos(u)y_k = r * m.sin(u)# 10.观测时刻升交点经度Ω_k的计算,升交点经度Ω_k等于观测时刻升交点赤经Ω与格林尼治恒星时GAST之差  Ω_k=Ω_0+(ω_DOT-omega_e)*t_k-omega_e*t_oeomega_e = 7.292115e-5  # 地球自转角速度OMEGA_k = OMEGA + (OMEGA_DOT - omega_e) * t_k - omega_e * TEO;  # 星历中给出的Omega即为Omega_o=Omega_t_oe-GAST_w# 11.计算卫星在地固系中的直角坐标lX_k = x_k * m.cos(OMEGA_k) - y_k * m.cos(i) * m.sin(OMEGA_k)Y_k = x_k * m.sin(OMEGA_k) + y_k * m.cos(i) * m.cos(OMEGA_k)Z_k = y_k * m.sin(i)# 12.计算卫星在协议地球坐标系中的坐标,考虑级移# [X,Y,Z]=[[1,0,X_P],[0,1,-Y_P],[-X_p,Y_P,1]]*[X_k,Y_k,Z_k]# XYZ=[X,Y,Z]if month > 12:  # 恢复历元year = year + 1month = month - 12print("历元:", year, "年", month, "月", day, "日", hour, "时", minute, "分", second, "秒", "\n卫星PRN号:", PRN, "\n平均角速度:", n,"\n卫星平近点角:", M_k, "\n偏近点角:", E, "\n真近点角:", V_k, "\n升交距角:", u_0, "\n摄动改正项:", δu, δr, δi, "\n经摄动改正后的升交距角、卫星矢径和轨道倾角:", u, r,i, "\n轨道平面坐标X,Y:", x_k, y_k, "\n观测时刻升交点经度:", OMEGA_k, "\n地固直角坐标系X:", X_k, "\n地固直角坐标系Y:", Y_k, "\n地固直角坐标系Z:", Z_k,'\n地固坐标系的位置')if __name__ == '__main__':for i in range(data_num):t1=NoneCulLocation(PRN, year, month, day, hour, minute, second, S, S_s, S_ss, IDOT, C_rs, n, mo, C_uc, e, C_us,sqrt_A, TEO,C_ic, OMEGA, C_is, I_0, C_rc, w, OMEGA_DOT,t1)

由于我近期在完成GNSS课程的一个作业,无论是专业知识还是编程语言都是初学阶段,本着提高自己的原则, 借鉴网上一些大神的资料,完成了本次作业。主要是借鉴了python读取导航电文并计算卫星位置_Small Cube的博客-CSDN博客_python卫星定位

该作者给与了很大帮助 ,经过该作者同意,上传本人第一个CSDN作品!!!

但是此次由于搞出来太激动了还未来得及完成结果准确性的检验,会在后续继续补充完善,如果有什么不妥,请各位大佬批评指正。

GPS卫星定位—python实现相关推荐

  1. php gps定位范围算法,基本的GPS卫星定位算法

    姓名:杨汉雄 学号:19011210569 [嵌牛导读]GPS定位包括确定一个点的三维坐标与实现同步这四个未知参数.当前主流的GPS定位算法有有两种:(1)伪距测量:测量GPS卫星发射的测距码信号到达 ...

  2. GPS卫星定位接收器的NMEA协议解析

    原文地址:GPS卫星定位接收器的NMEA协议解析作者:蟹蟹 GPS接收机只要处于工作状态就会源源不断地把接收并计算出的GPS导航定位信息通过串口传送到计算机中.前面的代码只负责从串口接收数据并将其放置 ...

  3. 天球坐标系、地球坐标系与地球自转有无关系,哪一种便于描述地面观测站的空间位置,哪一种便于描述人造地球卫星的位置?请用类似思维导图的方式总结GNSS定位的时空基准?GPS卫星定位中时间系统有何重要意义?

    答: 1.天球坐标系.地球坐标系与地球自转有无关系,哪一种便于描述地面观测站的空间位置,哪一种便于描述人造地球卫星的位置? 卫星定位中常采用空间直角坐标系及其相应的大地坐标系,一般取地球质心为坐标系的 ...

  4. 天球坐标系、地球坐标系与地球自转有无关系?哪一种便于描述地面观测站的空间位置?哪一种便于描述人造地球卫星的位置?总结GNSS定位的时空基准? GPS卫星定位中,时间系统有何重要意义?

    1. 天球坐标系.地球坐标系与地球自转有无关系?哪一种便于描述地面观测站的空间位置?哪一种便于描述人造地球卫星的位置? 天球坐标系与地球自转无关,地球坐标系与地球自转有关.地球坐标系便于描述地面观测站 ...

  5. GPS卫星定位测量基础-卫星多普勒定位技术

    卫星定位测量技术的发展可归结为三个阶段:卫星三角测量.卫星多普勒定位技术.GPS卫星定位测量.本节重点讲述 卫星多普勒定位技术    1. 卫星三角测量原理 卫星定位测量问世之初,人造地球卫星仅仅作为 ...

  6. Android 逆向分析之 : GPS卫星定位监控导航寻找人

    同事发过来一个地址:GPS卫星定位监控导航寻找人, 看起来挺有有意思的,逆向看看不可能就这么找人吧: 程序就是两个actvitiy,通过AsyncTask进行异步查询显示结果,当然还有其它的一大堆东西 ...

  7. LBS基站定位和GPS卫星定位对比

    备注: 本文为网上找到的一个word文档,看了之后,觉得总结相当不错,现在把其贴出来共享!同时感谢原作者无私的奉献精神! 位置定位大体上可以分为两大类: 1. GPS(Global Positioni ...

  8. VB实现GPS卫星定位及地图显示 Google Earth

    你是否看过电影里那高科技呢?当军方在搜索恐怖分子的时候经常会通过卫星定位或手机信号定位到其精准的地理位置,现在使用Google Earth和Google Maps提供的接口,你也可以实现这样的功能,误 ...

  9. GPS卫星定位车载终端原理全面介绍

    车载终端设备是GPS车辆监控管理系统的前端设备,安装在被监控的车辆上.车载终端还可以隐秘地安装在各种车辆内,同时与车辆本身的油路.电路.门磁及车上的防盗器相连,可对车辆进行全方位的掌控. 车载终端设备 ...

  10. GPS卫星定位车辆监控系统

    很久很久前的一个初步想法,今天拿出来做个纪念! 利用GPS(Global Positioning System)来作定位导航是GPS的最基本应用 用户对象: 1.个人用户 个人车辆被盗后,到我中心可以 ...

最新文章

  1. 6426C Lab3 部署证书和管理注册
  2. 如何选择正确的RAID级别
  3. JAVA操作properties文件
  4. 计算机组成解疑补漏之SDR、DDR及相关计算
  5. 【Java代码】坐标系说明+WGS84\GCJ02\BD09坐标系转换工具+Java坐标系转换及验证源代码分享(粘贴可用)
  6. S/4HANA for Customer Management里的搜索分页处理
  7. 【渝粤教育】广东开放大学 行政管理 形成性考核 (35)
  8. cross join 一张表没有值关联不出来数据_你是否还在对left join、right join和join有困扰呢?...
  9. win10+vs2015+opencv3配置
  10. 大数据之-Hadoop本地模式_执行Grep官方案例---大数据之hadoop工作笔记0021
  11. 微软AI实力秀:调侃Google吹牛;免费AI课程上线
  12. R语言ggplot2画图3
  13. TopOn的两种测试方法
  14. Maple学习笔记——基础
  15. GUI 自动测试工具[2021清单]
  16. 2021年了,对话系统凉透了吗?
  17. Hexo 的next主题下添加网易云音乐作BGM
  18. 极路由 mysql_用极路由3和移动硬盘DIY时间胶囊TimeCapsule做备份
  19. 微信网页授权校验文件
  20. 【已解决】程序文件被ESET NOD32误杀或拦截怎么办?以ENDPIINT SECURITY为例添加信任教程截图(ESET通用))

热门文章

  1. matlab三维绘图
  2. linux centos fedora 安装LBP2900打印机 LBP6230dn LBP6240dn
  3. Python多线程爬虫获取电影下载链接
  4. 基于银河麒麟 V10 系统安装和卸载 DM8 数据库
  5. HDL4SE:软件工程师学习Verilog语言(十六)
  6. 协方差矩阵的定义性质与python实现
  7. 《金狐系统维护盘》五周年纪念版【简洁易用,强大实用】
  8. RSS阅读器FeedDemon使用方法
  9. pdf文件转换成word文本文档去水印怎么弄
  10. 任正非:一江春水向东流