diff --git a/opendbc_repo/opendbc/car/hyundai/tests/test_hyundai.py b/opendbc_repo/opendbc/car/hyundai/tests/test_hyundai.py index 48dd15a3d..c51dce8bd 100644 --- a/opendbc_repo/opendbc/car/hyundai/tests/test_hyundai.py +++ b/opendbc_repo/opendbc/car/hyundai/tests/test_hyundai.py @@ -1040,6 +1040,8 @@ class TestHyundaiFingerprint: assert sportage_high_speed_params.ANGLE_LIMITS.MAX_LATERAL_JERK == sportage_params.ANGLE_LIMITS.MAX_LATERAL_JERK assert sportage_low_speed_params.ANGLE_LIMITS.MAX_LATERAL_JERK > sportage_high_speed_params.ANGLE_LIMITS.MAX_LATERAL_JERK assert sportage_low_speed_params.ANGLE_LIMITS.MAX_LATERAL_JERK < comparison_params.ANGLE_LIMITS.MAX_LATERAL_JERK + assert sportage_params.ANGLE_LIMITS.MAX_LATERAL_ACCEL > comparison_params.ANGLE_LIMITS.MAX_LATERAL_ACCEL + assert sportage_params.ANGLE_LIMITS.MAX_ANGLE_RATE > comparison_params.ANGLE_LIMITS.MAX_ANGLE_RATE assert comparison_params.ANGLE_LIMITS.MAX_LATERAL_JERK == ioniq6_params.ANGLE_LIMITS.MAX_LATERAL_JERK def test_ioniq_5_canfd_aux_messages_are_optional(self): diff --git a/opendbc_repo/opendbc/car/hyundai/values.py b/opendbc_repo/opendbc/car/hyundai/values.py index 096f40de8..74e48e366 100644 --- a/opendbc_repo/opendbc/car/hyundai/values.py +++ b/opendbc_repo/opendbc/car/hyundai/values.py @@ -11,6 +11,12 @@ from opendbc.car.fw_query_definitions import FwQueryConfig, Request, p16 Ecu = CarParams.Ecu AVERAGE_ROAD_ROLL = 0.06 # conservative roll margin used by Hyundai CAN-FD angle steering safety +SPORTAGE_HEV_2026_MAX_LATERAL_ACCEL = 3.25 +SPORTAGE_HEV_2026_BASE_LATERAL_JERK = 3.25 +SPORTAGE_HEV_2026_LOW_SPEED_JERK_BOOST = 0.75 +SPORTAGE_HEV_2026_LOW_SPEED_JERK_SPEED = 12.0 +SPORTAGE_HEV_2026_LOW_SPEED_JERK_WIDTH = 6.0 +SPORTAGE_HEV_2026_MAX_ANGLE_RATE = 6.0 class CarControllerParams: @@ -53,15 +59,19 @@ class CarControllerParams: if CP.flags & HyundaiFlags.CANFD_ANGLE_STEERING: self.STEER_THRESHOLD = 175 - # The Sportage angle port gets rough if it keeps the branch-wide higher jerk - # limit everywhere, but the fully calmed 3.0 m/s^3 cap lags too much in tight - # low-speed turns. Give it extra low-speed authority, then fade back to the - # calmer ceiling by normal road speeds. + # The Sportage angle port still needs more authority in real turns than the + # fully calmed branch-wide ceiling allows, but the old low-speed jerk boost + # made the 3-20 degree band angry and ping-pongy as the car slowed down. + # Split the difference: + # - keep a calmer low-speed boost that fades out earlier + # - give the car a little more true turn headroom through accel/rate limits if CP.carFingerprint == CAR.KIA_SPORTAGE_HEV_2026: - sportage_low_speed_weight = min(max((15.0 - vEgoRaw) / 7.0, 0.0), 1.0) - sportage_lateral_jerk = 3.0 + (1.2 * sportage_low_speed_weight) + sportage_low_speed_weight = min(max((SPORTAGE_HEV_2026_LOW_SPEED_JERK_SPEED - vEgoRaw) / SPORTAGE_HEV_2026_LOW_SPEED_JERK_WIDTH, 0.0), 1.0) + sportage_lateral_jerk = SPORTAGE_HEV_2026_BASE_LATERAL_JERK + (SPORTAGE_HEV_2026_LOW_SPEED_JERK_BOOST * sportage_low_speed_weight) self.ANGLE_LIMITS = replace(self.ANGLE_LIMITS, - MAX_LATERAL_JERK=sportage_lateral_jerk + (ACCELERATION_DUE_TO_GRAVITY * AVERAGE_ROAD_ROLL)) + MAX_LATERAL_ACCEL=SPORTAGE_HEV_2026_MAX_LATERAL_ACCEL + (ACCELERATION_DUE_TO_GRAVITY * AVERAGE_ROAD_ROLL), + MAX_LATERAL_JERK=sportage_lateral_jerk + (ACCELERATION_DUE_TO_GRAVITY * AVERAGE_ROAD_ROLL), + MAX_ANGLE_RATE=SPORTAGE_HEV_2026_MAX_ANGLE_RATE) # To determine the limit for your car, find the maximum value that the stock LKAS will request. # If the max stock LKAS request is <384, add your car to this list. diff --git a/opendbc_repo/opendbc/car/tesla/carcontroller.py b/opendbc_repo/opendbc/car/tesla/carcontroller.py index 4e64ab258..1fdba014a 100644 --- a/opendbc_repo/opendbc/car/tesla/carcontroller.py +++ b/opendbc_repo/opendbc/car/tesla/carcontroller.py @@ -9,6 +9,27 @@ from opendbc.car.tesla.preap.stock_cc_spoofer import StockCCSpoofer from opendbc.car.tesla.values import CANBUS, CAR, CarControllerParams from opendbc.car.vehicle_model import VehicleModel +_PREAP_RATE_LIMIT_BP = [0., 5., 15.] +_PREAP_RATE_LIMIT_UP = [5., 0.8, 0.15] +_PREAP_RATE_LIMIT_DOWN = [5., 3.5, 0.4] +_PREAP_EPS_ANGLE_ERROR_MAX = 20.0 + + +def _apply_preap_steer_angle_limits(desired_angle: float, last_angle: float, v_ego: float, + steering_angle: float, lat_active: bool) -> float: + if not lat_active: + return steering_angle + + steer_up = (last_angle * desired_angle > 0.) and (abs(desired_angle) > abs(last_angle)) + rate_limit = _PREAP_RATE_LIMIT_UP if steer_up else _PREAP_RATE_LIMIT_DOWN + max_angle_diff = float(np.interp(v_ego, _PREAP_RATE_LIMIT_BP, rate_limit)) + + apply_angle = float(np.clip(desired_angle, last_angle - max_angle_diff, last_angle + max_angle_diff)) + # Match the older Tesla unity controller and stay close to measured EPAS angle to avoid rejection. + return float(np.clip(apply_angle, + steering_angle - _PREAP_EPS_ANGLE_ERROR_MAX, + steering_angle + _PREAP_EPS_ANGLE_ERROR_MAX)) + def get_safety_CP(): from opendbc.car.tesla.interface import CarInterface @@ -96,9 +117,8 @@ class CarController(CarControllerBase): CS.engagement.pedal_speed_kph = 0.0 if self.frame % 2 == 0: - self.apply_angle_last = apply_steer_angle_limits_vm( - actuators.steeringAngleDeg, self.apply_angle_last, CS.out.vEgoRaw, CS.out.steeringAngleDeg, - lat_active, CarControllerParams, self.VM, + self.apply_angle_last = _apply_preap_steer_angle_limits( + actuators.steeringAngleDeg, self.apply_angle_last, CS.out.vEgo, CS.out.steeringAngleDeg, lat_active, ) cntr = (self.frame // 2) % 16 can_sends.append(self.tesla_can.create_steering_control(cntr, self.apply_angle_last, lat_active)) diff --git a/opendbc_repo/opendbc/car/tesla/preap/carstate.py b/opendbc_repo/opendbc/car/tesla/preap/carstate.py index 78cd2fedc..da48e3de1 100644 --- a/opendbc_repo/opendbc/car/tesla/preap/carstate.py +++ b/opendbc_repo/opendbc/car/tesla/preap/carstate.py @@ -49,10 +49,6 @@ def update_preap(cs, can_parsers): )) cs.engagement.handle_steering_disengage(ret.steeringDisengage) - gtw_epas = cp_chassis.vl["GTW_epasControl"] - # Pre-AP steering requires the EPAS firmware patch to advertise angle control and LDW enabled. - ret.invalidLkasSetting = (gtw_epas["GTW_epasControlType"] != 1) or (gtw_epas["GTW_epasLDWEnabled"] != 1) - cruise_state = cs.can_define.dv["DI_state"]["DI_cruiseState"].get(int(cp_chassis.vl["DI_state"]["DI_cruiseState"]), None) cs.di_cruise_state = cruise_state or "OFF" speed_units = cs.can_define.dv["DI_state"]["DI_speedUnits"].get(int(cp_chassis.vl["DI_state"]["DI_speedUnits"]), None) diff --git a/selfdrive/controls/lib/latcontrol_torque.py b/selfdrive/controls/lib/latcontrol_torque.py index 0689dd3d2..996179e89 100644 --- a/selfdrive/controls/lib/latcontrol_torque.py +++ b/selfdrive/controls/lib/latcontrol_torque.py @@ -78,14 +78,14 @@ CIVIC_BOSCH_MODIFIED_A_VARIANT_UNWIND_FRICTION_REDUCTION_LEFT = 0.03 CIVIC_BOSCH_MODIFIED_A_VARIANT_UNWIND_FRICTION_REDUCTION_RIGHT = 0.07 CIVIC_BOSCH_MODIFIED_B_VARIANT_FF_REDUCTION_LEFT = 0.17 CIVIC_BOSCH_MODIFIED_B_VARIANT_FF_REDUCTION_RIGHT = 0.25 -CIVIC_BOSCH_MODIFIED_B_VARIANT_TURN_IN_BOOST_LEFT = 0.08 -CIVIC_BOSCH_MODIFIED_B_VARIANT_TURN_IN_BOOST_RIGHT = 0.09 -CIVIC_BOSCH_MODIFIED_B_VARIANT_UNWIND_TAPER_LEFT = 0.74 -CIVIC_BOSCH_MODIFIED_B_VARIANT_UNWIND_TAPER_RIGHT = 0.98 -CIVIC_BOSCH_MODIFIED_B_VARIANT_TURN_IN_FRICTION_BOOST_LEFT = 0.04 -CIVIC_BOSCH_MODIFIED_B_VARIANT_TURN_IN_FRICTION_BOOST_RIGHT = 0.045 -CIVIC_BOSCH_MODIFIED_B_VARIANT_UNWIND_FRICTION_REDUCTION_LEFT = 0.52 -CIVIC_BOSCH_MODIFIED_B_VARIANT_UNWIND_FRICTION_REDUCTION_RIGHT = 0.82 +CIVIC_BOSCH_MODIFIED_B_VARIANT_TURN_IN_BOOST_LEFT = 0.10 +CIVIC_BOSCH_MODIFIED_B_VARIANT_TURN_IN_BOOST_RIGHT = 0.11 +CIVIC_BOSCH_MODIFIED_B_VARIANT_UNWIND_TAPER_LEFT = 0.82 +CIVIC_BOSCH_MODIFIED_B_VARIANT_UNWIND_TAPER_RIGHT = 1.08 +CIVIC_BOSCH_MODIFIED_B_VARIANT_TURN_IN_FRICTION_BOOST_LEFT = 0.05 +CIVIC_BOSCH_MODIFIED_B_VARIANT_TURN_IN_FRICTION_BOOST_RIGHT = 0.055 +CIVIC_BOSCH_MODIFIED_B_VARIANT_UNWIND_FRICTION_REDUCTION_LEFT = 0.60 +CIVIC_BOSCH_MODIFIED_B_VARIANT_UNWIND_FRICTION_REDUCTION_RIGHT = 0.94 BOLT_2022_2023_CARS = ( GM_CAR.CHEVROLET_BOLT_ACC_2022_2023, diff --git a/selfdrive/selfdrived/events.py b/selfdrive/selfdrived/events.py index ffcd52c41..be1b03b4f 100644 --- a/selfdrive/selfdrived/events.py +++ b/selfdrive/selfdrived/events.py @@ -418,8 +418,6 @@ def personality_changed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging def invalid_lkas_setting_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: text = "Toggle stock LKAS on or off to engage" - if CP.brand == "tesla" and CP.carFingerprint == "TESLA_MODEL_S_PREAP": - return NormalPermanentAlert("EPAS Firmware Required", "Flash Pre-AP EPAS firmware to enable steering") if CP.brand == "tesla": text = "Switch to Traffic-Aware Cruise Control to engage" elif CP.brand == "mazda":