127extern int satsys(
int sat,
int* prn);
129extern void satno2id(
int sat,
char*
id);
131extern double sat2freq(
int sat, uint8_t code,
const nav_t* nav);
136extern void sunmoonpos(
gtime_t tut,
const double* erpv,
double* rsun,
double* rmoon,
double* gmst);
137extern double geodist(
const double* rs,
const double* rr,
double* e);
138extern double satazel(
const double* pos,
const double* e,
double* azel);
140extern void ecef2pos(
const double* r,
double* pos);
141extern void ecef2enu(
const double* pos,
const double* r,
double* e);
142extern void xyz2enu(
const double* pos,
double* E);
143extern void covecef(
const double* pos,
const double* Q,
double* P);
144extern void covenu(
const double* pos,
const double* P,
double* Q);
145extern double dot(
const double* a,
const double* b,
int n);
146extern double norm(
const double* a,
int n);
147extern int normv3(
const double* a,
double* b);
148extern void cross3(
const double* a,
const double* b,
double* c);
149extern void matcpy(
double* A,
const double* B,
int n,
int m);
150extern void matmul(
const char* tr,
int n,
int k,
int m,
double alpha,
const double* A,
const double* B,
double beta,
152extern double*
mat(
int n,
int m);
153extern int*
imat(
int n,
int m);
154extern double*
zeros(
int n,
int m);
155extern double*
eye(
int n);
156extern int filter(
double* x,
double* P,
const double* H,
const double* v,
const double* R,
int n,
int m);
157extern double sbstropcorr(
gtime_t time,
const double* pos,
const double* azel,
double* var);
158extern double ionmodel(
gtime_t t,
const double* ion,
const double* pos,
const double* azel);
159extern int iontec(
gtime_t time,
const nav_t* nav,
const double* pos,
const double* azel,
int opt,
double* delay,
161extern int sbsioncorr(
gtime_t time,
const nav_t* nav,
const double* pos,
const double* azel,
double* delay,
163extern double tropmodel(
gtime_t time,
const double* pos,
const double* azel,
double humi);
164extern double tropmapf(
gtime_t time,
const double* pos,
const double* azel,
double* mapfw);
165extern int testsnr(
int base,
int freq,
double el,
double snr,
const snrmask_t* mask);
166extern void antmodel(
const pcv_t* pcv,
const double* del,
const double* azel,
int opt,
double* dant);
169 double* var,
int* svh);
171extern void tidedisp(
gtime_t tutc,
const double* rr,
int opt,
const erp_t* erp,
const double* odisp,
double* dr);
172extern unsigned int tickget(
void);
177 const int* exc,
const double* rr,
const double* x,
double* v,
double* H,
double* var);
179#define SQR(x) ((x) * (x))
180#define SQRT(x) ((x) <= 0.0 || (x) != (x) ? 0.0 : sqrt(x))
181#define MAX(x, y) ((x) > (y) ? (x) : (y))
182#define MIN(x, y) ((x) < (y) ? (x) : (y))
183#define ROUND(x) (int)floor((x) + 0.5)
186#define SOLQ_FIX_WL 99
189#define MIN_NSAT_SOL 4
190#define THRES_REJECT 4.0
192#define THRES_MW_JUMP 10.0
194#define VAR_POS SQR(60.0)
195#define VAR_VEL SQR(10.0)
196#define VAR_ACC SQR(10.0)
197#define VAR_CLK SQR(60.0)
198#define VAR_ZTD SQR(0.12)
199#define VAR_GRA SQR(0.01)
200#define VAR_IFB SQR(30.0)
201#define VAR_BIAS SQR(60.0)
202#define VAR_IONO SQR(60.0)
203#define VAR_GLO_IFB SQR(0.6)
208#define GAP_RESION 120
211#define NF(opt) ((opt)->ionoopt == IONOOPT_IFLC ? 1 : (opt)->nf)
212#define NP(opt) ((opt)->dynamics ? 9 : 3)
213#define NC(opt) (NSYS + 1)
219#define NI(opt) ((opt)->ionoopt == IONOOPT_EST ? MAXSAT : 0)
220#define N3(opt) (NF(opt) >= 3 ? NC(opt) : 0)
221#define N4(opt) (NF(opt) >= 4 ? NC(opt) : 0)
222#define NR(opt) (NP(opt) + NC(opt) + NT(opt) + NI(opt) + N3(opt) + N4(opt))
223#define NB(opt) (NF(opt) * MAXSAT)
224#define NX(opt) (NR(opt) + NB(opt))
225#define IC(s, opt) (NP(opt) + (s))
226#define IT(opt) (NP(opt) + NC(opt))
227#define II(s, opt) (NP(opt) + NC(opt) + NT(opt) + (s) - 1)
228#define I3(s, opt) (NP(opt) + NC(opt) + NT(opt) + NI(opt) + (s))
229#define I4(s, opt) (NP(opt) + NC(opt) + NT(opt) + NI(opt) + N3(opt) + (s))
230#define IB(s, f, opt) (NR(opt) + MAXSAT * (f) + (s) - 1)
235 return SQRT(rtk->
Pa[i + i * rtk->
nx]);
237 return SQRT(rtk->
P[i + i * rtk->
nx]);
242 double tow, pos[3], vel[3], acc[3], *x;
244 char id[32], *p = buff;
255 trace(NULL, 3,
"pppoutstat:\n");
262 p += sprintf(p,
"$POS,%d,%.3f,%d,%.4f,%.4f,%.4f,%.4f,%.4f,%.4f\n", week, tow, rtk->
sol.
stat, x[0], x[1], x[2],
271 "$VELACC,%d,%.3f,%d,%.4f,%.4f,%.4f,%.5f,%.5f,%.5f,%.4f,%.4f,"
272 "%.4f,%.5f,%.5f,%.5f\n",
273 week, tow, rtk->
sol.
stat, vel[0], vel[1], vel[2], acc[0], acc[1], acc[2], 0.0, 0.0, 0.0, 0.0, 0.0,
277 i =
IC(0, &rtk->
opt);
278 p += sprintf(p,
"$CLK,%d,%.3f,%d,%d,%.3f,%.3f,%.3f,%.3f\n", week, tow, rtk->
sol.
stat, 1, x[i] * 1E9 /
CLIGHT,
284 p += sprintf(p,
"$TROP,%d,%.3f,%d,%d,%.4f,%.4f\n", week, tow, rtk->
sol.
stat, 1, x[i],
STD(rtk, i));
288 p += sprintf(p,
"$TRPG,%d,%.3f,%d,%d,%.5f,%.5f,%.5f,%.5f\n", week, tow, rtk->
sol.
stat, 1, x[i + 1], x[i + 2],
289 STD(rtk, i + 1),
STD(rtk, i + 2));
294 for (i = 0; i <
MAXSAT; i++) {
295 ssat = rtk->
ssat + i;
299 j =
II(i + 1, &rtk->
opt);
300 if (rtk->
x[j] == 0.0) {
304 p += sprintf(p,
"$ION,%d,%.3f,%d,%s,%.1f,%.1f,%.4f,%.4f\n", week, tow, rtk->
sol.
stat,
id,
310 for (i = 0; i <
MAXSAT; i++)
311 for (j = 0; j <
NF(&rtk->
opt); j++) {
312 k =
IB(i + 1, j, &rtk->
opt);
313 if (rtk->
x[k] == 0.0)
continue;
316 sprintf(p,
"$AMB,%d,%.3f,%d,%s,%d,%.4f,%.4f\n", week, tow, rtk->
sol.
stat,
id, j + 1, x[k],
STD(rtk, k));
319 return (
int)(p - buff);
323 double rsun[3], esun[3], r, ang, erpv[5] = {0}, cosa;
327 trace(NULL, 3,
"testeclipse:\n");
333 for (i = 0; i < n; i++) {
336 if ((r =
norm(rs + i * 6, 3)) <= 0.0) {
341 if (*type && !strstr(type,
"BLOCK IIA")) {
346 cosa =
dot(rs + i * 6, esun, 3) / r;
347 cosa = cosa < -1.0 ? -1.0 : (cosa > 1.0 ? 1.0 : cosa);
351 if (ang <
PI / 2.0 || r * sin(ang) >
RE_WGS84) {
355 trace(NULL, 3,
"eclipsing sat excluded %s sat=%2d\n",
time_str(obs[0].time, 0), obs[i].sat);
357 for (j = 0; j < 3; j++) {
364 if (fabs(beta) < 1E-12 && fabs(mu) < 1E-12) {
367 return atan2(-tan(beta), sin(mu)) +
PI;
370extern int yaw_angle(
int sat,
const char* type,
int opt,
double beta,
double mu,
double* yaw) {
375static int sat_yaw(
gtime_t time,
int sat,
const char* type,
int opt,
const double* rs,
double* exs,
double* eys) {
376 double rsun[3], ri[6], es[3], esun[3], n[3], p[3], en[3], ep[3], ex[3], E, beta, mu;
377 double yaw, cosy, siny, erpv[5] = {0};
384 ri[3] -=
OMGE * ri[1];
385 ri[4] +=
OMGE * ri[0];
391 beta =
PI / 2.0 - acos(
dot(esun, en, 3));
392 E = acos(
dot(es, ep, 3));
393 mu =
PI / 2.0 + (
dot(es, esun, 3) <= 0 ? -E : E);
394 if (mu < -
PI / 2.0) {
396 }
else if (mu >=
PI / 2.0) {
401 if (!
yaw_angle(sat, type, opt, beta, mu, &yaw)) {
409 for (i = 0; i < 3; i++) {
410 exs[i] = -siny * en[i] + cosy * ex[i];
411 eys[i] = -cosy * en[i] - siny * ex[i];
416static int model_phw(
gtime_t time,
int sat,
const char* type,
int opt,
const double* rs,
const double* rr,
418 double exs[3], eys[3], ek[3], exr[3], eyr[3], eks[3], ekr[3], E[9];
419 double dr[3], ds[3], drs[3], r[3], pos[3], cosp, ph;
427 if (!
sat_yaw(time, sat, type, opt, rs, exs, eys)) {
432 for (i = 0; i < 3; i++) {
433 r[i] = rr[i] - rs[i];
452 for (i = 0; i < 3; i++) {
453 ds[i] = exs[i] - ek[i] *
dot(ek, exs, 3) - eks[i];
454 dr[i] = exr[i] - ek[i] *
dot(ek, exr, 3) + ekr[i];
459 }
else if (cosp > 1.0) {
462 ph = acos(cosp) / 2.0 /
PI;
464 if (
dot(ek, drs, 3) < 0.0) {
468 *phw = ph + floor(*phw - ph + 0.5);
472static double varerr(
int sat,
int sys,
double el,
int idx,
int type,
const prcopt_t* opt) {
473 double fact = 1.0, sinel = sin(el);
476 fact *= opt->
eratio[idx == 0 ? 0 : 1];
490 return SQR(fact * opt->
err[1]) +
SQR(fact * opt->
err[2] / sinel);
496 for (j = 0; j < rtk->
nx; j++) {
497 rtk->
P[i + j * rtk->
nx] = rtk->
P[j + i * rtk->
nx] = i == j ? var : 0.0;
506 if (freq1 == 0.0 || freq2 == 0.0 || obs->
L[0] == 0.0 || obs->
L[f] == 0.0) {
509 return (obs->
L[0] / freq1 - obs->
L[f] / freq2) *
CLIGHT;
518 if (freq1 == 0.0 || freq2 == 0.0 || obs->
L[0] == 0.0 || obs->
L[f] == 0.0 || obs->
P[0] == 0.0 || obs->
P[f] == 0.0) {
521 return (obs->
L[0] - obs->
L[f]) *
CLIGHT / (freq1 - freq2) -
522 (freq1 * obs->
P[0] + freq2 * obs->
P[f]) / (freq1 + freq2);
528 static int reported = 0;
531 if (reported & sys) {
559 fprintf(stderr,
"note: auto signal: %s iono-free 2nd freq = L%s (nominal band absent in data)\n", name,
561 trace(NULL, 1,
"corr_meas: auto IFLC 2nd band sys=%s code=L%s\n", name,
code2obs(code));
565 const double* dants,
double phw,
double* L,
double* P,
double* Lc,
double* Pc,
int tl) {
567 double freq[NFREQ] = {0}, C1, C2, cb = 0.0, pb = 0.0;
572 if (strstr(opt->
pppopt,
"-SSR_BIAS")) {
581 nfread = (corr ==
CORR_IGS && NFREQ > opt->
nf) ? NFREQ : opt->
nf;
582 for (i = 0; i < nfread && i < NFREQ; i++) {
583 L[i] = P[i] = cb = pb = 0.0;
586 if (freq[i] == 0.0 || obs->
L[i] == 0.0 || obs->
P[i] == 0.0) {
597 L[i] = obs->
L[i] *
CLIGHT / freq[i] - dants[ant_idx] - dantr[ant_idx] - phw *
CLIGHT / freq[i];
598 P[i] = obs->
P[i] - dants[ant_idx] - dantr[ant_idx];
625 int c = obs->
code[i] - 1;
634 trace(NULL, tl > 0 ? 3 : 4,
635 "corr_meas: %s satellite code bias does not exist. %s obscode=C%s\n", tstr, satid,
649 }
else if (sysno >= 0 && nav->
osb.
vrsyscb[sysno][c]) {
653 trace(NULL, tl > 0 ? 3 : 4,
654 "corr_meas: %s receiver code bias does not exist. %s obscode=C%s\n", tstr, satid,
661 trace(NULL, tl > 0 ? 3 : 4,
"corr_meas: %s invalid observation code. %s\n", tstr, satid);
665 P[i] += nav->
cbias[obs->
sat - 1][1];
668 P[i] += nav->
cbias[obs->
sat - 1][2];
701 trace(NULL, tl > 0 ? 4 : 4,
"corr_meas: %s cbias %s obscode=C%s ssrcode=C%s cbias=%7.3f\n", tstr, satid,
708 trace(NULL, tl > 0 ? 3 : 4,
709 "corr_meas: %s cbias does not exist. %s obscode=C%s ssrcode=C%s cbias=%7.3f\n", tstr, satid,
715 trace(NULL, tl > 0 ? 2 : 4,
"corr_meas: %s invalid cbias %s obscode=C%s ssrcode=C%s cbias=%7.3f\n",
721 trace(NULL, tl > 0 ? 4 : 4,
"corr_meas: %s pbias %s obscode=L%s ssrcode=L%s pbias=%7.3f\n", tstr, satid,
729 trace(NULL, tl > 0 ? 3 : 4,
730 "corr_meas: %s pbias does not exist. %s obscode=C%s ssrcode=C%s pbias=%7.3f\n", tstr, satid,
736 trace(NULL, tl > 0 ? 2 : 4,
"corr_meas: %s invalid pbias %s obscode=L%s ssrcode=L%s pbias=%7.3f\n",
745 if (corr ==
CORR_IGS && (freq[1] == 0.0 || P[1] == 0.0 || L[1] == 0.0)) {
747 for (j = 2; j < NFREQ; j++) {
748 if (freq[j] != 0.0 && P[j] != 0.0 && L[j] != 0.0) {
756 if (freq[0] == 0.0 || freq[i2] == 0.0) {
759 C1 =
SQR(freq[0]) / (
SQR(freq[0]) -
SQR(freq[i2]));
760 C2 = -
SQR(freq[i2]) / (
SQR(freq[0]) -
SQR(freq[i2]));
762 if (P[0] == 0.0 || P[i2] == 0.0 || L[0] == 0.0 || L[i2] == 0.0) {
763 trace(NULL, tl > 0 ? 2 : 4,
"corr_meas: no sufficient obs data %s %s \n", tstr, satid);
766 *Lc = C1 * L[0] + C2 * L[i2];
767 *Pc = C1 * P[0] + C2 * P[i2];
775 int i, f, sat, ndop = 0, nf = rtk->
opt.
nf < NFREQ ? rtk->
opt.
nf : NFREQ;
776 double dph, dpt, tt, mean_dop = 0.0;
777 double dopdif[
MAXOBS][NFREQ] = {{0}}, tts[
MAXOBS][NFREQ] = {{0}};
783 for (i = 0; i < n && i <
MAXOBS; i++) {
785 for (f = 0; f < nf; f++) {
786 if (obs[i].L[f] == 0.0 || obs[i].D[f] == 0.0 || rtk->
ssat[sat - 1].
ph[0][f] == 0.0) {
790 if (fabs(tt) <
DTTOL) {
793 dph = (obs[i].
L[f] - rtk->
ssat[sat - 1].
ph[0][f]) / tt;
795 dopdif[i][f] = dph - dpt;
797 if (fabs(dopdif[i][f]) < 3.0 * rtk->
opt.
thresdop) {
798 mean_dop += dopdif[i][f];
808 for (i = 0; i < n && i <
MAXOBS; i++) {
810 for (f = 0; f < nf; f++) {
811 if (dopdif[i][f] == 0.0) {
814 if (fabs(dopdif[i][f] - mean_dop) > rtk->
opt.
thresdop) {
816 trace(NULL, 3,
"ppp detslp_dop: sat=%2d F=%d dL=%.3f off=%.3f tt=%.2f\n", sat, f + 1,
817 dopdif[i][f] - mean_dop, mean_dop, tts[i][f]);
824 int i, f, sat, nf = rtk->
opt.
nf < NFREQ ? rtk->
opt.
nf : NFREQ;
825 for (i = 0; i < n && i <
MAXOBS; i++) {
827 for (f = 0; f < nf; f++) {
828 uint8_t code = obs[i].
code[f];
837 trace(NULL, 3,
"ppp detslp_code: sat=%2d F=%d %s->%s\n", sat, f + 1,
code2obs(ccode),
847 trace(NULL, 3,
"detslp_ll: n=%d\n", n);
851 for (i = 0; i < n && i <
MAXOBS; i++) {
852 for (j = 0; j < rtk->
opt.
nf && j < NFREQ; j++) {
853 if (obs[i].L[j] == 0.0 || !(obs[i].LLI[j] & 3)) {
857 trace(NULL, 3,
"detslp_ll: slip detected %s sat=%2d f=%d\n", satid, obs[i].sat, j + 1);
868 trace(NULL, 3,
"detslp_gf: n=%d\n", n);
870 for (i = 0; i < n && i <
MAXOBS; i++) {
871 for (f = 1; f < rtk->
opt.
nf && f < NFREQ; f++) {
872 if ((g1 =
gfmeas(obs + i, nav, f)) == 0.0) {
879 trace(NULL, 4,
"detslip_gf: sat=%2d f=%d gf0=%8.3f gf1=%8.3f\n", obs[i].sat, f + 1, g0, g1);
883 trace(NULL, 2,
"detslip_gf: slip detected %s sat=%2d f=%d gf=%8.3f->%8.3f\n", satid, obs[i].sat, f + 1,
897 trace(NULL, 3,
"detslp_mw: n=%d\n", n);
899 for (i = 0; i < n && i <
MAXOBS; i++) {
900 for (f = 1; f < rtk->
opt.
nf && f < NFREQ; f++) {
901 if ((w1 =
mwmeas(obs + i, nav, f)) == 0.0) {
908 trace(NULL, 4,
"detslip_mw: sat=%2d f=%d mw0=%8.3f mw1=%8.3f\n", obs[i].sat, f + 1, w0, w1);
912 trace(NULL, 2,
"detslip_mw: slip detected %s sat=%2d f=%d mw=%8.3f->%8.3f\n", satid, obs[i].sat, f + 1,
923 int discont0, discont1, ssrcode;
926 trace(NULL, 3,
"detslp_ssr: n=%d\n", n);
932 for (i = 0; i < n && i <
MAXOBS; i++) {
937 sys =
satsys(obs[i].sat, NULL);
940 for (j = 0; j < rtk->
opt.
nf && j < NFREQ; j++) {
953 if (discont0 != discont1) {
956 "detslp_ssr: discont detected sys=%2d %s sat=%2d f=%d code=%2d discont0=%d discont1=%d\n", sys,
957 satid, obs[i].sat, j + 1, ssrcode, discont0, discont1);
966 double *F, *P, *FP, *x, *xp, pos[3], Q[9] = {0}, Qv[9];
969 trace(NULL, 3,
"udpos_ppp:\n");
973 for (i = 0; i < 3; i++) {
979 if (
norm(rtk->
x, 3) <= 0.0) {
980 for (i = 0; i < 3; i++) {
984 for (i = 3; i < 6; i++) {
987 for (i = 6; i < 9; i++) {
994 for (i = 0; i < 3; i++) {
995 rtk->
P[i * (1 + rtk->
nx)] +=
SQR(rtk->
opt.
prn[5]) * fabs(rtk->
tt);
1001 for (i = 0; i < 3; i++) {
1008 for (i = nx = 0; i < rtk->
nx; i++) {
1009 if (rtk->
x[i] != 0.0 && rtk->
P[i + i * rtk->
nx] > 0.0) {
1024 for (i = 0; i < 6; i++) {
1025 F[i + (i + 3) * nx] = rtk->
tt;
1027 for (i = 0; i < 3; i++) {
1028 F[i + (i + 6) * nx] =
SQR(rtk->
tt) / 2.0;
1030 for (i = 0; i < nx; i++) {
1031 x[i] = rtk->
x[ix[i]];
1032 for (j = 0; j < nx; j++) {
1033 P[i + j * nx] = rtk->
P[ix[i] + ix[j] * rtk->
nx];
1037 matmul(
"NN", nx, 1, nx, 1.0, F, x, 0.0, xp);
1038 matmul(
"NN", nx, nx, nx, 1.0, F, P, 0.0, FP);
1039 matmul(
"NT", nx, nx, nx, 1.0, FP, F, 0.0, P);
1041 for (i = 0; i < nx; i++) {
1042 rtk->
x[ix[i]] = xp[i];
1043 for (j = 0; j < nx; j++) {
1044 rtk->
P[ix[i] + ix[j] * rtk->
nx] = P[i + j * nx];
1048 Q[0] = Q[4] =
SQR(rtk->
opt.
prn[3]) * fabs(rtk->
tt);
1052 for (i = 0; i < 3; i++) {
1053 for (j = 0; j < 3; j++) {
1054 rtk->
P[i + 6 + (j + 6) * rtk->
nx] += Qv[i + j * 3];
1069 trace(NULL, 3,
"udclk_ppp:\n");
1072 for (i = 0; i <
NC(rtk->
opt); i++) {
1085 double pos[3], azel[] = {0.0,
PI / 2.0}, ztd, var;
1086 int i =
IT(&rtk->
opt), j;
1088 trace(NULL, 3,
"udtrop_ppp:\n");
1090 if (rtk->
x[i] == 0.0) {
1096 for (j = i + 1; j < i + 3; j++) {
1102 trace(NULL, 2,
"udtrop_ppp: rtk->opt.prn[2]=%.3e\n", rtk->
opt.
prn[2]);
1104 for (j = i + 1; j < i + 3; j++) {
1105 rtk->
P[j + j * rtk->
nx] +=
SQR(rtk->
opt.
prn[2] * 0.1) * fabs(rtk->
tt);
1112 double freq1, freq2, ionp, ionc, sinel, pos[3], *azel, el;
1115 double L[NFREQ], P[NFREQ], Lc, Pc;
1118 trace(NULL, 3,
"udiono_ppp:\n");
1120 if ((p = strstr(rtk->
opt.
pppopt,
"-GAP_RESION="))) {
1121 sscanf(p,
"-GAP_RESION=%d", &gap_resion);
1123 for (i = 0; i <
MAXSAT; i++) {
1124 j =
II(i + 1, &rtk->
opt);
1125 if (rtk->
x[j] != 0.0 && (
int)rtk->
ssat[i].
outc[0] > gap_resion) {
1131 trace(NULL, 3,
"udiono_ppp(%4d): %s reset ionospheric estimates. %s outc=%d el=%2.0f\n", __LINE__,
1136 for (i = 0; i < n; i++) {
1137 j =
II(obs[i].sat, &rtk->
opt);
1138 corr_meas(obs + i, nav, rtk->
ssat[obs[i].
sat - 1].
azel, &rtk->
opt, dantr, dants, 0.0, L, P, &Lc, &Pc, 0);
1139 freq1 =
sat2freq(obs[i].sat, obs[i].code[0], nav);
1140 freq2 =
sat2freq(obs[i].sat, obs[i].code[1], nav);
1143 if (rtk->
x[j] == 0.0) {
1144 if (P[0] == 0.0 || P[1] == 0.0 || freq1 == 0.0 || freq2 == 0.0) {
1152 if (L[0] == 0.0 || L[1] == 0.0 || slip[0] || slip[1]) {
1159 trace(NULL, 3,
"udiono_ppp(%4d): %s initialize ionospheric estimates. %s el=%2.0f x=%8.4f\n", __LINE__,
1160 time_str(obs[i].time, 0), satid, azel[1] *
R2D, rtk->
x[j]);
1164 rtk->
P[j + j * rtk->
nx] +=
SQR(rtk->
opt.
prn[1] / sinel) * fabs(rtk->
tt);
1166 if (L[0] == 0.0 || L[1] == 0.0 || freq1 == 0.0 || freq2 == 0.0 || slip[0] || slip[1]) {
1184 trace(NULL, 3,
"udifb_ppp:\n");
1187 for (i = 0; i <
N3(&rtk->
opt); i++) {
1188 j =
I3(i, &rtk->
opt);
1190 if (rtk->
x[j] == 0.0) {
1199 for (i = 0; i <
N4(&rtk->
opt); i++) {
1200 j =
I4(i, &rtk->
opt);
1202 if (rtk->
x[j] == 0.0) {
1212 double L[NFREQ], P[NFREQ], Lc, Pc, bias[
MAXOBS], offset = 0.0, pos[3] = {0};
1213 double freq1, freq2, freq3, ion, dantr[
NFREQPCV] = {0}, dants[
NFREQPCV] = {0};
1214 int i, j, k, f, sat, slip[
MAXOBS] = {0}, clk_jump = 0;
1216 trace(NULL, 3,
"udbias : n=%d\n", n);
1220 clk_jump =
ROUND(
time2gpst(obs[0].time, NULL) * 10) % 864000 == 0;
1222 for (i = 0; i <
MAXSAT; i++) {
1223 for (j = 0; j < rtk->
opt.
nf && j < NFREQ; j++) {
1247 for (f = 0; f <
NF(&rtk->
opt); f++) {
1249 for (i = 0; i <
MAXSAT; i++) {
1251 initx(rtk, 0.0, 0.0,
IB(i + 1, f, &rtk->
opt));
1254 for (i = k = 0; i < n && i <
MAXOBS; i++) {
1256 j =
IB(sat, f, &rtk->
opt);
1257 corr_meas(obs + i, nav, rtk->
ssat[sat - 1].
azel, &rtk->
opt, dantr, dants, 0.0, L, P, &Lc, &Pc, 0);
1264 }
else if (L[f] != 0.0 && P[f] != 0.0) {
1265 freq1 =
sat2freq(sat, obs[i].code[0], nav);
1266 freq2 =
sat2freq(sat, obs[i].code[1], nav);
1267 freq3 =
sat2freq(sat, obs[i].code[f], nav);
1268 slip[i] = rtk->
ssat[sat - 1].
slip[f];
1269 if (obs[i].P[0] == 0.0 || obs[i].P[1] == 0.0 || obs[i].P[f] == 0.0 || freq1 == 0.0 || freq2 == 0.0 ||
1273 ion = (obs[i].
P[0] - obs[i].
P[1]) / (1.0 -
SQR(freq1 / freq2));
1274 bias[i] = L[f] - P[f] + 2.0 * ion *
SQR(freq1 / freq3);
1276 if (rtk->
x[j] == 0.0 || slip[i] || bias[i] == 0.0) {
1280 offset += bias[i] - rtk->
x[j];
1284 if (k >= 2 && fabs(offset / k) > 0.0005 *
CLIGHT) {
1285 for (i = 0; i <
MAXSAT; i++) {
1286 j =
IB(i + 1, f, &rtk->
opt);
1287 if (rtk->
x[j] != 0.0) {
1288 rtk->
x[j] += offset / k;
1291 trace(NULL, 2,
"phase-code jump corrected: %s n=%2d dt=%12.9fs\n",
time_str(rtk->
sol.
time, 0), k,
1294 for (i = 0; i < n && i <
MAXOBS; i++) {
1296 j =
IB(sat, f, &rtk->
opt);
1300 if (bias[i] == 0.0 || (rtk->
x[j] != 0.0 && !slip[i])) {
1308 for (k = 0; k <
MAXSAT; k++) {
1312 trace(NULL, 5,
"udbias_ppp: sat=%2d bias=%.3f\n", sat, bias[i]);
1318 trace(NULL, 3,
"udstate_ppp: n=%d\n", n);
1331 if (
NF(&rtk->
opt) >= 3) {
1343static void satantpcv(
const double* rs,
const double* rr,
const pcv_t* pcv,
double* dant) {
1344 double ru[3], rz[3], eu[3], ez[3], nadir, cosa;
1349 for (i = 0; i < 3; i++) {
1350 ru[i] = rr[i] - rs[i];
1357 cosa =
dot(eu, ez, 3);
1358 cosa = cosa < -1.0 ? -1.0 : (cosa > 1.0 ? 1.0 : cosa);
1366 const double zazel[] = {0.0,
PI / 2.0};
1367 double zhd, m_h, m_w, cotz, grad_n, grad_e;
1373 m_h =
tropmapf(time, pos, azel, &m_w);
1375 if (azel[1] > 0.0) {
1377 cotz = 1.0 / tan(azel[1]);
1378 grad_n = m_w * cotz * cos(azel[0]);
1379 grad_e = m_w * cotz * sin(azel[0]);
1380 m_w += grad_n * x[1] + grad_e * x[2];
1381 dtdx[1] = grad_n * (x[0] - zhd);
1382 dtdx[2] = grad_e * (x[0] - zhd);
1386 return m_h * zhd + m_w * (x[0] - zhd);
1390 double* dtdx,
const nav_t* nav,
double* dtrp,
double* var) {
1391 double trp[3] = {0};
1411 const double* x,
const nav_t* nav,
double* dion,
double* var) {
1413 return sbsioncorr(time, nav, pos, azel, dion, var);
1416 return iontec(time, nav, pos, azel, 1, dion, var);
1424 *dion = x[
II(sat, opt)];
1435static int ppp_res(
int post,
const obsd_t* obs,
int n,
const double* rs,
const double* dts,
const double* var_rs,
1436 const int* svh,
const double* dr,
int* exc,
const nav_t* nav,
const double* x,
const double* cov,
1437 rtk_t* rtk,
double* v,
double* H,
double* R,
double* azel,
double* resrms) {
1439 double y, r, cdtr, bias, C = 0.0, rr[3], pos[3], e[3], dtdx[3] = {0.0}, L[NFREQ], P[NFREQ], Lc, Pc;
1440 double var[
MAXOBS * 2 * NFREQ], dtrp = 0.0, dion = 0.0, vart = 0.0, vari = 0.0, freq, ifb, ifb_std, bias_std,
1443 double ve[
MAXOBS * 2 * NFREQ] = {0}, vmax = 0, resc_rms = 0, resp_rms = 0, resc_ave = 0, resp_ave = 0;
1444 char str[32], satstr[6];
1445 int ne = 0, obsi[
MAXOBS * 2 * NFREQ] = {0}, frqi[
MAXOBS * 2 * NFREQ], maxobs, maxfrq, rej;
1446 int i, j, k, sat, sys, nv = 0, nx = rtk->
nx, stat = 1, nresc = 0, nresp = 0;
1450 for (i = 0; i <
MAXSAT; i++) {
1451 for (j = 0; j < opt->
nf && j < NFREQ; j++) {
1456 for (i = 0; i < 3; i++) {
1457 rr[i] = x[i] + dr[i];
1461 for (i = 0; i < n && i <
MAXOBS; i++) {
1465 if ((r =
geodist(rs + i * 6, rr, e)) <= 0.0 ||
satazel(pos, e, azel + i * 2) < opt->
elmin) {
1469 if (!(sys =
satsys(sat, NULL)) || !rtk->
ssat[sat - 1].
vs ||
satexclude(obs[i].sat, var_rs[i], svh[i], opt) ||
1475 if (!
model_trop(obs[i].time, pos, azel + i * 2, opt, x, dtdx, nav, &dtrp, &vart) ||
1476 !
model_iono(obs[i].time, pos, azel + i * 2, opt, sat, x, nav, &dion, &vari)) {
1491 if (!
corr_meas(obs + i, nav, azel + i * 2, &rtk->
opt, dantr, dants, rtk->
ssat[sat - 1].
phw, L, P, &Lc, &Pc,
1495 trace(NULL, post > 0 ? 3 : 4,
"ppp_res: %s %s sat=%3d nf=%d\n", str, satstr, sat,
NF(opt));
1498 for (j = 0; j < 2 *
NF(opt); j++) {
1500 bias_std = ifb_std = dion_std = dtrp_std = 0.0;
1503 if ((y = j % 2 == 0 ? Lc : Pc) == 0.0) {
1507 if ((y = j % 2 == 0 ? L[j / 2] : P[j / 2]) == 0.0) {
1511 if ((freq =
sat2freq(sat, obs[i].code[j / 2], nav)) == 0.0) {
1514 C =
SQR(
FREQ1 / freq) * (j % 2 == 0 ? -1.0 : 1.0);
1516 for (k = 0; k < nx; k++) {
1517 H[k + nx * nv] = k < 3 ? -e[k] : 0.0;
1544 cdtr = x[
IC(k, opt)];
1545 H[
IC(k, opt) + nx * nv] = 1.0;
1547 if (j / 2 == 2 && j % 2 == 1) {
1548 ifb = x[
I3(k, opt)];
1549 ifb_std =
SQRT(cov[
I3(k, opt) +
I3(k, opt) * rtk->
nx]);
1550 H[
I3(k, opt) + nx * nv] = 1.0;
1552 if (j / 2 == 3 && j % 2 == 1) {
1553 ifb = x[
I4(k, opt)];
1554 ifb_std =
SQRT(cov[
I4(k, opt) +
I4(k, opt) * rtk->
nx]);
1555 H[
I4(k, opt) + nx * nv] = 1.0;
1559 dtrp_std =
SQRT(cov[
IT(opt) +
IT(opt) * rtk->
nx]);
1561 H[
IT(opt) + k + nx * nv] = dtdx[k];
1565 if (rtk->
x[
II(sat, opt)] == 0.0) {
1568 dion_std =
SQRT(cov[
II(sat, opt) +
II(sat, opt) * rtk->
nx]);
1569 H[
II(sat, opt) + nx * nv] = C;
1572 if ((bias = x[
IB(sat, j / 2, opt)]) == 0.0) {
1575 bias_std =
SQRT(cov[
IB(obs[i].sat, j / 2, opt) +
IB(obs[i].sat, j / 2, opt) * rtk->
nx]);
1577 H[
IB(sat, j / 2, opt) + nx * nv] = 1.0;
1580 v[nv] = y - (r + cdtr -
CLIGHT * dts[i * 2] + dtrp + C * dion + bias + ifb);
1583 rtk->
ssat[sat - 1].
resc[j / 2] = v[nv];
1585 rtk->
ssat[sat - 1].
resp[j / 2] = v[nv];
1589 var[nv] =
varerr(obs[i].sat, sys, azel[1 + i * 2], j / 2, j % 2, opt) + vart +
SQR(C) * vari +
1591 if (sys ==
SYS_GLO && j % 2 == 1) {
1595 trace(NULL, post > 0 ? 3 : 4,
1596 "ppp_res: post=%d %s %s sat=%3d %s%s res=%9.4f sig=%9.4f el=%4.1f cdtr=%7.4f "
1597 "C=%7.4f dion=%7.4f (%5.2f) dtrp=%7.4f (%5.2f) bias=%9.4f (%5.2f) ifb=%9.4f (%5.2f) fix=%d\n",
1598 post, str, satstr, sat, j % 2 ?
"C" :
"L",
code2obs(obs[i].code[j / 2]), v[nv], sqrt(var[nv]),
1599 azel[1 + i * 2] *
R2D, cdtr, C, dion, dion_std, dtrp, dtrp_std, bias, bias_std, ifb, ifb_std,
1600 rtk->
ssat[sat - 1].
fix[j / 2]);
1604 trace(NULL, 2,
"outlier (%d) rejected %s %s sat=%2d %s%s res=%9.4f el=%4.1f\n", post, str, satstr, sat,
1605 j % 2 ?
"C" :
"L",
code2obs(obs[i].code[j / 2]), v[nv], azel[1 + i * 2] *
R2D);
1611 if (post && fabs(v[nv]) > sqrt(var[nv]) *
THRES_REJECT) {
1618 rtk->
ssat[sat - 1].
vsat[j / 2] = 1;
1621 resc_rms += (v[nv] * v[nv]);
1625 resp_rms += (v[nv] * v[nv]);
1632 resp_rms = nresp ? sqrt(resp_rms / nresp) : 0.0;
1633 resp_ave = nresp ? resp_ave / nresp : 0.0;
1634 resc_rms = nresc ? sqrt(resc_rms / nresc) : 0.0;
1635 resc_ave = nresc ? resc_ave / nresc : 0.0;
1636 resrms[0] = resp_rms;
1637 resrms[1] = resc_rms;
1639 "ppp_res: post=%d, %s, nresp=, %2d, resp_rms=, %7.3f, resp_ave=, %7.3f, nresc=, %2d, resc_rms=, %7.3f, "
1640 "resc_ave=, %7.3f\n",
1641 post, str, nresp, resp_rms, resp_ave, nresc, resc_rms, resc_ave);
1644 if (post && ne > 0) {
1649 for (j = 1; j < ne; j++) {
1650 if (fabs(vmax) >= fabs(ve[j])) {
1658 sat = obs[maxobs].
sat;
1660 trace(NULL, 2,
"outlier (%d) rejected %s %s sat=%2d %s%d res=%9.4f el=%4.1f\n", post, str, satstr, sat,
1661 maxfrq % 2 ?
"P" :
"L", maxfrq / 2 + 1, vmax, azel[1 + maxobs * 2] *
R2D);
1663 rtk->
ssat[sat - 1].
rejc[maxfrq % 2]++;
1670 nv +=
const_iono_corr(rtk, obs, nav, n, azel, exc, rr, x, v + nv, H + nv * rtk->
nx, var + nv);
1673 for (i = 0; i < nv; i++) {
1674 for (j = 0; j < nv; j++) {
1675 R[i + j * nv] = i == j ? var[i] : 0.0;
1678 return post ? stat : nv;
1689 for (i = 0; i < n && i <
MAXOBS; i++) {
1690 for (j = 0; j < opt->
nf && j < NFREQ; j++) {
1703 for (i = 0; i < 3; i++) {
1705 rtk->
sol.
qr[i] = (float)rtk->
Pa[i + i * rtk->
na];
1707 rtk->
sol.
qr[3] = (float)rtk->
Pa[1];
1708 rtk->
sol.
qr[4] = (float)rtk->
Pa[1 + 2 * rtk->
na];
1709 rtk->
sol.
qr[5] = (float)rtk->
Pa[2];
1711 for (i = 0; i < 3; i++) {
1712 rtk->
sol.
rr[i] = rtk->
x[i];
1713 rtk->
sol.
qr[i] = (float)rtk->
P[i + i * rtk->
nx];
1715 rtk->
sol.
qr[3] = (float)rtk->
P[1];
1716 rtk->
sol.
qr[4] = (float)rtk->
P[2 + rtk->
nx];
1717 rtk->
sol.
qr[5] = (float)rtk->
P[2];
1725 for (i = 1; i < 7; i++) {
1729 for (i = 0; i < n && i <
MAXOBS; i++) {
1730 for (j = 0; j < opt->
nf && j < NFREQ; j++) {
1735 for (i = 0; i < n && i <
MAXOBS; i++) {
1736 for (j = 0; j < opt->
nf && j < NFREQ; j++) {
1737 if (obs[i].L[j] != 0.0) {
1739 rtk->
ssat[obs[i].
sat - 1].
ph[0][j] = obs[i].
L[j];
1743 for (i = 0; i <
MAXSAT; i++) {
1744 for (j = 0; j < opt->
nf && j < NFREQ; j++) {
1761 for (i = 0; i <
MAXSAT; i++) {
1762 if (rtk->
ssat[i].
fix[0] != 2) {
1765 for (j = 0; j <
MAXSAT; j++) {
1766 if (rtk->
ssat[j].
fix[0] != 2) {
1785 double *rs, *dts, *var, *v, *H, *R, *azel, *xp, *Pp, dr[3] = {0}, std[3] = {0.0};
1786 double resrms[2] = {0}, resrms_ar[2] = {0};
1791 trace(NULL, 3,
"pppos : time=%s nx=%d n=%d\n", str, rtk->
nx, n);
1798 for (i = 0; i <
MAXSAT; i++) {
1799 for (j = 0; j < opt->
nf && j < NFREQ; j++) {
1819 xp =
mat(rtk->
nx, 1);
1822 H =
mat(rtk->
nx, nv);
1830 if (!(nv =
ppp_res(0, obs, n, rs, dts, var, svh, dr, exc, nav, xp, Pp, rtk, v, H, R, azel, resrms))) {
1831 trace(NULL, 2,
"%s ppp (%d) no valid obs data\n", str, i + 1);
1835 if ((info =
filter(xp, Pp, H, v, R, rtk->
nx, nv))) {
1836 trace(NULL, 2,
"%s ppp (%d) filter error info=%d\n", str, i + 1, info);
1840 if (
ppp_res(i + 1, obs, n, rs, dts, var, svh, dr, exc, nav, xp, Pp, rtk, v, H, R, azel, resrms)) {
1848 trace(NULL, 2,
"%s ppp (%d) iteration overflows\n", str, i);
1852 if ((ret =
ppp_ar(ctx, rtk, obs, n, exc, nav, azel, xp, Pp)) &&
1853 ppp_res(9, obs, n, rs, dts, var, svh, dr, exc, nav, xp, Pp, rtk, v, H, R, azel, resrms_ar)) {
1857 for (i = 0; i < 3; i++) {
1858 std[i] = sqrt(Pp[i + i * rtk->
nx]);
1868 "pppos(%4d): time=%s stat=%d std=%.3f resp=%7.3f -> %7.3f (%6.3f) resc=%7.3f -> %7.3f (%6.3f)\n",
1869 __LINE__, str, stat,
norm(std, 3), resrms[0], resrms_ar[0], resrms_ar[0] / resrms[0], resrms[1],
1870 resrms_ar[1], resrms_ar[1] / resrms[1]);
1881 trace(NULL, 3,
"pppos(%4d): %s hold ambiguity nfix=%4d / %4d\n", __LINE__, str, rtk->
nfix, rtk->
opt.
minfix);
MRTKLIB Antenna Module — Antenna phase center model and parameter I/O.
MRTKLIB Astronomy Module — Sun and moon position computation.
MRTKLIB Atmosphere Module — Ionospheric and tropospheric models.
int getsysno(int sat)
Get system code number based on satellite number.
char * code2obs(uint8_t code)
MRTKLIB Bias SINEX Module — BIAS-SINEX data types and I/O functions.
MRTKLIB Constants — Physical, navigation, and system constants.
#define SSR_INVALID_PBIAS
#define SSR_INVALID_CBIAS
MRTKLIB Context — runtime context for processing, trace, and error handling.
MRTKLIB Coordinates Module — Coordinate transformations and geometry.
int has_sel_biascode(int sys, uint8_t code)
Select the HAS bias slot obs code for an observation code.
MRTKLIB Galileo HAS Module — E6-B C/NAV HAS page collection and Message Type 1 (MT1) decode into ssr_...
MRTKLIB IONEX Module — IONEX ionospheric TEC map I/O and interpolation.
MRTKLIB MADOCA-PPP Module — QZSS L6E CSSR message decode functions.
MRTKLIB Matrix Module — Matrix/vector operations and estimation.
int freq_idx2ant_idx(int sys, int freq_idx)
Convert frequency index to antenna PCV index.
int satexclude(int sat, double var, int svh, const struct prcopt_t *opt)
Test excluded satellite.
MRTKLIB Precise Ephemeris Module — Earth rotation parameter types and ERP I/O functions.
void satno2id(int sat, char *id)
double geodist(const double *rs, const double *rr, double *e)
static void detslp_ll(rtk_t *rtk, const obsd_t *obs, int n)
static void udifb_ppp(rtk_t *rtk)
int satsys(int sat, int *prn)
double * mat(int n, int m)
static void detslp_dop(rtk_t *rtk, const obsd_t *obs, int n, const nav_t *nav)
int const_iono_corr(rtk_t *rtk, const obsd_t *obs, const nav_t *nav, const int n, const double *azel, const int *exc, const double *rr, const double *x, double *v, double *H, double *var)
static void initx(rtk_t *rtk, double xi, double var, int i)
double * zeros(int n, int m)
void sunmoonpos(gtime_t tut, const double *erpv, double *rsun, double *rmoon, double *gmst)
double satazel(const double *pos, const double *e, double *azel)
void matcpy(double *A, const double *B, int n, int m)
void tidedisp(gtime_t tutc, const double *rr, int opt, const erp_t *erp, const double *odisp, double *dr)
unsigned int tickget(void)
static int test_hold_amb(rtk_t *rtk)
void cross3(const double *a, const double *b, double *c)
void xyz2enu(const double *pos, double *E)
void covecef(const double *pos, const double *Q, double *P)
double tropmodel(gtime_t time, const double *pos, const double *azel, double humi)
int pppoutstat(rtk_t *rtk, char *buff)
Write PPP solution status to buffer.
double tropmapf(gtime_t time, const double *pos, const double *azel, double *mapfw)
int mcssr_sel_biascode(const int sys, const int code)
int iontec(gtime_t time, const nav_t *nav, const double *pos, const double *azel, int opt, double *delay, double *var)
static void udclk_ppp(rtk_t *rtk)
int testsnr(int base, int freq, double el, double snr, const snrmask_t *mask)
int sbsioncorr(gtime_t time, const nav_t *nav, const double *pos, const double *azel, double *delay, double *var)
void antmodel(const pcv_t *pcv, const double *del, const double *azel, int opt, double *dant)
static void testeclipse(const obsd_t *obs, int n, const nav_t *nav, double *rs)
void time2str(gtime_t t, char *s, int n)
gtime_t gpst2utc(gtime_t t)
void covenu(const double *pos, const double *P, double *Q)
static void update_stat(rtk_t *rtk, const obsd_t *obs, int n, int stat)
int filter(double *x, double *P, const double *H, const double *v, const double *R, int n, int m)
int yaw_angle(int sat, const char *type, int opt, double beta, double mu, double *yaw)
static void udbias_ppp(rtk_t *rtk, const obsd_t *obs, int n, const nav_t *nav)
static double STD(rtk_t *rtk, int i)
static void ppp_note_autosig(int sys, uint8_t code)
void pppos(mrtk_ctx_t *ctx, rtk_t *rtk, const obsd_t *obs, int n, const nav_t *nav)
Precise point positioning.
double time2gpst(gtime_t t, int *week)
int satid2no(const char *id)
int pppnx(const prcopt_t *opt)
Number of estimated states for PPP.
double ionmodel(gtime_t t, const double *ion, const double *pos, const double *azel)
void satposs(gtime_t teph, const obsd_t *obs, int n, const nav_t *nav, int ephopt, double *rs, double *dts, double *var, int *svh)
static int sat_yaw(gtime_t time, int sat, const char *type, int opt, const double *rs, double *exs, double *eys)
double sbstropcorr(gtime_t time, const double *pos, const double *azel, double *var)
static int model_iono(gtime_t time, const double *pos, const double *azel, const prcopt_t *opt, int sat, const double *x, const nav_t *nav, double *dion, double *var)
char * code2obs(uint8_t code)
static int model_phw(gtime_t time, int sat, const char *type, int opt, const double *rs, const double *rr, double *phw)
double norm(const double *a, int n)
int satsys_bd2(int sat, int *prn)
static void udpos_ppp(rtk_t *rtk)
char * time_str(gtime_t t, int n)
int normv3(const double *a, double *b)
static void detslp_gf(rtk_t *rtk, const obsd_t *obs, int n, const nav_t *nav)
static void udtrop_ppp(rtk_t *rtk)
static double yaw_nominal(double beta, double mu)
int satexclude(int sat, double var, int svh, const prcopt_t *opt)
static double mwmeas(const obsd_t *obs, const nav_t *nav, int f)
static int model_trop(gtime_t time, const double *pos, const double *azel, const prcopt_t *opt, const double *x, double *dtdx, const nav_t *nav, double *dtrp, double *var)
static void detslp_ssr(rtk_t *rtk, const obsd_t *obs, int n, const nav_t *nav)
void matmul(const char *tr, int n, int k, int m, double alpha, const double *A, const double *B, double beta, double *C)
double dot(const double *a, const double *b, int n)
static double varerr(int sat, int sys, double el, int idx, int type, const prcopt_t *opt)
static double gfmeas(const obsd_t *obs, const nav_t *nav, int f)
static void udiono_ppp(rtk_t *rtk, const obsd_t *obs, int n, const nav_t *nav)
static int corr_meas(const obsd_t *obs, const nav_t *nav, const double *azel, const prcopt_t *opt, const double *dantr, const double *dants, double phw, double *L, double *P, double *Lc, double *Pc, int tl)
void ecef2pos(const double *r, double *pos)
static void detslp_code(rtk_t *rtk, const obsd_t *obs, int n)
static void udstate_ppp(rtk_t *rtk, const obsd_t *obs, int n, const nav_t *nav)
static int ppp_res(int post, const obsd_t *obs, int n, const double *rs, const double *dts, const double *var_rs, const int *svh, const double *dr, int *exc, const nav_t *nav, const double *x, const double *cov, rtk_t *rtk, double *v, double *H, double *R, double *azel, double *resrms)
void antmodel_s(const pcv_t *pcv, double nadir, double *dant)
static double trop_model_prec(gtime_t time, const double *pos, const double *azel, const double *x, double *dtdx, double *var)
void satantoff(gtime_t time, const double *rs, int sat, const nav_t *nav, double *dant)
static void satantpcv(const double *rs, const double *rr, const pcv_t *pcv, double *dant)
double sat2freq(int sat, uint8_t code, const nav_t *nav)
void ecef2enu(const double *pos, const double *r, double *e)
static void detslp_mw(rtk_t *rtk, const obsd_t *obs, int n, const nav_t *nav)
MRTKLIB Precise Point Positioning (PPP) Module.
int ppp_ar(mrtk_ctx_t *ctx, rtk_t *rtk, const obsd_t *obs, int n, int *exc, const nav_t *nav, const double *azel, double *x, double *P)
Ambiguity resolution in PPP.
MRTKLIB PPP Ambiguity Resolution Module.
int ppprtk_outstat(rtk_t *rtk, char *buff)
Write PPP-RTK solution status to buffer.
PPP-RTK positioning engine declarations.
MRTKLIB SBAS Module — SBAS message decoding and corrections.
MRTKLIB Tides Module — Tidal displacement corrections.
double timediff(gtime_t t1, gtime_t t2)
Compute time difference (t1 - t2).
void trace(mrtk_ctx_t *ctx, int level, const char *format,...)
Output trace message.
MRTKLIB Trace Module — debug trace and logging functions.
ERP (earth rotation parameter) type.
GNSS time representation.
Runtime context for MRTKLIB processing.
ssr_t ssr_ch[SSR_CH_NUM][MAXSAT]
double rsyscb[MAXBSNXSYS][MAXCODE]
double scb[MAXSAT][MAXCODE]
int vrsatcb[MAXSAT][MAXCODE]
int vspb[MAXSAT][MAXCODE]
int vscb[MAXSAT][MAXCODE]
int vrsyscb[MAXBSNXSYS][MAXCODE]
double spb[MAXSAT][MAXCODE]
double rsatcb[MAXSAT][MAXCODE]