工具推荐
首先为什么要使用git,因为可以追踪修改历史,方便了解整个算法的迭代过程;
为什么要使用vscode阅读代码,是因为 它真的很方便啊。
比如下图中,框中的部分就是用vscode查看某个commit指定文件的修改情况,一目了然。
具体vscode下载、配置、安装、使用等,请csdn自行查找博客。
其余代码逻辑
上节主要集中在tgd的修改,本节将继续讲解多频单点定位的开发工作。
为了和原始代码中计算残差的函数区别,新增了一个处理多频的伪距残差函数
rescode_mulfreq()
它与rescode的最大区别就是,在卫星循环的基础上,增加了频率循环。
for (i = *ns = 0; i < n && i < MAXOBS; i++){
for (freq_idx = 0; freq_idx < opt->nf; freq_idx++){
//logic
}
}
另外一个是关于电离层的改动,计算给定的频率的电离层,而不是特定的第一频点的延迟。
需要注意的是,计算的电离层都是GPS L1频点的延迟,因为默认使用的是GPS的电离层参数。
下图就是关于电离层修正的前后改动截图,其实就是将默认传入第一频率的code[0],改变为传入该频率的code[freq_idx]类型。
同时在配置文件中增加了SPP的新模式,即在prcopt_t结构体中增加了一个新的配置选项
并通过宏定义的方式,定义了单点定位的模式配置选项,如下:
#define SPP_MODE_L1 1 /*for single frequency*/
#define SPP_MODE_LX 2 /*for mul-frequency*/
#define SPP_MODE_LIF 3 /*for iono-free*/
并增加通过现有配置,进行单点定位模式设置的相关逻辑,主要逻辑如下
- 如果配置单频,配置文件中的电离层误差处理选项不能选择无电离层组合;
- 如果配置双频,电离层误差处理可选择使用模型或者使用无电离层组合;
- 如果配置三频,电离层暂时只允许选择使用模型进行修正。
- 当然,三频也可以使用双无电离层组合进行单点定位,但在本次开发中,不考虑这种情况。
spp_mode设置代码逻辑如下:
/* set spp mode ----------------------------------------------------------
* set the opt->spp_mode with the opt->mode and opt->ionoopt
*-----------------------------------------------------------------------------*/
extern int set_spp_mode(prcopt_t*opt){
if(opt->nf == 1){
opt->spp_mode = SPP_MODE_L1;
if(opt->ionoopt == IONOOPT_IFLC){
fprintf(stderr,"ionoopt not match spp mode\n");
return 1;
}
}
else if(opt->nf == 2){
if(opt->ionoopt == IONOOPT_IFLC){
opt->spp_mode =SPP_MODE_LIF;
}else{
opt->spp_mode = SPP_MODE_LX;
}
}
else{
opt->spp_mode = SPP_MODE_LX;
if(opt->ionoopt == IONOOPT_IFLC){
fprintf(stderr,"ionoopt not match spp mode\n");
return 1;
}
}
return 0;
}
在此commit前:
a5af554bebc4061872a850c4dc58f453a55725fa
我基于上面代码,将跑出来的结果放在了curtin_data文件夹下out.pos中,发现只有GPS的结果,虽然显示使用的卫星数很多,是因为代码设置卫星数目存在bug,实际只使用了GPS系统。
正好下节讲一下,如何利用rtklib的日志进行问题定位。
公众号
有时会将代码 或者资源放在个人公众号上,有问题,在公众号后台回复,也回答的比较快一些,欢迎关注 GNSS和自动驾驶。