#!/usr/bin/env python3 import importlib from parameterized import parameterized_class import unittest from cereal import car from selfdrive.car.car_helpers import interfaces from selfdrive.car.fingerprints import all_known_cars from selfdrive.car.interfaces import get_torque_params MAX_LAT_UP_JERK = 2.5 # m/s^3 MAX_LAT_UP_JERK_TOLERANCE = 0.5 # m/s^3 MIN_LAT_DOWN_JERK = 2.0 # m/s^3 @parameterized_class('car_model', [(c,) for c in all_known_cars()]) class TestLateralLimits(unittest.TestCase): @classmethod def setUpClass(cls): CarInterface, _, _ = interfaces[cls.car_model] CP = CarInterface.get_params(cls.car_model) if CP.dashcamOnly: raise unittest.SkipTest("Platform is behind dashcamOnly") # TODO: test angle if CP.steerControlType == car.CarParams.SteerControlType.angle: raise unittest.SkipTest if CP.notCar: raise unittest.SkipTest # TODO: test Honda if CP.carName in ("honda",): raise unittest.SkipTest("No steering safety") CarControllerParams = importlib.import_module(f'selfdrive.car.{CP.carName}.values').CarControllerParams cls.control_params = CarControllerParams(CP) cls.torque_params = get_torque_params(cls.car_model) def _calc_jerk(self): # TODO: some cars don't send at 100hz, put steer rate/step into CCP to calculate this properly steer_step = self.control_params.STEER_STEP time_to_max = self.control_params.STEER_MAX / self.control_params.STEER_DELTA_UP / 100. * steer_step time_to_min = self.control_params.STEER_MAX / self.control_params.STEER_DELTA_DOWN / 100. * steer_step max_lat_accel = self.torque_params['LAT_ACCEL_FACTOR'] return max_lat_accel / time_to_max, max_lat_accel / time_to_min def test_jerk_limits(self): up_jerk, down_jerk = self._calc_jerk() self.assertLess(up_jerk, MAX_LAT_UP_JERK + MAX_LAT_UP_JERK_TOLERANCE) self.assertGreater(down_jerk, MIN_LAT_DOWN_JERK) if __name__ == "__main__": unittest.main()