11
11
from cssrlib .ephemeris import satposs
12
12
from cssrlib .cssrlib import sSigGPS , sSigGAL , sSigQZS , sCType
13
13
from cssrlib .ppp import tidedisp , shapiro , windupcorr
14
- from cssrlib .rtk import IB , ddres , resamb_lambda , valpos , holdamb , initx , kfupdate
14
+ from cssrlib .rtk import IB , ddres , resamb_lambda , valpos , holdamb , initx
15
15
16
16
MAXITR = 10
17
17
ELMIN = 10
@@ -34,14 +34,26 @@ def logmon(nav, t, sat, cs, iu=None):
34
34
for i in range (n [0 ]):
35
35
if cpc [i , 0 ] == 0 and cpc [i , 1 ] == 0 :
36
36
continue
37
- nav .fout .write ("%6d\t %3d\t %8.3f\t %8.3f\t %8.3f\t %8.3f\t %2d\t "
38
- % (tow , sat [i ], cpc [i , 0 ], cpc [i , 1 ],
39
- prc [i , 0 ], prc [i , 1 ], cs .iodssr ))
37
+ sys , prn = gn .sat2prn (sat [i ])
38
+ pb = osr [i , 0 :2 ]
39
+ cb = osr [i , 2 :4 ]
40
+ antr = osr [i , 4 :6 ]
41
+ phw = osr [i , 6 :8 ]
42
+ trop = osr [i , 8 ]
43
+ iono = osr [i , 9 ]
44
+ relatv = osr [i , 10 ]
45
+ dorb = osr [i , 11 ]
46
+ dclk = osr [i ,12 ]
47
+ # tow sys prn trop iono antr1 antr2 antr5 relatv
48
+ # wup2 wup5 CPC1 CPC2 CPC5 PRC1 PRC2 PRC5 orb clk
49
+ nav .fout .write ("%6d\t %2d\t %3d\t %8.3f\t %8.3f\t %8.3f\t %8.3f\t "
50
+ % (tow , sys , prn , pb [0 ], pb [1 ], cb [0 ], cb [1 ]))
51
+ nav .fout .write ("%8.3f\t %8.3f\t %8.3f\t %8.3f\t "
52
+ % (trop , iono , antr [0 ], antr [1 ]))
40
53
nav .fout .write ("%8.3f\t %8.3f\t %8.3f\t %8.3f\t %8.3f\t "
41
- % (osr [i , 0 ], osr [i , 1 ], osr [i , 2 ],
42
- osr [i , 3 ], osr [i , 4 ]))
54
+ % (relatv , phw [0 ], phw [1 ], cpc [i , 0 ], cpc [i , 1 ]))
43
55
nav .fout .write ("%8.3f\t %8.3f\t %8.3f\t %8.3f\n "
44
- % (osr [i , 5 ], osr [i , 6 ], osr [ i , 7 ], osr [ i , 8 ] ))
56
+ % (prc [i , 0 ], prc [i , 1 ], dorb , dclk ))
45
57
return 0
46
58
47
59
@@ -51,7 +63,7 @@ def rtkinit(nav, pos0=np.zeros(3)):
51
63
nav .pmode = 1 # 0:static, 1:kinematic
52
64
53
65
nav .na = 3 if nav .pmode == 0 else 6
54
- nav .nq = 3
66
+ nav .nq = 3 if nav . pmode == 0 else 6
55
67
nav .ratio = 0
56
68
nav .thresar = [2 ]
57
69
nav .nx = nav .na + gn .uGNSS .MAXSAT * nav .nf
@@ -63,8 +75,8 @@ def rtkinit(nav, pos0=np.zeros(3)):
63
75
nav .phw = np .zeros (gn .uGNSS .MAXSAT )
64
76
65
77
# parameter for PPP-RTK
66
- nav .eratio = [50 , 50 ]
67
- nav .err = [100 , 0.00707 , 0.00354 ]
78
+ nav .eratio = [100 , 100 ]
79
+ nav .err = [0 , 0.003 , 0.003 ]
68
80
nav .sig_p0 = 30.0
69
81
nav .sig_v0 = 10.0
70
82
nav .sig_n0 = 30.0
@@ -73,18 +85,20 @@ def rtkinit(nav, pos0=np.zeros(3)):
73
85
nav .tidecorr = True
74
86
nav .armode = 1 # 1:contunous,2:instantaneous,3:fix-and-hold
75
87
nav .gnss_t = [uGNSS .GPS , uGNSS .GAL , uGNSS .QZS ]
76
- nav .gnss_t = [uGNSS .GPS ] # GPS only
88
+ # nav.gnss_t = [uGNSS.GPS] # GPS only
77
89
78
90
#
79
91
nav .x [0 :3 ] = pos0
92
+ nav .x [3 :6 ] = 0.0
80
93
81
94
dP = np .diag (nav .P )
82
95
dP .flags ['WRITEABLE' ]= True
83
96
dP [0 :3 ] = nav .sig_p0 ** 2
84
97
nav .q = np .zeros (nav .nq )
85
- if nav .pmode >= 1 :
98
+ if nav .pmode >= 1 : # kinematic
86
99
dP [3 :6 ] = nav .sig_v0 ** 2
87
- nav .q [0 :3 ] = nav .sig_qv ** 2
100
+ nav .q [0 :3 ] = nav .sig_qp ** 2
101
+ nav .q [3 :6 ] = nav .sig_qv ** 2
88
102
else :
89
103
nav .q [0 :3 ] = nav .sig_qp ** 2
90
104
# obs index
@@ -119,20 +133,13 @@ def udstate(nav, obs, cs):
119
133
120
134
# pos,vel
121
135
na = nav .na
122
- Px = nav .P [0 :na , 0 :na ]
123
- if nav .pmode >= 1 :
124
- F = np .eye (na )
125
- F [0 :3 , 3 :6 ] = np .eye (3 )* tt
126
- nav .x [0 :3 ] += tt * nav .x [3 :6 ]
127
- Px = F @Px @F .T
128
- dP = np .diag (Px )
129
- dP .flags ['WRITEABLE' ] = True
130
- dP [3 :3 + nav .nq ] += nav .q [0 :nav .nq ]* tt
131
- else :
132
- dP = np .diag (Px )
133
- dP .flags ['WRITEABLE' ] = True
134
- dP [0 :nav .nq ] += nav .q [0 :nav .nq ]* tt
135
- nav .P [0 :na , 0 :na ] = Px
136
+
137
+ Phi = np .eye (nav .nx )
138
+ Phi [0 :3 ,3 :6 ]= np .eye (3 )* tt
139
+ nav .P = Phi @nav .P @Phi .T
140
+ dP = np .diag (nav .P )
141
+ dP .flags ['WRITEABLE' ] = True
142
+ dP [0 :nav .nq ] += nav .q [0 :nav .nq ]* tt
136
143
137
144
# bias
138
145
for f in range (nav .nf ):
@@ -141,13 +148,14 @@ def udstate(nav, obs, cs):
141
148
for i in range (gn .uGNSS .MAXSAT ):
142
149
sat_ = i + 1
143
150
nav .outc [i , f ] += 1
144
- reset = True if nav .outc [i , f ] > nav .maxout else False
151
+ reset = ( nav .outc [i , f ] > nav .maxout )
145
152
sys_i , _ = gn .sat2prn (sat_ )
146
153
if sys_i not in nav .gnss_t :
147
154
continue
148
155
j = IB (sat_ , f , nav .na )
149
156
if reset and nav .x [j ] != 0.0 :
150
- initx (nav , 0.0 , 0.0 , j )
157
+ #initx(nav, 0.0, 0.0, j)
158
+ #print("reset amb f=%d sat=%d outc=%d" % (f,sat_,nav.outc[i, f]))
151
159
nav .outc [i , f ] = 0
152
160
# cycle slip check by LLI
153
161
for i in range (ns ):
@@ -164,7 +172,7 @@ def udstate(nav, obs, cs):
164
172
initx (nav , 0.0 , 0.0 , IB (sat [i ], f , nav .na ))
165
173
# bias
166
174
bias = np .zeros (ns )
167
- offset = 0
175
+ offset = 0
168
176
na = 0
169
177
for i in range (ns ):
170
178
if sys [i ] not in nav .gnss_t :
@@ -223,7 +231,7 @@ def zdres(nav, obs, rs, vs, dts, svh, rr, cs):
223
231
224
232
cs .cpc = np .zeros ((n , nf ))
225
233
cs .prc = np .zeros ((n , nf ))
226
- cs .osr = np .zeros ((n , 2 * nf + 5 ))
234
+ cs .osr = np .zeros ((n , 4 * nf + 5 ))
227
235
228
236
for i in range (n ):
229
237
sat = obs .sat [i ]
@@ -281,10 +289,10 @@ def zdres(nav, obs, rs, vs, dts, svh, rr, cs):
281
289
cbias += cs .lc [inet ].cbias [idx_l ][kidx ]
282
290
if cs .lc [inet ].pbias is not None :
283
291
pbias += cs .lc [inet ].pbias [idx_l ][kidx ]
284
- # t1 = timediff(obs.t, cs.lc[0].t0[sCType.ORBIT])
285
- # t2 = timediff(obs.t, cs.lc[inet].t0[sCType.PBIAS])
286
- # if t1 >= 0 and t1 < 30 and t2 >= 30:
287
- # pbias += nav.dsis[sat]
292
+ #t1 = timediff(obs.t, cs.lc[0].t0[sCType.ORBIT])
293
+ #t2 = timediff(obs.t, cs.lc[inet].t0[sCType.PBIAS])
294
+ #if t1 >= 0 and t1 < 30 and t2 >= 30:
295
+ # pbias += nav.dsis[sat]
288
296
289
297
# relativity effect
290
298
relatv = shapiro (rs [i , :], rr_ )
@@ -302,8 +310,9 @@ def zdres(nav, obs, rs, vs, dts, svh, rr, cs):
302
310
# prc_c += nav.dorb[sat]-nav.dclk[sat]
303
311
cs .prc [i , :] = prc_c + iono + cbias
304
312
cs .cpc [i , :] = prc_c - iono + pbias + phw
305
- cs .osr [i , :] = [pbias [0 ], pbias [1 ], cbias [0 ], cbias [1 ], trop ,
306
- iono_ , relatv , nav .dorb [sat ], nav .dclk [sat ]]
313
+ cs .osr [i , :] = [pbias [0 ], pbias [1 ], cbias [0 ], cbias [1 ],
314
+ antr [0 ], antr [1 ], phw [0 ], phw [1 ],
315
+ trop , iono_ , relatv , nav .dorb [sat ], nav .dclk [sat ]]
307
316
r += - _c * dts [i ]
308
317
309
318
for f in range (nf ):
@@ -314,12 +323,22 @@ def zdres(nav, obs, rs, vs, dts, svh, rr, cs):
314
323
return y , e , el
315
324
316
325
326
+ def kfupdate (x , P , H , v , R ):
327
+ """ kalmanf filter measurement update """
328
+ PHt = P @H .T
329
+ S = H @PHt + R
330
+ K = PHt @np .linalg .inv (S )
331
+ x += K @v
332
+ P = P - K @H @P
333
+
334
+ return x , P , S
335
+
317
336
def ppprtkpos (nav , obs , cs ):
318
337
""" PPP-RTK positioning """
319
338
320
- for i in range (gn .uGNSS .MAXSAT ):
321
- for j in range (nav .nf ):
322
- nav .vsat [j ] = 0
339
+ # for i in range(gn.uGNSS.MAXSAT):
340
+ # for j in range(nav.nf):
341
+ # nav.vsat[j] = 0
323
342
324
343
rs , vs , dts , svh = satposs (obs , nav , cs )
325
344
# Kalman filter time propagation
@@ -337,6 +356,7 @@ def ppprtkpos(nav, obs, cs):
337
356
el = elu [iu ]
338
357
nav .sat = sat
339
358
nav .y = y
359
+ ns = len (sat )
340
360
341
361
logmon (nav , obs .t , sat , cs , iu )
342
362
@@ -365,16 +385,19 @@ def ppprtkpos(nav, obs, cs):
365
385
if valpos (nav , v , R ):
366
386
nav .x = xp
367
387
nav .P = Pp
368
- ns = len (nav .sat )
369
388
nav .ns = 0
370
389
for i in range (ns ):
390
+ j = sat [i ]- 1
371
391
for f in range (nav .nf ):
372
- if nav .vsat [sat [ i ] - 1 , f ] == 0 :
392
+ if nav .vsat [j , f ] == 0 :
373
393
continue
374
- nav .lock [sat [ i ] - 1 , f ] += 1
375
- nav .outc [sat [ i ] - 1 , f ] = 0
394
+ nav .lock [j , f ] += 1
395
+ nav .outc [j , f ] = 0
376
396
if f == 0 :
377
397
nav .ns += 1
398
+
399
+ else :
400
+ nav .smode = 0
378
401
379
402
nb , xa = resamb_lambda (nav , sat )
380
403
nav .smode = 5 # float
0 commit comments