RTK_base/RTK/pntpos.c

1221 lines
45 KiB
C
Raw Permalink Normal View History

2022-06-22 09:23:36 +08:00
/*------------------------------------------------------------------------------
* pntpos.c : standard positioning
*
* Copyright (C) 2007-2020 by T.TAKASU, All rights reserved.
*
* version : $Revision:$ $Date:$
* history : 2010/07/28 1.0 moved from rtkcmn.c
* changed api:
* pntpos()
* deleted api:
* pntvel()
* 2011/01/12 1.1 add option to include unhealthy satellite
* reject duplicated observation data
* changed api: ionocorr()
* 2011/11/08 1.2 enable snr mask for single-mode (rtklib_2.4.1_p3)
* 2012/12/25 1.3 add variable snr mask
* 2014/05/26 1.4 support galileo and beidou
* 2015/03/19 1.5 fix bug on ionosphere correction for GLO and BDS
* 2018/10/10 1.6 support api change of satexclude()
* 2020/11/30 1.7 support NavIC/IRNSS in pntpos()
* no support IONOOPT_LEX option in ioncorr()
* improve handling of TGD correction for each system
* use E1-E5b for Galileo dual-freq iono-correction
* use API sat2freq() to get carrier frequency
* add output of velocity estimation error in estvel()
*-----------------------------------------------------------------------------*/
#include "rtklib.h"
/* constants/macros ----------------------------------------------------------*/
#define SQR(x) ((x) * (x))
#define MAX(x, y) ((x) >= (y) ? (x) : (y))
#if 0 /* enable GPS-QZS time offset estimation */
#define NX (4 + 5) /* # of estimated parameters */
#else
#define NX (4 + 3) /* # of estimated parameters */
#endif
#define MAXITR 10 /* max number of iteration for point pos */
#define ERR_ION 5.0 /* ionospheric delay Std (m) */
#define ERR_TROP 3.0 /* tropspheric delay Std (m) */
#define ERR_SAAS 0.3 /* Saastamoinen model error Std (m) */
#define ERR_BRDCI 0.5 /* broadcast ionosphere model error factor */
#define ERR_CBIAS 0.3 /* code bias error Std (m) */
#define REL_HUMI 0.7 /* relative humidity for Saastamoinen model */
#define MIN_EL (5.0 * D2R) /* min elevation for measurement error (rad) */
#define RESCODE_MIN_EL (15.0 * D2R) /* min elevation for second calculation (rad) */
/* pseudorange measurement error variance ------------------------------------*/
static double varerr(const prcopt_t *opt, const ssat_t *ssat, const obsd_t *obs, double el, int sys)
{
double fact = 1.0, varr, snr_rover;
switch (sys)
{
case SYS_GPS:
fact *= EFACT_GPS;
break;
case SYS_GLO:
fact *= EFACT_GLO;
break;
case SYS_SBS:
fact *= EFACT_SBS;
break;
case SYS_CMP:
fact *= EFACT_CMP;
break;
case SYS_QZS:
fact *= EFACT_QZS;
break;
case SYS_IRN:
fact *= EFACT_IRN;
break;
default:
fact *= EFACT_GPS;
break;
}
if (el < MIN_EL)
el = MIN_EL;
/* var = R^2*(a^2 + (b^2/sin(el) + c^2*(10^(0.1*(snr_max-snr_rover)))) + (d*rcv_std)^2) */
varr = SQR(opt->err[1]) + SQR(opt->err[2]) / sin(el);
if (opt->err[6] > 0.0)
{ /* if snr term not zero */
snr_rover = (ssat) ? SNR_UNIT * ssat->snr_rover[0] : opt->err[5];
varr += SQR(opt->err[6]) * pow(10, 0.1 * MAX(opt->err[5] - snr_rover, 0));
}
varr *= SQR(opt->eratio[0]);
if (opt->err[7] > 0.0)
{
varr += SQR(opt->err[7] * 0.01 * (1 << (obs->Pstd[0] + 5))); /* 0.01*2^(n+5) m */
}
if (opt->ionoopt == IONOOPT_IFLC)
varr *= SQR(3.0); /* iono-free */
return SQR(fact) * varr;
}
/* get group delay parameter (m) ---------------------------------------------*/
static double gettgd(int sat, const nav_t *nav, int type)
{
int i, sys = satsys(sat, NULL);
if (sys == SYS_GLO)
{
for (i = 0; i < nav->ng; i++)
{
if (nav->geph[i].sat == sat)
break;
}
return (i >= nav->ng) ? 0.0 : -nav->geph[i].dtaun * CLIGHT;
}
else
{
for (i = 0; i < nav->n; i++)
{
if (nav->eph[i].sat == sat)
break;
}
return (i >= nav->n) ? 0.0 : nav->eph[i].tgd[type] * CLIGHT;
}
}
/* test SNR mask -------------------------------------------------------------*/
static int snrmask(const obsd_t *obs, const double *azel, const prcopt_t *opt)
{
if (testsnr(0, 0, azel[1], obs->SNR[0] * SNR_UNIT, &opt->snrmask))
{
return 0;
}
if (opt->ionoopt == IONOOPT_IFLC)
{
if (testsnr(0, 1, azel[1], obs->SNR[1] * SNR_UNIT, &opt->snrmask))
return 0;
}
return 1;
}
/* iono-free or "pseudo iono-free" pseudorange with code bias correction -----*/
static double prange(const obsd_t *obs, const nav_t *nav, const prcopt_t *opt, double *var)
{
double P1, P2, gamma, b1, b2;
int sat, sys;
sat = obs->sat;
sys = satsys(sat, NULL);
P1 = obs->P[0];
P2 = obs->P[1];
*var = 0.0;
if (P1 == 0.0 || (opt->ionoopt == IONOOPT_IFLC && P2 == 0.0))
return 0.0;
/* P1-C1,P2-C2 DCB correction */
//if (sys == SYS_GPS || sys == SYS_GLO)
//{
// if (obs->code[0] == CODE_L1C)
// P1 += nav->cbias[sat - 1][1]; /* C1->P1 */
// if (obs->code[1] == CODE_L2C)
// P2 += nav->cbias[sat - 1][2]; /* C2->P2 */
//}
if (opt->ionoopt == IONOOPT_IFLC)
{ /* dual-frequency */
if (sys == SYS_GPS || sys == SYS_QZS)
{ /* L1-L2,G1-G2 */
gamma = SQR(FREQL1 / FREQL2);
return (P2 - gamma * P1) / (1.0 - gamma);
}
else if (sys == SYS_GLO)
{ /* G1-G2 */
gamma = SQR(FREQ1_GLO / FREQ2_GLO);
return (P2 - gamma * P1) / (1.0 - gamma);
}
else if (sys == SYS_GAL)
{ /* E1-E5b */
gamma = SQR(FREQL1 / FREQE5b);
if (getseleph(SYS_GAL))
{ /* F/NAV */
P2 -= gettgd(sat, nav, 0) - gettgd(sat, nav, 1); /* BGD_E5aE5b */
}
return (P2 - gamma * P1) / (1.0 - gamma);
}
else if (sys == SYS_CMP)
{ /* B1-B2 */
gamma = SQR(((obs->code[0] == CODE_L2I) ? FREQ1_CMP : FREQL1) / FREQ2_CMP);
if (obs->code[0] == CODE_L2I)
b1 = gettgd(sat, nav, 0); /* TGD_B1I */
else if (obs->code[0] == CODE_L1P)
b1 = gettgd(sat, nav, 2); /* TGD_B1Cp */
else
b1 = gettgd(sat, nav, 2) + gettgd(sat, nav, 4); /* TGD_B1Cp+ISC_B1Cd */
b2 = gettgd(sat, nav, 1); /* TGD_B2I/B2bI (m) */
return ((P2 - gamma * P1) - (b2 - gamma * b1)) / (1.0 - gamma);
}
else if (sys == SYS_IRN)
{ /* L5-S */
gamma = SQR(FREQL5 / FREQs);
return (P2 - gamma * P1) / (1.0 - gamma);
}
}
else
{ /* single-freq (L1/E1/B1) */
*var = SQR(ERR_CBIAS);
if (sys == SYS_GPS || sys == SYS_QZS)
{ /* L1 */
b1 = gettgd(sat, nav, 0); /* TGD (m) */
return P1 - b1;
}
else if (sys == SYS_GLO)
{ /* G1 */
gamma = SQR(FREQ1_GLO / FREQ2_GLO);
b1 = gettgd(sat, nav, 0); /* -dtaun (m) */
return P1 - b1 / (gamma - 1.0);
}
else if (sys == SYS_GAL)
{ /* E1 */
if (getseleph(SYS_GAL))
b1 = gettgd(sat, nav, 0); /* BGD_E1E5a */
else
b1 = gettgd(sat, nav, 1); /* BGD_E1E5b */
return P1 - b1;
}
else if (sys == SYS_CMP)
{ /* B1I/B1Cp/B1Cd */
if (obs->code[0] == CODE_L2I)
b1 = gettgd(sat, nav, 0); /* TGD_B1I */
else if (obs->code[0] == CODE_L1P)
b1 = gettgd(sat, nav, 2); /* TGD_B1Cp */
else
b1 = gettgd(sat, nav, 2) + gettgd(sat, nav, 4); /* TGD_B1Cp+ISC_B1Cd */
return P1 - b1;
}
else if (sys == SYS_IRN)
{ /* L5 */
gamma = SQR(FREQs / FREQL5);
b1 = gettgd(sat, nav, 0); /* TGD (m) */
return P1 - gamma * b1;
}
}
return P1;
}
/* ionospheric correction ------------------------------------------------------
* compute ionospheric correction
* args : gtime_t time I time
* nav_t *nav I navigation data
* int sat I satellite number
* double *pos I receiver position {lat,lon,h} (rad|m)
* double *azel I azimuth/elevation angle {az,el} (rad)
* int ionoopt I ionospheric correction option (IONOOPT_???)
* double *ion O ionospheric delay (L1) (m)
* double *var O ionospheric delay (L1) variance (m^2)
* return : status(1:ok,0:error)
*-----------------------------------------------------------------------------*/
extern int ionocorr(gtime_t time, const nav_t *nav, int sat, const double *pos,
const double *azel, int ionoopt, double *ion, double *var)
{
int err = 0;
// trace(4, "ionocorr: time=%s opt=%d sat=%2d pos=%.3f %.3f azel=%.3f %.3f\n",
// time_str(time, 3), ionoopt, sat, pos[0] * R2D, pos[1] * R2D, azel[0] * R2D,
// azel[1] * R2D);
/* SBAS ionosphere model */
// if (ionoopt == IONOOPT_SBAS)
// {
// if (sbsioncorr(time, nav, pos, azel, ion, var))
// return 1;
// err = 1;
// }
/* IONEX TEC model */
// if (ionoopt == IONOOPT_TEC)
// {
// if (iontec(time, nav, pos, azel, 1, ion, var))
// return 1;
// err = 1;
// }
/* QZSS broadcast ionosphere model */
// if (ionoopt == IONOOPT_QZS && norm(nav->ion_qzs, 8) > 0.0)
// {
// *ion = ionmodel(time, nav->ion_qzs, pos, azel);
// *var = SQR(*ion * ERR_BRDCI);
// return 1;
// }
/* GPS broadcast ionosphere model */
if (ionoopt == IONOOPT_BRDC || err == 1)
{
*ion = ionmodel(time, nav->ion_gps, pos, azel);
*var = SQR(*ion * ERR_BRDCI);
return 1;
}
*ion = 0.0;
*var = ionoopt == IONOOPT_OFF ? SQR(ERR_ION) : 0.0;
return 1;
}
/* tropospheric correction -----------------------------------------------------
* compute tropospheric correction
* args : gtime_t time I time
* nav_t *nav I navigation data
* double *pos I receiver position {lat,lon,h} (rad|m)
* double *azel I azimuth/elevation angle {az,el} (rad)
* int tropopt I tropospheric correction option (TROPOPT_???)
* double *trp O tropospheric delay (m)
* double *var O tropospheric delay variance (m^2)
* return : status(1:ok,0:error)
*-----------------------------------------------------------------------------*/
extern int tropcorr(gtime_t time, const nav_t *nav, const double *pos,
const double *azel, int tropopt, double *trp, double *var)
{
trace(4, "tropcorr: time=%s opt=%d pos=%.3f %.3f azel=%.3f %.3f\n",
time_str(time, 3), tropopt, pos[0] * R2D, pos[1] * R2D, azel[0] * R2D,
azel[1] * R2D);
/* Saastamoinen model */
if (tropopt == TROPOPT_SAAS || tropopt == TROPOPT_EST || tropopt == TROPOPT_ESTG)
{
*trp = tropmodel(time, pos, azel, REL_HUMI);
*var = SQR(ERR_SAAS / (sin(azel[1]) + 0.1));
return 1;
}
/* SBAS (MOPS) troposphere model */
// if (tropopt == TROPOPT_SBAS)
//{
// *trp = sbstropcorr(time, pos, azel, var);
// return 1;
// }
/* no correction */
*trp = 0.0;
*var = tropopt == TROPOPT_OFF ? SQR(ERR_TROP) : 0.0;
return 1;
}
/* pseudorange residuals
<EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD>в<EFBFBD> v<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ξ<EFBFBD><EFBFBD><EFBFBD> H<EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD> var<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>й۲<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵķ<EFBFBD>λ<EFBFBD>Ǻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> azel<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>λʱ<EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD> vsat<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD>в<EFBFBD> resp<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD><EFBFBD><EFBFBD> ns <EFBFBD>ͷ<EFBFBD><EFBFBD≯<EFBFBD><EFBFBD><EFBFBD> nv
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>17<EFBFBD><EFBFBD>
int iter I <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
obsd_t *obs I <EFBFBD>۲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int n I <EFBFBD>۲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double *rs I <EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ú<EFBFBD><EFBFBD>ٶȣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ6*n<EFBFBD><EFBFBD>{x,y,z,vx,vy,vz}(ecef)(m,m/s)
double *dts I <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ2*n<EFBFBD><EFBFBD> {bias,drift} (s|s/s)
double *vare I <EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ú<EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><EFBFBD><EFBFBD><EFBFBD> (m^2)
int *svh I <EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־ (-1:correction not available)
nav_t *nav I <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double *x I <EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ֮ǰ<EFBFBD>Ķ<EFBFBD>λֵ
prcopt_t *opt I <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>
double *v O <EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD><EFBFBD>Ҷ˲<EFBFBD><EFBFBD>֣<EFBFBD>α<EFBFBD><EFBFBD><EFBFBD>в<EFBFBD>
double *H O <EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еļ<EFBFBD><EFBFBD>ξ<EFBFBD><EFBFBD><EFBFBD>
double *var O <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD>
double *azel O <EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ǰ<EFBFBD><EFBFBD>λֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>й۲<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD> {<EFBFBD><EFBFBD>λ<EFBFBD>ǡ<EFBFBD><EFBFBD>߶Ƚ<EFBFBD>} (2*n)
int *vsat O <EFBFBD><EFBFBD><EFBFBD>й۲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ǰ<EFBFBD><EFBFBD>λʱ<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>Ч (1*n)
double *resp O <EFBFBD><EFBFBD><EFBFBD>й۲<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD>α<EFBFBD><EFBFBD><EFBFBD>в(P-(r+c*dtr-c*dts+I+T)) (1*n)
int *ns O <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵĸ<EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>
int O <EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD≯<EFBFBD><EFBFBD><EFBFBD>
-----------------------------------------------------*/
static int rescode(int iter, const obsd_t *obs, int n, const double *rs,
const double *dts, const double *vare, const int *svh,
const nav_t *nav, const double *x, const prcopt_t *opt,
const ssat_t *ssat, double *v, double *H, double *var,
double *azel, int *vsat, double *resp, int *ns)
{
gtime_t time;
double r, freq, dion = 0.0, dtrp = 0.0, vmeas, vion = 0.0, vtrp = 0.0, rr[3], pos[3], dtr, e[3], P;
int i, j, nv = 0, sat, sys;
int mask[NX - 3] = {0}; /* <20><><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>, 1:ʹ<><CAB9><EFBFBD>˸<EFBFBD>ϵͳ 0:û<><C3BB>ʹ<EFBFBD>ø<EFBFBD>ϵͳ */
trace(3, "resprng : n=%d\n", n);
// 1<><31><EFBFBD><EFBFBD>֮ǰ<D6AE>õ<EFBFBD><C3B5>Ķ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ֵ<EFBFBD><D6B5> rr <20><> dtr <20><><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD>й<EFBFBD><D0B9>ڵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>α<EFBFBD><CEB1><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD>
// X = [x,y,z,dtr,GPS-GAL,GPS-GLO,GPS-BDS,GPS-IRN]
for (i = 0; i < 3; i++)
rr[i] = x[i];
dtr = x[3];
/* 2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ecef2pos <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>еõ<D0B5><C3B5><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2> ECEF ת<><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ */
ecef2pos(rr, pos);
trace(3, "rescode: rr=%.3f %.3f %.3f\n", rr[0], rr[1], rr[2]);
for (i = *ns = 0; i < n && i < MAXOBS; i++) /* <20><>ÿһ<C3BF><D2BB><EFBFBD>۲<EFBFBD><DBB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
{
// 3<><33><EFBFBD><EFBFBD> vsat<61><74>azel <20><> resp <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<><30><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ζ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><E1B7A2><EFBFBD>
vsat[i] = 0;
azel[i * 2] = azel[1 + i * 2] = resp[i] = 0.0;
time = obs[i].time;
sat = obs[i].sat;
// 4<><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD> satsys <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><D6A4><EFBFBD>DZ<EFBFBD><C7B1><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD>ϵͳ
if (!(sys = satsys(sat, NULL)))
continue;
/* reject duplicated observation data
5<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><EFBFBD>Ĺ۲<EFBFBD><EFBFBD><EFBFBD> */
if (i < n - 1 && i < MAXOBS - 1 && sat == obs[i + 1].sat)
{
trace(2, "duplicated obs data %s sat=%d\n", time_str(time, 3), sat);
i++;
continue;
}
/* 6<><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>λʱ<CEBB>ų<EFBFBD><C5B3><EFBFBD>Щ<EFBFBD><D0A9><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD>ǣ<EFBFBD><C7A3><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> satexclude <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>*/
if (satexclude(sat, vare[i], svh[i], opt))
continue;
/* geometric distance and elevation mask*/
/*7<><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD> geodist <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǻ͵<C7BA>ǰ<EFBFBD><C7B0><EFBFBD>ջ<EFBFBD>λ<EFBFBD><CEBB>֮<EFBFBD><D6AE><EFBFBD>ļ<EFBFBD><C4BC>ξ<EFBFBD><CEBE><EFBFBD> r <20>ͽ<EFBFBD><CDBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>Ĺ۲<C4B9>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD>
Ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ξ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> >0<EFBFBD><EFBFBD><EFBFBD>˺<EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>תӰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD>SagnacЧӦ<EFBFBD><EFBFBD>*/
if ((r = geodist(rs + i * 6, rr, e)) <= 0.0)
continue;
// 8<><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD> satazel <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD>ջ<EFBFBD>λ<EFBFBD>ô<EFBFBD><C3B4><EFBFBD>վ<EFBFBD><D5BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD>ǵķ<C7B5>λ<EFBFBD>Ǻ<EFBFBD><C7BA><EFBFBD><EFBFBD>ǣ<EFBFBD><C7A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD><C7B5>ڽض<DABD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݡ<EFBFBD>
if (satazel(pos, e, azel + i * 2) < opt->elmin)
continue;
if (iter > 0)
{
/* test SNR mask TODO: ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RTK<54>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD>»<EFBFBD>վ<EFBFBD><D5BE><EFBFBD>㶨λ<E3B6A8><CEBB>ʱ<EFBFBD><CAB1>ҲҪ<D2B2><D2AA><EFBFBD>˼<EFBFBD><CBBC>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>㶨λ<E3B6A8>޽<EFBFBD> */
if (!snrmask(obs + i, azel + i * 2, opt))
continue;
/* ionospheric correction
9<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ionocorr <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ I (m)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ǽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> L1 <EFBFBD>ź<EFBFBD><EFBFBD>ϵģ<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>ʱ<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>һ<EFBFBD><EFBFBD>Ƶ<EFBFBD>ʵIJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> L1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĺ<EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD>ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
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(FREQL1 / freq);
vion *= SQR(FREQL1 / freq);
/* tropospheric correction
10<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> tropcorr <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ T (m<EFBFBD><EFBFBD>*/
if (!tropcorr(time, nav, pos, azel + i * 2, opt->tropopt, &dtrp, &vtrp))
{
continue;
}
}
/* psendorange with code bias correction
11<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> prange <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DCBУ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><EFBFBD>ֵ <EFBFBD><EFBFBD>*/
if ((P = prange(obs + i, nav, opt, &vmeas)) == 0.0)
continue;
/* pseudorange residual
12<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> ? ( r + d t r ? c ? d t s + I + T ) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD>в<EFBFBD>*/
v[nv] = P - (r + dtr - CLIGHT * dts[i * 2] + dion + dtrp);
trace(3, "sat=%2d v=%.3f P=%.3f r=%.3f dtr=%.6f dts=%.6f dion=%.3f dtrp=%.3f\n",
obs[i].sat, v[nv], P, r, dtr, dts[i], dion, dtrp);
/* design matrix
13<EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD>ξ<EFBFBD><EFBFBD><EFBFBD> H <EFBFBD><EFBFBD>ǰ 3 <EFBFBD><EFBFBD>Ϊ 7<EFBFBD>м<EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD>򣬵<EFBFBD> 4 <EFBFBD><EFBFBD>Ϊ 1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ 0*/
for (j = 0; j < NX; j++)
{
H[j + nv * NX] = j < 3 ? -e[j] : (j == 3 ? 1.0 : 0.0);
}
/* time system offset and receiver bias correction
14<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬϵͳ<EFBFBD><EFBFBD>GPS<EFBFBD><EFBFBD>GLO<EFBFBD><EFBFBD>GAL<EFBFBD><EFBFBD>CMP<EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>޸ľ<EFBFBD><EFBFBD><EFBFBD> H */
if (sys == SYS_GLO)
{
v[nv] -= x[4];
H[4 + nv * NX] = 1.0;
mask[1] = 1;
}
else if (sys == SYS_GAL)
{
v[nv] -= x[5];
H[5 + nv * NX] = 1.0;
mask[2] = 1;
}
else if (sys == SYS_CMP)
{
v[nv] -= x[6];
H[6 + nv * NX] = 1.0;
mask[3] = 1;
}
// else if (sys == SYS_IRN)
//{
// v[nv] -= x[7];
// H[7 + nv * NX] = 1.0;
// mask[4] = 1;
// }
else
mask[0] = 1;
// 15<31><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>붨λ<EBB6A8><CEBB><EFBFBD><EFBFBD><EFBFBD>ǵĶ<C7B5>λ<EFBFBD><CEBB>Ч<EFBFBD>Ա<EFBFBD>־<EFBFBD><D6BE>Ϊ 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ǵ<EFBFBD>α<EFBFBD><CEB1><EFBFBD>вֵ<EEB8B3><D6B5><EFBFBD><EFBFBD><EFBFBD>붨λ<EBB6A8><CEBB><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD><C7B8><EFBFBD> ns <20><> 1
vsat[i] = 1;
resp[i] = v[nv];
(*ns)++;
/* variance of pseudorange error
16<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> varerr <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ĵ<EFBFBD><EFBFBD><EFBFBD>ϵͳ<EFBFBD><EFBFBD><EFBFBD>Ȼ<EFBFBD><EFBFBD><EFBFBD>ۼӼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(URE<EFBFBD><EFBFBD>*/
var[nv++] = varerr(opt, &ssat[i], &obs[i], azel[1 + i * 2], sys) + vare[i] + vmeas + vion + vtrp;
trace(4, "sat=%2d azel=%5.1f %4.1f res=%7.3f sig=%5.3f\n", obs[i].sat,
azel[i * 2] * R2D, azel[1 + i * 2] * R2D, resp[i], sqrt(var[nv - 1]));
}
/* constraint to avoid rank-deficient
17<EFBFBD><EFBFBD>Ϊ<EFBFBD>˷<EFBFBD>ֹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><EFBFBD><EFBFBD> H <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
for (i = 0; i < NX - 3; i++)
{
if (mask[i])
continue;
v[nv] = 0.0;
for (j = 0; j < NX; j++)
H[j + nv * NX] = j == i + 3 ? 1.0 : 0.0;
var[nv++] = 0.01;
}
return nv;
}
static int rescode_weak(int iter, const obsd_t *obs, int n, const double *rs,
const double *dts, const double *vare, const int *svh,
const nav_t *nav, const double *x, const prcopt_t *opt,
const ssat_t *ssat, double *v, double *H, double *var,
double *azel, int *vsat, double *resp, int *ns)
{
gtime_t time;
double r, freq, dion = 0.0, dtrp = 0.0, vmeas, vion = 0.0, vtrp = 0.0, rr[3], pos[3], dtr, e[3], P;
int i, j, nv = 0, sat, sys;
int mask[NX - 3] = {0}; /* <20><><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>, 1:ʹ<><CAB9><EFBFBD>˸<EFBFBD>ϵͳ 0:û<><C3BB>ʹ<EFBFBD>ø<EFBFBD>ϵͳ */
trace(3, "resprng : n=%d\n", n);
// 1<><31><EFBFBD><EFBFBD>֮ǰ<D6AE>õ<EFBFBD><C3B5>Ķ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ֵ<EFBFBD><D6B5> rr <20><> dtr <20><><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD>й<EFBFBD><D0B9>ڵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>α<EFBFBD><CEB1><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD>
// X = [x,y,z,dtr,GPS-GAL,GPS-GLO,GPS-BDS,GPS-IRN]
for (i = 0; i < 3; i++)
rr[i] = x[i];
dtr = x[3];
/* 2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ecef2pos <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>еõ<D0B5><C3B5><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2> ECEF ת<><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ */
ecef2pos(rr, pos);
trace(3, "rescode: rr=%.3f %.3f %.3f\n", rr[0], rr[1], rr[2]);
for (i = *ns = 0; i < n && i < MAXOBS; i++) /* <20><>ÿһ<C3BF><D2BB><EFBFBD>۲<EFBFBD><DBB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
{
// 3<><33><EFBFBD><EFBFBD> vsat<61><74>azel <20><> resp <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<><30><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ζ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><E1B7A2><EFBFBD>
vsat[i] = 0;
azel[i * 2] = azel[1 + i * 2] = resp[i] = 0.0;
time = obs[i].time;
sat = obs[i].sat;
// 4<><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD> satsys <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><D6A4><EFBFBD>DZ<EFBFBD><C7B1><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD>ϵͳ
if (!(sys = satsys(sat, NULL)))
continue;
/* reject duplicated observation data
5<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><EFBFBD>Ĺ۲<EFBFBD><EFBFBD><EFBFBD> */
if (i < n - 1 && i < MAXOBS - 1 && sat == obs[i + 1].sat)
{
trace(2, "duplicated obs data %s sat=%d\n", time_str(time, 3), sat);
i++;
continue;
}
/* 6<><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>λʱ<CEBB>ų<EFBFBD><C5B3><EFBFBD>Щ<EFBFBD><D0A9><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD>ǣ<EFBFBD><C7A3><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> satexclude <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>*/
// if (satexclude(sat, vare[i], svh[i], opt))
// continue;
/* geometric distance and elevation mask*/
/*7<><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD> geodist <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǻ͵<C7BA>ǰ<EFBFBD><C7B0><EFBFBD>ջ<EFBFBD>λ<EFBFBD><CEBB>֮<EFBFBD><D6AE><EFBFBD>ļ<EFBFBD><C4BC>ξ<EFBFBD><CEBE><EFBFBD> r <20>ͽ<EFBFBD><CDBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>Ĺ۲<C4B9>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD>
Ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ξ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> >0<EFBFBD><EFBFBD><EFBFBD>˺<EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>תӰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD>SagnacЧӦ<EFBFBD><EFBFBD>*/
if ((r = geodist(rs + i * 6, rr, e)) <= 0.0)
continue;
// 8<><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD> satazel <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD>ջ<EFBFBD>λ<EFBFBD>ô<EFBFBD><C3B4><EFBFBD>վ<EFBFBD><D5BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD>ǵķ<C7B5>λ<EFBFBD>Ǻ<EFBFBD><C7BA><EFBFBD><EFBFBD>ǣ<EFBFBD><C7A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD><C7B5>ڽض<DABD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݡ<EFBFBD>
if (satazel(pos, e, azel + i * 2) < RESCODE_MIN_EL)
continue;
if (iter > 0)
{
/* test SNR mask TODO: ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RTK<54>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD>»<EFBFBD>վ<EFBFBD><D5BE><EFBFBD>㶨λ<E3B6A8><CEBB>ʱ<EFBFBD><CAB1>ҲҪ<D2B2><D2AA><EFBFBD>˼<EFBFBD><CBBC>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>㶨λ<E3B6A8>޽<EFBFBD> */
if (obs[i].SNR[0] < 30000)
continue;
/* ionospheric correction
9<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ionocorr <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ I (m)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ǽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> L1 <EFBFBD>ź<EFBFBD><EFBFBD>ϵģ<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>ʱ<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>һ<EFBFBD><EFBFBD>Ƶ<EFBFBD>ʵIJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> L1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĺ<EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD>ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
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(FREQL1 / freq);
vion *= SQR(FREQL1 / freq);
/* tropospheric correction
10<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> tropcorr <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ T (m<EFBFBD><EFBFBD>*/
if (!tropcorr(time, nav, pos, azel + i * 2, opt->tropopt, &dtrp, &vtrp))
{
continue;
}
}
/* psendorange with code bias correction
11<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> prange <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DCBУ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><EFBFBD>ֵ <EFBFBD><EFBFBD>*/
if ((P = prange(obs + i, nav, opt, &vmeas)) == 0.0)
continue;
/* pseudorange residual
12<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> ? ( r + d t r ? c ? d t s + I + T ) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD>в<EFBFBD>*/
v[nv] = P - (r + dtr - CLIGHT * dts[i * 2] + dion + dtrp);
trace(3, "sat=%2d v=%.3f P=%.3f r=%.3f dtr=%.6f dts=%.6f dion=%.3f dtrp=%.3f\n",
obs[i].sat, v[nv], P, r, dtr, dts[i], dion, dtrp);
/* design matrix
13<EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD>ξ<EFBFBD><EFBFBD><EFBFBD> H <EFBFBD><EFBFBD>ǰ 3 <EFBFBD><EFBFBD>Ϊ 7<EFBFBD>м<EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD>򣬵<EFBFBD> 4 <EFBFBD><EFBFBD>Ϊ 1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ 0*/
for (j = 0; j < NX; j++)
{
H[j + nv * NX] = j < 3 ? -e[j] : (j == 3 ? 1.0 : 0.0);
}
/* time system offset and receiver bias correction
14<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬϵͳ<EFBFBD><EFBFBD>GPS<EFBFBD><EFBFBD>GLO<EFBFBD><EFBFBD>GAL<EFBFBD><EFBFBD>CMP<EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>޸ľ<EFBFBD><EFBFBD><EFBFBD> H */
if (sys == SYS_GLO)
{
v[nv] -= x[4];
H[4 + nv * NX] = 1.0;
mask[1] = 1;
}
else if (sys == SYS_GAL)
{
v[nv] -= x[5];
H[5 + nv * NX] = 1.0;
mask[2] = 1;
}
else if (sys == SYS_CMP)
{
v[nv] -= x[6];
H[6 + nv * NX] = 1.0;
mask[3] = 1;
}
// else if (sys == SYS_IRN)
//{
// v[nv] -= x[7];
// H[7 + nv * NX] = 1.0;
// mask[4] = 1;
// }
else
mask[0] = 1;
// 15<31><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>붨λ<EBB6A8><CEBB><EFBFBD><EFBFBD><EFBFBD>ǵĶ<C7B5>λ<EFBFBD><CEBB>Ч<EFBFBD>Ա<EFBFBD>־<EFBFBD><D6BE>Ϊ 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ǵ<EFBFBD>α<EFBFBD><CEB1><EFBFBD>вֵ<EEB8B3><D6B5><EFBFBD><EFBFBD><EFBFBD>붨λ<EBB6A8><CEBB><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD><C7B8><EFBFBD> ns <20><> 1
vsat[i] = 1;
resp[i] = v[nv];
(*ns)++;
/* variance of pseudorange error
16<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> varerr <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ĵ<EFBFBD><EFBFBD><EFBFBD>ϵͳ<EFBFBD><EFBFBD><EFBFBD>Ȼ<EFBFBD><EFBFBD><EFBFBD>ۼӼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(URE<EFBFBD><EFBFBD>*/
var[nv++] = varerr(opt, &ssat[i], &obs[i], azel[1 + i * 2], sys) + vare[i] + vmeas + vion + vtrp;
trace(4, "sat=%2d azel=%5.1f %4.1f res=%7.3f sig=%5.3f\n", obs[i].sat,
azel[i * 2] * R2D, azel[1 + i * 2] * R2D, resp[i], sqrt(var[nv - 1]));
}
/* constraint to avoid rank-deficient
17<EFBFBD><EFBFBD>Ϊ<EFBFBD>˷<EFBFBD>ֹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><EFBFBD><EFBFBD> H <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
for (i = 0; i < NX - 3; i++)
{
if (mask[i])
continue;
v[nv] = 0.0;
for (j = 0; j < NX; j++)
H[j + nv * NX] = j == i + 3 ? 1.0 : 0.0;
var[nv++] = 0.01;
}
return nv;
}
/* validate solution ---------------------------------------------------------*/
static int valsol(const double *azel, const int *vsat, int n,
const prcopt_t *opt, const double *v, int nv, int nx,
char *msg)
{
double azels[MAXOBS * 2], dop[4], vv;
int i, ns;
trace(3, "valsol : n=%d nv=%d\n", n, nv);
/* α<><CEB1><EFBFBD>в<EFBFBD> <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3> */
vv = dot(v, v, nv);
if (nv > nx && vv > chisqr[nv - nx - 1])
{
sprintf(msg, "Warning: large chi-square error nv=%d vv=%.1f cs=%.1f", nv, vv, chisqr[nv - nx - 1]);
/* return 0; */ /* <20><>ֵ<EFBFBD><D6B5><EFBFBD>õ<EFBFBD>̫<EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
}
/* large GDOP check */
for (i = ns = 0; i < n; i++)
{
if (!vsat[i])
continue;
azels[ns * 2] = azel[i * 2];
azels[1 + ns * 2] = azel[1 + i * 2];
ns++;
}
dops(ns, azels, opt->elmin, dop);
if (dop[0] <= 0.0 || dop[0] > opt->maxgdop)
{
sprintf(msg, "gdop error nv=%d gdop=%.1f", nv, dop[0]);
return 0;
}
return 1;
}
/* estimate receiver position
ͨ<EFBFBD><EFBFBD>α<EFBFBD><EFBFBD>ʵ<EFBFBD>־<EFBFBD><EFBFBD>Զ<EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ú<EFBFBD><EFBFBD>Ӳ˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ֶ<EFBFBD>λ<EFBFBD><EFBFBD>ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD>{<EFBFBD><EFBFBD>λ<EFBFBD>ǡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>}<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λʱ<EFBFBD><EFBFBD>Ч<EFBFBD>ԡ<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD>в
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>13<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
obsd_t *obs I <EFBFBD>۲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int n I <EFBFBD>۲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double *rs I <EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ú<EFBFBD><EFBFBD>ٶȣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ6*n<EFBFBD><EFBFBD>{x,y,z,vx,vy,vz}(ecef)(m,m/s)
double *dts I <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ2*n<EFBFBD><EFBFBD> {bias,drift} (s|s/s)
double *vare I <EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ú<EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><EFBFBD><EFBFBD><EFBFBD> (m^2)
int *svh I <EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־ (-1:correction not available)
nav_t *nav I <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
prcopt_t *opt I <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>
sol_t *sol IO solution
double *azel IO <EFBFBD><EFBFBD>λ<EFBFBD>Ǻ͸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (rad)
int *vsat IO <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD>λʱ<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>Ч
double *resp IO <EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD>в<EFBFBD> (P-(r+c*dtr-c*dts+I+T))
char *msg O <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
int O 1<EFBFBD><EFBFBD>ʾ<EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
------------------------------------------------*/
static int estpos(const obsd_t *obs, int n, const double *rs, const double *dts,
const double *vare, const int *svh, const nav_t *nav,
const prcopt_t *opt, const ssat_t *ssat, sol_t *sol, double *azel,
int *vsat, double *resp, char *msg)
{
double x[NX] = {0}, dx[NX], Q[NX * NX], *v, *H, *var, sig;
int i, j, k, info, stat, nv, ns;
trace(3, "----> estpos : n=%d\n", n);
v = mat(n + 4, 1);
H = mat(NX, n + 4);
var = mat(n + 4, 1);
// 1<><31><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> sol->rr <20><>ǰ 3 <20><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ECEF<45><46><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5> x <20><><EFBFBD>
/*<2A><><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD>һ<EFBFBD>ζ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> sol Ϊ<>գ<EFBFBD><D5A3><EFBFBD> x <20><>ֵΪ 0<><30>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮ǰ<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD> 1 <EFBFBD>в<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>Ԫ<EFBFBD>Ķ<EFBFBD>λֵ<EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD>λ<EFBFBD>ij<EFBFBD>ʼֵ*/
for (i = 0; i < 3; i++)
x[i] = sol->rr[i];
for (i = 0; i < MAXITR; i++)
{
/* pseudorange residuals (m)
2<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><EFBFBD><EFBFBD> rescode <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD>в<EFBFBD> v<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>ξ<EFBFBD><EFBFBD><EFBFBD> H<EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD> var<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>й۲<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵķ<EFBFBD>λ<EFBFBD>Ǻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> azel<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>λʱ<EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD> vsat<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD>в<EFBFBD> resp<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD><EFBFBD><EFBFBD> ns <EFBFBD>ͷ<EFBFBD><EFBFBD≯<EFBFBD><EFBFBD><EFBFBD> nv<EFBFBD><EFBFBD>*/
nv = rescode(i, obs, n, rs, dts, vare, svh, nav, x, opt, ssat, v, H, var, azel, vsat, resp, &ns);
// 3<><33>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7>̵ĸ<CCB5><C4B8><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>δ֪<CEB4><D6AA><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD>
if (nv < NX)
{
nv = rescode_weak(i, obs, n, rs, dts, vare, svh, nav, x, opt, ssat, v, H, var, azel, vsat, resp, &ns);
if (nv < NX)
{
sprintf(msg, "lack of valid sats ns=%d", nv);
break;
}
}
/* 4<><34><EFBFBD><EFBFBD>α<EFBFBD><CEB1><EFBFBD>в<EFBFBD><D0B2>ı<EFBFBD>׼<EFBFBD><D7BC><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD><EFBFBD>ΪȨ<CEAA>أ<EFBFBD><D8A3><EFBFBD> H <20><> v<>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD>ضԽ<D8B6><D4BD>󣬵õ<F3A3ACB5><C3B5><EFBFBD>Ȩ֮<C8A8><D6AE><EFBFBD><EFBFBD> H<><48> v*/
for (j = 0; j < nv; j++)
{
sig = sqrt(var[j]);
v[j] /= sig;
for (k = 0; k < NX; k++)
H[k + j * NX] /= sig;
}
/* least square estimation
5<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> lsq <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> dx=(HH^T)^{-1}Hv
<EFBFBD><EFBFBD> Q=(HH^T)^{-1}<EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD>ǰ x <EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><EFBFBD><EFBFBD> dx <EFBFBD>Ͷ<EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>Ȩϵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> Q
<EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD>Ȩ<EFBFBD><EFBFBD>С<EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD><EFBFBD>ֵ<EFBFBD>ǶԽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD><EFBFBD>DZ˴˶<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵġ<EFBFBD>
<EFBFBD>󲿷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>Ȩ<EFBFBD>ؾ<EFBFBD><EFBFBD><EFBFBD> W <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̵Ľ<EFBFBD><EFBFBD>ı<EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӷ<EFBFBD> H <EFBFBD><EFBFBD> v <EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD>ضԽ<EFBFBD><EFBFBD>󣬵õ<EFBFBD><EFBFBD><EFBFBD>Ȩ֮<EFBFBD><EFBFBD><EFBFBD><EFBFBD> H <EFBFBD><EFBFBD> v<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>м<EFBFBD>Ȩһ<EFBFBD><EFBFBD>*/
if ((info = lsq(H, v, NX, nv, dx, Q)))
{
sprintf(msg, "lsq error info=%d", info);
break;
}
// 6<><36><EFBFBD><EFBFBD> 5 <20><><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD> dx <20><><EFBFBD><EFBFBD><EBB5BD>ǰ x ֵ<>У<EFBFBD><D0A3>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD> x ֵ
for (j = 0; j < NX; j++)
{
x[j] += dx[j];
}
/*7<><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 5 <20><><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5>޸<EFBFBD><DEB8><EFBFBD> dx С<>ڽض<DABD><D8B6><EFBFBD><EFBFBD><EFBFBD>(Ŀǰ<C4BF><C7B0>10^{-4} )<29><>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 6 <EFBFBD>еõ<EFBFBD><EFBFBD><EFBFBD> x ֵ<EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD>յĶ<EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> sol <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD><EFBFBD>ٵ<EFBFBD><EFBFBD><EFBFBD> valsol <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD>ϵ<EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>
(α<EFBFBD><EFBFBD><EFBFBD>в<EFBFBD>С<EFBFBD><EFBFBD>ij<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>^2ֵ<EFBFBD><EFBFBD> GDOP С<EFBFBD><EFBFBD>ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD> RTKLIB Manual P162, E.6.33, E.6.34)<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>򣬽<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD>*/
if (norm(dx, NX) < 1E-4)
{
sol->type = 0; /* type (0:xyz-ecef,1:enu-baseline) */
sol->time = timeadd(obs[0].time, -x[3] / CLIGHT); /* sol->time <20>д洢<D0B4><E6B4A2><EFBFBD>Ǽ<EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD>ջ<EFBFBD><D5BB>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źŹ۲<C5B9>ʱ<EFBFBD><CAB1> */
//<2F><EFBFBD><E2B7BD>ʱ<EFBFBD><CAB1> dtr <20><>λ<EFBFBD><CEBB> m<><6D><EFBFBD>dz<EFBFBD><C7B3><EFBFBD><EFBFBD>˹<EFBFBD><CBB9><EFBFBD>֮<EFBFBD><D6AE><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󸳸<EFBFBD> sol->dtr ʱ<>ٳ<EFBFBD><D9B3>Թ<EFBFBD><D4B9><EFBFBD>
sol->dtr[0] = x[3] / CLIGHT; /* receiver clock bias (s) */
sol->dtr[1] = x[4] / CLIGHT; /* GLO-GPS time offset (s) */
sol->dtr[2] = x[5] / CLIGHT; /* GAL-GPS time offset (s) */
sol->dtr[3] = x[6] / CLIGHT; /* BDS-GPS time offset (s) */
// sol->dtr[4] = x[7] / CLIGHT; /* IRN-GPS time offset (s) */
for (j = 0; j < 6; j++)
sol->rr[j] = j < 3 ? x[j] : 0.0;
for (j = 0; j < 3; j++)
sol->qr[j] = (float)Q[j + j * NX];
sol->qr[3] = (float)Q[1]; /* cov xy */
sol->qr[4] = (float)Q[2 + NX]; /* cov yz */
sol->qr[5] = (float)Q[2]; /* cov zx */
sol->ns = (uint8_t)ns;
sol->age = sol->ratio = 0.0;
/* validate solution */
if ((stat = valsol(azel, vsat, n, opt, v, nv, NX, msg)))
{
sol->stat = opt->sateph == EPHOPT_SBAS ? SOLQ_SBAS : SOLQ_SINGLE;
}
free(v);
free(H);
free(var);
return stat;
}
}
// 8<><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˹涨<CBB9><E6B6A8>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɢ<EFBFBD><C9A2>Ϣ<EFBFBD>󣬷<EFBFBD><F3A3ACB7><EFBFBD> 0
if (i >= MAXITR)
sprintf(msg, "iteration divergent i=%d", i);
free(v);
free(H);
free(var);
return 0;
}
/* RAIM FDE (failure detection and exclution)
ʹ<EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><EFBFBD>о<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD>Ķ<EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Լ<EFBFBD><EFBFBD>RAIM<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>ʣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>۲<EFBFBD>ֵ<EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD>ų<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˡ<EFBFBD>
ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD><EFBFBD>ڶԶ<EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><EFBFBD>׵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD>м<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>13<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
obsd_t *obs I <EFBFBD>۲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int n I <EFBFBD>۲<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double *rs I <EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ú<EFBFBD><EFBFBD>ٶȣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ6*n<EFBFBD><EFBFBD>{x,y,z,vx,vy,vz}(ecef)(m,m/s)
double *dts I <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ2*n<EFBFBD><EFBFBD> {bias,drift} (s|s/s)
double *vare I <EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ú<EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><EFBFBD><EFBFBD><EFBFBD> (m^2)
int *svh I <EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־ (-1:correction not available)
nav_t *nav I <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
prcopt_t *opt I <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>
sol_t *sol IO solution
double *azel IO <EFBFBD><EFBFBD>λ<EFBFBD>Ǻ͸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (rad)
int *vsat IO <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD>λʱ<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>Ч
double *resp IO <EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD>в<EFBFBD> (P-(r+c*dtr-c*dts+I+T))
char *msg O <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
int O (1:ok,0:error)
-------------------------------*/
static int raim_fde(const obsd_t *obs, int n, const double *rs,
const double *dts, const double *vare, const int *svh,
const nav_t *nav, const prcopt_t *opt, const ssat_t *ssat,
sol_t *sol, double *azel, int *vsat, double *resp, char *msg)
{
obsd_t *obs_e;
sol_t sol_e = {{0}};
char tstr[32], name[16], msg_e[128];
double *rs_e, *dts_e, *vare_e, *azel_e, *resp_e, rms_e, rms = 100.0;
int i, j, k, nvsat, stat = 0, *svh_e, *vsat_e, sat = 0;
trace(3, "----> raim_fde: %s n=%2d\n", time_str(obs[0].time, 0), n);
if (!(obs_e = (obsd_t *)malloc(sizeof(obsd_t) * n)))
return 0;
rs_e = mat(6, n);
dts_e = mat(2, n);
vare_e = mat(1, n);
azel_e = zeros(2, n);
svh_e = imat(1, n);
vsat_e = imat(1, n);
resp_e = mat(1, n);
/*Դ<><D4B4><EFBFBD><EFBFBD><EFBFBD>кܶ<D0BA><DCB6><EFBFBD><EFBFBD><EFBFBD> i<><69>j<EFBFBD><6A>k<EFBFBD><6B>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>i<EFBFBD><69>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD>ÿ<EFBFBD>ν<EFBFBD><CEBD><EFBFBD><EFBFBD><EFBFBD> i<><69><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8> if (j==i) continueʵ<65>ֵģ<D6B5>
j<EFBFBD><EFBFBD>ʾʣ<EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD>ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD>ν<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD>ݵĸ<EFBFBD>ֵ<EFBFBD><EFBFBD>k<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD>ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> jһ<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>*/
// 1<><31><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> i <20><><EFBFBD><EFBFBD><EFBFBD>ǡ<EFBFBD>
for (i = 0; i < n; i++)
{
/* satellite exclution */
for (j = k = 0; j < n; j++)
{
if (j == i)
continue;
obs_e[k] = obs[j];
matcpy(rs_e + 6 * k, rs + 6 * j, 6, 1);
matcpy(dts_e + 2 * k, dts + 2 * j, 2, 1);
vare_e[k] = vare[j];
svh_e[k++] = svh[j];
}
/* estimate receiver position without a satellite
2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> i <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǻ󣬽<EFBFBD>ʣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><EFBFBD>Ƶ<EFBFBD>һ<EFBFBD>𣬵<EFBFBD><EFBFBD><EFBFBD> estpos <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>ʣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD><EFBFBD>ж<EFBFBD>λ<EFBFBD>Ķ<EFBFBD>λֵ<EFBFBD><EFBFBD>*/
if (!estpos(obs_e, n - 1, rs_e, dts_e, vare_e, svh_e, nav, opt, ssat, &sol_e, azel_e,
vsat_e, resp_e, msg_e))
{
trace(3, "raim_fde: exsat=%2d (%s)\n", obs[i].sat, msg);
continue;
}
/*3<><33><EFBFBD>ۼ<EFBFBD>ʹ<EFBFBD>õ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʵ<EFBFBD>ֶ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>α<EFBFBD><CEB1><EFBFBD>в<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> nvsat<5<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD><EFBFBD>٣<EFBFBD><EFBFBD>޷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RAIM_FDE <EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
for (j = nvsat = 0, rms_e = 0.0; j < n - 1; j++)
{
if (!vsat_e[j])
continue;
rms_e += SQR(resp_e[j]);
nvsat++;
}
if (nvsat < 5)
{
trace(3, "raim_fde: exsat=%2d lack of satellites nvsat=%2d\n",
obs[i].sat, nvsat);
continue;
}
/*4<><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><CEB1><EFBFBD>в<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD>͵ı<CDB5>׼<EFBFBD><EFBFBD><EEA3AC><EFBFBD><EFBFBD>С<EFBFBD><D0A1> rms<6D><73><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> stat <20><>Ϊ 1<><31>
<EFBFBD><EFBFBD><EFBFBD>¸<EFBFBD><EFBFBD><EFBFBD> sol<EFBFBD><EFBFBD>azel<EFBFBD><EFBFBD>vsat(<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǣ<EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>Ϊ0)<EFBFBD><EFBFBD>resp<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD> rms_e<EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD> rms <EFBFBD>С<EFBFBD>*/
rms_e = sqrt(rms_e / nvsat);
trace(3, "raim_fde: exsat=%2d rms=%8.3f\n", obs[i].sat, rms_e);
if (rms_e > rms)
continue;
/* save result */
for (j = k = 0; j < n; j++)
{
if (j == i)
continue;
matcpy(azel + 2 * j, azel_e + 2 * k, 2, 1);
vsat[j] = vsat_e[k];
resp[j] = resp_e[k++];
}
stat = 1;
sol_e.eventime = sol->eventime;
*sol = sol_e;
sat = obs[i].sat;
rms = rms_e;
vsat[i] = 0;
strcpy(msg, msg_e);
}
/*5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ǣ<EFBFBD><C7A3>ظ<EFBFBD> 2-4<><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD>ܶ<EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD>α<EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><EFBFBD><EFBFBD>׼ƽ<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>С<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õĽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD>յĽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
// 6<><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD> stat<61><74>Ϊ 0<><30><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>и<EFBFBD><D0B8>õĽ<C3B5><C4BD><EFBFBD><EFBFBD>֣<EFBFBD><D6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD>
if (stat)
{
time2str(obs[0].time, tstr, 2);
satno2id(sat, name);
trace(2, "%s: %s excluded by raim\n", tstr + 11, name);
}
free(obs_e);
free(rs_e);
free(dts_e);
free(vare_e);
free(azel_e);
free(svh_e);
free(vsat_e);
free(resp_e);
return stat;
}
/* range rate residuals
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵļ<EFBFBD><EFBFBD>ξ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҷ˵<EFBFBD><EFBFBD>ٶȲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>11<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
obsd_t *obs I <EFBFBD>۲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int n I <EFBFBD>۲<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double *rs I <EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ú<EFBFBD><EFBFBD>ٶȣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ6*n<EFBFBD><EFBFBD>{x,y,z,vx,vy,vz}(ecef)(m,m/s)
double *dts I <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ2*n<EFBFBD><EFBFBD> {bias,drift} (s|s/s)
nav_t *nav I <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double *rr I <EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD>λ<EFBFBD>ú<EFBFBD><EFBFBD>ٶȣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ6<EFBFBD><EFBFBD>{x,y,z,vx,vy,vz}(ecef)(m,m/s)
double *x I <EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ֮ǰ<EFBFBD>Ķ<EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ4<EFBFBD><EFBFBD>{vx,vy,vz,drift}
double *azel IO <EFBFBD><EFBFBD>λ<EFBFBD>Ǻ͸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (rad)
int *vsat I <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>Ч
double *v O <EFBFBD><EFBFBD><EFBFBD>ٷ<EFBFBD><EFBFBD>̵<EFBFBD><EFBFBD>Ҷ˲<EFBFBD><EFBFBD>֣<EFBFBD><EFBFBD>ٶȲв<EFBFBD>
double *H O <EFBFBD><EFBFBD><EFBFBD>ٷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>еļ<EFBFBD><EFBFBD>ξ<EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
int O <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
------------------------------------------------------*/
static int resdop(const obsd_t *obs, int n, const double *rs, const double *dts,
const nav_t *nav, const double *rr, const double *x,
const double *azel, const int *vsat, double err, double *v,
double *H)
{
double freq, rate, pos[3], E[9], a[3], e[3], vs[3], cosel, sig;
int i, j, nv = 0;
trace(3, "resdop : n=%d\n", n);
// 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ecef2pos <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD> ECEF ת<><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>
ecef2pos(rr, pos);
// 2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD> xyz2enu <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
xyz2enu(pos, E);
for (i = 0; i < n && i < MAXOBS; i++)
{
freq = sat2freq(obs[i].sat, obs[i].code[0], nav);
// 3<><33>ȥ<EFBFBD><C8A5><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>
if (obs[i].D[0] == 0.0 || freq == 0.0 || !vsat[i] || norm(rs + 3 + i * 6, 3) <= 0.0)
{
continue;
}
/* LOS (line-of-sight) vector in ECEF
4<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ENU<EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȼ<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD> ECEF <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ*/
cosel = cos(azel[1 + i * 2]);
a[0] = sin(azel[i * 2]) * cosel;
a[1] = cos(azel[i * 2]) * cosel;
a[2] = sin(azel[1 + i * 2]);
matmul("TN", 3, 1, 3, 1.0, E, a, 0.0, e);
/* satellite velocity relative to receiver in ECEF
5<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ECEF <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>*/
for (j = 0; j < 3; j++)
{
vs[j] = rs[j + 3 + i * 6] - x[j];
}
/* range rate with earth rotation correction
6<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD>ξ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>
У<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD> RTKLIB manual P159 (F.6.29)<EFBFBD><EFBFBD><EFBFBD>˹<EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> P140 (E.3.8b) <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>󵼵õ<EFBFBD>*/
rate = dot(vs, e, 3) + OMGE / CLIGHT * (rs[4 + i * 6] * rr[0] + rs[1 + i * 6] * x[0] - rs[3 + i * 6] * rr[1] - rs[i * 6] * x[1]);
/* Std of range rate error (m/s) */
sig = (err <= 0.0) ? 1.0 : err * CLIGHT / freq;
/* range rate residual (m/s)
7<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݹ<EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ղв<EFBFBD>
<EFBFBD><EFBFBD>7<EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ղв<EFBFBD> b <EFBFBD><EFBFBD><EFBFBD>ܶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϲ<EFBFBD>ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ estvel <EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>ٵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD><EFBFBD>˷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>x<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>dx<EFBFBD><EFBFBD><EFBFBD>ټӵ<EFBFBD>x<EFBFBD>ϡ<EFBFBD>*/
v[nv] = (-obs[i].D[0] * CLIGHT / freq - (rate + x[3] - CLIGHT * dts[1 + i * 2])) / sig;
/* design matrix
8<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD>ξ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ξ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD> 4<EFBFBD><EFBFBD>δ֪<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> NX<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD><EFBFBD>ٷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><EFBFBD>ξ<EFBFBD><EFBFBD><EFBFBD> G <EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>һ<EFBFBD><EFBFBD>*/
for (j = 0; j < 4; j++)
{
H[j + nv * 4] = ((j < 3) ? -e[j] : 1.0) / sig;
}
// 9<><39><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><D9BD>۲ⷽ<DBB2><E2B7BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1
nv++;
}
return nv;
}
/* estimate receiver velocity
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>Ʋ<EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶȣ<EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>ٵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>9<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
obsd_t *obs I <EFBFBD>۲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int n I <EFBFBD>۲<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double *rs I <EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ú<EFBFBD><EFBFBD>ٶȣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ6*n<EFBFBD><EFBFBD>{x,y,z,vx,vy,vz}(ecef)(m,m/s)
double *dts I <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ2*n<EFBFBD><EFBFBD> {bias,drift} (s|s/s)
nav_t *nav I <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
prcopt_t *opt I <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>
sol_t *sol IO solution
double *azel IO <EFBFBD><EFBFBD>λ<EFBFBD>Ǻ͸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (rad)
int *vsat IO <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD>λʱ<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>Ч
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
int O (1:ok,0:error)
------------------------------------------------*/
static void estvel(const obsd_t *obs, int n, const double *rs, const double *dts,
const nav_t *nav, const prcopt_t *opt, sol_t *sol,
const double *azel, const int *vsat)
{
double x[4] = {0}, dx[4], Q[16], *v, *H;
double err = opt->err[4]; /* Doppler error (Hz) */
int i, j, nv;
trace(3, "----> estvel : n=%d\n", n);
v = mat(n, 1);
H = mat(4, n);
/*1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD> resdop<6F><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٷ<EFBFBD><D9B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵļ<DFB5><C4BC>ξ<EFBFBD><CEBE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҷ˵<D2B6><CBB5>ٶȲ<D9B6><C8B2><EFBFBD><E0A3AC><EFBFBD>ض<EFBFBD><D8B6><EFBFBD>ʱ<EFBFBD><CAB1>ʹ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ*/
for (i = 0; i < MAXITR; i++)
{
/* range rate residuals (m/s) */
if ((nv = resdop(obs, n, rs, dts, nav, sol->rr, x, azel, vsat, err, v, H)) < 4)
{
break;
}
/* least square estimation
2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD><EFBFBD>˷<EFBFBD> lsq <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<EFBFBD>ٶȡ<EFBFBD>ƵƯ}<EFBFBD>IJ<EFBFBD><EFBFBD><EFBFBD> dx<EFBFBD><EFBFBD><EFBFBD>ۼӵ<EFBFBD> x <EFBFBD><EFBFBD>*/
//<2F><><EFBFBD><EFBFBD><EFB2BB><EFBFBD><EFBFBD>λʱ<CEBB><CAB1><EFBFBD><EFBFBD>ʼֵ<CABC><D6B5><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>һ<EFBFBD><D2BB>Ԫ<EFBFBD><D4AA>λ<EFBFBD><CEBB>(<28><> sol <20>ж<EFBFBD>ȡ<EFBFBD><C8A1>ʼֵ)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٵij<D9B5>ʼֱֵ<D6B5>Ӹ<EFBFBD><D3B8><EFBFBD>Ϊ 0.
if (lsq(H, v, 4, nv, dx, Q))
break;
for (j = 0; j < 4; j++)
x[j] += dx[j];
/*3<><33><EFBFBD><EFBFBD><EFBFBD>鵱ǰ<E9B5B1><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>ֵ<EFBFBD>Ƿ<EFBFBD>С<EFBFBD><D0A1> 1E-6<><36>
<EFBFBD>ǣ<EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><EFBFBD>ܽӽ<EFBFBD><EFBFBD><EFBFBD>ʵֵ<EFBFBD>ˣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD>ٶȴ<EFBFBD><EFBFBD> sol->rr <EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD>*/
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> sol_t <20><><EFBFBD>ʹ<CDB4><E6B4A2><EFBFBD>ٽ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>û<EFBFBD>д洢<D0B4><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ƵƯ<C6B5><C6AF>
if (norm(dx, 4) < 1E-6)
{
matcpy(sol->rr + 3, x, 3, 1);
sol->qv[0] = (float)Q[0]; /* xx */
sol->qv[1] = (float)Q[5]; /* yy */
sol->qv[2] = (float)Q[10]; /* zz */
sol->qv[3] = (float)Q[1]; /* xy */
sol->qv[4] = (float)Q[6]; /* yz */
sol->qv[5] = (float)Q[2]; /* zx */
break;
}
}
free(v);
free(H);
}
/* single-point positioning ----------------------------------------------------
* compute receiver position, velocity, clock bias by single-point positioning
* with pseudorange and doppler observables
* args : obsd_t *obs I observation data
* int n I number of observation data
* nav_t *nav I navigation data
* prcopt_t *opt I processing options
* sol_t *sol IO solution
* double *azel IO azimuth/elevation angle (rad) (NULL: no output)
* ssat_t *ssat IO satellite status (NULL: no output)
* char *msg O error message for error exit
* return : status(1:ok,0:error)
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>Ʋ<EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>á<EFBFBD><EFBFBD>ٶȺ<EFBFBD><EFBFBD>Ӳ<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
obsd_t *obs I <EFBFBD>۲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int n I <EFBFBD>۲<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
nav_t *nav I <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
prcopt_t *opt I <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>
sol_t *sol IO solution
double *azel IO <EFBFBD><EFBFBD>λ<EFBFBD>Ǻ͸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (rad) (NULL: no output)
ssat_t *ssat IO <EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ (NULL: no output)
char *msg O <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
int O (1:ok,0:error)
*-----------------------------------------------------------------------------*/
extern int pntpos(const obsd_t *obs, int n, const nav_t *nav,
const prcopt_t *opt, sol_t *sol, double *azel, ssat_t *ssat,
char *msg)
{
prcopt_t opt_ = *opt;
double *rs, *dts, *var, *azel_, *resp;
int i, stat, vsat[MAXOBS] = {0}, svh[MAXOBS];
trace(3, "--> pntpos : tobs=%s n=%d\n", time_str(obs[0].time, 3), n);
sol->stat = SOLQ_NONE;
if (n <= 0)
{
strcpy(msg, "no observation data");
return 0;
}
sol->time = obs[0].time;
msg[0] = '\0';
sol->eventime = obs[0].eventime;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>ռ<EFBFBD> 96*n */
rs = mat(6, n);
dts = mat(2, n);
var = mat(1, n);
azel_ = zeros(2, n);
resp = mat(1, n);
if (ssat) /* <20><>ssat<61><74><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ */
{
for (i = 0; i < MAXSAT; i++)
{
ssat[i].snr_rover[0] = 0;
ssat[i].snr_base[0] = 0;
}
for (i = 0; i < n; i++)
ssat[obs[i].sat - 1].snr_rover[0] = obs[i].SNR[0];
}
/*1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1> opt <20>е<EFBFBD>ģʽ<C4A3><CABD><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD>ģʽʱ<CABD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> broadcast ģ<>ͣ<EFBFBD><CDA3><EFBFBD>Klobucharģ<72>ͣ<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Saastamoinen ģ<EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> opt <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>*/
if (opt_.mode != PMODE_SINGLE)
{ /* for precise positioning */
// opt_.ionoopt = IONOOPT_BRDC; /* <20><>ΪRTCM32<33><32><EFBFBD><EFBFBD><E1B9A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD> */
opt_.ionoopt = IONOOPT_OFF;
opt_.tropopt = TROPOPT_SAAS;
}
/* satellite positons, velocities and clocks
2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> satposs <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>á<EFBFBD><EFBFBD>ٶȡ<EFBFBD>ʱ<EFBFBD><EFBFBD>*/
satposs(sol->time, obs, n, nav, opt_.sateph, rs, dts, var, svh);
/* estimate receiver position with pseudorange
3<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> estpos <EFBFBD><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD>ջ<EFBFBD>λ<EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> valsol <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GDOP <EFBFBD><EFBFBD><EFBFBD>*/
stat = estpos(obs, n, rs, dts, var, svh, nav, &opt_, ssat, sol, azel_, vsat, resp, msg);
/* 4<><34><EFBFBD><EFBFBD>3<EFBFBD>еļ<D0B5><C4BC><EFBFBD>ûͨ<C3BB><CDA8>RAIM FDE <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD>о<EFBFBD><D0BE><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>ԣ<EFBFBD><D4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>ų<EFBFBD><C5B3><EFBFBD>*/
if (!stat && n >= 6 && opt->posopt[4])
{
stat = raim_fde(obs, n, rs, dts, var, svh, nav, &opt_, ssat, sol, azel_, vsat, resp, msg);
}
/* estimate receiver velocity with Doppler
5<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> estvel <EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>Ʋ<EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶȡ<EFBFBD>*/
if (stat)
{
estvel(obs, n, rs, dts, nav, &opt_, sol, azel_, vsat);
}
if (azel)
{
for (i = 0; i < n * 2; i++)
azel[i] = azel_[i];
}
if (ssat)
{
for (i = 0; i < MAXSAT; i++) /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
{
ssat[i].vs = 0;
ssat[i].azel[0] = ssat[i].azel[1] = 0.0;
ssat[i].resp[0] = ssat[i].resc[0] = 0.0;
}
for (i = 0; i < n; i++)
{
ssat[obs[i].sat - 1].azel[0] = azel_[i * 2];
ssat[obs[i].sat - 1].azel[1] = azel_[1 + i * 2];
if (!vsat[i])
continue;
ssat[obs[i].sat - 1].vs = 1;
ssat[obs[i].sat - 1].resp[0] = resp[i]; /* residuals of pseudorange (m) */
}
}
2022-06-27 15:36:14 +08:00
rt_free(rs);
rt_free(dts);
rt_free(var);
rt_free(azel_);
rt_free(resp);
2022-06-22 09:23:36 +08:00
return stat;
}