From 6e77a8077247d18f861e7e0ad68c22c26d264d4a Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Tue, 6 May 2025 16:43:37 -0500 Subject: [PATCH] 2017 --- panda/board/obj/bootstub.panda.bin | Bin 14876 -> 14876 bytes panda/board/obj/bootstub.panda_h7.bin | Bin 16944 -> 16944 bytes panda/board/obj/panda.bin.signed | Bin 60464 -> 61068 bytes panda/board/obj/panda_h7.bin.signed | Bin 68956 -> 69844 bytes selfdrive/car/gm/carcontroller.py | 2 +- selfdrive/car/gm/carstate.py | 4 ++-- selfdrive/car/gm/interface.py | 29 +++++++++++++----------- selfdrive/car/gm/values.py | 10 ++++---- selfdrive/car/interfaces.py | 2 +- selfdrive/car/torque_data/override.toml | 2 +- 10 files changed, 26 insertions(+), 23 deletions(-) diff --git a/panda/board/obj/bootstub.panda.bin b/panda/board/obj/bootstub.panda.bin index 57610205e37dc3ae0ee126af0b63ebc4b056e074..76c7cae35b9d8f922c9637c5031e28ec4debf568 100755 GIT binary patch delta 21 ccmbPJGN)w2En^N7b3>Elq@<+HkBqI@0ApkbM*si- delta 21 ccmbPJGN)w2En^O2)6_%@L(7!SkBqI@0An8rA^-pY diff --git a/panda/board/obj/bootstub.panda_h7.bin b/panda/board/obj/bootstub.panda_h7.bin index 7932b3905b1a92e902069cce671e8ef793b420cc..1c665aea4dee9b63c96715b0afda4b66ac1d64a6 100755 GIT binary patch delta 23 dcmdnc!ngs5X4!CZfTCnY6qUS!k93IJ&G2zCGf delta 23 dcmdnc!ngs5X4!BUo2DjO7+R)mUS!k93IJ%W2vGn4 diff --git a/panda/board/obj/panda.bin.signed b/panda/board/obj/panda.bin.signed index dc2bc663b2fd24712cafde2c1d67018029b51489..a621439f512744cb8b92d37136c9ff1d3a5ac274 100644 GIT binary patch delta 10911 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 ceg2aHF@>YP)j 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 threshold else: ret.gas = pt_cp.vl["AcceleratorPedal2"]["AcceleratorPedal2"] / 254. @@ -174,7 +174,7 @@ class CarState(CarStateBase): ret.leftBlindspot = cam_cp.vl["BCMBlindSpotMonitor"]["LeftBSM"] == 1 ret.rightBlindspot = cam_cp.vl["BCMBlindSpotMonitor"]["RightBSM"] == 1 - # FrogPilot CarState functions + self.lkas_previously_enabled = self.lkas_enabled if self.CP.carFingerprint in SDGM_CAR: self.lkas_enabled = cam_cp.vl["ASCMSteeringButton"]["LKAButton"] diff --git a/selfdrive/car/gm/interface.py b/selfdrive/car/gm/interface.py index cb1b1d4f78..7b96b7d2c6 100644 --- a/selfdrive/car/gm/interface.py +++ b/selfdrive/car/gm/interface.py @@ -29,10 +29,10 @@ CAM_MSG = 0x320 # AEBCmd ACCELERATOR_POS_MSG = 0xbe NON_LINEAR_TORQUE_PARAMS = { - CAR.CHEVROLET_BOLT_EUV: [1.8, 1.1, 0.290, -0.045], - CAR.CHEVROLET_BOLT_CC: [1.8, 1.1, 0.290, -0.045], - CAR.GMC_ACADIA: [4.78003305, 1.0, 0.3122, 0.05591772], - CAR.CHEVROLET_SILVERADO: [3.29974374, 1.0, 0.25571356, 0.0465122] + CAR.CHEVROLET_BOLT_EUV: {"left": [2.15, 1.0, 0.17, -0.04], "right": [2.15, 1.0, 0.21, -0.04]}, + CAR.CHEVROLET_BOLT_CC: {"left": [2.15, 1.0, 0.17, -0.04], "right": [2.15, 1.0, 0.21, -0.04]}, + CAR.GMC_ACADIA: {"left": [4.78, 1.0, 0.31, 0.05], "right": [4.78, 1.0, 0.31, 0.05]}, + CAR.CHEVROLET_SILVERADO: {"left": [3.30, 1.0, 0.25, 0.05], "right": [3.30, 1.0, 0.25, 0.05]} } NEURAL_PARAMS_PATH = os.path.join(BASEDIR, 'selfdrive/car/torque_data/neural_ff_weights.json') @@ -74,7 +74,11 @@ class CarInterface(CarInterfaceBase): # ToDo: To generalize to other GMs, explore tanh function as the nonlinear non_linear_torque_params = NON_LINEAR_TORQUE_PARAMS.get(self.CP.carFingerprint) assert non_linear_torque_params, "The params are not defined" - a, b, c, d = non_linear_torque_params + if latcontrol_inputs.lateral_acceleration >= 0: + params = non_linear_torque_params["right"] + else: + params = non_linear_torque_params["left"] + a, b, c, d = params steer_torque = (sig(latcontrol_inputs.lateral_acceleration * a) * b) + (latcontrol_inputs.lateral_acceleration * c) + d return float(steer_torque) + friction @@ -116,14 +120,13 @@ class CarInterface(CarInterfaceBase): ret.minSteerSpeed = 10 * CV.KPH_TO_MS # Tuning for experimental long - ret.longitudinalTuning.kiV = [0.5, 0.5, 0.5] + ret.longitudinalTuning.kiV = [2.0, 1.5] ret.vEgoStopping = 0.1 ret.vEgoStarting = 0.1 - ret.stoppingDecelRate = 1.0 # reach brake quickly after enabling + ret.stoppingDecelRate = 2.0 # reach brake quickly after enabling ret.vEgoStopping = 0.25 ret.vEgoStarting = 0.25 - ret.stopAccel = -0.25 if experimental_long: ret.pcmCruise = False @@ -131,7 +134,7 @@ class CarInterface(CarInterfaceBase): ret.safetyConfigs[0].safetyParam |= Panda.FLAG_GM_HW_CAM_LONG elif candidate in SDGM_CAR: - ret.longitudinalTuning.kiV = [0., 0., 0.] # TODO: tuning + ret.longitudinalTuning.kiV = [0., 0.] # TODO: tuning ret.experimentalLongitudinalAvailable = False ret.networkLocation = NetworkLocation.fwdCamera ret.pcmCruise = True @@ -150,7 +153,7 @@ class CarInterface(CarInterfaceBase): ret.minSteerSpeed = 7 * CV.MPH_TO_MS # Tuning - ret.longitudinalTuning.kiV = [0.5, 0.5, 0.5] + ret.longitudinalTuning.kiV = [2.4, 1.5] if ret.enableGasInterceptor: # Need to set ASCM long limits when using pedal interceptor, instead of camera ACC long limits @@ -201,7 +204,7 @@ class CarInterface(CarInterfaceBase): elif candidate in (CAR.CHEVROLET_BOLT_EUV, CAR.CHEVROLET_BOLT_CC): ret.steerActuatorDelay = 0.2 CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) - ret.lateralTuning.torque.kp = 0.6 + ret.lateralTuning.torque.kp = 0.4 if ret.enableGasInterceptor: # ACC Bolts use pedal for full longitudinal control, not just sng @@ -267,7 +270,7 @@ class CarInterface(CarInterfaceBase): ret.stoppingControl = True ret.autoResumeSng = True - if candidate in CC_ONLY_CAR: #pedal interceptor tuning + if candidate in CC_ONLY_CAR: ret.flags |= GMFlags.PEDAL_LONG.value ret.safetyConfigs[0].safetyParam |= Panda.FLAG_GM_PEDAL_LONG # Note: Low speed, stop and go not tested. Should be fairly smooth on highway @@ -290,7 +293,7 @@ class CarInterface(CarInterfaceBase): ret.openpilotLongitudinalControl = not frogpilot_toggles.disable_openpilot_long ret.pcmCruise = False - if not ret.enableGasInterceptor and candidate in CC_ONLY_CAR: #redneck tuning + if not ret.enableGasInterceptor and candidate in CC_ONLY_CAR: ret.longitudinalTuning.kpBP = [10.7, 10.8, 28.] # 10.7 m/s == 24 mph ret.longitudinalTuning.kpV = [0., 20., 20.] # set lower end to 0 since we can't drive below that speed ret.longitudinalTuning.deadzoneBP = [0.] diff --git a/selfdrive/car/gm/values.py b/selfdrive/car/gm/values.py index 6780776cfa..9758783c6a 100644 --- a/selfdrive/car/gm/values.py +++ b/selfdrive/car/gm/values.py @@ -11,13 +11,13 @@ Ecu = car.CarParams.Ecu class CarControllerParams: - STEER_MAX = 300 # GM limit is 3Nm. Used by carcontroller to generate LKA output + STEER_MAX = 450 # GM limit is 3Nm. Used by carcontroller to generate LKA output STEER_STEP = 3 # Active control frames per command (~33hz) INACTIVE_STEER_STEP = 10 # Inactive control frames per command (10hz) - STEER_DELTA_UP = 10 # Delta rates require review due to observed EPS weakness - STEER_DELTA_DOWN = 15 - STEER_DRIVER_ALLOWANCE = 65 - STEER_DRIVER_MULTIPLIER = 4 + STEER_DELTA_UP = 15 # Delta rates require review due to observed EPS weakness + STEER_DELTA_DOWN = 34 + STEER_DRIVER_ALLOWANCE = 78 + STEER_DRIVER_MULTIPLIER = 6 STEER_DRIVER_FACTOR = 100 NEAR_STOP_BRAKE_PHASE = 0.25 # m/s SNG_INTERCEPTOR_GAS = 18. / 255. diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index 63eeabdef8..8e40dc21ab 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -411,7 +411,7 @@ class CarInterfaceBase(ABC): tune.init('torque') tune.torque.useSteeringAngle = use_steering_angle - tune.torque.kp = 0.6 + tune.torque.kp = 0.4 tune.torque.kf = 1.0 tune.torque.ki = 0.1 tune.torque.friction = params['FRICTION'] diff --git a/selfdrive/car/torque_data/override.toml b/selfdrive/car/torque_data/override.toml index b37817b4cc..ba6ace6dfe 100644 --- a/selfdrive/car/torque_data/override.toml +++ b/selfdrive/car/torque_data/override.toml @@ -43,7 +43,7 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] "CADILLAC_ESCALADE" = [1.899999976158142, 1.842270016670227, 0.1120000034570694] "CADILLAC_ESCALADE_ESV_2019" = [1.15, 1.3, 0.2] "CADILLAC_XT4" = [1.45, 1.6, 0.2] -"CHEVROLET_BOLT_EUV" = [2.0, 2.0, 0.05] +"CHEVROLET_BOLT_EUV" = [3.0, 2.0, 0.11] "CHEVROLET_MALIBU_CC" = [1.85, 1.85, 0.075] "CHEVROLET_SILVERADO" = [1.9, 1.9, 0.112] "CHEVROLET_TRAILBLAZER" = [1.33, 1.9, 0.16]