规范程序变量命名,针对rtk/ins与spp/ins情况做出却别。
This commit is contained in:
parent
82435740dc
commit
2d3d98f091
@ -51,17 +51,59 @@ extern void rt_insopt_init(insopt_t *insopt){
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
/* index if position */
|
||||
/* get number of phase bias */
|
||||
extern int xnB(const insopt_t *insopt){
|
||||
return ((insopt)->gopt?((prcopt_t*)(insopt)->gopt)->mode==PMODE_INS_TGNSS
|
||||
&&(insopt)->tc==INSTC_RTK?(MAXSAT*xnIF(insopt)):0:0);
|
||||
}
|
||||
/* numebr of observation data frequency */
|
||||
extern int xnIF(const insopt_t *insopt) {
|
||||
return ((insopt)->gopt?((prcopt_t*)(insopt)->gopt)->ionoopt==IONOOPT_IFLC?1:
|
||||
((prcopt_t*)insopt->gopt)->nf:0);
|
||||
}
|
||||
/* get number of all states */
|
||||
extern int xnX(const insopt_t *insopt) {
|
||||
switch (insopt->tc) {
|
||||
case INSTC_RTK:
|
||||
return xnP(insopt)+ xnV(insopt)+ xnA(insopt)+ xnBa(insopt)+xnBg(insopt)+xnB(insopt);
|
||||
case INSTC_SINGLE:
|
||||
xnP(insopt)+ xnV(insopt)+ xnA(insopt)+ xnBa(insopt)+xnBg(insopt)+xnRb(insopt)+xnRd(insopt);
|
||||
}
|
||||
}
|
||||
/* get number of position */
|
||||
extern int xnP(const insopt_t *insopt) {return 3;}
|
||||
/* get number of velocity */
|
||||
extern int xnV(const insopt_t *insopt) {return 3;}
|
||||
/* get number of attitude */
|
||||
extern int xnA(const insopt_t *insopt) {return 3;}
|
||||
/* get number of acc bias */
|
||||
extern int xnBa(const insopt_t *insopt){return 3;}
|
||||
/* get number of gyro bias */
|
||||
extern int xnBg(const insopt_t *insopt){return 3;}
|
||||
/* get numebr of receiver clk bias */
|
||||
extern int xnRb(const insopt_t *insopt){
|
||||
return ((insopt)->gopt?((prcopt_t*)(insopt)->gopt)->mode==PMODE_INS_TGNSS
|
||||
&&(insopt)->tc<=INSTC_RTK?3:0:0);
|
||||
}
|
||||
/* get numer of receiver clk drift */
|
||||
extern int xnRd(const insopt_t *insopt){
|
||||
return ((insopt)->gopt?((prcopt_t*)(insopt)->gopt)->mode==PMODE_INS_TGNSS
|
||||
&&(insopt)->tc<=INSTC_RTK?3:0:0);
|
||||
}
|
||||
/* index of position */
|
||||
extern int xiP(const insopt_t *insopt) {return 6;}
|
||||
/* index if velocity */
|
||||
/* index of velocity */
|
||||
extern int xiV(const insopt_t *insopt) {return 3;}
|
||||
/* index if attitude */
|
||||
/* index of attitude */
|
||||
extern int xiA(const insopt_t *insopt) {return 0;}
|
||||
/* index if acc bias */
|
||||
/* index of acc bias */
|
||||
extern int xiBa(const insopt_t *insopt) {return 9;}
|
||||
/* index if gyro bias */
|
||||
/* index of gyro bias */
|
||||
extern int xiBg(const insopt_t *insopt) {return 12;}
|
||||
/* index of receiver clk bias */
|
||||
extern int xiRb(const insopt_t *insopt) {return 15;}
|
||||
/* index of receiver clk drift */
|
||||
extern int xiRd(const insopt_t *insopt) {return 18;}
|
||||
/* system noise covariance matrix--------------------------------------------*/
|
||||
static void sysQ(int is,int n,int nx,double v,double dt,double *Q)
|
||||
{
|
||||
@ -241,12 +283,15 @@ static void stochasticPhi(int ix,int nix,int nx,double dt,double *phi)
|
||||
/* determine transition matrix(first-order approx: Phi=I+F*dt)---------------*/
|
||||
static void getPhi1(const int nx, double dt, const double *Cbe,
|
||||
const double *pos, const double *omgb, const double *fib,
|
||||
double *phi) {
|
||||
double *phi,const insopt_t *insopt)
|
||||
{
|
||||
int i, j;
|
||||
double omega[3] = {0}, T[9], ge[3], re, rn[3], Cbv[9];
|
||||
double W2[9];
|
||||
int index_att = 0,num_att=3,index_bg=12,num_bg=3,index_vel=3,num_vel=3,index_pos=6,num_pos=3;
|
||||
int index_ba=9,num_ba=3,index_clk=15,num_clk=3,index_dtrr=18;
|
||||
int index_att = xiA(insopt),num_att=xnA(insopt),index_bg=xiBg(insopt),num_bg=xnBg(insopt);
|
||||
int index_vel= xiV(insopt),num_vel= xnV(insopt),index_pos= xiP(insopt),num_pos= xnP(insopt);
|
||||
int index_ba= xiBa(insopt),num_ba= xnBa(insopt),index_clk= xiRb(insopt),num_clk= xnRb(insopt);
|
||||
int index_dtrr= xiRd(insopt),num_dtrr= xnRd(insopt);
|
||||
|
||||
// trace(3, "getPhi1:\n");
|
||||
|
||||
@ -282,10 +327,10 @@ static void getPhi1(const int nx, double dt, const double *Cbe,
|
||||
}
|
||||
|
||||
/* clk */
|
||||
if(nx>15){
|
||||
phi[index_clk+0+(index_dtrr+0)*nx]=dt;
|
||||
phi[index_clk+1+(index_dtrr+1)*nx]=dt;
|
||||
phi[index_clk+2+(index_dtrr+2)*nx]=dt;
|
||||
if(insopt->tc==INSTC_SINGLE){
|
||||
for(i=0;i<num_dtrr;i++){
|
||||
phi[index_clk+i+(index_dtrr+i)*nx]=dt;
|
||||
}
|
||||
}
|
||||
|
||||
stochasticPhi(index_ba,num_ba,nx,dt,phi);
|
||||
@ -300,14 +345,18 @@ static void getQ(const insopt_t *insopt,double dt,double* Q,const int nx)
|
||||
trace(3,"too large time difference of ins and gnss measurements\n");
|
||||
}
|
||||
setzero(Q,nx,nx);
|
||||
int index_att = xiA(insopt),num_att=xnA(insopt),index_bg=xiBg(insopt),num_bg=xnBg(insopt);
|
||||
int index_vel= xiV(insopt),num_vel= xnV(insopt);
|
||||
int index_ba= xiBa(insopt),num_ba= xnBa(insopt),index_clk= xiRb(insopt),num_clk= xnRb(insopt);
|
||||
int index_dtrr= xiRd(insopt),num_dtrr= xnRd(insopt);
|
||||
|
||||
sysQ(0,3,nx,insopt->gyro_noise_PSD ,dt,Q);
|
||||
sysQ(3,3,nx,insopt->accel_noise_PSD,dt,Q);
|
||||
sysQ(9,3,nx,insopt->accel_bias_PSD,dt,Q);
|
||||
sysQ(12,3,nx,insopt->gyro_bias_PSD,dt,Q);
|
||||
if(nx>15){
|
||||
sysQ(15,3,nx,insopt->clock_phase_PSD ,dt,Q);
|
||||
sysQ(18,3,nx,insopt->clock_freq_PSD ,dt,Q);
|
||||
sysQ(index_att,num_att,nx,insopt->gyro_noise_PSD ,dt,Q);
|
||||
sysQ(index_vel,num_vel,nx,insopt->accel_noise_PSD,dt,Q);
|
||||
sysQ(index_ba,num_ba,nx,insopt->accel_bias_PSD,dt,Q);
|
||||
sysQ(index_bg,num_bg,nx,insopt->gyro_bias_PSD,dt,Q);
|
||||
if(insopt->tc==INSTC_SINGLE){
|
||||
sysQ(index_clk,num_clk,nx,insopt->clock_phase_PSD ,dt,Q);
|
||||
sysQ(index_dtrr,num_dtrr,nx,insopt->clock_freq_PSD ,dt,Q);
|
||||
}
|
||||
}
|
||||
static void setQ(const insopt_t *insopt,const double dt, const int nx, double *Q,const int upd){
|
||||
@ -350,7 +399,8 @@ static void propP(const insopt_t *insopt,const double *Q,const double *phi,
|
||||
}
|
||||
/* initialize every epoch for clock (white noise) */
|
||||
// initP(15,3,nx,3000,UNC_CLK,P);
|
||||
free(PQ); free(Phi2);
|
||||
free(PQ);
|
||||
free(Phi2);
|
||||
}
|
||||
/* propagate state estimates noting that all states are zero due to closed-loop
|
||||
* correction----------------------------------------------------------------*/
|
||||
@ -364,11 +414,11 @@ static void updstat(const insopt_t *insopt,ins_t *ins,const double dt,
|
||||
const double *x0,const double *P0,double *phi,double *P,
|
||||
double *x,double *Q,const int upd)
|
||||
{
|
||||
int nx = ins->nx;
|
||||
int nx = xnX(insopt);
|
||||
// setphi(ins->Cbe,ins->fb,ins->position,dt,phi,nx);
|
||||
// setQ(insopt,dt,nx,Q,upd);
|
||||
|
||||
getPhi1(nx,dt,ins->Cbe,ins->position,ins->omgb,ins->fb,phi);
|
||||
getPhi1(nx,dt,ins->Cbe,ins->position,ins->omgb,ins->fb,phi,insopt);
|
||||
getQ(insopt,dt,Q,nx);
|
||||
|
||||
/* propagate state estimation error covariance */
|
||||
@ -395,7 +445,7 @@ static void updstat(const insopt_t *insopt,ins_t *ins,const double dt,
|
||||
extern void propinss(ins_t *ins,const insopt_t *insopt,double dt,
|
||||
double *x,double *P,const int upd)
|
||||
{
|
||||
int nx = ins->nx;
|
||||
int nx = xnX(insopt);
|
||||
double *phi,*Q;
|
||||
|
||||
Q = mat(nx,nx);
|
||||
|
@ -450,20 +450,21 @@ static double baseline(const double *ru, const double *rb, double *dr)
|
||||
/* initialize state and covariance -------------------------------------------*/
|
||||
static void initx(rtk_t *rtk, double xi, double var, int i)
|
||||
{
|
||||
int j,tc;
|
||||
int j,tc,nx;
|
||||
|
||||
tc = rtk->opt.insopt.tc;
|
||||
tc = rtk->opt.mode;
|
||||
nx = tc==PMODE_INS_TGNSS?rtk->ins.nx:rtk->nx;
|
||||
|
||||
if(tc==INSTC_RTK){
|
||||
if(tc==PMODE_INS_TGNSS){
|
||||
rtk->ins.x[i]=xi;
|
||||
for (j=0;j<rtk->nx;j++) {
|
||||
rtk->ins.P[i+j*rtk->ins.nx]=rtk->ins.P[j+i*rtk->ins.nx]=i==j?var:0.0;
|
||||
for (j=0;j<nx;j++) {
|
||||
rtk->ins.P[i+j*nx]=rtk->ins.P[j+i*nx]=i==j?var:0.0;
|
||||
}
|
||||
}
|
||||
else{
|
||||
rtk->x[i]=xi;
|
||||
for (j=0;j<rtk->nx;j++) {
|
||||
rtk->P[i+j*rtk->nx]=rtk->P[j+i*rtk->nx]=i==j?var:0.0;
|
||||
for (j=0;j<nx;j++) {
|
||||
rtk->P[i+j*nx]=rtk->P[j+i*nx]=i==j?var:0.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -533,7 +534,7 @@ static void udpos(rtk_t *rtk, double tt)
|
||||
ix=imat(rtk->nx,1);
|
||||
for (i=nx=0;i<rtk->nx;i++) {
|
||||
/* TODO: The b34 code causes issues so use b33 code for now */
|
||||
if (i<9||(rtk->x[i]!=0.0&&rtk->P[i+i*rtk->nx]>0.0)) ix[nx++]=i;
|
||||
if (i<9||(rtk->x[i]!=0.0&&rtk->P[i+i*rtk->nx]>0.0)) ix[nx++]=i; // 这里保留前9维(pos,velocity,acc)+模糊度并记录他们在x中的index保存在ix中
|
||||
}
|
||||
/* state transition of position/velocity/acceleration */
|
||||
F=eye(nx); P=mat(nx,nx); FP=mat(nx,nx); x=mat(nx,1); xp=mat(nx,1);
|
||||
@ -2251,7 +2252,7 @@ extern void init_tc(insopt_t *insopt, ins_t *ins, const prcopt_t *opt)
|
||||
int i; gtime_t t0={0};
|
||||
|
||||
trace(3,"initlc:\n");
|
||||
ins->nx = insopt->tc==INSTC_SINGLE?21:15+NB(opt);
|
||||
ins->nx = xnX(insopt);
|
||||
ins->x =mat(ins->nx,1);
|
||||
ins->P =mat(ins->nx,ins->nx);
|
||||
ins->P0=zeros(ins->nx,ins->nx);
|
||||
@ -2313,14 +2314,11 @@ extern void rtkinit(rtk_t *rtk, const prcopt_t *opt)
|
||||
rtk->opt=*opt;
|
||||
rtk->initial_mode=rtk->opt.mode;
|
||||
rtk->sol.thres=(float)opt->thresar[0];
|
||||
rtk->opt.insopt.gopt =&rtk->opt;
|
||||
|
||||
/* ins */
|
||||
if(opt->mode<=PMODE_INS_TGNSS){
|
||||
init_tc(&rtk->opt.insopt,&rtk->ins,opt);
|
||||
// switch(opt->insopt.tc){
|
||||
// case INSTC_SINGLE: rtk->opt.mode = PMODE_SINGLE; break;
|
||||
// case INSTC_RTK: rtk->opt.mode = PMODE_KINEMA; break;
|
||||
// }
|
||||
rtk->ins.rtkp=rtk;
|
||||
}
|
||||
else{
|
||||
|
@ -1,3 +1,3 @@
|
||||
Start testing: Feb 01 14:19 CST
|
||||
Start testing: Feb 02 14:21 CST
|
||||
----------------------------------------------------------
|
||||
End testing: Feb 01 14:19 CST
|
||||
End testing: Feb 02 14:21 CST
|
||||
|
@ -727,6 +727,7 @@ typedef struct {
|
||||
|
||||
int tc; /* ins-gnss tightly coupled mode (INSTC_???) */
|
||||
double L_ba_b[3]; /* lever arm from antenna to imu */
|
||||
void *gopt; /* pointer to option */
|
||||
|
||||
}insopt_t;
|
||||
|
||||
@ -1600,7 +1601,17 @@ EXPORT void rt_tcfilter(rtksvr_t *svr, int fobs, uint32_t tick);
|
||||
EXPORT int rt_init_ins(obsd_t *obs, rtksvr_t *svr, int n, imud_t *imud, int i_imu, int flag,
|
||||
const prcopt_t *prcopt);
|
||||
/* rt_ins-gnss ----------------------------------------------------------------------*/
|
||||
EXPORT int xnX(const insopt_t *insopt);
|
||||
extern int xnB(const insopt_t *insopt);
|
||||
EXPORT int xnP(const insopt_t *insopt);
|
||||
EXPORT int xnV(const insopt_t *insopt);
|
||||
EXPORT int xnA(const insopt_t *insopt);
|
||||
EXPORT int xnBa(const insopt_t *insopt);
|
||||
EXPORT int xnBg(const insopt_t *insopt);
|
||||
EXPORT int xnRb(const insopt_t *insopt);
|
||||
EXPORT int xnRd(const insopt_t *insopt);
|
||||
EXPORT int xiP(const insopt_t *insopt);
|
||||
EXPORT int xnIF(const insopt_t *opt);
|
||||
EXPORT int xiV(const insopt_t *insopt);
|
||||
EXPORT int xiA(const insopt_t *insopt);
|
||||
EXPORT int xiBa(const insopt_t *insopt);
|
||||
|
Loading…
x
Reference in New Issue
Block a user