参考
https://blog.csdn.net/weixin_41341009/article/details/111225552
文章目录
一、预备知识
1、软件简介
开源论文:https://link.springer.com/article/10.1007/s10291-020-01070-2
开源代码:https://www.ngs.noaa.gov/gps-toolbox/GREAT-UPD.htm
代码下载地址2
GREAT 团队主页【iGMAS创新中心】:http://igmas.users.sgg.whu.edu.cn/home
系统频点:https://blog.csdn.net/Gou_Hailong/article/details/114849937
这款软件是武汉大学李星星教授团队在 GPS Solutions 所开源的一款估计相位小数偏差产品(Uncalibrated Phase Delays, UPD)的软件,并且还提供了配套的数据下载、软件调用、数据绘图分析的脚本。软件支持的系统和频点如下:
- 支持GPS, GLONASS, Galileo, BDS
- GPS
125
, GLO12
, GAL157
, BDS276
- 好像不支持北斗3
2、基本原理
参考文献
[1]李星星. GNSS精密单点定位及非差模糊度快速确定方法研究[D].武汉大学,2013.
UPD
全称为Uncalibrated Phase Delays,未校准的相位硬件延迟。在PPP解算中,UPD会被模糊度吸收,从而导致模糊度失去了整周特性。
关于恢复模糊度整数特性的的方法有三种:
- UPD分离:将卫星端 UPD 估计出来,然后浮点模糊度减去UPD就可恢复整数特性。
- 整数钟:估计吸收UPD的卫星钟差,UPD被钟差吸收,钟差被扣掉后,就可以实现模糊度整数特性的恢复。
- 钟差去耦:分别对伪距的钟差和载波相位的钟差进行了精确估计, 将伪距和载波相位的硬件延迟偏差与模糊度进行分离,成功实现了非差模糊度的正确固定。
GREAT-UPD 使用的就是第一种方法,下面给出IF组合计算EWL, WL, NL
的公式
二、实操笔记
首先来看一下软件包中都有什么:
├─bin
│ ├─Linux
│ ├─Macintosh
│ └─Windows
├─doc
│ └─UPD_config
├─sample data
│ └─UPD_2020001
│ ├─ambflag
│ ├─ambflag23
│ ├─ambupd
│ ├─gnss
│ ├─obs
│ ├─result
│ └─XML
├─src
│ ├─app
│ ├─LibGnut
│ │ ├─gall
│ │ ├─gcoders
│ │ ├─gdata
│ │ ├─gio
│ │ ├─gmodels
│ │ ├─gset
│ │ ├─gutils
│ │ └─pugixml
│ │ └─src
│ ├─LibMat
│ │ ├─gutils
│ │ └─newmat
│ └─LibUPD
│ ├─gall
│ ├─gambfix
│ ├─gcoders
│ ├─gdata
│ ├─gproc
│ ├─gset
│ └─gutils
└─util
├─batch_process
│ └─__pycache__
├─PreEdit
│ ├─Linux
│ ├─Macintosh
│ ├─PreEdit_config
│ ├─PreEdit_sample
│ │ ├─2020
│ │ │ └─001
│ │ └─2020001
│ │ └─ambflag
│ └─Windows
└─upd_analysis
├─NL&EWL_epoch
├─upd_res
└─WL&EWL
- bin:这里面是一些可执行程序,在不同的平台下提供了相应的版本,支持的平台有
linux, Macintosh, windows
- doc:这里面有一些配置文件的示例和帮助文档
GREAT-UPD_1.0.pdf
- sample data:这里面是一个算例,时间是2020年DOY01的
- src:估计UPD的源码
- util:一些脚本和工具,注意
PreEdit
是一个周跳探测的小工具
如果想要详细研究UPD估计的代码的话,需要按照帮助文档GREAT-UPD_1.0.pdf
第3章Installation
来进行软件的安装并仔细阅读和调试,由于时间成本比较大,暂且不论。如果只把这个软件当作一个小工具使用的话,只需要搞懂util
中的脚本并且会调用bin
中的可执行程序即可。
PS: 在看下面的内容之前,笔者建议读者先通读一边帮助文档,并且着重看一下附录中的文件结构和内容。
1、数据下载
GPS广播星历和精密星历的下载:https://blog.csdn.net/Gou_Hailong/article/details/100809806
CDDIS网站下 GNSS 相关的数据产品下载:https://blog.csdn.net/Gou_Hailong/article/details/109191352
数据下载的脚本在./util/batch_process
目录下,先进去
1 下载DCB
# 看看怎么用的
python3 download_dcb.py -h
---------------------------------------
Purpose: Download CODE DCB Files
Usage: python dcb_download.py -y <year> -d <doy> -l <length> --dst=<dst>
-y Year
-d Day of Year
-l Length of Days
--dst= Directory of DCB Files
-h|--help Help Information
注意:帮助里面文件名给错了,应该是download_dcb.py
,而不是dcb_download.py
,使用示例:
./download_dcb.py -y 2022 -d 2 -l 2 --dst=./tmp
-----------------------------------
最后下载的文件有:
ls tmp
P1C12201.DCB P1P22201.DCB P2C22201_RINEX.DCB
这个下载的是CODE的DCB,它是一个月给一个值,并且里面只含有GPS
和GLONASS
系统的DCB。
2 下载观测文件
# 看看怎么用的
python3 download_obs.py -h
---------------------------------------
Purpose: Download GNSS Observation Files <priority: MGEX, then IGS>
Usage: python obs_download.py -y <year> -d <doy> -l <length> --dst=<dst> --site=<site_list_file>
-y Year
-d Day of Year
-l Length of Days
--dst= Directory of Obs Files
--site= Site List
-h|--help Help Information
注意上边帮助信息的文件名也写错了,这个要比DCB要多一个参数--site
,下面创建一个测站列表文件
site_list_test
---------------------------------------
abpo
abmf
下面是使用示例:
python3 download_obs.py -y 2022 -d 2 -l 1 --dst=./tmp --site=site_list_test
运行上面的示例之后,可以发现没有反应,这是因为脚本用的是cddis.gsfc.nasa.gov
的ftp
源,但是cddis在2020年10月31日宣布了暂停ftp匿名服务(上面两个链接有介绍文件路径,可参看),所以不能使用了。解决方法是,换成武大ftp
源,可以将download_obs.py
文件中
# 第21行
CDDIS_DOMAIN = "cddis.gsfc.nasa.gov"
# 替换为
CDDIS_DOMAIN = "igs.gnsswhu.cn"
# 再次调用脚本
python3 download_obs.py -y 2022 -d 2 -l 1 --dst=./tmp --site=site_list_test
# 然后就可以下载到观测文件了!
ls tmp/2022/002/
abmf0020.22o abpo0020.22o
3 下载导航电文文件
# 看看怎么用的
python3 download_nav.py -h
---------------------------------------
Purpose: Download GNSS Navigation Files
Usage: python nav_download.py -y <year> -d <doy> -l <length> --dst=<dst>
-y Year
-d Day of Year
-l Length of Days
--dst= Directory of Nav Files
-h|--help Help Information
注意帮助里面的文件名写错了,这个使用的也是cddis的ftp源,将download_nav.py
文件
# 第22行
CDDIS_DOMAIN = "cddis.gsfc.nasa.gov"
# 替换为
CDDIS_DOMAIN = "igs.gnsswhu.cn"
# 另外由于 whu 和 cddis 关于导航电文的文件路径不同,所以要复杂一些
# 第82行下面加一行
str_nav_m = f"BRDM00DLR_S_{new_year:04}{new_doy:03}0000_01D_MN.rnx.gz"
# 第92行删除,改成下面两行
gnss_tools.ftp_download(CDDIS_DOMAIN,f"/pub/gps/data/daily/{new_year:04}/brdc",str_daily_dst,str_nav_p)
gnss_tools.ftp_download(CDDIS_DOMAIN,f"/pub/gps/data/daily/{new_year:04}/brdc",str_daily_dst,str_nav_m)
# 另外将所有的 .*Z 替换为 *.gz, 运行下面的指令
python3 ./download_nav.py -y 2022 -d 2 -l 1 --dst=./tmp
# 然后就可以下载到导航电文了!
---------------------------------------
ls tmp/2022/002/
brdc0020.22g brdc0020.22n BRDM00DLR_S_20220020000_01D_MN.rnx
2、数据预处理
准备好所需要的文件
- 观测o文件
- DCB文件
- 导航电文文件,我一般用长文件名
BRDM00DLR_S_20220020000_01D_MN.rnx
,并把文件名改成brdm0020.22p
数据预处理就是使用软件包自带的小工具PreEdit
来进行周跳探测,笔者是在linux 系统下测试的,所以首先需要让其可执行
cd ./util/PreEdit/Linux
chmod +x GREAT-PreEdit
# 看看怎么用的
export LD_LIBRARY_PATH=./
./GREAT-PreEdit -h
---------------------------------------
GREAT/TURBOEDIT [0.9.0] compiled: Aug 5 2020 16:13:12 ($Rev: 2448 $)
Usage:
-h|--help .. this help
-V int .. version
-v int .. verbosity level
-x file .. configuration input file
-- .. configuration from stdinp
-l file .. log output file
-X .. output default configuration in XML
可以看到,直接调用小工具的话,后面跟-x cfg_xx.xml -l logfile.log
即可,配置文件的配置可以参看帮助文档中附录,或者样例里面的xml
文件。更重要的是,软件包中还提供了自己生成配置文件的脚本,在linux
平台下的调用方法是
Linux:
export LD_LIBRARY_PATH=../Linux
python ../../batch_process/PreEdit.py -c PreEdit_Linux.ini
python ../../batch_process/PreEdit.py --config=PreEdit_Linux.ini
值得注意的是,需要首先将*.ini
文件中的各项给出准确的值:像路径,最好给绝对路径(默认是在./util/PreEdit/PreEdit_sample
路径下调用的脚本),然后时间、测站列表、工作路径、原始数据路径都要给出。
ps: 个人感觉这个脚本很鸡肋,因为无论如何都要更改配置,还不如直接改xml的配置,但是如果再对脚本进行一些扩充,将其改成可以批量生成
xml
并运行程序的脚本,那这个脚本的意义就很大了。
3、UPD估计
在进行UPD估计之前,首先要准备好所需文件
- 观测o文件
- DCB文件
- ambflag周跳文件:数据预处理得到
- 导航电文
p
文件 - ambupd浮点模糊度文件:这个文件需要自己生成,就是做一个PPP,将浮点模糊度存起来,文件内容结构参见附录。ps: 这个没有专业知识和代码的话,生成起来确实有些困难。
- ifcb文件:如果要估计EWL UPD的话,需要估计 GPS 的 IFCB,并且需要23频的周跳文件
ambflg23
,这个文件也要自己生成。
UPD估计的可执行文件路径为
./bin/Linux
chmod +x GREAT-UPD # 令其可执行
# 看看怎么用的
export LD_LIBRARY_PATH=./
./GREAT-UPD -h
---------------------------------------
GREAT/UPD [0.9.0] compiled: Aug 5 2020 15:57:06 ($Rev: 2448 $)
Usage:
-h|--help .. this help
-V int .. version
-v int .. verbosity level
-x file .. configuration input file
-- .. configuration from stdinp
-l file .. log output file
-X .. output default configuration in XML
可以看到,直接调用小工具的话,后面跟-x cfg_xx.xml -l logfile.log
即可,配置文件的配置可以参看帮助文档中附录,或者样例里面的xml
文件。
三、算例的运行
为了更清晰的表达脚本的调用方法,这里举一个例子,就一起来把软件包中的算例给跑一下吧。首先算例所在目录为sample data/UPD_2020001
,为了不“污染”原始算例,先在./sample data/
目录下建个副本,取个名字叫UPD_2020001m
,将必要的文件拷进去,文件中要有
ambupd gnss obs site_list upd_Linux.ini
就相当于,现在已经下载好了数据,并且准备好了所需的ambupd
和ifcb
文件。下面在linux
下进行数据预处理和UPD估计,其他系统操作类似。
另外,文件夹中有空格会很烦,所以将sample data
文件夹改名为sample_data
1、数据预处理
下面就要做数据预处理——周跳探测
cd ./util/PreEdit/PreEdit_sample # 进入数据预处理配置文件所在路径
cp PreEdit_Linux.ini PreEdit_Linuxm.ini # 防止原始文件被污染,下面改 PreEdit_Linuxm.ini 文件
1 12频周跳探测
然后将PreEdit_Linuxm.ini
内容改为
[project]
ymd_beg = 2020-01-01
ymd_end = 2020-01-01
hms_beg = 00:00:00
hms_end = 23:55:0
satsys = GREC
sitelist = ./site_list
interval = 30
ref_xml = ../PreEdit_config/PreEdit12.xml
work_dir = ../../../sample_data/UPD_2020001m
software = ../Linux/GREAT-PreEdit
[process]
minimum_elev = 7
[data]
nav_dir = ../../../sample_data/UPD_2020001m/gnss
obs_dir = ../../../sample_data/UPD_2020001m/obs
ambflag_dir = ../../../sample_data/UPD_2020001m/ambflag
这个目录下的site_list
文件中,只有两个测站,为了多对一些测站进行周跳探测进而后续利用这些测站进行UPD估计,我们用./sample_data/UPD_2020001m/site_list
将其替换掉。接着逐次运行下面的指令
# 所在目录为 ./util/PreEdit/PreEdit_sample
export LD_LIBRARY_PATH=../Linux
python ../../batch_process/PreEdit.py -c PreEdit_Linuxm.ini
等一会就会在路径../../../sample_data/UPD_2020001m/ambflag
下生成周跳文件
1 23频周跳探测
依次运行下面的指令
cp PreEdit_Linuxm.ini PreEdit_Linuxm2.ini
然后将PreEdit_Linuxm2.ini
文件内容改为
[project]
ymd_beg = 2020-01-01
ymd_end = 2020-01-01
hms_beg = 00:00:00
hms_end = 23:55:0
satsys = GREC
sitelist = ./site_list
interval = 30
ref_xml = ../PreEdit_config/PreEdit23.xml
work_dir = ../../../sample_data/UPD_2020001m
software = ../Linux/GREAT-PreEdit
[process]
minimum_elev = 7
[data]
nav_dir = ../../../sample_data/UPD_2020001m/gnss
obs_dir = ../../../sample_data/UPD_2020001m/obs
ambflag_dir = ../../../sample_data/UPD_2020001m/ambflag23
然后运行
# 所在目录为 ./util/PreEdit/PreEdit_sample
python ../../batch_process/PreEdit.py -c PreEdit_Linuxm2.ini
通过上面的操作,我们已经生成了12频和23频的周跳文件
ambflag
ambflag23
2、UPD 估计
下面进入路径./sample_data/UPD_2020001m
,然后我们现在有的数据:
ls
------------------------------------
ambflag ambflag23 ambupd gnss obs PreEdit.xml site_list upd_Linux.ini
------------------------------------
cp upd_Linux.ini upd_Linux1.ini # 备份原 config 文件
1 WL & NL UPD
然后修改upd_Linux1.ini
文件的内容如下:
[project]
; Begin Time: Year-Mon-Day
ymd_beg = 2020-01-01
ymd_end = 2020-01-01
hms_beg = 00:00:00
hms_end = 23:59:30
satsys = G
sitelist = ./site_list
interval = 30
work_dir = .
software = ../../bin/Linux/GREAT-UPD
[process]
; UPD Mode : WL or NL or EWL or EWL_EPOCH or WL+NL[first WL, then NL]
upd_mode = WL+NL
sat_rm = G04
[data]
; File Directory
dcb_dir = ./gnss
nav_dir = ./gnss
obs_dir = ./obs
upd_dir = .
ifcb_dir =
ambflag_dir = ./ambflag
ambupd_dir = ./ambupd
接着运行程序
python ../../util/batch_process/upd.py -c upd_Linux1.ini
过一会就会生成 WL, NL
upd 文件
2 EWL UPD
cp upd_Linux1.ini upd_Linux2.ini
修改upd_Linux2.ini
的文件内容如下:
[project]
; Begin Time: Year-Mon-Day
ymd_beg = 2020-01-01
ymd_end = 2020-01-01
hms_beg = 00:00:00
hms_end = 23:59:30
satsys = G
sitelist = ./site_list
interval = 30
work_dir = .
software = ../../bin/Linux/GREAT-UPD
[process]
; UPD Mode : WL or NL or EWL or EWL_EPOCH or WL+NL[first WL, then NL]
upd_mode = EWL
sat_rm = G04
[data]
; File Directory
dcb_dir = ./gnss
nav_dir = ./gnss
obs_dir = ./obs
upd_dir = .
ifcb_dir = ./gnss
ambflag_dir = ./ambflag23
ambupd_dir = ./ambupd
然后运行指令
python ../../util/batch_process/upd.py -c upd_Linux2.ini
最后就生成 EWL UPD 了。
注意:这只是GPS系统UPD产品的生成,其他系统只需更改satsys = G
即可!
ps:
1、目前笔者只会估计单天的UPD,不知可不可以进行多天 UPD 的批量生成
2、关于 ambupd 文件和 ifcb 文件的生成,笔者还未知,所以只会跑所给算例,如果知道这两种文件的生成方式,那么就可以模仿所给算例生成其他天的 UPD。
3、脚本目前还不太智能,因为需要手动配置ini文件,后面如果可以扩充一下,改成批量自动配置ini文件,然后再调用程序就好了。