GAMP是我精密单点定位学习之旅上最好的老师
这篇博客将介绍我在GAMP上学到的知识和踩过的坑。
1、数据下载
GAMP对于文件的命名格式是有要求的,我们常用的文件下载方式主要是GAMPII和FAST
1、对于我个人来说更喜欢用FAST的下载观测文件o、导航文件n/p、北斗的DCB文件,下载的混合nav文件,要把brdc改为brdm才可以用,不然有时会显示没有nav文件。
2、其余的文件我一般用GAMPII进行下载,省去了文件命名的问题。
2、提高GAMP北斗系统精度
GAMP程序在2018年发布,所以使用最近的北斗的文件会出现很多问题,no valid obs / 定位结果较差/无法收敛。下图就是用gamp程序测试北斗动态PPP与我最近修改后的结果。
(这个图RMS值是错的)
3、如何提高GAMP北斗精度
1、将北斗二系统与北斗三系统分开
2、北斗二系统与北斗三系统间实现ISB(目前我还未实现)
3、增加多频点,至少满足用B1 B3频点进行定位,增加B2a B2b
4、增加频点与信道的选择,rtklib在2020之后的版本加入了sat2freq方便选择频点与频率的优先级
4、程序简单修改
1、MAXPRNCMP 调整为61
2、Obsscan_PPP
因为北斗B1 B3 是存到obs[i].L[0]、 obs[i].L[2]
3、修改readantex
4、频率修改(这个根据个人选择)
以下这几个位置需要改正
因为GAMP有些程序是定死的,常用 lam[0] lam[1],我们需要根据自己简单修改一下。
非差非组合选频
gfmeas
udiono_ppp
ppp_res
5、更改下gamp pos的输出格式
double pos[3], dms1[3], dms2[3], P[9], Q[9], dxyz[3], denu[3];
const char* sep = opt2sep(opt);
char* p = (char*)buff, c;
int i;
for (i = 0; i < 3; i++)
dxyz[i] = denu[i] = 0.0;
ecef2pos(sol->rr, pos);
soltocov(sol, P);
covenu(pos, P, Q);
//if (opt->height == 1) { /* geodetic height */
// pos[2] -= geoidh(pos);
}
if (opt->degf) {
deg2dms(pos[0] * R2D, dms1, 5);
deg2dms(pos[1] * R2D, dms2, 5);
p += sprintf(p, "%s%s%4.0f%s%02.0f%s%08.5f%s%4.0f%s%02.0f%s%08.5f", s, sep,
dms1[0], sep, dms1[1], sep, dms1[2], sep, dms2[0], sep, dms2[1], sep,
dms2[2]);
}
else
p += sprintf(p, "%s%s%14.9f%s%14.9f", s, sep, pos[0] * R2D, sep, pos[1] * R2D);
p += sprintf(p, "%s%11.4f%s%14.4f%s%14.4f%s%14.4f", sep, pos[2], sep, sol->rr[0], sep, sol->rr[1], sep, sol->rr[2]);
p += sprintf(p, "%s%20.12e%s%20.12e", sep, sol->dtr[0], sep, sol->dtr[1]);
//
if (0.0 == PPP_Glo.crdTrue[0])
ecef2pos(sol->rr, pos);
else
ecef2pos(PPP_Glo.crdTrue, pos);
for (i = 0; i < 3; i++)
denu[i] = sol->rr[i + 3];
ecef2enu(pos, sol->rr + 3, denu);
p += sprintf(p, "%s%10.4f%s%10.4f%s%10.4f", sep, denu[0], sep, denu[1], sep, denu[2]);
p += sprintf(p, "%s%2d%s%2d%s%2d%s%2d", sep, sol->ns[0], sep, sol->ns[1], sep, sol->ns[2], sep, sol->ns[3]);
if (0.0 == PPP_Glo.crdTrue[0])
denu[0] = denu[1] = denu[2] = 0.0;
else {
ecef2pos(PPP_Glo.crdTrue, pos);
for (i = 0; i < 3; i++)
denu[i] = dxyz[i] = sol->rr[i] - PPP_Glo.crdTrue[i];
ecef2enu(pos, dxyz, denu);
}
p += sprintf(p, "%s%8.4f%s%8.4f%s%8.4f%s%8.4f", sep, denu[0], sep, denu[1], sep, denu[2], sep, norm(denu, 3));
p += sprintf(p, "\n");
return p - (char*)buff;
今天就先介绍这,后面将继续介绍如何修改clk与isb