Skip to content
This repository was archived by the owner on Apr 13, 2021. It is now read-only.

Commit f82b1f4

Browse files
committed
Merge pull request #334 from ljbade/time-jump-final
Final CORS fix PR
2 parents 8bbc35e + 2ec0ee1 commit f82b1f4

15 files changed

+139
-140
lines changed

include/libswiftnav/observation.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ u8 make_propagated_sdiffs_wip(u8 n_local, navigation_measurement_t *m_local,
4848
u8 make_propagated_sdiffs(u8 n_local, navigation_measurement_t *m_local,
4949
u8 n_remote, navigation_measurement_t *m_remote,
5050
double *remote_dists, double remote_pos_ecef[3],
51-
const ephemeris_t *e[], const gps_time_t *t,
5251
sdiff_t *sds);
5352

5453
s8 make_dd_measurements_and_sdiffs(gnss_signal_t ref_sid, const gnss_signal_t *non_ref_sids, u8 num_dds,

include/libswiftnav/track.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ typedef struct {
161161
typedef struct {
162162
double raw_pseudorange;
163163
double pseudorange;
164+
double raw_carrier_phase;
164165
double carrier_phase;
165166
double raw_doppler;
166167
double doppler;
@@ -234,12 +235,12 @@ void cn0_est_init(cn0_est_state_t *s, float bw, float cn0_0,
234235
float cn0_est(cn0_est_state_t *s, float I, float Q);
235236

236237
s8 calc_navigation_measurement(u8 n_channels, const channel_measurement_t *meas[],
237-
navigation_measurement_t *nav_meas[],
238+
navigation_measurement_t *nav_meas[], gps_time_t *rec_time,
238239
const ephemeris_t* e[]);
239240

240241
int nav_meas_cmp(const void *a, const void *b);
241242
u8 tdcp_doppler(u8 n_new, navigation_measurement_t *m_new,
242243
u8 n_old, navigation_measurement_t *m_old,
243-
navigation_measurement_t *m_corrected);
244+
navigation_measurement_t *m_corrected, double dt);
244245

245246
#endif /* LIBSWIFTNAV_TRACK_H */

python/swiftnav/observation.pxd

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ cdef extern from "libswiftnav/observation.h":
4040
u8 make_propagated_sdiffs(u8 n_local, navigation_measurement_t *m_local,
4141
u8 n_remote, navigation_measurement_t *m_remote,
4242
double *remote_dists, double remote_pos_ecef[3],
43-
const ephemeris_t *e[], const gps_time_t *t,
4443
sdiff_t *sds)
4544

4645
s8 make_dd_measurements_and_sdiffs(gnss_signal_t ref_sid, const gnss_signal_t *non_ref_sids,

python/swiftnav/observation.pyx

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,7 @@ def single_diff_(m_a, m_b):
7171
# TODO (Buro): special note that there are a bunch of statically
7272
# declared things in the .c file for observation.c
7373

74-
def make_propagated_sdiffs_(m_local, m_remote, remote_dists, remote_pos_ecef,
75-
es, GpsTime t):
74+
def make_propagated_sdiffs_(m_local, m_remote, remote_dists, remote_pos_ecef):
7675
"""Propagates remote measurements to a local time and makes
7776
sdiffs. When we get two sets of observations that aren't time
7877
matched to each other (but are internally time matched within each
@@ -93,8 +92,6 @@ def make_propagated_sdiffs_(m_local, m_remote, remote_dists, remote_pos_ecef,
9392
cdef navigation_measurement_t m_local_[32], m_remote_[32]
9493
mk_nav_meas_array(m_local, n_local, &m_local_[0])
9594
mk_nav_meas_array(m_remote, n_remote, &m_remote_[0])
96-
cdef ephemeris_t** es_ = <ephemeris_t **>malloc(len(es)*sizeof(ephemeris_t *))
97-
mk_ephemeris_array(es, len(es), es_)
9895
# TODO (Buro): These can be moved up into type hints.
9996
cdef np.ndarray[np.double_t, ndim=1, mode="c"] remote_dists_ \
10097
= np.array(remote_dists, dtype=np.double)
@@ -106,10 +103,7 @@ def make_propagated_sdiffs_(m_local, m_remote, remote_dists, remote_pos_ecef,
106103
n_remote, &m_remote_[0],
107104
&remote_dists_[0],
108105
&remote_pos_ecef_[0],
109-
es_,
110-
&t._thisptr,
111106
&sdiffs_[0])
112-
free(es_)
113107
return read_sdiff_array(n_sats, &sdiffs_[0])
114108

115109
def make_dd_measurements_and_sdiffs_(GNSSSignal ref_sid, non_ref_sids, sdiffs_in):

python/swiftnav/track.pxd

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ cdef extern from "libswiftnav/track.h":
171171
ctypedef struct navigation_measurement_t:
172172
double raw_pseudorange
173173
double pseudorange
174+
double raw_carrier_phase
174175
double carrier_phase
175176
double raw_doppler
176177
double doppler
@@ -184,12 +185,13 @@ cdef extern from "libswiftnav/track.h":
184185

185186
s8 calc_navigation_measurement(u8 n_channels, const channel_measurement_t *meas[],
186187
navigation_measurement_t *nav_meas[],
187-
const ephemeris_t* e[])
188+
gps_time_t *rec_time, const ephemeris_t* e[])
189+
188190

189191
int nav_meas_cmp(const void *a, const void *b)
190192
u8 tdcp_doppler(u8 n_new, navigation_measurement_t *m_new,
191193
u8 n_old, navigation_measurement_t *m_old,
192-
navigation_measurement_t *m_corrected)
194+
navigation_measurement_t *m_corrected, double dt)
193195

194196
cdef class Correlation:
195197
cdef correlation_t _thisptr

python/swiftnav/track.pyx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -496,11 +496,12 @@ cdef class ChannelMeasurement:
496496
cdef class NavigationMeasurement:
497497

498498
def __init__(self,
499-
raw_pseudorange, pseudorange, carrier_phase, raw_doppler,
500-
doppler, sat_pos, sat_vel, snr, lock_time,
499+
raw_pseudorange, pseudorange, raw_carrier_phase, carrier_phase,
500+
raw_doppler, doppler, sat_pos, sat_vel, snr, lock_time,
501501
GpsTime tot, GNSSSignal sid, lock_counter):
502502
self._thisptr.raw_pseudorange = raw_pseudorange
503503
self._thisptr.pseudorange = pseudorange
504+
self._thisptr.raw_carrier_phase = raw_carrier_phase
504505
self._thisptr.carrier_phase = carrier_phase
505506
self._thisptr.raw_doppler = raw_doppler
506507
self._thisptr.doppler = doppler
@@ -546,7 +547,8 @@ cdef mk_nav_meas_array(py_nav_meas, u8 n_c_nav_meas, navigation_measurement_t *c
546547
memcpy(&c_nav_meas[i], &sd_, sizeof(navigation_measurement_t))
547548

548549
# TODO (Buro): Remove mallocs, etc. here. Do all this in-place
549-
def _calc_navigation_measurement(chan_meas, nav_meas, ephemerides):
550+
def _calc_navigation_measurement(chan_meas, nav_meas, GpsTime rec_time,
551+
ephemerides):
550552
"""
551553
"""
552554
n_channels = len(chan_meas)
@@ -558,14 +560,15 @@ def _calc_navigation_measurement(chan_meas, nav_meas, ephemerides):
558560
chan_meas_[n] = &((<ChannelMeasurement ?>chan_meas[n])._thisptr)
559561
nav_meas_[n] = &((<NavigationMeasurement ?>nav_meas[n])._thisptr)
560562
ephs[n] = &((<Ephemeris ?>ephemerides[n])._thisptr)
561-
calc_navigation_measurement(n_channels, chan_meas_, nav_meas_, ephs)
563+
calc_navigation_measurement(n_channels, chan_meas_, nav_meas_,
564+
&rec_time._thisptr, ephs)
562565
free(chan_meas_)
563566
free(nav_meas_)
564567
free(ephs)
565568
return nav_meas
566569

567570
# TODO (Buro): Remove mallocs, etc. here. Also, wow, this is awful
568-
def _tdcp_doppler(m_new, m_old):
571+
def _tdcp_doppler(m_new, m_old, dt):
569572
n_new = len(m_new)
570573
n_old = len(m_old)
571574
n_corrected = min(n_new, n_old)
@@ -579,7 +582,7 @@ def _tdcp_doppler(m_new, m_old):
579582
m_old_[n] = &((<NavigationMeasurement?>m_old[n])._thisptr)
580583
for n in range(n_corrected):
581584
m_corrected_[n] = (<NavigationMeasurement?>m_corrected[n])._thisptr
582-
n_written = tdcp_doppler(n_new, m_new_[0], n_old, m_old_[0], m_corrected_)
585+
n_written = tdcp_doppler(n_new, m_new_[0], n_old, m_old_[0], m_corrected_, dt)
583586
free(m_new_)
584587
free(m_old_)
585588
free(m_corrected_)

python/tests/test_observation.py

Lines changed: 27 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
from swiftnav.ephemeris import Ephemeris
1313
from swiftnav.pvt import calc_PVT_
14+
import copy
1415
import numpy as np
1516
import pytest
1617
import swiftnav.time as ti
@@ -23,71 +24,71 @@
2324
pseudorange=23946993.888943646,
2425
raw_pseudorange=23946993.888943646,
2526
sat_pos=(-19477278.087422125, -7649508.9457812719, 16674633.163554827),
26-
sat_vel=(0, 0, 0), carrier_phase=0,
27+
sat_vel=(0, 0, 0), raw_carrier_phase=0, carrier_phase=0,
2728
raw_doppler=0, doppler=0, lock_counter=0,
2829
snr=0, lock_time=0,
2930
tot=ti.GpsTime(tow=0, wn=0)),
3031
t.NavigationMeasurement(sid=s.GNSSSignal(sat=1, code=0),
3132
pseudorange=22932174.156858064,
3233
raw_pseudorange=22932174.156858064,
3334
sat_pos=(-9680013.5408340245, -15286326.354385279, 19429449.383770257),
34-
sat_vel=(0, 0, 0), carrier_phase=0,
35+
sat_vel=(0, 0, 0), raw_carrier_phase=0, carrier_phase=0,
3536
raw_doppler=0, doppler=0, lock_counter=0,
3637
snr=0, lock_time=0,
3738
tot=ti.GpsTime(tow=0, wn=0)),
3839
t.NavigationMeasurement(sid=s.GNSSSignal(sat=2, code=0),
3940
pseudorange=24373231.648055989,
4041
raw_pseudorange=24373231.648055989,
4142
sat_pos=(-19858593.085281931, -3109845.8288993631, 17180320.439503901),
42-
sat_vel=(0, 0, 0), carrier_phase=0,
43+
sat_vel=(0, 0, 0), raw_carrier_phase=0, carrier_phase=0,
4344
raw_doppler=0, doppler=0, lock_counter=0,
4445
snr=0, lock_time=0,
4546
tot=ti.GpsTime(tow=0, wn=0)),
4647
t.NavigationMeasurement(sid=s.GNSSSignal(sat=3, code=0),
4748
pseudorange=24779663.252316438,
4849
raw_pseudorange=24779663.252316438,
4950
sat_pos=(6682497.8716542246, -14006962.389166718, 21410456.275678463),
50-
sat_vel=(0, 0, 0), carrier_phase=0,
51+
sat_vel=(0, 0, 0), raw_carrier_phase=0, carrier_phase=0,
5152
raw_doppler=0, doppler=0, lock_counter=0,
5253
snr=0, lock_time=0,
5354
tot=ti.GpsTime(tow=0, wn=0)),
5455
t.NavigationMeasurement(sid=s.GNSSSignal(sat=4, code=0),
5556
pseudorange=26948717.022331879,
5657
raw_pseudorange=26948717.022331879,
5758
sat_pos=(7415370.9916331079, -24974079.044485383, -3836019.0262199985),
58-
sat_vel=(0, 0, 0), carrier_phase=0,
59+
sat_vel=(0, 0, 0), raw_carrier_phase=0, carrier_phase=0,
5960
raw_doppler=0, doppler=0, lock_counter=0,
6061
snr=0, lock_time=0,
6162
tot=ti.GpsTime(tow=0, wn=0)),
6263
t.NavigationMeasurement(sid=s.GNSSSignal(sat=5, code=0),
6364
pseudorange=23327405.435463827,
6465
raw_pseudorange=23327405.435463827,
6566
sat_pos=(-2833466.1648670658, -22755197.793894723, 13160322.082875408),
66-
sat_vel=(0, 0, 0), carrier_phase=0,
67+
sat_vel=(0, 0, 0), raw_carrier_phase=0, carrier_phase=0,
6768
raw_doppler=0, doppler=0, lock_counter=0,
6869
snr=0, lock_time=0,
6970
tot=ti.GpsTime(tow=0, wn=0)),
7071
t.NavigationMeasurement(sid=s.GNSSSignal(sat=6, code=0),
7172
pseudorange=27371419.016328193,
7273
raw_pseudorange=27371419.016328193,
7374
sat_pos=(14881660.383624561, -5825253.4316490609, 21204679.68313824),
74-
sat_vel=(0, 0, 0), carrier_phase=0,
75+
sat_vel=(0, 0, 0), raw_carrier_phase=0, carrier_phase=0,
7576
raw_doppler=0, doppler=0, lock_counter=0,
7677
snr=0, lock_time=0,
7778
tot=ti.GpsTime(tow=0, wn=0)),
7879
t.NavigationMeasurement(sid=s.GNSSSignal(sat=7, code=0),
7980
pseudorange=26294221.697782904,
8081
raw_pseudorange=26294221.697782904,
8182
sat_pos=(12246530.477279386, -22184711.955107089, 7739084.2855069181),
82-
sat_vel=(0, 0, 0), carrier_phase=0,
83+
sat_vel=(0, 0, 0), raw_carrier_phase=0, carrier_phase=0,
8384
raw_doppler=0, doppler=0, lock_counter=0,
8485
snr=0, lock_time=0,
8586
tot=ti.GpsTime(tow=0, wn=0)),
8687
t.NavigationMeasurement(sid=s.GNSSSignal(sat=8, code=0),
8788
pseudorange=25781999.479948733,
8889
raw_pseudorange=25781999.479948733,
8990
sat_pos=(-25360766.249484103, -1659033.490658124, 7821492.0398916304),
90-
sat_vel=(0, 0, 0), carrier_phase=0,
91+
sat_vel=(0, 0, 0), raw_carrier_phase=0, carrier_phase=0,
9192
raw_doppler=0, doppler=0, lock_counter=0,
9293
snr=0, lock_time=0,
9394
tot=ti.GpsTime(tow=0, wn=0))]
@@ -140,49 +141,29 @@ def test_prop_single_diff():
140141
pseudorange=21123480.27105955, doppler=0, raw_doppler=0, carrier_phase=-110993309.26669005,
141142
sat_vel=[-1025.0370403901404, -1821.9217799467374, -2091.6303199092254],
142143
lock_time=0, tot=ti.GpsTime(wn=1876, tow=167131.92954684512),
143-
raw_pseudorange=21121324.476403236,
144+
raw_pseudorange=21121324.476403236, raw_carrier_phase=-110993309.26669005,
144145
snr=30.0, sid=s.GNSSSignal(code=0, sat=0), lock_counter=0),
145146
t.NavigationMeasurement(sat_pos=[-16580310.849158794, 918714.1939749047, 20731444.258332774],
146147
pseudorange=22432049.84763688, doppler=0, raw_doppler=0, carrier_phase=-117882743.21601027,
147148
sat_vel=[1060.9864205977192, -2411.43509917502, 953.6270954519971],
148149
lock_time=0, tot=ti.GpsTime(wn=1876, tow=167131.9251737675),
149-
raw_pseudorange=22432340.166121125,
150+
raw_pseudorange=22432340.166121125, raw_carrier_phase=-117882743.21601027,
150151
snr=30.0, sid=s.GNSSSignal(code=0, sat=2), lock_counter=0)]
151-
remote_dists = np.array([ 21121393.87562408, 22432814.46819838])
152-
base_pos = np.array( [-2704375, -4263211, 3884637])
153-
es = [Ephemeris(**{'ura': 0.0, 'healthy': 1,
154-
'xyz': {'acc': [-6.51925802230835e-08, 4.718410826464475e-09, 2.6226835183928943],
155-
'iod': 0, 'a_gf0': 5153.648313522339, 'a_gf1': 0.5977821557062277,
156-
'pos': [5.122274160385132e-09, 19.0625, 259.9375],
157-
'rate': [1.0151416063308716e-06, 6.260350346565247e-06, -6.332993507385254e-08],
158-
'toa': 4096},
159-
'valid': 1,
160-
'sid': {'code': 0, 'sat': 0},
161-
'toe': {'wn': 1876, 'tow': 172800.0},
162-
'kepler': {'inc_dot': 4.4966158735287064e-10, 'tgd': 5.122274160385132e-09, 'omegadot': -8.099980253833005e-09,
163-
'sqrta': 5153.648313522339, 'inc': 0.9634151551139846, 'cus': 6.260350346565247e-06,
164-
'omega0': 0.5977821557062277, 'cuc': 1.0151416063308716e-06, 'm0': 2.6226835183928943,
165-
'toc': {'wn': 1876, 'tow': 172800.0}, 'dn': 4.718410826464475e-09, 'ecc': 0.0049016030970960855,
166-
'cic': -6.332993507385254e-08, 'crs': 19.0625, 'iode': 74, 'iodc': 21845, 'cis': -6.51925802230835e-08,
167-
'crc': 259.9375, 'w': 0.4885959643259506, 'af0': 7.212162017822266e-06, 'af1': 9.094947017729282e-13, 'af2': 0.0},
168-
'fit_interval': 14400}),
169-
Ephemeris(**{'ura': 0.0, 'healthy': 1,
170-
'xyz': {'acc': [-6.146728992462158e-08, 4.742340394655613e-09, -0.8114190126645531], 'iod': 0,
171-
'a_gf0': 5153.798839569092, 'a_gf1': 1.6390180338742641,
172-
'pos': [1.862645149230957e-09, -40.5625, 221.625],
173-
'rate': [-2.2239983081817627e-06, 8.001923561096191e-06, 3.725290298461914e-09], 'toa': 0},
174-
'valid': 1,
175-
'sid': {'code': 0, 'sat': 2},
176-
'toe': {'wn': 1876, 'tow': 172800.0},
177-
'kepler': {'inc_dot': -4.475186409476941e-10, 'tgd': 1.862645149230957e-09, 'omegadot': -8.103551831174965e-09,
178-
'sqrta': 5153.798839569092, 'inc': 0.9587534715647247, 'cus': 8.001923561096191e-06,
179-
'omega0': 1.6390180338742641, 'cuc': -2.2239983081817627e-06, 'm0': -0.8114190126645531,
180-
'toc': {'wn': 1876, 'tow': 172800.0}, 'dn': 4.742340394655613e-09, 'ecc': 0.00035172002390027046,
181-
'cic': 3.725290298461914e-09, 'crs': -40.5625, 'iode': 59, 'iodc': 21845, 'cis': -6.146728992462158e-08,
182-
'crc': 221.625, 'w': 2.9037284161724037, 'af0': -9.969808161258698e-07, 'af1': -5.229594535194337e-12, 'af2': 0.0},
183-
'fit_interval': 14400})]
184-
gpst = ti.GpsTime(wn=1876, tow=167132)
185-
sdiffs = o.make_propagated_sdiffs_(rover_nm, rover_nm, remote_dists, base_pos, es, gpst)
152+
base_nm = [t.NavigationMeasurement(sat_pos=[-19277279.74504115, -8215892.62052003, 16367597.39238895],
153+
pseudorange=21123480.27105955, doppler=0, raw_doppler=0, carrier_phase=-110993309.26669005,
154+
sat_vel=[-1025.03418813, -1821.90205153, -2091.65477547],
155+
lock_time=0, tot=ti.GpsTime(wn=1876, tow=167131.92954684512),
156+
raw_pseudorange=21121324.476403236, raw_carrier_phase=-110993309.26669005,
157+
snr=30.0, sid=s.GNSSSignal(code=0, sat=0), lock_counter=0),
158+
t.NavigationMeasurement(sat_pos=[-16580231.46081397, 918533.75723257, 20731515.61249766],
159+
pseudorange=22432049.84763688, doppler=0, raw_doppler=0, carrier_phase=-117882743.21601027,
160+
sat_vel=[1060.97989026, -2411.44777346, 953.59410165],
161+
lock_time=0, tot=ti.GpsTime(wn=1876, tow=167131.9251737675),
162+
raw_pseudorange=22432340.166121125, raw_carrier_phase=-117882743.21601027,
163+
snr=30.0, sid=s.GNSSSignal(code=0, sat=2), lock_counter=0)]
164+
remote_dists = np.array([ 21121393.87562408, 22432814.46819838])
165+
base_pos = np.array( [-2704375, -4263211, 3884637])
166+
sdiffs = o.make_propagated_sdiffs_(rover_nm, base_nm, remote_dists, base_pos)
186167
assert len(sdiffs) == 2
187168
assert sdiffs[0].pseudorange > 0
188169
assert sdiffs[1].pseudorange > 0

src/baseline.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -409,8 +409,9 @@ static bool chi_test(double threshold, u8 num_dds,
409409
*
410410
* -`-1`: < 3 dds
411411
* -`-2`: dgelsy error (see lesq_solution_float)
412-
* -`-3`: raim check failed, repair failed
412+
* -`-3`: raim check failed, repair failed, ref satellite was bad
413413
* -`-4`: raim check failed, not enough sats for repair
414+
* -`-5`: raim check failed, repair failed, more than one acceptable solution
414415
*/
415416
/* TODO(dsk) update all call sites to use n_used as calculated here.
416417
* TODO(dsk) add warn/info logging to call sites when repair occurs.
@@ -501,7 +502,7 @@ s8 lesq_solve_raim(u8 num_dds_u8, const double *dd_obs,
501502
if (n_used) {
502503
*n_used = 0;
503504
}
504-
return -3;
505+
return -5;
505506
}
506507
}
507508

src/ephemeris.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,6 @@ static s8 calc_sat_state_kepler(const ephemeris_t *e,
261261

262262
/* TODO: Implement convergence test using integer difference of doubles,
263263
* http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm */
264-
/* TODO: Bound number of iterations. */
265264
do {
266265
ea_old = ea;
267266
temp = 1.0 - ecc * cos(ea_old);

0 commit comments

Comments
 (0)