整个代码还是根据rtklib进行改的,功能很完善,但是我主要只关注ppp/ins紧组合
代码链接
https://github.com/Erensu/ignav
代码功能
可以完成ppp和ins的紧组合,把conf文件中ins-tc改成2就行,这项是1的话就是ins和spp紧组合,3是ins和dgps紧组合,4是ins和rtk紧组合
主函数入口
app文件夹下的rtkrcv.cc是主函数入口
-o 后面是option file
INSTC_PPK这个模式表示的是ins and gnss tightly coupled mode: ppp-kinematic
紧组合流程涉及的主要函数及其调用关系
rtkrcv.cc文件:
con_open->con_thread这个线程是控制台线程,start, stop, shutdown都是这里输入
rtkrcv.cc文件的main进去->startsvr->rtksvrstart(这个函数属于rtksvr.cc文件)
rtksvr.cc文件:
rtksvrstart->rtksvrthread->pntpos是单点定位
rtksvrthread->decoderaw->input_raw->input_m39->decode_imu_m39->decode_imu_data(这里把imu的数据读进去了)
给的示例数据的imu是迈普时空m39型号,具体读取是以二进制的形式读取的
通过ignav结果输出的rslt文件的最后几列,把imu的数据改成euroc-imu,并修改inpstr5-format为=euroc-imu,但是读一会imu数据就卡住
修改如下:将euroc.cc文件中的extern int input_imu_euroc(raw_t *raw, unsigned char data)函数中的
raw->imu.time.time=(time_t)val[0];
raw->imu.time.sec =val[0]-(time_t)val[0];
改成
int gpsweek = val[0] / 604800;
double gpssec = val[0] - gpsweek * 604800;
gtime_t timunow = gpst2time(gpsweek,gpssec);
raw->imu.time = timunow;
具体原因就是imu时间戳读取出了问题,实际文件中是gpst,而原始代码直接给入(time_t)val[0]是错误的
但是改完之后好像原来m39的数据里的里程计信息损失了,导致结果计算无法fix了,感觉没了差分信息
改成euroc的imu数据形式:
之前m39的imu格式
rtksvrthread->tcigpos是紧组合核心函数
Conf文件解读
pos1-posmode选成PMODE_INS_TGNSS才是INS和GNSS的紧组合,ppp.cc中的pppos函数会判断opt->mode(也就是pos1-posmode),如果是PMODE_INS_TGNSS,那么tc变量置为1,这样x就选成rtk->ins.x,否则tc为0,x就是rtk->x,就是rtklib中的那个rtk->x
/* input stream path args------------------------------------------------------
* inpstr1-path: rover observation data file path
* inpstr2-path: base observation data file path
* inpstr3-path: correction data file path
* inpstr4-path: gnss position measurement data file path
* inpstr5-path: imu measurement raw data file path
* inpstr6-path: reserve
* inpstr7-path: dual-ants measurement data path
* ---------------------------------------------------------------------------*/
sp3精密星历文件和clk精密钟差文件在conf文件中是否输入?
紧组合代码运行bug调试
按照官方给的操作会出现下图这样的nan和inf的问题
解决方法:需要把ins.cc中的updateins函数里,变量domge初始化没有设置成0
紧组合代码解读
INS的update在e系下进行,具体代码见文件ins-gnss-tc.cc的!updateins(insopt,ins,imu)这一行,具体这一行实现了机械编排。
下面propinss(ins,insopt,ins->dt,ins->x,ins->P);是做了卡尔曼滤波状态预测,
下面info=rtkpos(rtk,obs,nu+nr,nav);是做卡尔曼滤波的量测更新。rtkpos函数就是rtklib更改而来,
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)