#!/usr/bin/env python3
from cereal import car
from panda import Panda
from selfdrive . car import STD_CARGO_KG , scale_rot_inertia , scale_tire_stiffness , gen_empty_fingerprint , get_safety_config
from selfdrive . car . chrysler . values import CAR , DBC , RAM_CARS
from selfdrive . car . interfaces import CarInterfaceBase
class CarInterface ( CarInterfaceBase ) :
@staticmethod
def get_params ( candidate , fingerprint = gen_empty_fingerprint ( ) , car_fw = None , disable_radar = False ) :
ret = CarInterfaceBase . get_std_params ( candidate , fingerprint )
ret . carName = " chrysler "
ret . radarOffCan = DBC [ candidate ] [ ' radar ' ] is None
param = Panda . FLAG_CHRYSLER_RAM_DT if candidate in RAM_CARS else None
ret . safetyConfigs = [ get_safety_config ( car . CarParams . SafetyModel . chrysler , param ) ]
ret . steerActuatorDelay = 0.1
ret . steerLimitTimer = 0.4
ret . minSteerSpeed = 3.8 # m/s
if candidate in ( CAR . PACIFICA_2019_HYBRID , CAR . PACIFICA_2020 , CAR . JEEP_CHEROKEE_2019 ) :
# TODO: allow 2019 cars to steer down to 13 m/s if already engaged.
ret . minSteerSpeed = 17.5 # m/s 17 on the way up, 13 on the way down once engaged.
# Chrysler
if candidate in ( CAR . PACIFICA_2017_HYBRID , CAR . PACIFICA_2018 , CAR . PACIFICA_2018_HYBRID , CAR . PACIFICA_2019_HYBRID , CAR . PACIFICA_2020 ) :
ret . mass = 2242. + STD_CARGO_KG
ret . wheelbase = 3.089
ret . steerRatio = 16.2 # Pacifica Hybrid 2017
ret . lateralTuning . pid . kpBP , ret . lateralTuning . pid . kiBP = [ [ 9. , 20. ] , [ 9. , 20. ] ]
ret . lateralTuning . pid . kpV , ret . lateralTuning . pid . kiV = [ [ 0.15 , 0.30 ] , [ 0.03 , 0.05 ] ]
ret . lateralTuning . pid . kf = 0.00006
# Jeep
elif candidate in ( CAR . JEEP_CHEROKEE , CAR . JEEP_CHEROKEE_2019 ) :
ret . mass = 1778 + STD_CARGO_KG
ret . wheelbase = 2.71
ret . steerRatio = 16.7
ret . steerActuatorDelay = 0.2
ret . lateralTuning . pid . kpBP , ret . lateralTuning . pid . kiBP = [ [ 9. , 20. ] , [ 9. , 20. ] ]
ret . lateralTuning . pid . kpV , ret . lateralTuning . pid . kiV = [ [ 0.15 , 0.30 ] , [ 0.03 , 0.05 ] ]
ret . lateralTuning . pid . kf = 0.00006
# Ram
elif candidate == CAR . RAM_1500 :
ret . steerActuatorDelay = 0.2
ret . wheelbase = 3.88
ret . steerRatio = 16.3
ret . mass = 2493. + STD_CARGO_KG
CarInterfaceBase . configure_torque_tune ( candidate , ret . lateralTuning )
ret . minSteerSpeed = 14.5
if car_fw is not None :
for fw in car_fw :
if fw . ecu == ' eps ' and fw . fwVersion in ( b " 68312176AE " , b " 68312176AG " , b " 68273275AG " ) :
ret . minSteerSpeed = 0.
else :
raise ValueError ( f " Unsupported car: { candidate } " )
ret . centerToFront = ret . wheelbase * 0.44
# starting with reasonable value for civic and scaling by mass and wheelbase
ret . rotationalInertia = scale_rot_inertia ( ret . mass , ret . wheelbase )
# TODO: start from empirically derived lateral slip stiffness for the civic and scale by
# mass and CG position, so all cars will have approximately similar dyn behaviors
ret . tireStiffnessFront , ret . tireStiffnessRear = scale_tire_stiffness ( ret . mass , ret . wheelbase , ret . centerToFront )
ret . enableBsm = 720 in fingerprint [ 0 ]
return ret
def _update ( self , c ) :
ret = self . CS . update ( self . cp , self . cp_cam )
# events
events = self . create_common_events ( ret , extra_gears = [ car . CarState . GearShifter . low ] )
# Low speed steer alert hysteresis logic
if self . CP . minSteerSpeed > 0. and ret . vEgo < ( self . CP . minSteerSpeed + 0.5 ) :
self . low_speed_alert = True
elif ret . vEgo > ( self . CP . minSteerSpeed + 1. ) :
self . low_speed_alert = False
if self . low_speed_alert :
events . add ( car . CarEvent . EventName . belowSteerSpeed )
ret . events = events . to_msg ( )
return ret
def apply ( self , c ) :
return self . CC . update ( c , self . CS )