From e75470f2e8bd791f29d3740abd0eaba7b709fc00 Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Wed, 7 Oct 2026 23:46:25 -0500 Subject: [PATCH] Overrun --- .../lib/longitudinal_mpc_lib/SConscript | 2 + .../libacados_ocp_solver_long.so | Bin 91048 -> 160736 bytes .../lib/longitudinal_mpc_lib/long_mpc.py | 10 ++- .../tests/test_longitudinal_planner.py | 24 ++++++ starpilot/car/ford/lateral.py | 15 ++++ starpilot/car/ford/tests/test_lateral.py | 81 ++++++++++++++++++ 6 files changed, 131 insertions(+), 1 deletion(-) diff --git a/selfdrive/controls/lib/longitudinal_mpc_lib/SConscript b/selfdrive/controls/lib/longitudinal_mpc_lib/SConscript index 164b965142..5c316ed8e2 100644 --- a/selfdrive/controls/lib/longitudinal_mpc_lib/SConscript +++ b/selfdrive/controls/lib/longitudinal_mpc_lib/SConscript @@ -28,6 +28,8 @@ casadi_cost_0 = [ casadi_constraints = [ f'{gen}/long_constraints/long_constr_h_fun.c', f'{gen}/long_constraints/long_constr_h_fun_jac_uxt_zt.c', + f'{gen}/long_constraints/long_constr_h_e_fun.c', + f'{gen}/long_constraints/long_constr_h_e_fun_jac_uxt_zt.c', ] build_files = [f'{gen}/acados_solver_long.c'] + casadi_model + casadi_cost_y + casadi_cost_e + \ diff --git a/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/libacados_ocp_solver_long.so b/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/libacados_ocp_solver_long.so index f50a9487194ed75b5dc4e2410655efce7df7cb02..036bc6a785ef3a3e9b76432f9632cc91f5c53ac7 100755 GIT binary patch literal 160736 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 -0.01 + assert mpc.params[-1, 0] - 0.01 <= mpc.a_solution[-1] <= mpc.params[-1, 1] + 0.01 + assert np.interp(0.2, T_IDXS_MPC, mpc.a_solution) < 0.0 + + def test_prius_stopped_lead_obstacle_bias_is_small_and_vehicle_specific(): prius = ToyotaCarInterface.get_non_essential_params(TOYOTA_CAR.TOYOTA_PRIUS) other = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) diff --git a/starpilot/car/ford/lateral.py b/starpilot/car/ford/lateral.py index 5215e1abf4..7a01112457 100644 --- a/starpilot/car/ford/lateral.py +++ b/starpilot/car/ford/lateral.py @@ -34,6 +34,9 @@ MAX_LATERAL_ACCEL = ISO_LATERAL_ACCEL - ACCELERATION_DUE_TO_GRAVITY * 0.06 STEER_DT = CarControllerParams.STEER_STEP * DT_CTRL CURVATURE_LOOKAHEAD_MIN = 0.20 CURVATURE_LOOKAHEAD_MAX = 0.40 +MACH_E_HIGH_SPEED_LOOKAHEAD_EXTRA = 0.40 +MACH_E_HIGH_SPEED_LOOKAHEAD_START_SPEED = 16.0 +MACH_E_HIGH_SPEED_LOOKAHEAD_FULL_SPEED = 23.0 MACH_E_TURN_IN_LOOKAHEAD_EXTRA = 0.80 MACH_E_LOW_SPEED_TURN_IN_LOOKAHEAD_EXTRA = 1.60 MACH_E_LOW_SPEED_TURN_IN_START_SPEED = 2.0 @@ -228,6 +231,13 @@ class FordLateralController: direction = int(getattr(self.model.meta.laneChangeDirection, "raw", self.model.meta.laneChangeDirection)) return state in (1, 2, 3), direction + def _high_speed_lookahead_extra(self, v_ego: float, steering_pressed: bool, lane_change: bool) -> float: + if (self.CP.carFingerprint != CAR.FORD_MUSTANG_MACH_E_MK1 or not self.CP.flags & FordFlags.CANFD or + steering_pressed or lane_change): + return 0.0 + return MACH_E_HIGH_SPEED_LOOKAHEAD_EXTRA * float(np.interp( + v_ego, [MACH_E_HIGH_SPEED_LOOKAHEAD_START_SPEED, MACH_E_HIGH_SPEED_LOOKAHEAD_FULL_SPEED], [0.0, 1.0])) + @staticmethod def _current_curvature(CS) -> float: return -CS.out.yawRate / max(CS.out.vEgoRaw, 0.1) @@ -595,6 +605,7 @@ class FordLateralController: v_ego = float(CS.out.vEgoRaw) lookahead = self._curvature_lookahead() + lookahead += self._high_speed_lookahead_extra(v_ego, bool(CS.out.steeringPressed), self._lane_change()[0]) predicted = self._predicted_curvature(v_ego, lookahead) allow_opposite_preview = False if self.CP.carFingerprint in FORD_CONSERVATIVE_PREVIEW_CARS: @@ -677,6 +688,10 @@ class FordLateralController: if self._lane_change()[0]: curvature_rate = 0.0 + if (self.CP.carFingerprint == CAR.FORD_MUSTANG_MACH_E_MK1 and self.CP.flags & FordFlags.CANFD and + command_predicted != predicted and command_predicted * curvature_rate > 0.0): + curvature_rate = 0.0 + self.curvature_last = float(np.clip(applied, -0.02, 0.02)) min_curvature_rate = -0.001024 if self.CP.carFingerprint == CAR.FORD_MUSTANG_MACH_E_MK1 and self.CP.flags & FordFlags.CANFD: diff --git a/starpilot/car/ford/tests/test_lateral.py b/starpilot/car/ford/tests/test_lateral.py index 13f54812d3..35f08e8d27 100644 --- a/starpilot/car/ford/tests/test_lateral.py +++ b/starpilot/car/ford/tests/test_lateral.py @@ -917,6 +917,87 @@ def test_curvature_strategy_uses_learned_lookahead(controller, monkeypatch): assert lookaheads == [pytest.approx(0.38)] +@pytest.mark.parametrize("speed,expected", ((0.0, 0.0), (15.0, 0.0), (16.0, 0.0), (19.5, 0.2), + (23.0, 0.4), (30.0, 0.4), (40.0, 0.4))) +def test_mach_e_high_speed_preview_ramps_continuously(controller, speed, expected): + controller.CP.carFingerprint = CAR.FORD_MUSTANG_MACH_E_MK1 + controller.CP.flags = FordFlags.CANFD + assert controller._high_speed_lookahead_extra(speed, False, False) == pytest.approx(expected) + + +@pytest.mark.parametrize("fingerprint,flags,driver,lane_change", ( + (CAR.FORD_MUSTANG_MACH_E_MK1, FordFlags.CANFD, True, False), + (CAR.FORD_MUSTANG_MACH_E_MK1, FordFlags.CANFD, False, True), + (CAR.FORD_MUSTANG_MACH_E_MK1, 0, False, False), + (CAR.FORD_EXPLORER_MK6, FordFlags.CANFD, False, False), + (CAR.FORD_F_150_MK14, FordFlags.CANFD, False, False), + (CAR.FORD_EDGE_MK2, 0, False, False), +)) +def test_high_speed_preview_preserves_takeover_lane_changes_and_other_fords(controller, fingerprint, flags, driver, lane_change): + controller.CP.carFingerprint = fingerprint + controller.CP.flags = flags + assert controller._high_speed_lookahead_extra(30.0, driver, lane_change) == 0.0 + + +@pytest.mark.parametrize("sign", (-1, 1)) +@pytest.mark.parametrize("speed", (16.0, 19.5, 23.0, 30.0)) +def test_mach_e_high_speed_preview_preserves_constant_curve_authority(controller, monkeypatch, sign, speed): + controller.CP.carFingerprint = CAR.FORD_MUSTANG_MACH_E_MK1 + controller.CP.flags = FordFlags.CANFD + curvature = sign * 0.001 + controller.curvature_last = curvature + controller.desired_curvature_last = curvature + monkeypatch.setattr(controller, "_predicted_curvature", lambda *_: curvature) + result = controller.update(SimpleNamespace(latActive=True), car_state(speed=speed, curvature=curvature), + SimpleNamespace(curvature=curvature)) + assert result.curvature == pytest.approx(curvature) + assert result.curvature_rate == 0.0 + assert result.path_angle == 0.0 + + +@pytest.mark.parametrize("driver,lane_change", ((False, False), (True, False), (False, True))) +def test_mach_e_high_speed_preview_update_uses_bounded_horizon(controller, monkeypatch, driver, lane_change): + controller.CP.carFingerprint = CAR.FORD_MUSTANG_MACH_E_MK1 + controller.CP.flags = FordFlags.CANFD + controller.sm["liveDelay"].lateralDelay = 0.38 + monkeypatch.setattr(controller, "_lane_change", lambda: (lane_change, 0)) + lookaheads = [] + monkeypatch.setattr(controller, "_predicted_curvature", lambda v, t: lookaheads.append(t) or 0.0) + controller.update(SimpleNamespace(latActive=True), car_state(speed=30.0, steering_pressed=driver), + SimpleNamespace(curvature=0.0001)) + assert lookaheads[0] == pytest.approx(0.38 if driver or lane_change else 0.78) + assert controller._curvature_lookahead() == pytest.approx(0.38) + + +@pytest.mark.parametrize("sign", (-1, 1)) +@pytest.mark.parametrize("conflicting_rate", (False, True)) +@pytest.mark.parametrize("fingerprint,flags,driver,lane_change", ( + (CAR.FORD_MUSTANG_MACH_E_MK1, FordFlags.CANFD, False, False), + (CAR.FORD_MUSTANG_MACH_E_MK1, FordFlags.CANFD, True, False), + (CAR.FORD_MUSTANG_MACH_E_MK1, FordFlags.CANFD, False, True), + (CAR.FORD_MUSTANG_MACH_E_MK1, 0, False, False), + (CAR.FORD_EXPLORER_MK6, FordFlags.CANFD, False, False), + (CAR.FORD_EDGE_MK2, 0, False, False), +)) +def test_mach_e_unwind_rate_does_not_fight_selected_release(controller, monkeypatch, sign, conflicting_rate, + fingerprint, flags, driver, lane_change): + controller.CP.carFingerprint = fingerprint + controller.CP.flags = flags + controller.desired_curvature_last = sign * 0.013 + controller.curvature_last = sign * 0.012 + predicted = sign * 0.011 + rate = sign * 0.0002 * (1 if conflicting_rate else -1) + controller.curvature_samples.append(predicted - rate * STEER_DT * 8.0) + monkeypatch.setattr(controller, "_predicted_curvature", lambda v, t: predicted if t < 0.5 else sign * 0.006) + monkeypatch.setattr(controller, "_lane_change", lambda: (lane_change, 0)) + result = controller.update(SimpleNamespace(latActive=True), + car_state(speed=8.0, curvature=sign * 0.012, steering_pressed=driver), + SimpleNamespace(curvature=sign * 0.012)) + suppress = fingerprint == CAR.FORD_MUSTANG_MACH_E_MK1 and flags & FordFlags.CANFD and not driver and not lane_change + assert result.curvature_rate == pytest.approx(0.0 if lane_change or suppress and conflicting_rate else rate) + assert result.path_angle == 0.0 + + def test_mach_e_preview_does_not_override_opposite_current_path(controller): controller.CP.carFingerprint = CAR.FORD_MUSTANG_MACH_E_MK1