import unittest import random import timeit import numpy as np from common.kalman.simple_kalman import KF1D from common.kalman.simple_kalman_old import KF1D as KF1D_old class TestSimpleKalman(unittest.TestCase): def setUp(self): dt = 0.01 x0_0 = 0.0 x1_0 = 0.0 A0_0 = 1.0 A0_1 = dt A1_0 = 0.0 A1_1 = 1.0 C0_0 = 1.0 C0_1 = 0.0 K0_0 = 0.12287673 K1_0 = 0.29666309 self.kf_old = KF1D_old(x0=np.array([[x0_0], [x1_0]]), A=np.array([[A0_0, A0_1], [A1_0, A1_1]]), C=np.array([C0_0, C0_1]), K=np.array([[K0_0], [K1_0]])) self.kf = KF1D(x0=[[x0_0], [x1_0]], A=[[A0_0, A0_1], [A1_0, A1_1]], C=[C0_0, C0_1], K=[[K0_0], [K1_0]]) def test_getter_setter(self): self.kf.x = [[1.0], [1.0]] self.assertEqual(self.kf.x, [[1.0], [1.0]]) def update_returns_state(self): x = self.kf.update(100) self.assertEqual(x, self.kf.x) def test_old_equal_new(self): for _ in range(1000): v_wheel = random.uniform(0, 200) x_old = self.kf_old.update(v_wheel) x = self.kf.update(v_wheel) # Compare the output x, verify that the error is less than 1e-4 np.testing.assert_almost_equal(x_old[0], x[0]) np.testing.assert_almost_equal(x_old[1], x[1]) def test_new_is_faster(self): setup = """ import numpy as np from common.kalman.simple_kalman import KF1D from common.kalman.simple_kalman_old import KF1D as KF1D_old dt = 0.01 x0_0 = 0.0 x1_0 = 0.0 A0_0 = 1.0 A0_1 = dt A1_0 = 0.0 A1_1 = 1.0 C0_0 = 1.0 C0_1 = 0.0 K0_0 = 0.12287673 K1_0 = 0.29666309 kf_old = KF1D_old(x0=np.array([[x0_0], [x1_0]]), A=np.array([[A0_0, A0_1], [A1_0, A1_1]]), C=np.array([C0_0, C0_1]), K=np.array([[K0_0], [K1_0]])) kf = KF1D(x0=[[x0_0], [x1_0]], A=[[A0_0, A0_1], [A1_0, A1_1]], C=[C0_0, C0_1], K=[[K0_0], [K1_0]]) """ kf_speed = timeit.timeit("kf.update(1234)", setup=setup, number=10000) kf_old_speed = timeit.timeit("kf_old.update(1234)", setup=setup, number=10000) self.assertTrue(kf_speed < kf_old_speed / 4) if __name__ == "__main__": unittest.main()