@@ -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