diff --git a/selfdrive/car/body/interface.py b/selfdrive/car/body/interface.py index 50564d3ed8..79b4637a96 100644 --- a/selfdrive/car/body/interface.py +++ b/selfdrive/car/body/interface.py @@ -1,12 +1,13 @@ import math from cereal import car from openpilot.selfdrive.car import DT_CTRL, get_safety_config +from openpilot.selfdrive.car.data_structures import CarParams from openpilot.selfdrive.car.interfaces import CarInterfaceBase from openpilot.selfdrive.car.body.values import SPEED_FROM_RPM class CarInterface(CarInterfaceBase): @staticmethod - def _get_params(ret, candidate, fingerprint, car_fw, experimental_long, docs): + def _get_params(ret: CarParams, candidate, fingerprint, car_fw, experimental_long, docs): ret.notCar = True ret.carName = "body" ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.body)] diff --git a/selfdrive/car/chrysler/interface.py b/selfdrive/car/chrysler/interface.py index e74513c176..bdacb25987 100755 --- a/selfdrive/car/chrysler/interface.py +++ b/selfdrive/car/chrysler/interface.py @@ -3,6 +3,7 @@ from cereal import car from panda import Panda from openpilot.selfdrive.car import create_button_events, get_safety_config from openpilot.selfdrive.car.chrysler.values import CAR, RAM_HD, RAM_DT, RAM_CARS, ChryslerFlags +from openpilot.selfdrive.car.data_structures import CarParams from openpilot.selfdrive.car.interfaces import CarInterfaceBase ButtonType = car.CarState.ButtonEvent.Type @@ -10,7 +11,7 @@ ButtonType = car.CarState.ButtonEvent.Type class CarInterface(CarInterfaceBase): @staticmethod - def _get_params(ret, candidate, fingerprint, car_fw, experimental_long, docs): + def _get_params(ret: CarParams, candidate, fingerprint, car_fw, experimental_long, docs): ret.carName = "chrysler" ret.dashcamOnly = candidate in RAM_HD @@ -26,7 +27,7 @@ class CarInterface(CarInterfaceBase): elif candidate in RAM_DT: ret.safetyConfigs[0].safetyParam |= Panda.FLAG_CHRYSLER_RAM_DT - CarInterfaceBase.configure_torque_tune(candidate, ret) + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) if candidate not in RAM_CARS: # Newer FW versions standard on the following platforms, or flashed by a dealer onto older platforms have a higher minimum steering speed. new_eps_platform = candidate in (CAR.CHRYSLER_PACIFICA_2019_HYBRID, CAR.CHRYSLER_PACIFICA_2020, CAR.JEEP_GRAND_CHEROKEE_2019, CAR.DODGE_DURANGO) diff --git a/selfdrive/car/data_structures.py b/selfdrive/car/data_structures.py index aedd1d16ff..ef93d6b2b1 100644 --- a/selfdrive/car/data_structures.py +++ b/selfdrive/car/data_structures.py @@ -81,7 +81,7 @@ class CarParams: minEnableSpeed: float = auto_field() minSteerSpeed: float = auto_field() - # safetyConfigs: list[SafetyConfig] = auto_field() + safetyConfigs: list['CarParams.SafetyConfig'] = auto_field() alternativeExperience: int = auto_field() # panda flag for features like no disengage on gas maxLateralAccel: float = auto_field() @@ -114,6 +114,12 @@ class CarParams: pid: 'CarParams.LateralPIDTuning' = field(default_factory=lambda: CarParams.LateralPIDTuning()) torque: 'CarParams.LateralTorqueTuning' = field(default_factory=lambda: CarParams.LateralTorqueTuning()) + @dataclass + @apply_auto_fields + class SafetyConfig: + safetyModel: 'CarParams.SafetyModel' = field(default_factory=lambda: CarParams.SafetyModel.silent) + safetyParam: int = auto_field() + @dataclass @apply_auto_fields class LateralParams: @@ -160,7 +166,7 @@ class CarParams: carVin: str = auto_field() # VIN number queried during fingerprinting dashcamOnly: bool = auto_field() passive: bool = auto_field() # is openpilot in control? - # transmissionType: TransmissionType = auto_field() + transmissionType: 'CarParams.TransmissionType' = field(default_factory=lambda: CarParams.TransmissionType.unknown) carFw: list['CarParams.CarFw'] = auto_field() radarTimeStep: float = 0.05 # time delta between radar updates, 20Hz is very standard @@ -178,10 +184,51 @@ class CarParams: kiV: list[float] = auto_field() kf: float = auto_field() + class SafetyModel(StrEnum): + silent = auto() + hondaNidec = auto() + toyota = auto() + elm327 = auto() + gm = auto() + hondaBoschGiraffe = auto() + ford = auto() + cadillac = auto() + hyundai = auto() + chrysler = auto() + tesla = auto() + subaru = auto() + gmPassive = auto() + mazda = auto() + nissan = auto() + volkswagen = auto() + toyotaIpas = auto() + allOutput = auto() + gmAscm = auto() + noOutput = auto() # like silent but without silent CAN TXs + hondaBosch = auto() + volkswagenPq = auto() + subaruPreglobal = auto() # pre-Global platform + hyundaiLegacy = auto() + hyundaiCommunity = auto() + volkswagenMlb = auto() + hongqi = auto() + body = auto() + hyundaiCanfd = auto() + volkswagenMqbEvo = auto() + chryslerCusw = auto() + psa = auto() + class SteerControlType(StrEnum): torque = auto() angle = auto() + class TransmissionType(StrEnum): + unknown = auto() + automatic = auto() # Traditional auto, including DSG + manual = auto() # True "stick shift" only + direct = auto() # Electric vehicle or other direct drive + cvt = auto() + @dataclass @apply_auto_fields class CarFw: diff --git a/selfdrive/car/ford/interface.py b/selfdrive/car/ford/interface.py index b872be212b..f83b1e07e1 100644 --- a/selfdrive/car/ford/interface.py +++ b/selfdrive/car/ford/interface.py @@ -2,6 +2,7 @@ from cereal import car from panda import Panda from openpilot.selfdrive.car import create_button_events, get_safety_config from openpilot.selfdrive.car.conversions import Conversions as CV +from openpilot.selfdrive.car.data_structures import CarParams from openpilot.selfdrive.car.ford.fordcan import CanBus from openpilot.selfdrive.car.ford.values import Ecu, FordFlags from openpilot.selfdrive.car.interfaces import CarInterfaceBase @@ -13,7 +14,7 @@ GearShifter = car.CarState.GearShifter class CarInterface(CarInterfaceBase): @staticmethod - def _get_params(ret, candidate, fingerprint, car_fw, experimental_long, docs): + def _get_params(ret: CarParams, candidate, fingerprint, car_fw, experimental_long, docs): ret.carName = "ford" ret.dashcamOnly = bool(ret.flags & FordFlags.CANFD) diff --git a/selfdrive/car/gm/interface.py b/selfdrive/car/gm/interface.py index 4fee31ead3..700dd060b0 100755 --- a/selfdrive/car/gm/interface.py +++ b/selfdrive/car/gm/interface.py @@ -8,6 +8,7 @@ from panda import Panda from openpilot.common.basedir import BASEDIR from openpilot.selfdrive.car import create_button_events, get_safety_config, get_friction from openpilot.selfdrive.car.conversions import Conversions as CV +from openpilot.selfdrive.car.data_structures import CarParams from openpilot.selfdrive.car.gm.radar_interface import RADAR_HEADER_MSG from openpilot.selfdrive.car.gm.values import CAR, CruiseButtons, CarControllerParams, EV_CAR, CAMERA_ACC_CAR, CanBus from openpilot.selfdrive.car.interfaces import CarInterfaceBase, TorqueFromLateralAccelCallbackType, FRICTION_THRESHOLD, LatControlInputs, NanoFFModel @@ -88,7 +89,7 @@ class CarInterface(CarInterfaceBase): return self.torque_from_lateral_accel_linear @staticmethod - def _get_params(ret, candidate, fingerprint, car_fw, experimental_long, docs): + def _get_params(ret: CarParams, candidate, fingerprint, car_fw, experimental_long, docs): ret.carName = "gm" ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.gm)] ret.autoResumeSng = False @@ -140,9 +141,9 @@ class CarInterface(CarInterfaceBase): (ret.networkLocation == NetworkLocation.gateway and ret.radarUnavailable) # Start with a baseline tuning for all GM vehicles. Override tuning as needed in each model section below. - ret.lateralTuning.kiBP, ret.lateralTuning.kpBP = [[0.], [0.]] - ret.lateralTuning.kpV, ret.lateralTuning.kiV = [[0.2], [0.00]] - ret.lateralTuning.kf = 0.00004 # full torque for 20 deg at 80mph means 0.00007818594 + ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0.], [0.]] + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.00]] + ret.lateralTuning.pid.kf = 0.00004 # full torque for 20 deg at 80mph means 0.00007818594 ret.steerActuatorDelay = 0.1 # Default delay, not measured yet ret.steerLimitTimer = 0.4 @@ -150,39 +151,39 @@ class CarInterface(CarInterfaceBase): ret.longitudinalActuatorDelay = 0.5 # large delay to initially start braking if candidate == CAR.CHEVROLET_VOLT: - ret.lateralTuning.kpBP = [0., 40.] - ret.lateralTuning.kpV = [0., 0.17] - ret.lateralTuning.kiBP = [0.] - ret.lateralTuning.kiV = [0.] - ret.lateralTuning.kf = 1. # get_steer_feedforward_volt() + ret.lateralTuning.pid.kpBP = [0., 40.] + ret.lateralTuning.pid.kpV = [0., 0.17] + ret.lateralTuning.pid.kiBP = [0.] + ret.lateralTuning.pid.kiV = [0.] + ret.lateralTuning.pid.kf = 1. # get_steer_feedforward_volt() ret.steerActuatorDelay = 0.2 elif candidate == CAR.GMC_ACADIA: ret.minEnableSpeed = -1. # engage speed is decided by pcm ret.steerActuatorDelay = 0.2 - CarInterfaceBase.configure_torque_tune(candidate, ret) + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) elif candidate == CAR.BUICK_LACROSSE: - CarInterfaceBase.configure_torque_tune(candidate, ret) + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) elif candidate == CAR.CADILLAC_ESCALADE: ret.minEnableSpeed = -1. # engage speed is decided by pcm - CarInterfaceBase.configure_torque_tune(candidate, ret) + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) elif candidate in (CAR.CADILLAC_ESCALADE_ESV, CAR.CADILLAC_ESCALADE_ESV_2019): ret.minEnableSpeed = -1. # engage speed is decided by pcm if candidate == CAR.CADILLAC_ESCALADE_ESV: - ret.lateralTuning.kiBP, ret.lateralTuning.kpBP = [[10., 41.0], [10., 41.0]] - ret.lateralTuning.kpV, ret.lateralTuning.kiV = [[0.13, 0.24], [0.01, 0.02]] - ret.lateralTuning.kf = 0.000045 + ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[10., 41.0], [10., 41.0]] + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.13, 0.24], [0.01, 0.02]] + ret.lateralTuning.pid.kf = 0.000045 else: ret.steerActuatorDelay = 0.2 - CarInterfaceBase.configure_torque_tune(candidate, ret) + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) elif candidate == CAR.CHEVROLET_BOLT_EUV: ret.steerActuatorDelay = 0.2 - CarInterfaceBase.configure_torque_tune(candidate, ret) + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) elif candidate == CAR.CHEVROLET_SILVERADO: # On the Bolt, the ECM and camera independently check that you are either above 5 kph or at a stop @@ -190,14 +191,14 @@ class CarInterface(CarInterfaceBase): # TODO: check if this is split by EV/ICE with more platforms in the future if ret.openpilotLongitudinalControl: ret.minEnableSpeed = -1. - CarInterfaceBase.configure_torque_tune(candidate, ret) + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) elif candidate == CAR.CHEVROLET_EQUINOX: - CarInterfaceBase.configure_torque_tune(candidate, ret) + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) elif candidate == CAR.CHEVROLET_TRAILBLAZER: ret.steerActuatorDelay = 0.2 - CarInterfaceBase.configure_torque_tune(candidate, ret) + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) return ret diff --git a/selfdrive/car/hyundai/interface.py b/selfdrive/car/hyundai/interface.py index e610218570..fbcf3ac345 100644 --- a/selfdrive/car/hyundai/interface.py +++ b/selfdrive/car/hyundai/interface.py @@ -20,7 +20,7 @@ BUTTONS_DICT = {Buttons.RES_ACCEL: ButtonType.accelCruise, Buttons.SET_DECEL: Bu class CarInterface(CarInterfaceBase): @staticmethod - def _get_params(ret, candidate, fingerprint, car_fw, experimental_long, docs): + def _get_params(ret: CarParams, candidate, fingerprint, car_fw, experimental_long, docs): ret.carName = "hyundai" ret.radarUnavailable = RADAR_START_ADDR not in fingerprint[1] or DBC[ret.carFingerprint]["radar"] is None @@ -74,7 +74,7 @@ class CarInterface(CarInterfaceBase): ret.steerActuatorDelay = 0.1 # Default delay ret.steerLimitTimer = 0.4 - CarInterfaceBase.configure_torque_tune(candidate, ret) + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) if candidate == CAR.KIA_OPTIMA_G4_FL: ret.steerActuatorDelay = 0.2 diff --git a/selfdrive/car/mazda/interface.py b/selfdrive/car/mazda/interface.py index 43112bf5dc..7bf5668db7 100755 --- a/selfdrive/car/mazda/interface.py +++ b/selfdrive/car/mazda/interface.py @@ -2,6 +2,7 @@ from cereal import car from openpilot.selfdrive.car import create_button_events, get_safety_config from openpilot.selfdrive.car.conversions import Conversions as CV +from openpilot.selfdrive.car.data_structures import CarParams from openpilot.selfdrive.car.mazda.values import CAR, LKAS_LIMITS from openpilot.selfdrive.car.interfaces import CarInterfaceBase @@ -11,7 +12,7 @@ EventName = car.CarEvent.EventName class CarInterface(CarInterfaceBase): @staticmethod - def _get_params(ret, candidate, fingerprint, car_fw, experimental_long, docs): + def _get_params(ret: CarParams, candidate, fingerprint, car_fw, experimental_long, docs): ret.carName = "mazda" ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.mazda)] ret.radarUnavailable = True @@ -21,7 +22,7 @@ class CarInterface(CarInterfaceBase): ret.steerActuatorDelay = 0.1 ret.steerLimitTimer = 0.8 - CarInterfaceBase.configure_torque_tune(candidate, ret) + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) if candidate not in (CAR.MAZDA_CX5_2022, ): ret.minSteerSpeed = LKAS_LIMITS.DISABLE_SPEED * CV.KPH_TO_MS diff --git a/selfdrive/car/mock/interface.py b/selfdrive/car/mock/interface.py index 7506bab053..a5a3fa9180 100755 --- a/selfdrive/car/mock/interface.py +++ b/selfdrive/car/mock/interface.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 from cereal import car import cereal.messaging as messaging +from openpilot.selfdrive.car.data_structures import CarParams from openpilot.selfdrive.car.interfaces import CarInterfaceBase # mocked car interface for dashcam mode @@ -12,7 +13,7 @@ class CarInterface(CarInterfaceBase): self.sm = messaging.SubMaster(['gpsLocation', 'gpsLocationExternal']) @staticmethod - def _get_params(ret, candidate, fingerprint, car_fw, experimental_long, docs): + def _get_params(ret: CarParams, candidate, fingerprint, car_fw, experimental_long, docs): ret.carName = "mock" ret.mass = 1700. ret.wheelbase = 2.70 diff --git a/selfdrive/car/nissan/interface.py b/selfdrive/car/nissan/interface.py index 2e9a990610..1590cd3d3f 100644 --- a/selfdrive/car/nissan/interface.py +++ b/selfdrive/car/nissan/interface.py @@ -1,6 +1,7 @@ from cereal import car from panda import Panda from openpilot.selfdrive.car import create_button_events, get_safety_config +from openpilot.selfdrive.car.data_structures import CarParams from openpilot.selfdrive.car.interfaces import CarInterfaceBase from openpilot.selfdrive.car.nissan.values import CAR @@ -10,7 +11,7 @@ ButtonType = car.CarState.ButtonEvent.Type class CarInterface(CarInterfaceBase): @staticmethod - def _get_params(ret, candidate, fingerprint, car_fw, experimental_long, docs): + def _get_params(ret: CarParams, candidate, fingerprint, car_fw, experimental_long, docs): ret.carName = "nissan" ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.nissan)] ret.autoResumeSng = False diff --git a/selfdrive/car/subaru/interface.py b/selfdrive/car/subaru/interface.py index a6c49ae5d6..4636579808 100644 --- a/selfdrive/car/subaru/interface.py +++ b/selfdrive/car/subaru/interface.py @@ -1,6 +1,7 @@ from cereal import car from panda import Panda from openpilot.selfdrive.car import get_safety_config +from openpilot.selfdrive.car.data_structures import CarParams from openpilot.selfdrive.car.disable_ecu import disable_ecu from openpilot.selfdrive.car.interfaces import CarInterfaceBase from openpilot.selfdrive.car.subaru.values import CAR, GLOBAL_ES_ADDR, SubaruFlags @@ -9,7 +10,7 @@ from openpilot.selfdrive.car.subaru.values import CAR, GLOBAL_ES_ADDR, SubaruFla class CarInterface(CarInterfaceBase): @staticmethod - def _get_params(ret, candidate: CAR, fingerprint, car_fw, experimental_long, docs): + def _get_params(ret: CarParams, candidate: CAR, fingerprint, car_fw, experimental_long, docs): ret.carName = "subaru" ret.radarUnavailable = True # for HYBRID CARS to be upstreamed, we need: @@ -38,7 +39,7 @@ class CarInterface(CarInterfaceBase): if ret.flags & SubaruFlags.LKAS_ANGLE: ret.steerControlType = car.CarParams.SteerControlType.angle else: - CarInterfaceBase.configure_torque_tune(candidate, ret) + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) if candidate in (CAR.SUBARU_ASCENT, CAR.SUBARU_ASCENT_2023): ret.steerActuatorDelay = 0.3 # end-to-end angle controller diff --git a/selfdrive/car/tesla/interface.py b/selfdrive/car/tesla/interface.py index deb0e00230..9600cc2ebb 100755 --- a/selfdrive/car/tesla/interface.py +++ b/selfdrive/car/tesla/interface.py @@ -1,14 +1,15 @@ #!/usr/bin/env python3 from cereal import car from panda import Panda -from openpilot.selfdrive.car.tesla.values import CANBUS, CAR from openpilot.selfdrive.car import get_safety_config +from openpilot.selfdrive.car.data_structures import CarParams +from openpilot.selfdrive.car.tesla.values import CANBUS, CAR from openpilot.selfdrive.car.interfaces import CarInterfaceBase class CarInterface(CarInterfaceBase): @staticmethod - def _get_params(ret, candidate, fingerprint, car_fw, experimental_long, docs): + def _get_params(ret: CarParams, candidate, fingerprint, car_fw, experimental_long, docs): ret.carName = "tesla" # There is no safe way to do steer blending with user torque, diff --git a/selfdrive/car/toyota/interface.py b/selfdrive/car/toyota/interface.py index 8b2a7d58d7..054d2ac12a 100644 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -19,7 +19,7 @@ class CarInterface(CarInterfaceBase): return CarControllerParams.ACCEL_MIN, CarControllerParams.ACCEL_MAX @staticmethod - def _get_params(ret, candidate, fingerprint, car_fw, experimental_long, docs): + def _get_params(ret: CarParams, candidate, fingerprint, car_fw, experimental_long, docs): ret.carName = "toyota" ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.toyota)] ret.safetyConfigs[0].safetyParam = EPS_SCALE[candidate] @@ -36,7 +36,7 @@ class CarInterface(CarInterfaceBase): ret.steerActuatorDelay = 0.18 ret.steerLimitTimer = 0.8 else: - CarInterfaceBase.configure_torque_tune(candidate, ret) + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) ret.steerActuatorDelay = 0.12 # Default delay, Prius has larger delay ret.steerLimitTimer = 0.4 @@ -68,19 +68,19 @@ class CarInterface(CarInterfaceBase): elif candidate in (CAR.TOYOTA_RAV4_TSS2, CAR.TOYOTA_RAV4_TSS2_2022, CAR.TOYOTA_RAV4_TSS2_2023): ret.lateralTuning = CarParams.LateralPIDTuning() - ret.lateralTuning.kiBP = [0.0] - ret.lateralTuning.kpBP = [0.0] - ret.lateralTuning.kpV = [0.6] - ret.lateralTuning.kiV = [0.1] - ret.lateralTuning.kf = 0.00007818594 + ret.lateralTuning.pid.kiBP = [0.0] + ret.lateralTuning.pid.kpBP = [0.0] + ret.lateralTuning.pid.kpV = [0.6] + ret.lateralTuning.pid.kiV = [0.1] + ret.lateralTuning.pid.kf = 0.00007818594 # 2019+ RAV4 TSS2 uses two different steering racks and specific tuning seems to be necessary. # See https://github.com/commaai/openpilot/pull/21429#issuecomment-873652891 for fw in car_fw: if fw.ecu == "eps" and (fw.fwVersion.startswith(b'\x02') or fw.fwVersion in [b'8965B42181\x00\x00\x00\x00\x00\x00']): - ret.lateralTuning.kpV = [0.15] - ret.lateralTuning.kiV = [0.05] - ret.lateralTuning.kf = 0.00004 + ret.lateralTuning.pid.kpV = [0.15] + ret.lateralTuning.pid.kiV = [0.05] + ret.lateralTuning.pid.kf = 0.00004 break elif candidate in (CAR.TOYOTA_CHR, CAR.TOYOTA_CAMRY, CAR.TOYOTA_SIENNA, CAR.LEXUS_CTH, CAR.LEXUS_NX): diff --git a/selfdrive/car/volkswagen/interface.py b/selfdrive/car/volkswagen/interface.py index 1c11ab6746..b35ac6266e 100644 --- a/selfdrive/car/volkswagen/interface.py +++ b/selfdrive/car/volkswagen/interface.py @@ -1,6 +1,7 @@ from cereal import car from panda import Panda from openpilot.selfdrive.car import get_safety_config +from openpilot.selfdrive.car.data_structures import CarParams from openpilot.selfdrive.car.interfaces import CarInterfaceBase from openpilot.selfdrive.car.volkswagen.values import CAR, CANBUS, CarControllerParams, NetworkLocation, TransmissionType, GearShifter, VolkswagenFlags @@ -20,7 +21,7 @@ class CarInterface(CarInterfaceBase): self.cp_ext = self.cp_cam @staticmethod - def _get_params(ret, candidate: CAR, fingerprint, car_fw, experimental_long, docs): + def _get_params(ret: CarParams, candidate: CAR, fingerprint, car_fw, experimental_long, docs): ret.carName = "volkswagen" ret.radarUnavailable = True @@ -72,14 +73,14 @@ class CarInterface(CarInterfaceBase): ret.steerLimitTimer = 0.4 if ret.flags & VolkswagenFlags.PQ: ret.steerActuatorDelay = 0.2 - CarInterfaceBase.configure_torque_tune(candidate, ret) + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) else: ret.steerActuatorDelay = 0.1 - ret.lateralTuning.kpBP = [0.] - ret.lateralTuning.kiBP = [0.] - ret.lateralTuning.kf = 0.00006 - ret.lateralTuning.kpV = [0.6] - ret.lateralTuning.kiV = [0.2] + ret.lateralTuning.pid.kpBP = [0.] + ret.lateralTuning.pid.kiBP = [0.] + ret.lateralTuning.pid.kf = 0.00006 + ret.lateralTuning.pid.kpV = [0.6] + ret.lateralTuning.pid.kiV = [0.2] # Global longitudinal tuning defaults, can be overridden per-vehicle