多系统 GNSS 非差非组合精密单点定位相关理论和方法研究--周峰

PPP经典必读硕博论文,主要是重新回顾相关知识点,总结一下学习笔记、学习感悟。

12.3

1.

2.MGEX:多系统 GNSS 实验、Multi-GNSS Experiment,是IGS下的一项计划,用于布设MGEX跟踪站网,与现有的IGS跟踪站网一起组成全球站网。

MGEX 分析中心可向全球用户提供多系统 GNSS 精密卫星轨道和钟差改正等产品。目前,共有 7 个,分别是:(1)法国空间研究中心(Centre National d’EtudesSpatiales, CNES);(2)欧洲定轨中心(CODE);(3)德国地学研究中心(DeutschesGeoForschungsZentrum, GFZ);(4)德国慕尼黑工业大学(Technische UniversitätMünchen, TUM);(5)中国武汉大学(Wuhan University, WHU);(6)日本宇航空间探测局(Japan Aerospace Exploration Agency, JAXA);(7)欧洲空间局(European Space Agency, ESA)。

3.基于非差非组合观测值的PPP相比于传统无电离层组合观测值的PPP,优点是:

  • 在处理当前和未来的GNSS观测值时更有弹性,弹性? 是指因为是非差非组合,后续进行处理时比较方便吗?存疑
  • 避免了线性组合噪声放大
  • 能够提取电离层延迟,获取精确的电离层延迟改正信息,可以利用外部电离层改正信息来约束非差非组合 PPP 中的电离层参数用以加快收敛

4.定位模型包括随机模型和函数模型。函数模型描述了观测量与相应的待估参数之间的函数关系,随机模型则反应了观测值的统计特性。定位模型的构建是获得最优解的关键前提。

5.本文给了四种函数模型:

  • 原始观测模型
  • 无电离层组合函数模型
  • UofC模型
  • 非差非组合函数模型
    • 对原始观测模型进行处理就得到了非差非组合函数模型
      • 引入精密卫星轨道和钟差改正,代入至原始观测方程并线性化
      • 将接收机钟差、电离层延迟、载波相位模糊度参数重新参数化,得到非差非组合函数模型

6.PPP中通过模型改正的误差项有哪些:

  • 卫星和接收机天线相位中心误差
  • 测站对流层天顶干延迟
  • 相对论效应
  • 潮汐负荷形变(固体潮、极移和海潮)
  • 萨奈克效应(Sagnac effect)
  • 卫星相位缠绕
  • ...

7.一些名词:

  • UCD :单位是s,频率相关的接收机和卫星端的非校正伪距硬件延迟   uncalibrated code delay
  • UPD:单位是周,频率相关的接收机和卫星端的非校正相位硬件延迟    uncalibrated phase delay
  • DCB:Differential Code Bias 差分码偏差  不同信号得到的观测值之间存在的系统性偏差

8.参数估计方法

  1. 最小二乘法
  2. 卡尔曼滤波

9.观测模型 (以非差非组合双频接收机为例)

    • 这里就是电离层延迟,L1和L2频率上的电离层延迟比例
    • 这里给出的是观测值(伪距和相位)的噪声矩阵,方差阵,由卫星高度角或者信噪比随机模型确定

