mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-08-21 08:14:00 +08:00
The smallest promotion
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
3
|
||||
3
|
||||
|
||||
@@ -1 +1 @@
|
||||
339e80b0864c7a955f197a47e5ff745025eefb3a5a5dcfff121d3bd50bc31018 driving_tinygrad.pkl
|
||||
66fca133dfb3658949a294e2e6eccce875bf892572ea6b5774e8441514eb0367 driving_tinygrad.pkl
|
||||
|
||||
Reference in New Issue
Block a user