#!/usr/bin/env python3 import numpy as np import unittest from selfdrive.car.honda.interface import CarInterface from selfdrive.car.honda.values import CAR from selfdrive.controls.lib.vehicle_model import VehicleModel from selfdrive.locationd.liblocationd_py import liblocationd # pylint: disable=no-name-in-module, import-error class TestParamsLearner(unittest.TestCase): def setUp(self): self.CP = CarInterface.get_params(CAR.CIVIC) bts = self.CP.to_bytes() self.params_learner = liblocationd.params_learner_init(len(bts), bts, 0.0, 1.0, self.CP.steerRatio, 1.0) def test_convergence(self): # Setup vehicle model with wrong parameters VM_sim = VehicleModel(self.CP) x_target = 0.75 sr_target = self.CP.steerRatio - 0.5 ao_target = -1.0 VM_sim.update_params(x_target, sr_target) # Run simulation times = np.arange(0, 15*3600, 0.01) angle_offset = np.radians(ao_target) steering_angles = np.radians(10 * np.sin(2 * np.pi * times / 100.)) + angle_offset speeds = 10 * np.sin(2 * np.pi * times / 1000.) + 25 for i, _ in enumerate(times): u = speeds[i] sa = steering_angles[i] psi = VM_sim.yaw_rate(sa - angle_offset, u) liblocationd.params_learner_update(self.params_learner, psi, u, sa) # Verify learned parameters sr = liblocationd.params_learner_get_sR(self.params_learner) ao_slow = np.degrees(liblocationd.params_learner_get_slow_ao(self.params_learner)) x = liblocationd.params_learner_get_x(self.params_learner) self.assertAlmostEqual(x_target, x, places=1) self.assertAlmostEqual(ao_target, ao_slow, places=1) self.assertAlmostEqual(sr_target, sr, places=1) if __name__ == "__main__": unittest.main()