From 33cb78cfa9293d03893ca98a30a7308122c1958c Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Mon, 23 Feb 2026 22:24:42 -0600 Subject: [PATCH] Lat Tuning --- selfdrive/car/gm/interface.py | 8 ++++++++ selfdrive/car/torque_data/override.toml | 4 +++- selfdrive/car/torque_data/substitute.toml | 2 -- selfdrive/controls/lib/latcontrol_torque.py | 21 +++++++++++++++++---- 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/selfdrive/car/gm/interface.py b/selfdrive/car/gm/interface.py index dfe8bad86..fba7a0298 100644 --- a/selfdrive/car/gm/interface.py +++ b/selfdrive/car/gm/interface.py @@ -382,6 +382,14 @@ class CarInterface(CarInterfaceBase): ret.lateralTuning.torque.kd = 0.93 ret.lateralTuning.torque.kfDEPRECATED = 0.02 + if candidate in (CAR.CHEVROLET_BOLT_CC_2019_2021, + CAR.CHEVROLET_BOLT_ACC_2022_2023, + CAR.CHEVROLET_BOLT_ACC_2022_2023_PEDAL, + CAR.CHEVROLET_BOLT_CC_2022_2023): + # Apply 2019-style negative FF and Ki-mult tweaks to 2019-2021 and 2022 variants. + ret.lateralTuning.torque.ki *= 1.07 + ret.lateralTuning.torque.kd *= 0.93 + if candidate == CAR.CHEVROLET_BOLT_CC_2017: gm_safety_cfg.safetyParam |= Panda.FLAG_GM_BOLT_2017 diff --git a/selfdrive/car/torque_data/override.toml b/selfdrive/car/torque_data/override.toml index bb04260b9..5a97e8beb 100644 --- a/selfdrive/car/torque_data/override.toml +++ b/selfdrive/car/torque_data/override.toml @@ -44,7 +44,9 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] "CADILLAC_ESCALADE_ESV_2019" = [1.15, 1.3, 0.2] "CADILLAC_XT4" = [1.45, 1.6, 0.2] "CADILLAC_XT6" = [1.33, 1.9, 0.16] -"CHEVROLET_BOLT_ACC_2022_2023" = [2.0, 2.0, 0.09] +"CHEVROLET_BOLT_ACC_2022_2023" = [2.0, 2.0, 0.13] +"CHEVROLET_BOLT_CC_2017" = [1.5, 2.0, 0.245] +"CHEVROLET_BOLT_CC_2019_2021" = [2.0, 2.0, 0.13] "CHEVROLET_BLAZER" = [1.33, 1.33, 0.18] "CHEVROLET_MALIBU_CC" = [1.58, 1.8422651988094612, 0.205] "CHEVROLET_SILVERADO" = [1.9, 1.9, 0.112] diff --git a/selfdrive/car/torque_data/substitute.toml b/selfdrive/car/torque_data/substitute.toml index deb8cfc0f..d9f8498bc 100644 --- a/selfdrive/car/torque_data/substitute.toml +++ b/selfdrive/car/torque_data/substitute.toml @@ -64,10 +64,8 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] "CHEVROLET_VOLT_ASCM" = "CHEVROLET_VOLT" "GMC_ACADIA_ASCM" = "GMC_ACADIA" "CHEVROLET_VOLT_2019" = "CHEVROLET_VOLT" -"CHEVROLET_BOLT_CC_2019_2021" = "CHEVROLET_BOLT_ACC_2022_2023" "CHEVROLET_BOLT_ACC_2022_2023_PEDAL" = "CHEVROLET_BOLT_ACC_2022_2023" "CHEVROLET_BOLT_CC_2022_2023" = "CHEVROLET_BOLT_ACC_2022_2023" -"CHEVROLET_BOLT_CC_2017" = "CHEVROLET_BOLT_ACC_2022_2023" "CHEVROLET_EQUINOX_CC" = "CHEVROLET_EQUINOX" "CHEVROLET_SUBURBAN" = "CHEVROLET_SILVERADO" "CHEVROLET_SUBURBAN_CC" = "CHEVROLET_SILVERADO" diff --git a/selfdrive/controls/lib/latcontrol_torque.py b/selfdrive/controls/lib/latcontrol_torque.py index a19142538..0adc8b3ec 100644 --- a/selfdrive/controls/lib/latcontrol_torque.py +++ b/selfdrive/controls/lib/latcontrol_torque.py @@ -43,12 +43,18 @@ DEADZONE_BOOST_LAT_ACCEL = 0.08 UNWIND_D_DES_THRESHOLD = -1.0 UNWIND_LAT_ACCEL_NEAR_ZERO = 0.3 -BOLT_CARS = ( +BOLT_2022_2023_CARS = ( GM_CAR.CHEVROLET_BOLT_ACC_2022_2023, GM_CAR.CHEVROLET_BOLT_ACC_2022_2023_PEDAL, GM_CAR.CHEVROLET_BOLT_CC_2022_2023, +) +BOLT_2019_2021_CARS = ( GM_CAR.CHEVROLET_BOLT_CC_2019_2021, ) +BOLT_2017_CARS = ( + GM_CAR.CHEVROLET_BOLT_CC_2017, +) +BOLT_CARS = BOLT_2022_2023_CARS + BOLT_2019_2021_CARS + BOLT_2017_CARS class LatControlTorque(LatControl): def __init__(self, CP, CI, dt): @@ -72,6 +78,13 @@ class LatControlTorque(LatControl): self.prev_desired_lateral_accel = 0.0 self.is_bolt = CP.carFingerprint in BOLT_CARS + self.is_bolt_2022_2023 = CP.carFingerprint in BOLT_2022_2023_CARS + self.is_bolt_2019_2021 = CP.carFingerprint in BOLT_2019_2021_CARS + self.is_bolt_2017 = CP.carFingerprint in BOLT_2017_CARS + # Keep Bolt-specific FF controls isolated by generation. + self.use_bolt_ff_scaling = self.is_bolt_2022_2023 or self.is_bolt_2019_2021 + self.use_bolt_deadzone_boost = self.is_bolt_2022_2023 or self.is_bolt_2019_2021 + self.use_bolt_ki_multiplier = self.is_bolt_2022_2023 or self.is_bolt_2019_2021 self.torque_ff_scale_pos = 1.0 self.torque_ff_scale_neg = 1.0 self.torque_deadzone_boost_neg = 0.0 @@ -81,7 +94,7 @@ class LatControlTorque(LatControl): self.torque_ff_scale_neg = float(self.torque_params.ki) self.torque_ki_mult = float(self.torque_params.kd) self.torque_deadzone_boost_neg = float(getattr(self.torque_params, "kfDEPRECATED", 0.0)) - if self.torque_ki_mult > 0.0 and self.torque_ki_mult != 1.0: + if self.use_bolt_ki_multiplier and self.torque_ki_mult > 0.0 and self.torque_ki_mult != 1.0: self.pid._k_i = [self.pid._k_i[0], [k * self.torque_ki_mult for k in self.pid._k_i[1]]] def update_live_torque_params(self, latAccelFactor, latAccelOffset, friction): @@ -144,13 +157,13 @@ class LatControlTorque(LatControl): # latAccelOffset corrects roll compensation bias from device roll misalignment relative to car roll ff -= self.torque_params.latAccelOffset ff_scale = 1.0 - if self.is_bolt: + if self.use_bolt_ff_scaling: ff_scale = np.interp(ff, [-FF_SCALE_BLEND_LAT_ACCEL, 0.0, FF_SCALE_BLEND_LAT_ACCEL], [self.torque_ff_scale_neg, 1.0, self.torque_ff_scale_pos]) ff *= ff_scale ff += get_friction(error_with_lsf + JERK_GAIN * desired_lateral_jerk, lateral_accel_deadzone, get_friction_threshold(CS.vEgo), self.torque_params) deadzone_boost_active = False - if self.is_bolt and self.torque_deadzone_boost_neg > 0.0 and gravity_adjusted_future_lateral_accel < 0.0: + if self.use_bolt_deadzone_boost and self.torque_deadzone_boost_neg > 0.0 and gravity_adjusted_future_lateral_accel < 0.0: if abs(gravity_adjusted_future_lateral_accel) < DEADZONE_BOOST_LAT_ACCEL: boost_scale = np.interp(abs(gravity_adjusted_future_lateral_accel), [0.0, DEADZONE_BOOST_LAT_ACCEL], [1.0, 0.0]) ff -= self.torque_deadzone_boost_neg * boost_scale