当前位置:网站首页>rtklib2.4.3 b34 单点定位的一个bug
rtklib2.4.3 b34 单点定位的一个bug
2022-06-23 03:53:00 【奔跑的橘子】
单点定位部分的一个问题
这是一个本次更新引入的新问题,以前是没有的,如下图:
- 如果没有对代码重新编译则不会遇到本文将要提到的问题,因为release版本的程序是不会有问题的
- 如果对代码进行debug,那么也不会遇到这个问题
- 如果尝试直接运行debug版本的程序,那么大概率会出现此问题

老生常谈的root cause
这个issue是由局部变量没有初始化引起的,因此想要fix这个issue也很简单,只要将这四个变量dion,dtrp,vmeas,vion,vtrp初始化即可。从算法角度讲,这四个变量只有在第一次迭代的时候不会初始化,所以我们将其初始化为0.
static int rescode(int iter, const obsd_t *obs, int n, const double *rs,
...
{
gtime_t time;
double r,freq,dion,dtrp,vmeas,vion,vtrp,rr[3],pos[3],dtr,e[3],P;
...
if (iter>0) {
// 这里计算电离层 对流程延迟及方差
}
/* pseudorange residual */
v[nv]=P-(r+dtr-CLIGHT*dts[i*2]+dion+dtrp); // this is line 306
...
}
从代码角度讲,这段代码有两个地方对我们普通开发者来说不太好(代码是大神写的嘛,大神可以随便写)。这两个地方都很老生常谈,只要有一个地方注意了,就不会产生这个issue.
- 局部变量没有初始化,何止局部变量,一切变量都是要初始化的,这真的是一个非常好的习惯
if没有else。可能在以下两种情况下else没有任何意义。
–if(true),ture也可能是表达式等等,无论何种考虑出现了这种情况,反正他出现了
–else中不需要做任何事情。
以上两种情况,写不写else对程序执行来说没有任何区别。但是对避错和阅读代码来说区别很大。因为只要写了else就证明了代码的作者考虑了else这个情况,这是一种刻意行为。所以此时的else建议写成如下形式,
if(...) {
//...
} else {
NULL; // REMINDER!:do nothing on purpose
}
亦或是如下形式也是可以接受的,
if(...) {
//...
} else {
} // REMINDER!:do nothing on purpose
为何如此修改
那么作者为何做了如下修改呢?道理很简单,我们看一下代码,这个if里做了以下四件事,而这些都是与接收机位置有关的量。虽然这个位置不需要很准,概略坐标就够了。但是我们知道在pvt解算时,初始位置是不知道的,这里计算这些量没有任何意义,且计算的结果是错的,起了副作用,还不如不算。这个改动不仅节省了CPU,个人猜测还会提高迭代效率。
- 仰角mask
- SNR mask
- 电离层延迟计算
- 对流层延迟计算
if (iter>0) {
/* test elevation mask */
if (satazel(pos,e,azel+i*2)<opt->elmin) continue;
/* test SNR mask */
if (!snrmask(obs+i,azel+i*2,opt)) continue;
/* ionospheric correction */
if (!ionocorr(time,nav,sat,pos,azel+i*2,opt->ionoopt,&dion,&vion)) {
continue;
}
if ((freq=sat2freq(sat,obs[i].code[0],nav))==0.0) continue;
dion*=SQR(FREQ1/freq);
vion*=SQR(FREQ1/freq);
/* tropospheric correction */
if (!tropcorr(time,nav,pos,azel+i*2,opt->tropopt,&dtrp,&vtrp)) {
continue;
}
}
于是改动
于是,fix的方法也就水到渠成了,大概下边这样改,
dion = 0; dtrp = 0; vion = 0; vtrp = 0;
for (i=*ns=0;i<n&&i<MAXOBS;i++) {
或者如此,
if (iter>0) {
// 这里计算电离层 对流程延迟及方差
} else {
dion = 0; dtrp = 0; vion = 0; vtrp = 0;
}
边栏推荐
- Usage of API interface test ------ post
- dolphinscheduler海豚调度升级代码改造-UpgradeDolphinScheduler
- OGNL Object-Graph Navigation Language
- 【OFDM通信】基于matlab OFDM多用户资源分配仿真【含Matlab源码 1902期】
- ICER skill 02makefile script self running VCs simulation
- ApiPost接口测试的用法之------Post
- Abnova liquidcell negative enrichment cell separation and recovery system
- Amazing tips for using live chat to drive business sales
- Abnova fluorescent dye 555-c3 maleimide scheme
- Kail infiltration basic literacy basic command
猜你喜欢

Win10 view my Ini path

《微信小程序-基础篇》带你了解小程序的路由系统(二)
![[graph theory] - bipartite graph](/img/2d/999820edafe7294440cf1873a26084.png)
[graph theory] - bipartite graph

【图像融合】基于非凸罚分的稀疏正则化实现图像融合附matlab代码

Dolphin scheduler 2.0.5 task test (spark task) reported an error: container exited with a non zero exit code 1

ApiPost接口测试的用法之------Post

Static two position relay xjls-84/440/dc220v

Abnova PSMA bead solution

Current relay jdl-1002a

Can bus Basics
随机推荐
ICER skills 03design compile
Abnova fluorescent dye 555-c3 maleimide scheme
2022 simulated examination question bank and answers for safety management personnel of metal and nonmetal mines (open pit mines)
openwrt目录结构
Flask基础:环境搭建+配置+URL与试图之间的映射+重定向+数据库连接
PaddlePaddle模型服务化部署,重新启动pipeline后出现报错,trt报错
Function declaration and call of 17 generator
Chrome debugging tips
微信小程序实例开发:跑起来
传统意义上的互联网式的平台或将不复存在,一个融合的产业特质和互联网特质的全新产业
怎样利用数据讲一个精彩故事?
395. redundant path
如何更好地组织最小 WEB API 代码结构
1183. electricity
Banner banner
396. mine site construction
ApiPost接口测试的用法之------Post
微信小程序:全新趣味测试
Shadertoy基础教学02、画笑脸
Alkylation process test questions and simulation test in 2022