diff --git a/opendbc_repo/opendbc/car/hyundai/carstate.py b/opendbc_repo/opendbc/car/hyundai/carstate.py index f231e366c..713d65fa3 100644 --- a/opendbc_repo/opendbc/car/hyundai/carstate.py +++ b/opendbc_repo/opendbc/car/hyundai/carstate.py @@ -397,7 +397,8 @@ class CarState(CarStateBase): ret.cruiseState.nonAdaptive = cp.vl["MANUAL_SPEED_LIMIT_ASSIST"]["MSLA_ENABLED"] == 1 if self.CP.carFingerprint == CAR.HYUNDAI_IONIQ_6: msla = cp.vl["MANUAL_SPEED_LIMIT_ASSIST"] - self.ipedal_active = decode_ioniq_6_ipedal_state(msla["EV_REGEN_STATE"], msla["EV_REGEN_STATE_2"]) + # Tolerate older/stale DBCs that do not yet expose the inferred regen state signals. + self.ipedal_active = decode_ioniq_6_ipedal_state(msla.get("EV_REGEN_STATE", 0), msla.get("EV_REGEN_STATE_2", 0)) prev_cruise_buttons = self.cruise_buttons[-1] prev_main_buttons = self.main_buttons[-1] @@ -473,6 +474,7 @@ class CarState(CarStateBase): ] if CP.flags & HyundaiFlags.EV: msgs.append(("DRIVE_MODE_EV", 0)) # optional: not all CAN-FD EV variants publish drive mode + msgs.append(("MANUAL_SPEED_LIMIT_ASSIST", 0)) # optional: used for non-adaptive cruise state and Ioniq 6 i-Pedal latch detection msgs.append(("STEERING_WHEEL_MEDIA_BUTTONS", 0)) # optional: absent or slower on some CAN-FD variants cam_msgs.append(("ADAS_0x380", 0)) # optional: dashboard stop-sign signal, only on ADAS-equipped HKG CANFD return { diff --git a/opendbc_repo/opendbc/car/hyundai/values.py b/opendbc_repo/opendbc/car/hyundai/values.py index f8bbadcc6..096f40de8 100644 --- a/opendbc_repo/opendbc/car/hyundai/values.py +++ b/opendbc_repo/opendbc/car/hyundai/values.py @@ -113,6 +113,7 @@ class HyundaiSafetyFlags(IntFlag): class HyundaiStarPilotSafetyFlags(IntFlag): HAS_LDA_BUTTON = 1024 AOL_LKAS_ON_ENGAGE = 2048 + ALLOW_IPEDAL_PADDLE = 32768 class HyundaiStarPilotFlags(IntFlag): diff --git a/opendbc_repo/opendbc/car/interfaces.py b/opendbc_repo/opendbc/car/interfaces.py index 38817132d..d3ba809e4 100644 --- a/opendbc_repo/opendbc/car/interfaces.py +++ b/opendbc_repo/opendbc/car/interfaces.py @@ -232,6 +232,8 @@ class CarInterfaceBase(ABC): fp_ret.safetyConfigs[-1].safetyParam |= HyundaiStarPilotSafetyFlags.HAS_LDA_BUTTON.value if starpilot_toggles.always_on_lateral_lkas: fp_ret.safetyConfigs[-1].safetyParam |= HyundaiStarPilotSafetyFlags.AOL_LKAS_ON_ENGAGE.value + if candidate == HYUNDAI.HYUNDAI_IONIQ_6 and getattr(starpilot_toggles, "always_ipedal", False): + fp_ret.safetyConfigs[-1].safetyParam |= HyundaiStarPilotSafetyFlags.ALLOW_IPEDAL_PADDLE.value elif platform in TOYOTA: fp_ret.canUsePedal = not CP.autoResumeSng diff --git a/opendbc_repo/opendbc/car/tests/test_car_interfaces.py b/opendbc_repo/opendbc/car/tests/test_car_interfaces.py index 3b50894a1..db5ec0932 100644 --- a/opendbc_repo/opendbc/car/tests/test_car_interfaces.py +++ b/opendbc_repo/opendbc/car/tests/test_car_interfaces.py @@ -64,6 +64,7 @@ class DummyCarInterface(CarInterfaceBase): def get_test_starpilot_toggles() -> SimpleNamespace: return SimpleNamespace( + always_ipedal=False, always_on_lateral_lkas=False, car_model="", cluster_offset=1.0, @@ -214,6 +215,31 @@ class TestCarInterfaces: ) assert fp_car_params.safetyConfigs[-1].safetyParam & HyundaiStarPilotSafetyFlags.AOL_LKAS_ON_ENGAGE.value + def test_hyundai_always_ipedal_flag_is_set_for_ioniq_6(self): + toggles = get_test_starpilot_toggles() + toggles.always_ipedal = True + fingerprint = {bus: {} for bus in range(8)} + fingerprint[2][0x50] = 16 + + car_params = HyundaiCarInterface.get_params( + HYUNDAI_CAR.HYUNDAI_IONIQ_6, + fingerprint, + [], + alpha_long=False, + is_release=False, + docs=False, + starpilot_toggles=toggles, + ) + + fp_car_params = HyundaiCarInterface.get_starpilot_params( + HYUNDAI_CAR.HYUNDAI_IONIQ_6, + fingerprint, + [], + car_params, + toggles, + ) + assert fp_car_params.safetyConfigs[-1].safetyParam & HyundaiStarPilotSafetyFlags.ALLOW_IPEDAL_PADDLE.value + def test_toyota_disable_openpilot_long_sets_stock_long_safety_flag(self): CarInterface = interfaces[TOYOTA_CAR.TOYOTA_PRIUS_TSS2] fingerprint = {bus: {} for bus in range(8)} diff --git a/opendbc_repo/opendbc/dbc/hyundai_canfd_generated.dbc b/opendbc_repo/opendbc/dbc/hyundai_canfd_generated.dbc index fb9b336c1..96e2277ee 100644 --- a/opendbc_repo/opendbc/dbc/hyundai_canfd_generated.dbc +++ b/opendbc_repo/opendbc/dbc/hyundai_canfd_generated.dbc @@ -824,6 +824,8 @@ BO_ 736 MANUAL_SPEED_LIMIT_ASSIST: 32 XXX SG_ MSLA_ENABLED : 38|1@1+ (1,0) [0|1] "" XXX SG_ MAX_SPEED : 55|8@0+ (1,0) [0|255] "" XXX SG_ MAX_SPEED_COPY : 144|8@1+ (1,0) [0|255] "" XXX + SG_ EV_REGEN_STATE : 104|8@1+ (1,0) [0|255] "" XXX + SG_ EV_REGEN_STATE_2 : 184|8@1+ (1,0) [0|255] "" XXX BO_ 837 ADRV_0x345: 8 ADRV SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX diff --git a/opendbc_repo/opendbc/safety/modes/hyundai_canfd.h b/opendbc_repo/opendbc/safety/modes/hyundai_canfd.h index e439220cc..d0c81a68b 100644 --- a/opendbc_repo/opendbc/safety/modes/hyundai_canfd.h +++ b/opendbc_repo/opendbc/safety/modes/hyundai_canfd.h @@ -56,6 +56,7 @@ static bool hyundai_canfd_alt_buttons = false; static bool hyundai_canfd_lka_steering_alt = false; static bool hyundai_canfd_angle_steering = false; +static bool hyundai_canfd_allow_ipedal_paddle = false; static unsigned int hyundai_canfd_get_lka_addr(void) { return hyundai_canfd_lka_steering_alt ? 0x110U : 0x50U; @@ -228,10 +229,21 @@ static bool hyundai_canfd_tx_hook(const CANPacket_t *msg) { // cruise buttons check if (msg->addr == 0x1cfU) { int button = msg->data[2] & 0x7U; + bool main_button = GET_BIT(msg, 19U) || GET_BIT(msg, 21U); + bool lkas_button = GET_BIT(msg, 23U); + bool right_paddle = GET_BIT(msg, 25U); + bool left_paddle = GET_BIT(msg, 27U); bool is_cancel = (button == HYUNDAI_BTN_CANCEL); bool is_resume = (button == HYUNDAI_BTN_RESUME); + bool is_left_paddle_only = hyundai_canfd_allow_ipedal_paddle && + !controls_allowed && + (button == HYUNDAI_BTN_NONE) && + !main_button && + !lkas_button && + !right_paddle && + left_paddle; - bool allowed = (is_cancel && cruise_engaged_prev) || (is_resume && controls_allowed); + bool allowed = (is_cancel && cruise_engaged_prev) || (is_resume && controls_allowed) || is_left_paddle_only; if (!allowed) { tx = false; } @@ -278,6 +290,7 @@ static safety_config hyundai_canfd_init(uint16_t param) { const uint16_t HYUNDAI_PARAM_CANFD_LKA_STEERING_ALT = 128; const uint16_t HYUNDAI_PARAM_CANFD_ALT_BUTTONS = 32; const uint16_t HYUNDAI_PARAM_CANFD_ANGLE_STEERING = 1024; + const uint16_t HYUNDAI_PARAM_ALLOW_IPEDAL_PADDLE = 32768; static const CanMsg HYUNDAI_CANFD_LKA_STEERING_TX_MSGS[] = { HYUNDAI_CANFD_LKA_STEERING_COMMON_TX_MSGS(0, 1) @@ -330,6 +343,7 @@ static safety_config hyundai_canfd_init(uint16_t param) { hyundai_canfd_alt_buttons = GET_FLAG(param, HYUNDAI_PARAM_CANFD_ALT_BUTTONS); hyundai_canfd_lka_steering_alt = GET_FLAG(param, HYUNDAI_PARAM_CANFD_LKA_STEERING_ALT); hyundai_canfd_angle_steering = GET_FLAG(param, HYUNDAI_PARAM_CANFD_ANGLE_STEERING); + hyundai_canfd_allow_ipedal_paddle = GET_FLAG(param, HYUNDAI_PARAM_ALLOW_IPEDAL_PADDLE); safety_config ret; if (hyundai_longitudinal) { diff --git a/opendbc_repo/opendbc/safety/tests/test_hyundai_canfd.py b/opendbc_repo/opendbc/safety/tests/test_hyundai_canfd.py index c75add648..b5a32fbee 100755 --- a/opendbc_repo/opendbc/safety/tests/test_hyundai_canfd.py +++ b/opendbc_repo/opendbc/safety/tests/test_hyundai_canfd.py @@ -427,6 +427,47 @@ class TestHyundaiCanfdLKASteeringEV(TestHyundaiCanfdBase): self.safety.set_safety_hooks(CarParams.SafetyModel.hyundaiCanfd, HyundaiSafetyFlags.CANFD_LKA_STEERING | HyundaiSafetyFlags.EV_GAS) self.safety.init_tests() + def _paddle_msg(self, left_paddle=0, right_paddle=0, buttons=0, main_button=0, lka_button=0, bus=None): + if bus is None: + bus = self.BUTTONS_TX_BUS + values = { + "CRUISE_BUTTONS": buttons, + "ADAPTIVE_CRUISE_MAIN_BTN": main_button, + "LDA_BTN": lka_button, + "RIGHT_PADDLE": right_paddle, + "LEFT_PADDLE": left_paddle, + "SET_ME_1": 1, + } + return self.packer.make_can_msg_safety("CRUISE_BUTTONS", bus, values) + + def test_left_paddle_send(self): + for controls_allowed in (True, False): + self.safety.set_controls_allowed(controls_allowed) + self.assertFalse(self._tx(self._paddle_msg(left_paddle=1))) + + +class TestHyundaiCanfdLKASteeringEVAlwaysIPedal(TestHyundaiCanfdLKASteeringEV): + + def setUp(self): + self.packer = CANPackerSafety("hyundai_canfd_generated") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.hyundaiCanfd, + HyundaiSafetyFlags.CANFD_LKA_STEERING | + HyundaiSafetyFlags.EV_GAS | + HyundaiStarPilotSafetyFlags.ALLOW_IPEDAL_PADDLE) + self.safety.init_tests() + + def test_left_paddle_send(self): + self.safety.set_controls_allowed(False) + self.assertTrue(self._tx(self._paddle_msg(left_paddle=1))) + self.assertFalse(self._tx(self._paddle_msg(right_paddle=1))) + self.assertFalse(self._tx(self._paddle_msg(left_paddle=1, buttons=1))) + self.assertFalse(self._tx(self._paddle_msg(left_paddle=1, main_button=1))) + self.assertFalse(self._tx(self._paddle_msg(left_paddle=1, lka_button=1))) + + self.safety.set_controls_allowed(True) + self.assertFalse(self._tx(self._paddle_msg(left_paddle=1))) + # TODO: Handle ICE and HEV configurations once we see cars that use the new messages class TestHyundaiCanfdLKASteeringAltEV(TestHyundaiCanfdBase): diff --git a/selfdrive/controls/lib/latcontrol_torque.py b/selfdrive/controls/lib/latcontrol_torque.py index e2d556df9..d13138d83 100644 --- a/selfdrive/controls/lib/latcontrol_torque.py +++ b/selfdrive/controls/lib/latcontrol_torque.py @@ -48,6 +48,7 @@ UNWIND_LAT_ACCEL_NEAR_ZERO = 0.3 MIN_LATERAL_CONTROL_SPEED = 0.3 CIVIC_BOSCH_MODIFIED_B_FIXED_FRICTION_THRESHOLD = 0.30 CIVIC_BOSCH_MODIFIED_B_LAT_ACCEL_FACTOR_MULT = 1.20 +CIVIC_BOSCH_MODIFIED_B_VARIANT_LAT_ACCEL_FACTOR_MULT = 1.10 CIVIC_BOSCH_MODIFIED_B_TRANSITION_SPEED = 12.0 CIVIC_BOSCH_MODIFIED_B_PHASE_SCALE = 0.10 CIVIC_BOSCH_MODIFIED_B_FF_ONSET = 0.18 @@ -64,16 +65,16 @@ CIVIC_BOSCH_MODIFIED_B_TURN_IN_FRICTION_BOOST_LEFT = 0.02 CIVIC_BOSCH_MODIFIED_B_TURN_IN_FRICTION_BOOST_RIGHT = 0.00 CIVIC_BOSCH_MODIFIED_B_UNWIND_FRICTION_REDUCTION_LEFT = 0.26 CIVIC_BOSCH_MODIFIED_B_UNWIND_FRICTION_REDUCTION_RIGHT = 0.40 -CIVIC_BOSCH_MODIFIED_B_VARIANT_FF_REDUCTION_LEFT = 0.04 -CIVIC_BOSCH_MODIFIED_B_VARIANT_FF_REDUCTION_RIGHT = 0.10 -CIVIC_BOSCH_MODIFIED_B_VARIANT_TURN_IN_BOOST_LEFT = 0.02 -CIVIC_BOSCH_MODIFIED_B_VARIANT_TURN_IN_BOOST_RIGHT = 0.08 -CIVIC_BOSCH_MODIFIED_B_VARIANT_UNWIND_TAPER_LEFT = 0.16 -CIVIC_BOSCH_MODIFIED_B_VARIANT_UNWIND_TAPER_RIGHT = 0.26 -CIVIC_BOSCH_MODIFIED_B_VARIANT_TURN_IN_FRICTION_BOOST_LEFT = 0.01 -CIVIC_BOSCH_MODIFIED_B_VARIANT_TURN_IN_FRICTION_BOOST_RIGHT = 0.03 -CIVIC_BOSCH_MODIFIED_B_VARIANT_UNWIND_FRICTION_REDUCTION_LEFT = 0.08 -CIVIC_BOSCH_MODIFIED_B_VARIANT_UNWIND_FRICTION_REDUCTION_RIGHT = 0.16 +CIVIC_BOSCH_MODIFIED_B_VARIANT_FF_REDUCTION_LEFT = 0.10 +CIVIC_BOSCH_MODIFIED_B_VARIANT_FF_REDUCTION_RIGHT = 0.20 +CIVIC_BOSCH_MODIFIED_B_VARIANT_TURN_IN_BOOST_LEFT = 0.04 +CIVIC_BOSCH_MODIFIED_B_VARIANT_TURN_IN_BOOST_RIGHT = 0.00 +CIVIC_BOSCH_MODIFIED_B_VARIANT_UNWIND_TAPER_LEFT = 0.28 +CIVIC_BOSCH_MODIFIED_B_VARIANT_UNWIND_TAPER_RIGHT = 0.42 +CIVIC_BOSCH_MODIFIED_B_VARIANT_TURN_IN_FRICTION_BOOST_LEFT = 0.02 +CIVIC_BOSCH_MODIFIED_B_VARIANT_TURN_IN_FRICTION_BOOST_RIGHT = 0.00 +CIVIC_BOSCH_MODIFIED_B_VARIANT_UNWIND_FRICTION_REDUCTION_LEFT = 0.16 +CIVIC_BOSCH_MODIFIED_B_VARIANT_UNWIND_FRICTION_REDUCTION_RIGHT = 0.28 BOLT_2022_2023_CARS = ( GM_CAR.CHEVROLET_BOLT_ACC_2022_2023, @@ -230,8 +231,8 @@ GENESIS_G90_TURN_IN_FRICTION_BOOST_RIGHT = 0.12 GENESIS_G90_UNWIND_FRICTION_REDUCTION_LEFT = 0.14 GENESIS_G90_UNWIND_FRICTION_REDUCTION_RIGHT = 0.22 -IONIQ_6_FF_GAIN_LEFT = 0.040 -IONIQ_6_FF_GAIN_RIGHT = 0.000 +IONIQ_6_FF_GAIN_LEFT = 0.045 +IONIQ_6_FF_GAIN_RIGHT = 0.015 IONIQ_6_BASE_LAT_ACCEL_FACTOR_MULT = 1.23 IONIQ_6_BASE_FRICTION_THRESHOLD = 0.36 IONIQ_6_FF_ONSET = 0.10 @@ -247,14 +248,14 @@ IONIQ_6_UNWIND_TAPER_RIGHT = 5.05 IONIQ_6_FRICTION_MULT = 0.965 IONIQ_6_FRICTION_LAT_RISE = 0.20 IONIQ_6_FRICTION_JERK_RISE = 0.24 -IONIQ_6_TURN_IN_THRESHOLD_REDUCTION_LEFT = 0.46 -IONIQ_6_TURN_IN_THRESHOLD_REDUCTION_RIGHT = 0.64 -IONIQ_6_UNWIND_THRESHOLD_INCREASE_LEFT = 2.40 -IONIQ_6_UNWIND_THRESHOLD_INCREASE_RIGHT = 5.80 -IONIQ_6_TURN_IN_FRICTION_BOOST_LEFT = 0.24 -IONIQ_6_TURN_IN_FRICTION_BOOST_RIGHT = 0.40 -IONIQ_6_UNWIND_FRICTION_REDUCTION_LEFT = 2.15 -IONIQ_6_UNWIND_FRICTION_REDUCTION_RIGHT = 5.30 +IONIQ_6_TURN_IN_THRESHOLD_REDUCTION_LEFT = 0.50 +IONIQ_6_TURN_IN_THRESHOLD_REDUCTION_RIGHT = 0.72 +IONIQ_6_UNWIND_THRESHOLD_INCREASE_LEFT = 2.55 +IONIQ_6_UNWIND_THRESHOLD_INCREASE_RIGHT = 6.20 +IONIQ_6_TURN_IN_FRICTION_BOOST_LEFT = 0.26 +IONIQ_6_TURN_IN_FRICTION_BOOST_RIGHT = 0.44 +IONIQ_6_UNWIND_FRICTION_REDUCTION_LEFT = 2.30 +IONIQ_6_UNWIND_FRICTION_REDUCTION_RIGHT = 5.70 IONIQ_6_CENTER_TAPER_MAX = 0.056 IONIQ_6_CENTER_TAPER_LAT = 0.22 IONIQ_6_CENTER_TAPER_LAT_WIDTH = 0.02 @@ -269,20 +270,20 @@ IONIQ_6_LOW_MID_CENTER_TAPER_SPEED_WIDTH = 1.5 IONIQ_6_DIRECTIONAL_TAPER_LAT_START = 0.19 IONIQ_6_DIRECTIONAL_TAPER_LAT_END = 0.90 IONIQ_6_DIRECTIONAL_TAPER_LAT_WIDTH = 0.06 -IONIQ_6_DIRECTIONAL_TAPER_BASE_LEFT = 0.16 -IONIQ_6_DIRECTIONAL_TAPER_BASE_RIGHT = 0.54 -IONIQ_6_DIRECTIONAL_TAPER_UNWIND_LEFT = 1.52 -IONIQ_6_DIRECTIONAL_TAPER_UNWIND_RIGHT = 3.05 +IONIQ_6_DIRECTIONAL_TAPER_BASE_LEFT = 0.14 +IONIQ_6_DIRECTIONAL_TAPER_BASE_RIGHT = 0.48 +IONIQ_6_DIRECTIONAL_TAPER_UNWIND_LEFT = 1.64 +IONIQ_6_DIRECTIONAL_TAPER_UNWIND_RIGHT = 3.28 IONIQ_6_DIRECTIONAL_TAPER_FLOOR_LEFT = 0.48 IONIQ_6_DIRECTIONAL_TAPER_FLOOR_RIGHT = 0.52 IONIQ_6_DIRECTIONAL_TAPER_UNWIND_FLOOR_LEFT = 0.10 IONIQ_6_DIRECTIONAL_TAPER_UNWIND_FLOOR_RIGHT = 0.04 IONIQ_6_HEAVY_DIRECTIONAL_TAPER_LAT_START = 0.82 IONIQ_6_HEAVY_DIRECTIONAL_TAPER_LAT_WIDTH = 0.12 -IONIQ_6_HEAVY_DIRECTIONAL_TAPER_BASE_LEFT = 0.15 -IONIQ_6_HEAVY_DIRECTIONAL_TAPER_BASE_RIGHT = 0.26 -IONIQ_6_HEAVY_DIRECTIONAL_TAPER_UNWIND_LEFT = 0.50 -IONIQ_6_HEAVY_DIRECTIONAL_TAPER_UNWIND_RIGHT = 0.82 +IONIQ_6_HEAVY_DIRECTIONAL_TAPER_BASE_LEFT = 0.13 +IONIQ_6_HEAVY_DIRECTIONAL_TAPER_BASE_RIGHT = 0.22 +IONIQ_6_HEAVY_DIRECTIONAL_TAPER_UNWIND_LEFT = 0.56 +IONIQ_6_HEAVY_DIRECTIONAL_TAPER_UNWIND_RIGHT = 0.94 IONIQ_6_OUTPUT_TAPER_SPEED = 8.5 IONIQ_6_OUTPUT_TAPER_SPEED_WIDTH = 2.5 IONIQ_6_OUTPUT_CENTER_TAPER_BLEND = 0.90 @@ -1112,6 +1113,8 @@ class LatControlTorque(LatControl): self.torque_params.latAccelFactor *= IONIQ_6_BASE_LAT_ACCEL_FACTOR_MULT if self.is_civic_bosch_modified: self.torque_params.latAccelFactor *= CIVIC_BOSCH_MODIFIED_B_LAT_ACCEL_FACTOR_MULT + if civic_bosch_modified_lateral_testing_ground_active(): + self.torque_params.latAccelFactor *= CIVIC_BOSCH_MODIFIED_B_VARIANT_LAT_ACCEL_FACTOR_MULT if self.is_bolt: kp_scale = getattr(self.torque_params, "kp", getattr(self.torque_params, "kpDEPRECATED", 1.0)) ki_scale = getattr(self.torque_params, "ki", getattr(self.torque_params, "kiDEPRECATED", 1.0)) @@ -1127,6 +1130,8 @@ class LatControlTorque(LatControl): latAccelFactor *= IONIQ_6_BASE_LAT_ACCEL_FACTOR_MULT if self.is_civic_bosch_modified: latAccelFactor *= CIVIC_BOSCH_MODIFIED_B_LAT_ACCEL_FACTOR_MULT + if civic_bosch_modified_lateral_testing_ground_active(): + latAccelFactor *= CIVIC_BOSCH_MODIFIED_B_VARIANT_LAT_ACCEL_FACTOR_MULT self.torque_params.latAccelFactor = latAccelFactor self.torque_params.latAccelOffset = latAccelOffset self.torque_params.friction = friction diff --git a/selfdrive/controls/tests/test_latcontrol.py b/selfdrive/controls/tests/test_latcontrol.py index 81440988e..0990e4a11 100644 --- a/selfdrive/controls/tests/test_latcontrol.py +++ b/selfdrive/controls/tests/test_latcontrol.py @@ -429,6 +429,11 @@ class TestLatControl: assert controller.torque_params.latAccelFactor == pytest.approx(3.0 * 1.20) + monkeypatch.setattr(latcontrol_torque, "civic_bosch_modified_lateral_testing_ground_active", lambda: True) + variant_controller = LatControlTorque(CP.as_reader(), CI, DT_CTRL) + + assert variant_controller.torque_params.latAccelFactor == pytest.approx(3.0 * 1.20 * 1.10) + def test_modified_civic_b_torque_ff_scale_curve(self): steady_left = get_civic_bosch_modified_b_ff_scale(0.5, 0.0, 12.0) steady_right = get_civic_bosch_modified_b_ff_scale(-0.5, 0.0, 12.0) @@ -470,7 +475,7 @@ class TestLatControl: variant_unwind_right_friction = get_civic_bosch_modified_b_friction_scale(12.0, -0.5, 0.8) assert variant_steady_right < base_steady_right - assert variant_turn_in_right >= base_turn_in_right + assert variant_turn_in_right < base_turn_in_right assert variant_unwind_right < base_unwind_right assert variant_unwind_right_friction < base_unwind_right_friction