@ -1,5 +1,6 @@
#!/usr/bin/env python3
from cereal import car
from math import fabs
from selfdrive . config import Conversions as CV
from selfdrive . car . gm . values import CAR , CruiseButtons , \
AccState , CarControllerParams
@ -15,6 +16,21 @@ class CarInterface(CarInterfaceBase):
params = CarControllerParams ( )
return params . ACCEL_MIN , params . ACCEL_MAX
# Volt determined by iteratively plotting and minimizing error for f(angle, speed) = steer.
@staticmethod
def get_steer_feedforward_volt ( desired_angle , v_ego ) :
# maps [-inf,inf] to [-1,1]: sigmoid(34.4 deg) = sigmoid(1) = 0.5
# 1 / 0.02904609 = 34.4 deg ~= 36 deg ~= 1/10 circle? Arbitrary?
desired_angle * = 0.02904609
sigmoid = desired_angle / ( 1 + fabs ( desired_angle ) )
return 0.10006696 * sigmoid * ( v_ego + 3.12485927 )
def get_steer_feedforward_function ( self ) :
if self . CP . carFingerprint in [ CAR . VOLT ] :
return self . get_steer_feedforward_volt
else :
return CarInterfaceBase . get_steer_feedforward_default
@staticmethod
def get_params ( candidate , fingerprint = gen_empty_fingerprint ( ) , car_fw = None ) :
ret = CarInterfaceBase . get_std_params ( candidate , fingerprint )
@ -41,9 +57,17 @@ class CarInterface(CarInterfaceBase):
ret . minEnableSpeed = 18 * CV . MPH_TO_MS
ret . mass = 1607. + STD_CARGO_KG
ret . wheelbase = 2.69
ret . steerRatio = 15.7
ret . steerRatio = 17.7 # Stock 15.7, LiveParameters
tire_stiffness_factor = 0.469 # Stock Michelin Energy Saver A/S, LiveParameters
ret . steerRatioRear = 0.
ret . centerToFront = ret . wheelbase * 0.4 # wild guess
ret . centerToFront = ret . wheelbase * 0.45 # Volt Gen 1, TODO corner weigh
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 . MALIBU :
# supports stop and go, but initial engage must be above 18mph (which include conservatism)