卫星端硬件延迟改正通常有两种做法:1、DCB文件改正 2、OSB文件改正(推荐)
下面推导北斗系统DCB改正公式(采用 CAS GFZ产品)
发布的精密星历和精密钟差产品BDS2和BDS3均采用B1I、B3I无电离层组合模型进行参数估计。
在传统的无电离层组合观测数据处理中,该项误差包含在钟差参数中,不需要单独考虑该误差。但是如果用户端不采用同样的无电离层组合,则必须对每个频率上的观测值进行DCB改正。所以对于BDS3 B1C和B2a等新频点无电离层组合,需要将卫星端硬件时延偏差考虑进去
1、无电离层组合
信号 | 频率 | BDS-2 | BDS-3 |
B1I | 1561.098 | C2I C2Q C2X | C2I C2Q C2X |
B2I | 1207.14 | C7I C7Q C7X | |
B3I | 1268.52 | C6I C6Q C6X | C6I C6Q C6X |
B1C | 1574.42 | C1D C1P C1X | |
B2a | 1176.45 | C5D C5P C5X | |
B2b | 1207.14 | C7D C7P C7Z | |
B2(B2a+B2b) | 1191.795 | C8D C8P C8X |
无电离层组合 | CAS | DLR |
B1I-B2I | C2I-C7I | C2I-C7I |
B1I-B3I | C2I-C6I | C2I-C6I |
B1I-B1C | C1X-C2I | |
B1I-B2a | C2I-C5X | |
B1I-B2b | C2I-C7Z | |
B1I-B2ab | C2I-C8X | |
B2I-B3I | ||
B3I-B1C | C1X-C6I/C1P-C6I | |
B3I-B2a | ||
B3I-B2b | ||
B3I-B2ab | ||
B1C-B2a | C1X-C5X/C1P-C5P | |
B1C-B2b | C1X-C7X | |
B1C-B2ab | C1X-C8X |
CAS、DLR提供不同种类的DCB产品
B1I、B2I、B3I、B1C、B2a、B2b、B2(B2a+B2b)分别对应f1、f2、f3、f4、f5、f6、f7、
北斗双频无电离层组合
以下为14种多频无电离层组合DCB改正:
B1I-B2I无电离层组合(CAS、DLR产品)
B1I-B1C无电离层组合(DLR产品)
B1I-B2a无电离层组合(DLR产品)
B1I-B2b无电离层组合(DLR产品)
B1I-B2ab无电离层组合(DLR产品)
B2I-B3I无电离层组合(CAS产品)
B1C-B3I无电离层组合 (CAS产品)
B3I-B2a无电离层组合(CAS产品)
B3I-B2b无电离层组合(CAS产品)
B3I-B2ab无电离层组合(CAS产品)
B1C-B2a无电离层组合(CAS产品)
B1C-B2b无电离层组合(CAS产品)
B1C-B2ab无电离层组合(CAS产品)
2、非差非组合
参考文献:李昕博士《多频率多星座GNSS快速精密定位关键技术研究 》
我选用第二种方法,通过差分码偏差产品进行改正。
OSB改正(推荐)
非常方便且同时配合UPD产品,以下是OSB文件读取程序
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <sstream>
#include<map>
struct OSBData {
string time1;
string time2;
double value;
double STD;
};
map<string,map<int,map<string, OSBData>>>readOSBData(const string& filename) {
map<string, map<int, map<string, OSBData>>>obscontainers;
map<int, map<string, OSBData>> obscontainer;
map<string, OSBData>obscontainer_;
ifstream file(filename);
if (!file.is_open()) {
std::cerr << "Failed to open file: " << filename << std::endl;
return {};
}
string line;
std::string system;
int prn;
std::string code;
std::string time1;
std::string time2;
double value;
double STD;
while (std::getline(file, line)) {
if (line.find("OSB ") != std::string::npos && line.find(" ns") != std::string::npos)
{
std::istringstream iss(line);
std::string item;
while (iss >> item) {
iss >> item;
iss >> item;
system = item.substr(0, 1);
prn = stoi(item.substr(1));
iss >> item;
code = item;
iss >> item;
time1 = item;
iss >> item;
time2 = item;
iss >> item;
iss >> item;
value = stod(item);
iss >> item;
STD = stod(item);
obscontainer_[code] = { time1, time2, value, STD };
obscontainer[prn] = obscontainer_;
obscontainers[system] = obscontainer;
}
}
}
file.close();
return obscontainers;
}
此程序很简单,还需要根据自己的程序修改读入的time1 time2,容器为:
“GNSS系统”[卫星号][code] .value or std;
由于本人水平有限,如果公式推导有误,请大家批评指正,目前重构PPP代码中,欢迎交流。