GNSS星历数据读取

文章介绍了GNSS位置结算过程中RTKlib软件所需的两种关键文件:观测文件(o文件)包含接收机接收到的卫星报文信息,如伪距、相位和多普勒观测值;而nav文件则存储卫星的运行状态和星历数据。通过结合o文件的时间信息和nav文件的星历,可以解算出卫星的ECEF坐标。

GNSS位置结算需要两个文件放入RTKlib中
卫星的位置需要o文件和nav文件共同提供数据才可以解算

1.observation观测文件

观测文件指接收机接收到的所有卫星的报文信息
格式如下:
在这里插入图片描述
卫星字母编号
在这里插入图片描述
SYS / # / OBS TYPES结尾的行,这样的存在决定了后面数据块的存储顺序和释义。数据类型都是由三个字符组成,第一个字符:C伪距;L载波;D多普勒;S信号强度;第二个字符是数字,代表 频数编号;第三个字符表示跟踪模式或通道,比如常用的C C/A码;S LxC(D);L LxC(P);X LxC(D+P);P AS off; W AS on;Y Y码;M M码
数据块

2021 5 21 6 29 6.0040000 0 34

20215216296.0040000秒 + 历元标志0 + 当前历元所观测到的卫星数34。关于历元标志,0表示正常,1表示在前一历元和当前历元之间发生了电源故障,>1表示事件标志。

伪距观测值,类型标识为C1C,LLI 位为空,信号强度SSI=6
相位观测值,类型标识为L1C,LLI 为0,表示连续跟踪或状态未知,信号强度SSI=6
多普勒观测值,类型标识为D1C,LLI 位为空,信号强度SSI=6
载噪比,类型标识为S1C。

2.nav文件

nav时星历广播报文文件,包含了卫星在这一段时间的的运行状态,IGS观测中心提供的nav文件一般包含GPS,北斗等数据可以从nasa下载。
在这里插入图片描述

读取导航nav文件代码参考

卫星的位置需要o文件和nav文件共同提供数据才可以解算,o文件提供观测时的时间,利用nav中提供的播发时间和其他信息共同解算卫星的ECEF坐标。
由星历参数求解卫星时空位置——参考1

### GNSS .obs 文件格式说明 GNSS观测文件(.obs)是一种标准的数据文件,主要用于存储来自全球导航卫星系统的原始测量数据。这类文件遵循特定的结构化格式,便于不同软件和硬件平台之间的互操作性。 #### 文件头信息 文件头部包含有关站点、接收机、天线的信息以及其他元数据。特别需要注意的是以`SYS / # / OBS TYPES`结尾的行[^3]。这一部分定义了后续数据块中的观测类型及其排列顺序,对于正确解释数据至关重要。 #### 观测数据体 主体部分由多个周期性的观测记录组成,每条记录代表一次完整的卫星信号采样时刻下的所有可用通道的状态报告。每个观测时段内会列出参与此次定位计算的具体卫星编号以及对应的伪距(Pseudorange)、载波相位(Carrier Phase)等物理量。 ```plaintext > TIME OF FIRST OBS 2021 7 5 0 0 0.0000000 0 > OBSERVATION DATA (GPS SYSTEM) GpsTime WeekNo SecOfWeek NumSats PRN LLI SNR PseudoRange CarrierPhase Doppler ... 0 0 0 8 1 0 40 X Y Z ... ``` 上述示例展示了典型的 Rinex 格式的开头几行,其中包含了时间戳和其他必要的参数来描述观测条件。 ### 解析方法 为了有效地解析`.obs`文件,在编程层面需执行如下操作: 1. **读取并理解文件头** - 提取出关于站名、仪器型号的关键字段。 - 记录下所使用的坐标系及时钟模型等相关设置。 2. **遍历观测数据区** - 对于每一组新的观测时间段,提取出精确的时间标记。 - 处理各个卫星的相关观测量,包括但不限于伪距、多普勒频移及信噪比(SNR)。 以下是利用 Python 进行基本 `.obs` 文件解析的一个简化版本代码片段: ```python def parse_obs_file(file_path): with open(file_path, 'r') as f: lines = f.readlines() header_info = {} observation_data = [] is_header_section = True for line in lines: stripped_line = line.strip() if not stripped_line or stripped_line.startswith('%'): continue if "END OF HEADER" in stripped_line.upper(): is_header_section = False continue if is_header_section: key_value_pair = stripped_line.split(':') if len(key_value_pair) >= 2: key = key_value_pair[0].strip().replace(' ', '_').lower() value = ':'.join(key_value_pair[1:]).strip() header_info[key] = value else: parts = stripped_line.split() epoch_time = { 'year': int(parts[0]), 'month': int(parts[1]), 'day': int(parts[2]), 'hour': int(parts[3]), 'minute': int(parts[4]), 'second': float(parts[5]) } num_sats = int(parts[-1]) satellites = [] start_index = 6 while start_index < len(parts)-num_sats*4+start_index: prn_id = int(parts[start_index]) lli = int(parts[start_index + 1]) snr = int(parts[start_index + 2]) pseudo_range = float(parts[start_index + 3]) satellite_entry = {'prn': prn_id, 'lli': lli, 'snr': snr, 'pseudo_range': pseudo_range} satellites.append(satellite_entry) start_index += 4 entry = dict(epoch=epoch_time, satellites=satellites) observation_data.append(entry) return header_info, observation_data ``` 此函数接受一个路径作为输入,并返回两个字典列表——一个是保存文件头部信息的对象;另一个则是按照时间序列组织起来的实际观测数据集。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值