Default vehicle-specific tunes to the StarPilot controller

This commit is contained in:
firestar5683
2026-11-05 13:58:13 -06:00
parent 708dfa8ad5
commit 1383968390
6 changed files with 22 additions and 13 deletions
@@ -173,10 +173,7 @@ def model_turn_assist_supported(CP) -> bool:
def default_selection(CP) -> ControllerSelection:
policy = policy_for(CP)
from openpilot.starpilot.lateral.hkg_vehicle_policy import PROFILES
forte_non_scc = policy == 'kia_forte' and str(CP.carFingerprint) in ('KIA_FORTE_2019_NON_SCC', 'KIA_FORTE_2021_NON_SCC')
dom_default = forte_non_scc or policy == 'kia_carnival'
mode = ControllerMode.STARPILOT if policy and policy != 'generic' and (policy not in PROFILES or dom_default) else ControllerMode.STANDARD
mode = ControllerMode.STARPILOT if policy and policy != 'generic' else ControllerMode.STANDARD
return ControllerSelection(mode, policy, 'default')
@@ -61,7 +61,7 @@ class TestControllerSelection(unittest.TestCase):
cp = cp_for(vehicle)
self.assertEqual(policy_for(cp), policy)
selected = selection_from_bytes(cp, None)
mode = ControllerMode.STANDARD if vehicle in (HYUNDAI.KIA_EV6, HYUNDAI.HYUNDAI_SONATA) or policy is None else ControllerMode.STARPILOT
mode = ControllerMode.STARPILOT
self.assertEqual(selected.mode, mode)
lateral = LatControlTorque(cp.as_reader(), interfaces[vehicle](cp), DT_CTRL)
self.assertEqual(lateral.controller_mode, selected.mode)
@@ -68,8 +68,8 @@ def test_actual_same_frame_threshold_error_output_and_override(monkeypatch, vehi
def test_niro_saved_standard_and_other_factory_have_no_new_profile():
cp = interfaces[CAR.KIA_NIRO_EV].get_non_essential_params(CAR.KIA_NIRO_EV)
assert default_selection(cp).mode == ControllerMode.STANDARD
standard = LatControlTorque(cp.as_reader(), interfaces[cp.carFingerprint](cp), 0.01)
assert default_selection(cp).mode == ControllerMode.STARPILOT
standard = LatControlTorque(cp.as_reader(), interfaces[cp.carFingerprint](cp), 0.01, controller_mode=ControllerMode.STANDARD)
assert standard.starpilot_extension is None
for field in ('passive', 'dashcamOnly', 'notCar'):
other = cp.as_reader().as_builder()
@@ -26,7 +26,7 @@ from openpilot.starpilot.lateral import hkg_vehicle_shaping as shaping
def test_actual_controller_context_defaults_live_tune_limits_and_off(monkeypatch, vehicle, helper, speed, curvature, direction, pressed):
cp = interfaces[vehicle].get_non_essential_params(vehicle)
ci = interfaces[vehicle](cp)
assert default_selection(cp).mode == (ControllerMode.STARPILOT if vehicle == CAR.KIA_CARNIVAL_HEV_4TH_GEN else ControllerMode.STANDARD)
assert default_selection(cp).mode == ControllerMode.STARPILOT
native = LatControlTorque(cp.as_reader(), ci, 0.01, controller_mode=ControllerMode.STANDARD)
assert native.starpilot_extension is None
actual = LatControlTorque(cp.as_reader(), ci, 0.01, controller_mode=ControllerMode.STARPILOT)
@@ -14,9 +14,7 @@ CASES = [(vehicle, profile, factor) for profile, (vehicles, factor) in PROFILES.
def test_exact_profile_defaults_and_saved_controller_selection(vehicle, profile, factor):
cp = interfaces[vehicle].get_non_essential_params(vehicle)
assert policy_for(cp) == profile
expected = (ControllerMode.STARPILOT if vehicle in (CAR.KIA_FORTE_2019_NON_SCC, CAR.KIA_FORTE_2021_NON_SCC,
CAR.KIA_CARNIVAL_2025, CAR.KIA_CARNIVAL_HEV_4TH_GEN)
else ControllerMode.STANDARD)
expected = ControllerMode.STARPILOT
assert default_selection(cp).mode == expected
for raw in (b'{', b'{"version":true,"vehicles":{}}', b'{"version":1,"vehicles":{},"vehicles":{}}', b'x' * 4097):
assert selection_from_bytes(cp, raw).mode == expected
@@ -60,7 +58,8 @@ def test_unadmitted_and_cross_vehicle_choices_are_not_applied(vehicle, profile,
saved = replace_mode(None, cp, ControllerMode.STARPILOT)
other = interfaces[CAR.HYUNDAI_IONIQ_5].get_non_essential_params(CAR.HYUNDAI_IONIQ_5)
if vehicle != CAR.HYUNDAI_IONIQ_5:
assert selection_from_bytes(other, saved).mode == ControllerMode.STANDARD
assert selection_from_bytes(other, saved).mode == ControllerMode.STARPILOT
assert selection_from_bytes(other, saved).source == 'default'
@pytest.mark.parametrize('vehicle,profile,factor', CASES)
@@ -195,3 +194,16 @@ def test_ev6_taper_keeps_low_speed_and_substantial_curve_effect_small():
assert old - actual < .002
if abs(acceleration) >= 1.:
assert old - actual < .00002
@pytest.mark.parametrize('vehicle,profile,factor', CASES)
@pytest.mark.parametrize('alpha_long', [False, True])
def test_vehicle_tune_defaults_are_independent_of_longitudinal_choice(vehicle, profile, factor, alpha_long):
cp = interfaces[vehicle].get_non_essential_params(vehicle)
cp.openpilotLongitudinalControl = alpha_long
assert default_selection(cp).mode == ControllerMode.STARPILOT
raw = replace_mode(None, cp, ControllerMode.STANDARD)
selected = selection_from_bytes(cp, raw)
assert selected.mode == ControllerMode.STANDARD
assert selected.source == 'saved'
assert selected.policy == profile
@@ -66,7 +66,7 @@ class TestControllerFeature(unittest.TestCase):
self.assertTrue(_onroad_preference('torque', DOCUMENT_KEY))
self.assertFalse(self.params.get_bool('AdvancedLateralTune'))
self.cp = interfaces[HYUNDAI.KIA_EV6].get_non_essential_params(HYUNDAI.KIA_EV6)
self.assertEqual(self.require_row().value, "Stock Controller")
self.assertEqual(self.require_row().value, "StarPilot Controller")
self.cp = interfaces[HYUNDAI.HYUNDAI_IONIQ_6].get_non_essential_params(HYUNDAI.HYUNDAI_IONIQ_6)
self.cp.notCar = True
self.assertIsNone(self.row())