10.状态模型

  • (有点懂了
  • 这里的系统噪声是那些代求参数的噪声方差阵,只能先设置初始值

11.有个疑问,为什么在观测方程中只是用L1频率来计算电离层延迟,而不是使用L2频率?

这里我搜了一下:看到有位博主是说:选择L1算,就可以根据电离层延迟频率间的关系得到其他频率的电离层延迟。L1和L2的电离层可以用相应关系反求出来。(上面已经写出来了,当时先写的这边,忘了)

原文链接:RTKlib单点定位-部分思考_rtklib bds-CSDN博客

12. 数据预处理和质量控制

  • 该部分工作应该在参数估计前进行
  • 主要包括:
    • 伪距观测值粗差检测
      • 构造粗差检测量
    • 载波相位观测值周跳探测
      • GF法   /   MW组合观测值法
    •   接收机钟跳探测与修复
      •   一旦接收机发生钟跳,将破坏 GNSS 时标、伪距和载波相位观测值之间的一致性    
    • 抗差卡尔曼滤波
      • 抗差 Kalman 滤波通过构造等价权对含有小周跳或粗差的观测值进行控制,降低异常观测值对于参数估计的影响

13.实时 PPP 处理流程图

     

        

  • 27
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
实现基于北斗BDS-3的星历文件的gnss伪距单点定位程序,你需要掌握以下几个方面的知识: 1. 北斗BDS-3卫星系统的基本原理和星历数据格式; 2. gnss伪距单点定位的基本原理和算法; 3. 编程语言和开发环境。 下面是一个基于Python语言的北斗BDS-3星历文件的gnss伪距单点定位程序示例: ```python import numpy as np # 读取北斗BDS-3星历文件 def read_bds3_nav_file(file_path): with open(file_path, 'r') as f: lines = f.readlines() nav_data = {} for i in range(0, len(lines), 8): prn = int(lines[i][2:4]) nav_data[prn] = {} nav_data[prn]['toc'] = float(lines[i][4:23]) nav_data[prn]['af0'] = float(lines[i][23:42]) nav_data[prn]['af1'] = float(lines[i][42:61]) nav_data[prn]['af2'] = float(lines[i][61:80]) nav_data[prn]['iode'] = int(lines[i+1][4:23]) nav_data[prn]['crs'] = float(lines[i+1][23:42]) nav_data[prn]['deltan'] = float(lines[i+1][42:61]) nav_data[prn]['m0'] = float(lines[i+1][61:80]) nav_data[prn]['cuc'] = float(lines[i+2][4:23]) nav_data[prn]['ecc'] = float(lines[i+2][23:42]) nav_data[prn]['cus'] = float(lines[i+2][42:61]) nav_data[prn]['sqrtA'] = float(lines[i+2][61:80]) nav_data[prn]['toe'] = float(lines[i+3][4:23]) nav_data[prn]['cic'] = float(lines[i+3][23:42]) nav_data[prn]['omega0'] = float(lines[i+3][42:61]) nav_data[prn]['cis'] = float(lines[i+3][61:80]) nav_data[prn]['i0'] = float(lines[i+4][4:23]) nav_data[prn]['crc'] = float(lines[i+4][23:42]) nav_data[prn]['omega'] = float(lines[i+4][42:61]) nav_data[prn]['omegadot'] = float(lines[i+4][61:80]) nav_data[prn]['idot'] = float(lines[i+5][4:23]) nav_data[prn]['l2code'] = int(lines[i+5][23:42]) nav_data[prn]['week'] = int(lines[i+5][42:61]) nav_data[prn]['l2pflag'] = int(lines[i+5][61:80]) nav_data[prn]['accuracy'] = int(lines[i+6][4:23]) nav_data[prn]['health'] = int(lines[i+6][23:42]) nav_data[prn]['tgd1'] = float(lines[i+6][42:61]) nav_data[prn]['tgd2'] = float(lines[i+6][61:80]) nav_data[prn]['iodc'] = int(lines[i+7][4:23]) nav_data[prn]['transmit_time'] = float(lines[i+7][23:42]) nav_data[prn]['fit_interval'] = int(lines[i+7][42:61]) return nav_data # 计算卫星位置 def calculate_satellite_position(nav_data, prn, transmit_time): t = transmit_time - nav_data[prn]['toe'] a = nav_data[prn]['sqrtA'] ** 2 n0 = 7.2921151467e-5 n = n0 + nav_data[prn]['deltan'] M = nav_data[prn]['m0'] + n * t E = M for i in range(10): E = M + nav_data[prn]['ecc'] * np.sin(E) v = np.arctan2(np.sqrt(1 - nav_data[prn]['ecc'] ** 2) * np.sin(E), np.cos(E) - nav_data[prn]['ecc']) phi = v + nav_data[prn]['omega'] u = phi + nav_data[prn]['cus'] * np.sin(2 * phi) + nav_data[prn]['cuc'] * np.cos(2 * phi) r = a * (1 - nav_data[prn]['ecc'] * np.cos(E)) + nav_data[prn]['crc'] * np.cos(2 * phi) + nav_data[prn]['crs'] * np.sin(2 * phi) i = nav_data[prn]['i0'] + nav_data[prn]['idot'] * t + nav_data[prn]['cis'] * np.sin(2 * phi) + nav_data[prn]['cic'] * np.cos(2 * phi) x = r * np.cos(u) y = r * np.sin(u) z = 0 xe = x * np.cos(n * t) - y * np.cos(i) * np.sin(n * t) ye = x * np.sin(n * t) + y * np.cos(i) * np.cos(n * t) ze = y * np.sin(i) return np.array([xe, ye, ze]) # 计算接收机位置 def calculate_receiver_position(satellite_positions, pseudoranges): A = np.zeros((len(satellite_positions) - 1, 4)) b = np.zeros((len(satellite_positions) - 1, 1)) for i in range(1, len(satellite_positions)): A[i-1, :] = np.append(satellite_positions[i, :] - satellite_positions[0, :], 1) b[i-1, 0] = pseudoranges[i] - pseudoranges[0] + np.dot(satellite_positions[0, :], satellite_positions[0, :]) - np.dot(satellite_positions[i, :], satellite_positions[i, :]) x = np.linalg.lstsq(A, b, rcond=None)[0] receiver_position = x[0:3, 0] receiver_clock_error = x[3, 0] return receiver_position, receiver_clock_error # 主程序 if __name__ == '__main__': # 读取北斗BDS-3星历文件 nav_data = read_bds3_nav_file('bds3_nav.txt') # 读取伪距数据 pseudoranges = [22326531.20, 21570022.07, 24881521.91, 23717318.44, 22394411.94] # 计算卫星位置 satellite_positions = np.zeros((len(pseudoranges), 3)) transmit_time = nav_data[1]['transmit_time'] for i in range(len(pseudoranges)): satellite_positions[i, :] = calculate_satellite_position(nav_data, i+1, transmit_time) # 计算接收机位置 receiver_position, receiver_clock_error = calculate_receiver_position(satellite_positions, pseudoranges) # 输出结果 print('Receiver position: x=%f, y=%f, z=%f' % (receiver_position[0], receiver_position[1], receiver_position[2])) print('Receiver clock error: %f' % receiver_clock_error) ``` 这段代码实现了北斗BDS-3星历文件的读取、卫星位置计算、接收机位置计算和结果输出等功能。其中,read_bds3_nav_file函数用于读取星历文件,calculate_satellite_position函数用于计算卫星位置,calculate_receiver_position函数用于计算接收机位置。主程序中给出了一个示例,包括伪距数据和结果输出。需要注意的是,这段代码中只考虑了单频伪距测量,因此计算出的接收机位置精度较低,如果需要提高精度需要考虑多频伪距测量、载波相位测量等因素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Code_ADing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值