The smallest promotion

This commit is contained in:
firestar5683
2026-08-10 22:53:46 -05:00
parent d938c9daa6
commit 6bd48c28e8
582 changed files with 64651 additions and 17100 deletions
+12 -1
View File
@@ -103,6 +103,7 @@ class LatControlTorque(LatControl):
self.is_bolt_2017 = CP.carFingerprint in BOLT_2017_CARS
self.is_volt_standard = CP.carFingerprint in VOLT_STANDARD_CARS
self.is_genesis_g90 = CP.carFingerprint in GENESIS_G90_CARS
self.is_genesis_g70 = CP.carFingerprint in GENESIS_G70_CARS
self.is_genesis_gv70 = CP.carFingerprint in GENESIS_GV70_CARS
self.is_palisade = CP.carFingerprint in PALISADE_CARS
self.is_prius = CP.carFingerprint in PRIUS_CARS
@@ -290,6 +291,7 @@ class LatControlTorque(LatControl):
volt_standard_test_active = self.is_volt_standard and volt_standard_lateral_testing_ground_active()
genesis_g90_test_active = self.is_genesis_g90 and genesis_g90_lateral_testing_ground_active()
palisade_active = self.is_palisade
genesis_g70_active = self.is_genesis_g70
prius_active = self.is_prius
camry_active = self.is_camry
rav4_prime_active = self.is_rav4_prime
@@ -300,6 +302,7 @@ class LatControlTorque(LatControl):
ioniq_6_active = self.is_ioniq_6
sonata_active = self.is_sonata
sonata_hybrid_active = self.is_sonata_hybrid
genesis_g70_center_output_taper = get_genesis_g70_center_output_scale(setpoint, CS.vEgo) if genesis_g70_active else 1.0
elantra_non_scc_active = self.is_elantra_non_scc
kia_xceed_active = self.is_kia_xceed
kia_niro_phev_2022_active = self.is_kia_niro_phev_2022
@@ -317,6 +320,7 @@ class LatControlTorque(LatControl):
ioniq_6_center_taper = get_ioniq_6_center_taper_scale(setpoint, CS.vEgo) if ioniq_6_active else 1.0
sonata_center_taper = get_sonata_center_taper_scale(setpoint, CS.vEgo) if sonata_active else 1.0
sonata_hybrid_center_taper = get_sonata_hybrid_center_taper_scale(setpoint, CS.vEgo) if sonata_hybrid_active else 1.0
sonata_hybrid_center_output_taper = get_sonata_hybrid_center_output_scale(setpoint, CS.vEgo) if sonata_hybrid_active else 1.0
kia_xceed_center_taper = get_kia_xceed_center_taper_scale(setpoint, CS.vEgo) if kia_xceed_active else 1.0
kia_niro_phev_2022_center_taper = get_kia_niro_phev_2022_center_taper_scale(setpoint, CS.vEgo) if kia_niro_phev_2022_active else 1.0
kia_stinger_2022_center_taper = get_kia_stinger_2022_center_taper_scale(setpoint, CS.vEgo) if kia_stinger_2022_active else 1.0
@@ -336,7 +340,9 @@ class LatControlTorque(LatControl):
friction_threshold = get_gm_base_friction_threshold(CS.vEgo)
else:
friction_threshold = get_standard_friction_threshold(CS.vEgo)
if self.is_genesis_gv70:
if self.is_genesis_g70:
friction_threshold = get_genesis_g70_friction_threshold(CS.vEgo, setpoint, desired_lateral_jerk)
elif self.is_genesis_gv70:
friction_threshold = get_genesis_gv70_friction_threshold(CS.vEgo, setpoint, desired_lateral_jerk)
friction_scale = 1.0
if bolt_2022_2023_tuned_path_active:
@@ -454,6 +460,8 @@ class LatControlTorque(LatControl):
)
elif prius_active:
vehicle_friction_jerk_deadzone = get_prius_friction_jerk_deadzone(CS.vEgo, setpoint)
elif genesis_g70_active:
vehicle_friction_jerk_deadzone = get_genesis_g70_friction_jerk_deadzone(CS.vEgo, setpoint)
else:
vehicle_friction_jerk_deadzone = 0.0
friction_jerk_deadzone = get_center_chatter_friction_jerk_deadzone(
@@ -530,8 +538,11 @@ class LatControlTorque(LatControl):
output_torque *= get_palisade_center_output_scale(setpoint, CS.vEgo)
elif tucson_4th_gen_active:
output_torque *= tucson_4th_gen_center_taper
elif genesis_g70_active:
output_torque *= genesis_g70_center_output_taper
elif sonata_hybrid_active:
output_torque *= sonata_hybrid_center_taper
output_torque *= sonata_hybrid_center_output_taper
elif self.is_silverado:
output_torque *= silverado_center_taper
elif kia_niro_phev_2022_active:
@@ -87,6 +87,9 @@ SILVERADO_CARS = (
GENESIS_G90_CARS = (
HYUNDAI_CAR.GENESIS_G90,
)
GENESIS_G70_CARS = (
HYUNDAI_CAR.GENESIS_G70_2020,
)
GENESIS_GV70_CARS = (
HYUNDAI_CAR.GENESIS_GV70_ELECTRIFIED_1ST_GEN,
)
@@ -198,6 +201,31 @@ GENESIS_GV70_FRICTION_CENTER_LAT_WIDTH = 0.12
GENESIS_GV70_FRICTION_CALM_JERK = 0.35
GENESIS_GV70_FRICTION_CALM_JERK_WIDTH = 0.10
GENESIS_G70_FRICTION_THRESHOLD_GAIN = 0.10
GENESIS_G70_FRICTION_SPEED_ONSET = 10.0
GENESIS_G70_FRICTION_SPEED_ONSET_WIDTH = 3.0
GENESIS_G70_FRICTION_SPEED_CUTOFF = 35.0
GENESIS_G70_FRICTION_SPEED_CUTOFF_WIDTH = 6.0
GENESIS_G70_FRICTION_CENTER_LAT = 0.28
GENESIS_G70_FRICTION_CENTER_LAT_WIDTH = 0.10
GENESIS_G70_FRICTION_CALM_JERK = 0.35
GENESIS_G70_FRICTION_CALM_JERK_WIDTH = 0.10
GENESIS_G70_FRICTION_JERK_DEADZONE_MAX = 0.24
GENESIS_G70_FRICTION_JERK_DEADZONE_LAT = 0.30
GENESIS_G70_FRICTION_JERK_DEADZONE_LAT_WIDTH = 0.08
GENESIS_G70_FRICTION_JERK_DEADZONE_SPEED = 12.0
GENESIS_G70_FRICTION_JERK_DEADZONE_SPEED_WIDTH = 3.5
GENESIS_G70_CENTER_OUTPUT_TAPER_MAX = 0.10
GENESIS_G70_CENTER_OUTPUT_TAPER_LAT = 0.30
GENESIS_G70_CENTER_OUTPUT_TAPER_LAT_WIDTH = 0.10
GENESIS_G70_CENTER_OUTPUT_TAPER_SPEED = 18.0
GENESIS_G70_CENTER_OUTPUT_TAPER_SPEED_WIDTH = 3.0
GENESIS_G70_LOW_SPEED_CENTER_TAPER_MAX = 0.06
GENESIS_G70_LOW_SPEED_CENTER_TAPER_LAT = 0.14
GENESIS_G70_LOW_SPEED_CENTER_TAPER_LAT_WIDTH = 0.05
GENESIS_G70_LOW_SPEED_CENTER_TAPER_SPEED_MAX = 7.5
GENESIS_G70_LOW_SPEED_CENTER_TAPER_SPEED_WIDTH = 1.2
BOLT_2017_LATERAL_TESTING_GROUND_ID = testing_ground.id_3
BOLT_2017_STEER_RATIO_TEST_SCALE = 1.045
BOLT_2017_STEER_RATIO_ONSET_SPEED = 20.0 * CV.MPH_TO_MS
@@ -353,6 +381,11 @@ SONATA_HYBRID_LOW_SPEED_CENTER_TAPER_LAT = 0.10
SONATA_HYBRID_LOW_SPEED_CENTER_TAPER_LAT_WIDTH = 0.02
SONATA_HYBRID_LOW_SPEED_CENTER_TAPER_SPEED_MAX = 7.5
SONATA_HYBRID_LOW_SPEED_CENTER_TAPER_SPEED_WIDTH = 1.0
SONATA_HYBRID_CENTER_OUTPUT_TAPER_MAX = 0.06
SONATA_HYBRID_CENTER_OUTPUT_TAPER_LAT = 0.18
SONATA_HYBRID_CENTER_OUTPUT_TAPER_LAT_WIDTH = 0.05
SONATA_HYBRID_CENTER_OUTPUT_TAPER_SPEED = 12.5
SONATA_HYBRID_CENTER_OUTPUT_TAPER_SPEED_WIDTH = 2.5
SONATA_FF_REDUCTION_LEFT = 0.04
SONATA_FF_REDUCTION_RIGHT = 0.26
@@ -748,7 +781,7 @@ IONIQ_6_FRICTION_CENTER_FADE_SPEED_WIDTH = 2.5
# Newer Ioniq 6 highway center-chatter correction; activation is firmware-gated.
IONIQ_6_2025_FRICTION_SCALE_MULT = 0.80
IONIQ_6_2025_FRICTION_JERK_DEADZONE = 0.45
IONIQ_6_2025_CENTER_OUTPUT_TAPER_MAX = 0.20
IONIQ_6_2025_CENTER_OUTPUT_TAPER_MAX = 0.24
IONIQ_6_2025_CENTER_OUTPUT_TAPER_LAT = 0.35
IONIQ_6_2025_CENTER_OUTPUT_TAPER_LAT_WIDTH = 0.10
IONIQ_6_2025_CENTER_OUTPUT_TAPER_SPEED = 22.0
@@ -939,8 +972,11 @@ SIENNA_4TH_GEN_HIGH_SPEED_OUTPUT_TAPER_MAX_SPEED = 27.0
SIENNA_4TH_GEN_HIGH_SPEED_OUTPUT_TAPER_MAX_SPEED_WIDTH = 3.0
LEXUS_IS_PHASE_SCALE = 0.10
LEXUS_IS_TURN_IN_FF_BOOST_LEFT = 0.04
LEXUS_IS_TURN_IN_FF_BOOST_RIGHT = 0.04
# The Lexus route still fell short during a clean high-speed turn-in while
# already at the controller limit. Keep this correction small and phase-gated
# so straight-line behavior and unwind tuning are unchanged.
LEXUS_IS_TURN_IN_FF_BOOST_LEFT = 0.06
LEXUS_IS_TURN_IN_FF_BOOST_RIGHT = 0.06
LEXUS_IS_UNWIND_FF_REDUCTION_LEFT = 0.10
LEXUS_IS_UNWIND_FF_REDUCTION_RIGHT = 0.16
LEXUS_IS_UNWIND_LAT_ONSET = 0.18
@@ -2040,6 +2076,14 @@ def get_sonata_hybrid_center_taper_scale(desired_lateral_accel: float, v_ego: fl
return 1.0 - reduction
def get_sonata_hybrid_center_output_scale(desired_lateral_accel: float, v_ego: float) -> float:
speed_weight = _sonata_hybrid_sigmoid((v_ego - SONATA_HYBRID_CENTER_OUTPUT_TAPER_SPEED) /
SONATA_HYBRID_CENTER_OUTPUT_TAPER_SPEED_WIDTH)
center_weight = _sonata_hybrid_sigmoid((SONATA_HYBRID_CENTER_OUTPUT_TAPER_LAT - abs(desired_lateral_accel)) /
SONATA_HYBRID_CENTER_OUTPUT_TAPER_LAT_WIDTH)
return 1.0 - SONATA_HYBRID_CENTER_OUTPUT_TAPER_MAX * speed_weight * center_weight
def _sonata_sigmoid(x: float) -> float:
return _sigmoid(x)
@@ -2511,6 +2555,42 @@ def get_genesis_gv70_friction_threshold(v_ego: float, desired_lateral_accel: flo
return base_threshold * (1.0 + gain)
def get_genesis_g70_friction_threshold(v_ego: float, desired_lateral_accel: float = 0.0,
desired_lateral_jerk: float = 0.0) -> float:
base_threshold = get_standard_friction_threshold(v_ego)
speed_onset = _sigmoid((v_ego - GENESIS_G70_FRICTION_SPEED_ONSET) / GENESIS_G70_FRICTION_SPEED_ONSET_WIDTH)
speed_cutoff = _sigmoid((GENESIS_G70_FRICTION_SPEED_CUTOFF - v_ego) / GENESIS_G70_FRICTION_SPEED_CUTOFF_WIDTH)
center_weight = _sigmoid((GENESIS_G70_FRICTION_CENTER_LAT - abs(desired_lateral_accel)) /
GENESIS_G70_FRICTION_CENTER_LAT_WIDTH)
calm_jerk_weight = _sigmoid((GENESIS_G70_FRICTION_CALM_JERK - abs(desired_lateral_jerk)) /
GENESIS_G70_FRICTION_CALM_JERK_WIDTH)
gain = (GENESIS_G70_FRICTION_THRESHOLD_GAIN * speed_onset * speed_cutoff *
center_weight * calm_jerk_weight)
return base_threshold * (1.0 + gain)
def get_genesis_g70_friction_jerk_deadzone(v_ego: float, desired_lateral_accel: float) -> float:
speed_weight = _sigmoid((v_ego - GENESIS_G70_FRICTION_JERK_DEADZONE_SPEED) /
GENESIS_G70_FRICTION_JERK_DEADZONE_SPEED_WIDTH)
center_weight = _sigmoid((GENESIS_G70_FRICTION_JERK_DEADZONE_LAT - abs(desired_lateral_accel)) /
GENESIS_G70_FRICTION_JERK_DEADZONE_LAT_WIDTH)
return GENESIS_G70_FRICTION_JERK_DEADZONE_MAX * speed_weight * center_weight
def get_genesis_g70_center_output_scale(desired_lateral_accel: float, v_ego: float) -> float:
speed_weight = _sigmoid((v_ego - GENESIS_G70_CENTER_OUTPUT_TAPER_SPEED) /
GENESIS_G70_CENTER_OUTPUT_TAPER_SPEED_WIDTH)
center_weight = _sigmoid((GENESIS_G70_CENTER_OUTPUT_TAPER_LAT - abs(desired_lateral_accel)) /
GENESIS_G70_CENTER_OUTPUT_TAPER_LAT_WIDTH)
reduction = GENESIS_G70_CENTER_OUTPUT_TAPER_MAX * speed_weight * center_weight
low_speed_weight = _sigmoid((GENESIS_G70_LOW_SPEED_CENTER_TAPER_SPEED_MAX - v_ego) /
GENESIS_G70_LOW_SPEED_CENTER_TAPER_SPEED_WIDTH)
low_speed_center_weight = _sigmoid((GENESIS_G70_LOW_SPEED_CENTER_TAPER_LAT - abs(desired_lateral_accel)) /
GENESIS_G70_LOW_SPEED_CENTER_TAPER_LAT_WIDTH)
reduction += GENESIS_G70_LOW_SPEED_CENTER_TAPER_MAX * low_speed_weight * low_speed_center_weight
return 1.0 - reduction
def _ioniq_5_sigmoid(x: float) -> float:
return _sigmoid(x)
@@ -3532,13 +3612,13 @@ def get_flm_capabilities(car_fingerprint, brand: str = "", hyundai_canfd: bool =
dedicated_friction = car_fingerprint in (
set(BOLT_2022_2023_CARS) | set(BOLT_2018_2021_CARS) | set(VOLT_STANDARD_CARS) | set(PALISADE_CARS) |
set(PRIUS_CARS) | set(RAV4_PRIME_CARS) | set(SIENNA_4TH_GEN_CARS) | set(IONIQ_5_CARS) | set(IONIQ_6_CARS) | set(KIA_EV6_CARS) | set(KIA_FORTE_CARS) |
set(KIA_NIRO_PHEV_2022_CARS) | set(KIA_CARNIVAL_CARS) | set(GENESIS_G90_CARS) | set(CAMRY_CARS)
set(KIA_NIRO_PHEV_2022_CARS) | set(KIA_CARNIVAL_CARS) | set(GENESIS_G90_CARS) | set(GENESIS_G70_CARS) | set(CAMRY_CARS)
)
dedicated_center_taper = car_fingerprint in (
set(PRIUS_CARS) | set(SIENNA_4TH_GEN_CARS) | set(BOLT_CARS) | set(VOLT_STANDARD_CARS) | set(IONIQ_5_CARS) |
set(IONIQ_EV_OLD_CARS) | set(IONIQ_6_CARS) | set(SONATA_CARS) | set(SONATA_HYBRID_CARS) |
set(KIA_XCEED_CARS) | set(KIA_NIRO_PHEV_2022_CARS) | set(KIA_FORTE_CARS) | set(KIA_EV6_CARS) |
set(KIA_CARNIVAL_CARS) | set(TUCSON_4TH_GEN_CARS) | set(SILVERADO_CARS)
set(KIA_CARNIVAL_CARS) | set(TUCSON_4TH_GEN_CARS) | set(GENESIS_G70_CARS) | set(SILVERADO_CARS)
)
rich_knobs = [name for name, meta in FLM_SUPPORTED_VEHICLE_KNOBS.items() if meta["profile"] == profile_key]
return {
@@ -26,6 +26,7 @@ GM_TRUCK_TARGET_FILTER_DROP_BYPASS = 0.45
TOYOTA_SIENNA_TARGET_FILTER_MIN_SPEED = 12.0
TOYOTA_SIENNA_TARGET_FILTER_UP_TAU = 0.18
TOYOTA_SIENNA_TARGET_FILTER_DOWN_TAU = 0.24
TOYOTA_SIENNA_LOW_SPEED_ACCEL_UP_TAU = 0.35
TOYOTA_SIENNA_TARGET_FILTER_BRAKE_BYPASS = -0.75
TOYOTA_SIENNA_TARGET_FILTER_DROP_BYPASS = 0.65
TOYOTA_SIENNA_COMFORT_FILTER_MIN_SPEED = 5.0
@@ -109,7 +110,7 @@ class LongControlVehicleTuning:
)
self.is_toyota_sienna_4g = bool(
CP.brand == "toyota" and
getattr(CP, "carFingerprint", None) == TOYOTA_CAR.TOYOTA_SIENNA_4TH_GEN
str(getattr(CP, "carFingerprint", "")) == str(TOYOTA_CAR.TOYOTA_SIENNA_4TH_GEN)
)
self.is_toyota_corolla_tss2 = bool(
CP.brand == "toyota" and
@@ -211,12 +212,22 @@ class LongControlVehicleTuning:
lead_brake <= TOYOTA_SIENNA_COMFORT_FILTER_MAX_LEAD_BRAKE
)
# Keep the legacy high-speed filter unchanged. The lower-speed entry is only
# for a centered lead with enough room to soften a comfort response.
if v_ego < TOYOTA_SIENNA_TARGET_FILTER_MIN_SPEED and not comfort_filter_active:
if a_target > 0.0:
if not self.toyota_sienna_target_filter_initialized or self.toyota_sienna_filtered_a_target < 0.0:
self.toyota_sienna_filtered_a_target = 0.0
self.toyota_sienna_target_filter_initialized = True
alpha = DT_CTRL / (TOYOTA_SIENNA_LOW_SPEED_ACCEL_UP_TAU + DT_CTRL)
self.toyota_sienna_filtered_a_target += alpha * (
float(a_target) - self.toyota_sienna_filtered_a_target
)
return self.toyota_sienna_filtered_a_target
self.toyota_sienna_target_filter_initialized = False
return a_target
# Keep the legacy high-speed filter unchanged. The lower-speed entry is only
# for a centered lead with enough room to soften a comfort response.
if comfort_filter_active:
bypass_filter = a_target <= TOYOTA_SIENNA_COMFORT_FILTER_BRAKE_BYPASS
else:
+12 -2
View File
@@ -22,6 +22,7 @@ from openpilot.selfdrive.controls.lib.longitudinal_vehicle_tunes import (
get_far_follow_output_slew_rates,
get_follow_prebrake_min_headway,
is_gm_silverado_early_follow_lead,
is_toyota_rav4_tss2_2023,
get_toyota_sienna_post_departure_restop_cap,
get_untracked_slow_lead_decel_scale,
)
@@ -2657,6 +2658,12 @@ class LongitudinalPlanner:
post_departure_active = self.post_departure_follow_settle_active(
policy_lead, scene_v_ego, effective_t_follow,
)
# The RAV4's post-departure path used to bypass the ordinary follow cap for
# the entire settle latch. When a slow lead changed lanes, that let the
# cruise branch request full acceleration before the next lead was stable.
# Keep the normal catch-up cap on this car; urgent braking remains outside
# this comfort policy and is still allowed through unchanged.
post_departure_bypass = post_departure_active and not is_toyota_rav4_tss2_2023(self.CP)
follow_result = apply_follow_policy(
self.lead_one,
self.lead_two,
@@ -2667,7 +2674,7 @@ class LongitudinalPlanner:
previous_target=prev_output_a_target,
raw_target=output_a_target,
tracking=tracking_lead,
post_departure=post_departure_active,
post_departure=post_departure_bypass,
blocked=bool(output_should_stop or vision_low_speed_stop_active or close_lead_caps),
panic_bypass=panic_bypass,
)
@@ -2858,7 +2865,10 @@ class LongitudinalPlanner:
longitudinalPlan.accels = self.a_desired_trajectory.tolist()
longitudinalPlan.jerks = self.j_desired_trajectory.tolist()
longitudinalPlan.hasLead = sm['radarState'].leadOne.status
# LongControl needs to know about whichever lead MPC is following. Using
# leadOne only leaves the stop-release guard blind when source=lead1.
selected_lead = sm['radarState'].leadTwo if self.mpc.source == "lead1" else sm['radarState'].leadOne
longitudinalPlan.hasLead = bool(selected_lead.status)
longitudinalPlan.longitudinalPlanSource = self.mpc.source
longitudinalPlan.fcw = self.fcw
@@ -19,6 +19,14 @@ TOYOTA_SIENNA_POST_DEPARTURE_RESTOP_MIN_BRAKE = 0.18
TOYOTA_SIENNA_POST_DEPARTURE_RESTOP_MAX_BRAKE = 0.32
def is_toyota_rav4_tss2_2023(CP):
"""Identify the RAV4 TSS2 controller that needs normal catch-up caps after departure."""
return (
getattr(CP, "brand", "") == "toyota" and
str(getattr(CP, "carFingerprint", "")) == "TOYOTA_RAV4_TSS2_2023"
)
def get_far_follow_output_slew_rates(CP):
if CP.brand == "honda" and str(CP.carFingerprint) == "HONDA_HRV_3G":
return (
@@ -31,6 +31,7 @@ from openpilot.selfdrive.controls.lib.latcontrol_vehicle_tunes import (
get_kona_non_scc_friction_threshold,
get_kona_non_scc_highway_transition_output_scale,
get_kia_ev6_center_output_scale,
get_sonata_hybrid_center_output_scale,
get_prius_center_taper_scale,
KIA_FORTE_BASE_LAT_ACCEL_FACTOR_MULT,
RAM_1500_BASE_LAT_ACCEL_FACTOR_MULT,
@@ -67,6 +68,9 @@ from openpilot.selfdrive.controls.lib.latcontrol_torque import (
get_genesis_g90_ff_scale,
get_genesis_g90_friction_scale,
get_genesis_g90_friction_threshold,
get_genesis_g70_center_output_scale,
get_genesis_g70_friction_jerk_deadzone,
get_genesis_g70_friction_threshold,
get_genesis_gv70_friction_threshold,
get_elantra_non_scc_ff_scale,
get_palisade_ff_scale,
@@ -774,6 +778,29 @@ class TestLatControl:
assert highway_turn == pytest.approx(base, rel=0.01)
assert highway_center < center
def test_genesis_g70_center_chatter_tune(self):
base = get_standard_friction_threshold(25.0)
center = get_genesis_g70_friction_threshold(25.0, 0.0, 0.0)
curve = get_genesis_g70_friction_threshold(25.0, 0.8, 0.8)
center_deadzone = get_genesis_g70_friction_jerk_deadzone(25.0, 0.0)
curve_deadzone = get_genesis_g70_friction_jerk_deadzone(25.0, 0.8)
assert center > base
assert curve == pytest.approx(base, rel=0.01)
assert center_deadzone > curve_deadzone
assert get_genesis_g70_center_output_scale(0.0, 25.0) < get_genesis_g70_center_output_scale(0.8, 25.0)
assert get_genesis_g70_center_output_scale(0.0, 10.0) > get_genesis_g70_center_output_scale(0.0, 25.0)
assert get_genesis_g70_center_output_scale(0.0, 0.0) < get_genesis_g70_center_output_scale(0.0, 10.0)
def test_sonata_hybrid_center_output_taper_is_mid_speed_and_center_gated(self):
low_speed = get_sonata_hybrid_center_output_scale(0.0, 8.0)
center = get_sonata_hybrid_center_output_scale(0.0, 13.4)
turn = get_sonata_hybrid_center_output_scale(0.8, 13.4)
assert low_speed > center
assert turn > center
assert turn > 0.99
def test_ioniq_5_ff_scale_curve(self):
assert get_ioniq_5_ff_scale(0.0, 0.0, 20.0) == 1.0
steady_left = get_ioniq_5_ff_scale(0.7, 0.0, 12.0)
@@ -1301,6 +1328,29 @@ class TestLatControl:
assert lac_log.active
assert controller.torque_params.latAccelFactor == pytest.approx(CP.lateralTuning.torque.latAccelFactor)
def test_genesis_g70_center_output_taper_update_path(self, monkeypatch):
monkeypatch.setattr(latcontrol_torque, "get_genesis_g70_center_output_scale", lambda *_args: 1.0)
controller, VM, CS, params, starpilot_toggles = self._build_torque_controller(HYUNDAI.GENESIS_G70_2020)
CS.vEgo = 25.0
base_output, _, lac_log = controller.update(
True, CS, VM, params, False, 0.0002, False, 0.2, None, None, starpilot_toggles,
)
monkeypatch.setattr(latcontrol_torque, "get_genesis_g70_center_output_scale", lambda *_args: 0.5)
tapered_controller, tapered_VM, tapered_CS, tapered_params, tapered_toggles = self._build_torque_controller(
HYUNDAI.GENESIS_G70_2020,
)
tapered_CS.vEgo = 25.0
tapered_output, _, _ = tapered_controller.update(
True, tapered_CS, tapered_VM, tapered_params, False, 0.0002, False, 0.2, None, None, tapered_toggles,
)
assert controller.is_genesis_g70
assert lac_log.active
assert controller.starpilot_lateral_state.frictionThreshold > get_standard_friction_threshold(25.0)
assert base_output != 0.0
assert tapered_output == pytest.approx(base_output * 0.5)
def test_ioniq_5_default_update_path(self):
controller, VM, CS, params, starpilot_toggles = self._build_torque_controller(HYUNDAI.HYUNDAI_IONIQ_5)
CarInterface = interfaces[HYUNDAI.HYUNDAI_IONIQ_5]
@@ -1152,6 +1152,20 @@ def test_toyota_sienna_target_filter_smooths_mild_high_speed_handoffs():
assert -0.20 < filtered < 0.30
def test_toyota_sienna_target_filter_ramps_low_speed_acceleration():
CP = make_longcontrol_cp(brand="toyota", carFingerprint=TOYOTA_CAR.TOYOTA_SIENNA_4TH_GEN)
tuning = vehicle_tunes.LongControlVehicleTuning(CP)
first = tuning.shape_toyota_sienna_accel_target(1.5, 2.0, False)
assert 0.0 < first < 1.5
for _ in range(100):
filtered = tuning.shape_toyota_sienna_accel_target(1.5, 3.0, False)
assert filtered < 1.5
assert tuning.shape_toyota_sienna_accel_target(-1.5, 3.0, False) == pytest.approx(-1.5)
def test_toyota_sienna_target_filter_bypasses_stop_and_urgent_braking():
CP = make_longcontrol_cp(brand="toyota", carFingerprint=TOYOTA_CAR.TOYOTA_SIENNA_4TH_GEN)
tuning = vehicle_tunes.LongControlVehicleTuning(CP)
@@ -22,6 +22,7 @@ from openpilot.selfdrive.controls.lib.longitudinal_vehicle_tunes import (
get_follow_prebrake_min_headway,
get_toyota_sienna_post_departure_restop_cap,
is_gm_silverado_early_follow_lead,
is_toyota_rav4_tss2_2023,
)
from openpilot.selfdrive.modeld.constants import ModelConstants, Plan
from openpilot.selfdrive.modeld import modeld
@@ -2734,6 +2735,49 @@ def test_publish_force_stop_handoff_sets_should_stop_when_vcruise_zero():
assert pm.sent["longitudinalPlan"].longitudinalPlan.shouldStop
def test_publish_has_lead_includes_second_mpc_lead():
class FakePM:
def __init__(self):
self.sent = {}
def send(self, name, msg):
self.sent[name] = msg
class FakeSM(dict):
def all_checks(self, service_list=None):
return True
logMonoTime = {"modelV2": int(1e9)}
CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC)
planner = LongitudinalPlanner(CP, init_v=5.0)
planner.output_a_target = 0.0
planner.output_should_stop = False
planner.v_desired_trajectory = np.zeros(CONTROL_N)
planner.a_desired_trajectory = np.zeros(CONTROL_N)
planner.j_desired_trajectory = np.zeros(CONTROL_N)
planner.fcw = False
planner.mpc.source = "lead1"
planner.mpc.solve_time = 0.0
sm = FakeSM(make_sm(5.0, desired_accel=0.0, min_accel=-1.0, experimental_mode=False))
sm["radarState"].leadOne = make_lead(status=False)
sm["radarState"].leadTwo = make_lead(status=True, d_rel=8.0, v_lead=4.0, radar=True)
pm = FakePM()
planner.publish(sm, pm)
assert pm.sent["longitudinalPlan"].longitudinalPlan.hasLead
def test_rav4_tss2_2023_is_the_car_specific_post_departure_tune():
rav4_cp = ToyotaCarInterface.get_non_essential_params(TOYOTA_CAR.TOYOTA_RAV4_TSS2_2023)
other_cp = ToyotaCarInterface.get_non_essential_params(TOYOTA_CAR.TOYOTA_RAV4_TSS2_2022)
assert is_toyota_rav4_tss2_2023(rav4_cp)
assert not is_toyota_rav4_tss2_2023(other_cp)
@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"])
def test_force_stop_handoff_sets_output_should_stop_before_zero_vcruise(model_version):
v_ego = 1.25
Binary file not shown.
@@ -1 +1 @@
3
3
@@ -1 +1 @@
339e80b0864c7a955f197a47e5ff745025eefb3a5a5dcfff121d3bd50bc31018 driving_tinygrad.pkl
66fca133dfb3658949a294e2e6eccce875bf892572ea6b5774e8441514eb0367 driving_tinygrad.pkl