Skip to content

Commit 5f9cb66

Browse files
test vru
1 parent 00dc573 commit 5f9cb66

1 file changed

Lines changed: 69 additions & 5 deletions

File tree

tests/test_smoothing.py

Lines changed: 69 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ def test_benchmark_ains(self):
3535
fs = 10.24 # sampling rate in Hz
3636
_, pos, vel, euler, acc, gyro = benchmark_full_pva_beat_202311A(fs)
3737
euler = np.degrees(euler)
38+
gyro = np.degrees(gyro)
3839
head = euler[:, 2]
3940

4041
# IMU measurements
@@ -70,12 +71,12 @@ def test_benchmark_ains(self):
7071
smoother.update(
7172
f_i,
7273
w_i,
73-
degrees=False,
74+
degrees=True,
7475
pos=p_i,
7576
pos_var=pos_noise_std**2 * np.ones(3),
7677
head=h_i,
7778
head_var=head_noise_std**2,
78-
head_degrees=False,
79+
head_degrees=True,
7980
)
8081

8182
pos_ains.append(smoother.ains.position())
@@ -123,6 +124,7 @@ def test_benchmark_ahrs(self):
123124
fs = 10.24 # sampling rate in Hz
124125
_, pos, vel, euler, acc, gyro = benchmark_full_pva_beat_202311A(fs)
125126
euler = np.degrees(euler)
127+
gyro = np.degrees(gyro)
126128
head = euler[:, 2]
127129

128130
# IMU measurements
@@ -156,10 +158,10 @@ def test_benchmark_ahrs(self):
156158
smoother.update(
157159
f_i,
158160
w_i,
159-
degrees=False,
161+
degrees=True,
160162
head=h_i,
161163
head_var=head_noise_std**2,
162-
head_degrees=False,
164+
head_degrees=True,
163165
)
164166

165167
euler_ains.append(smoother.ains.euler(degrees=True))
@@ -168,14 +170,76 @@ def test_benchmark_ahrs(self):
168170
euler_ains = np.array(euler_ains)
169171

170172
# Smoothed state estimates
171-
euler_smth = smoother.euler(degrees=False)
173+
euler_smth = smoother.euler(degrees=True)
174+
175+
# Half-sample shift
176+
# # (compensates for the delay introduced by Euler integration)
177+
euler_ains = resample_poly(euler_ains, 2, 1)[1:-1:2]
178+
euler_smth = resample_poly(euler_smth, 2, 1)[1:-1:2]
179+
euler = euler[:-1, :]
180+
181+
warmup = int(fs * 600.0) # truncate 600 seconds from the beginning
182+
183+
euler_err_smth = np.std((euler_smth - euler)[warmup:], axis=0)
184+
euler_err_ains = np.std((euler_ains - euler)[warmup:], axis=0)
185+
np.testing.assert_array_less(euler_err_smth, euler_err_ains)
186+
187+
def test_benchmark_vru(self):
188+
# Reference signal
189+
fs = 10.24 # sampling rate in Hz
190+
_, pos, vel, euler, acc, gyro = benchmark_full_pva_beat_202311A(fs)
191+
euler = np.degrees(euler)
192+
gyro = np.degrees(gyro)
193+
head = euler[:, 2]
194+
195+
# IMU measurements
196+
err_acc = sf.constants.ERR_ACC_MOTION2 # m/s^2
197+
err_gyro = sf.constants.ERR_GYRO_MOTION2 # rad/s
198+
imu_noise = sf.noise.IMUNoise(err_acc, err_gyro)(fs, len(acc))
199+
acc_imu = acc + imu_noise[:, :3]
200+
gyro_imu = gyro + np.degrees(imu_noise[:, 3:])
201+
202+
# AINS
203+
p0 = pos[0] # position [m]
204+
v0 = vel[0] # velocity [m/s]
205+
q0 = sf.quaternion_from_euler(euler[0], degrees=True) # unit quaternion
206+
ba0 = np.zeros(3) # accelerometer bias [m/s^2]
207+
bg0 = np.zeros(3) # gyroscope bias [rad/s]
208+
x0 = np.concatenate((p0, v0, q0, ba0, bg0))
209+
P0 = np.eye(12) * 1e-3
210+
err_acc = sf.constants.ERR_ACC_MOTION2 # m/s^2
211+
err_gyro = sf.constants.ERR_GYRO_MOTION2 # rad/s
212+
ains = sf.VRU(fs, x0, P0, err_acc, err_gyro)
213+
214+
smoother = sf.FixedIntervalSmoother(ains, cov_smoothing=True)
215+
216+
euler_ains = []
217+
for f_i, w_i in zip(acc_imu, gyro_imu):
218+
smoother.update(
219+
f_i,
220+
w_i,
221+
degrees=True,
222+
)
223+
224+
euler_ains.append(smoother.ains.euler(degrees=True))
225+
226+
# Forward filter state estimates
227+
euler_ains = np.array(euler_ains)
228+
229+
# Smoothed state estimates
230+
euler_smth = smoother.euler(degrees=True)
172231

173232
# Half-sample shift
174233
# # (compensates for the delay introduced by Euler integration)
175234
euler_ains = resample_poly(euler_ains, 2, 1)[1:-1:2]
176235
euler_smth = resample_poly(euler_smth, 2, 1)[1:-1:2]
177236
euler = euler[:-1, :]
178237

238+
# Drop yaw
239+
euler = euler[:, :2]
240+
euler_ains = euler_ains[:, :2]
241+
euler_smth = euler_smth[:, :2]
242+
179243
warmup = int(fs * 600.0) # truncate 600 seconds from the beginning
180244

181245
euler_err_smth = np.std((euler_smth - euler)[warmup:], axis=0)

0 commit comments

Comments
 (0)