Vehicles - Toyota - Longitudinal Tune - Cydia
Co-Authored-By: Irene <12470297+cydia2020@users.noreply.github.com>
This commit is contained in:
parent
4cc1c2dbca
commit
3642711e70
@ -10,6 +10,7 @@ from openpilot.selfdrive.car.toyota.values import CAR, STATIC_DSU_MSGS, NO_STOP_
|
|||||||
UNSUPPORTED_DSU_CAR, STOP_AND_GO_CAR
|
UNSUPPORTED_DSU_CAR, STOP_AND_GO_CAR
|
||||||
from opendbc.can.packer import CANPacker
|
from opendbc.can.packer import CANPacker
|
||||||
|
|
||||||
|
LongCtrlState = car.CarControl.Actuators.LongControlState
|
||||||
SteerControlType = car.CarParams.SteerControlType
|
SteerControlType = car.CarParams.SteerControlType
|
||||||
VisualAlert = car.CarControl.HUDControl.VisualAlert
|
VisualAlert = car.CarControl.HUDControl.VisualAlert
|
||||||
|
|
||||||
@ -32,6 +33,12 @@ UNLOCK_CMD = b'\x40\x05\x30\x11\x00\x40\x00\x00'
|
|||||||
|
|
||||||
PARK = car.CarState.GearShifter.park
|
PARK = car.CarState.GearShifter.park
|
||||||
|
|
||||||
|
# PCM compensatory force calculation threshold
|
||||||
|
# a variation in accel command is more pronounced at higher speeds, let compensatory forces ramp to zero before
|
||||||
|
# applying when speed is high
|
||||||
|
COMPENSATORY_CALCULATION_THRESHOLD_V = [-0.3, -0.25, 0.] # m/s^2
|
||||||
|
COMPENSATORY_CALCULATION_THRESHOLD_BP = [0., 11., 23.] # m/s
|
||||||
|
|
||||||
class CarController(CarControllerBase):
|
class CarController(CarControllerBase):
|
||||||
def __init__(self, dbc_name, CP, VM):
|
def __init__(self, dbc_name, CP, VM):
|
||||||
self.CP = CP
|
self.CP = CP
|
||||||
@ -41,6 +48,7 @@ class CarController(CarControllerBase):
|
|||||||
self.last_angle = 0
|
self.last_angle = 0
|
||||||
self.alert_active = False
|
self.alert_active = False
|
||||||
self.last_standstill = False
|
self.last_standstill = False
|
||||||
|
self.prohibit_neg_calculation = True
|
||||||
self.standstill_req = False
|
self.standstill_req = False
|
||||||
self.steer_rate_counter = 0
|
self.steer_rate_counter = 0
|
||||||
self.distance_button = 0
|
self.distance_button = 0
|
||||||
@ -52,6 +60,8 @@ class CarController(CarControllerBase):
|
|||||||
# FrogPilot variables
|
# FrogPilot variables
|
||||||
params = Params()
|
params = Params()
|
||||||
|
|
||||||
|
self.cydia_tune = params.get_bool("CydiaTune")
|
||||||
|
|
||||||
self.doors_locked = False
|
self.doors_locked = False
|
||||||
self.doors_unlocked = True
|
self.doors_unlocked = True
|
||||||
|
|
||||||
@ -60,6 +70,7 @@ class CarController(CarControllerBase):
|
|||||||
hud_control = CC.hudControl
|
hud_control = CC.hudControl
|
||||||
pcm_cancel_cmd = CC.cruiseControl.cancel
|
pcm_cancel_cmd = CC.cruiseControl.cancel
|
||||||
lat_active = CC.latActive and abs(CS.out.steeringTorque) < MAX_USER_TORQUE
|
lat_active = CC.latActive and abs(CS.out.steeringTorque) < MAX_USER_TORQUE
|
||||||
|
stopping = actuators.longControlState == LongCtrlState.stopping
|
||||||
|
|
||||||
# *** control msgs ***
|
# *** control msgs ***
|
||||||
can_sends = []
|
can_sends = []
|
||||||
@ -138,10 +149,30 @@ class CarController(CarControllerBase):
|
|||||||
interceptor_gas_cmd = 0.12 if CS.out.standstill else 0.
|
interceptor_gas_cmd = 0.12 if CS.out.standstill else 0.
|
||||||
else:
|
else:
|
||||||
interceptor_gas_cmd = 0.
|
interceptor_gas_cmd = 0.
|
||||||
if frogpilot_variables.sport_plus:
|
|
||||||
pcm_accel_cmd = clip(actuators.accel, self.params.ACCEL_MIN, self.params.ACCEL_MAX_PLUS)
|
# prohibit negative compensatory calculations when first activating long after accelerator depression or engagement
|
||||||
|
if not CC.longActive:
|
||||||
|
self.prohibit_neg_calculation = True
|
||||||
|
|
||||||
|
comp_thresh = interp(CS.out.vEgo, COMPENSATORY_CALCULATION_THRESHOLD_BP, COMPENSATORY_CALCULATION_THRESHOLD_V)
|
||||||
|
# don't reset until a reasonable compensatory value is reached
|
||||||
|
if CS.pcm_neutral_force > comp_thresh * self.CP.mass:
|
||||||
|
self.prohibit_neg_calculation = False
|
||||||
|
|
||||||
|
# limit minimum to only positive until first positive is reached after engagement, don't calculate when long isn't active
|
||||||
|
if CC.longActive and not self.prohibit_neg_calculation and self.cydia_tune:
|
||||||
|
accel_offset = CS.pcm_neutral_force / self.CP.mass
|
||||||
else:
|
else:
|
||||||
pcm_accel_cmd = clip(actuators.accel, self.params.ACCEL_MIN, self.params.ACCEL_MAX)
|
accel_offset = 0.
|
||||||
|
|
||||||
|
# only calculate pcm_accel_cmd when long is active to prevent disengagement from accelerator depression
|
||||||
|
if CC.longActive:
|
||||||
|
if frogpilot_variables.sport_plus:
|
||||||
|
pcm_accel_cmd = clip(actuators.accel + accel_offset, self.params.ACCEL_MIN, self.params.ACCEL_MAX_PLUS)
|
||||||
|
else:
|
||||||
|
pcm_accel_cmd = clip(actuators.accel + accel_offset, self.params.ACCEL_MIN, self.params.ACCEL_MAX)
|
||||||
|
else:
|
||||||
|
pcm_accel_cmd = 0.
|
||||||
|
|
||||||
# TODO: probably can delete this. CS.pcm_acc_status uses a different signal
|
# TODO: probably can delete this. CS.pcm_acc_status uses a different signal
|
||||||
# than CS.cruiseState.enabled. confirm they're not meaningfully different
|
# than CS.cruiseState.enabled. confirm they're not meaningfully different
|
||||||
@ -164,6 +195,8 @@ class CarController(CarControllerBase):
|
|||||||
# we can spam can to cancel the system even if we are using lat only control
|
# we can spam can to cancel the system even if we are using lat only control
|
||||||
if (self.frame % 3 == 0 and self.CP.openpilotLongitudinalControl) or pcm_cancel_cmd:
|
if (self.frame % 3 == 0 and self.CP.openpilotLongitudinalControl) or pcm_cancel_cmd:
|
||||||
lead = hud_control.leadVisible or CS.out.vEgo < 12. # at low speed we always assume the lead is present so ACC can be engaged
|
lead = hud_control.leadVisible or CS.out.vEgo < 12. # at low speed we always assume the lead is present so ACC can be engaged
|
||||||
|
# when stopping, send -2.5 raw acceleration immediately to prevent vehicle from creeping, else send actuators.accel
|
||||||
|
accel_raw = -2.5 if stopping and self.cydia_tune else actuators.accel
|
||||||
|
|
||||||
# Press distance button until we are at the correct bar length. Only change while enabled to avoid skipping startup popup
|
# Press distance button until we are at the correct bar length. Only change while enabled to avoid skipping startup popup
|
||||||
if self.frame % 6 == 0 and self.CP.openpilotLongitudinalControl:
|
if self.frame % 6 == 0 and self.CP.openpilotLongitudinalControl:
|
||||||
@ -177,11 +210,11 @@ class CarController(CarControllerBase):
|
|||||||
if pcm_cancel_cmd and self.CP.carFingerprint in UNSUPPORTED_DSU_CAR:
|
if pcm_cancel_cmd and self.CP.carFingerprint in UNSUPPORTED_DSU_CAR:
|
||||||
can_sends.append(toyotacan.create_acc_cancel_command(self.packer))
|
can_sends.append(toyotacan.create_acc_cancel_command(self.packer))
|
||||||
elif self.CP.openpilotLongitudinalControl:
|
elif self.CP.openpilotLongitudinalControl:
|
||||||
can_sends.append(toyotacan.create_accel_command(self.packer, pcm_accel_cmd, pcm_cancel_cmd, self.standstill_req, lead, CS.acc_type, fcw_alert,
|
can_sends.append(toyotacan.create_accel_command(self.packer, pcm_accel_cmd, accel_raw, pcm_cancel_cmd, self.standstill_req, lead, CS.acc_type, fcw_alert,
|
||||||
self.distance_button, frogpilot_variables))
|
self.distance_button, frogpilot_variables))
|
||||||
self.accel = pcm_accel_cmd
|
self.accel = pcm_accel_cmd
|
||||||
else:
|
else:
|
||||||
can_sends.append(toyotacan.create_accel_command(self.packer, 0, pcm_cancel_cmd, False, lead, CS.acc_type, False, self.distance_button, frogpilot_variables))
|
can_sends.append(toyotacan.create_accel_command(self.packer, 0, 0, pcm_cancel_cmd, False, lead, CS.acc_type, False, self.distance_button, frogpilot_variables))
|
||||||
|
|
||||||
if self.frame % 2 == 0 and self.CP.enableGasInterceptor and self.CP.openpilotLongitudinalControl:
|
if self.frame % 2 == 0 and self.CP.enableGasInterceptor and self.CP.openpilotLongitudinalControl:
|
||||||
# send exactly zero if gas cmd is zero. Interceptor will send the max between read value and gas cmd.
|
# send exactly zero if gas cmd is zero. Interceptor will send the max between read value and gas cmd.
|
||||||
|
@ -179,6 +179,7 @@ class CarState(CarStateBase):
|
|||||||
ret.cruiseState.standstill = self.pcm_acc_status == 7
|
ret.cruiseState.standstill = self.pcm_acc_status == 7
|
||||||
ret.cruiseState.enabled = bool(cp.vl["PCM_CRUISE"]["CRUISE_ACTIVE"])
|
ret.cruiseState.enabled = bool(cp.vl["PCM_CRUISE"]["CRUISE_ACTIVE"])
|
||||||
ret.cruiseState.nonAdaptive = cp.vl["PCM_CRUISE"]["CRUISE_STATE"] in (1, 2, 3, 4, 5, 6)
|
ret.cruiseState.nonAdaptive = cp.vl["PCM_CRUISE"]["CRUISE_STATE"] in (1, 2, 3, 4, 5, 6)
|
||||||
|
self.pcm_neutral_force = cp.vl["PCM_CRUISE"]["NEUTRAL_FORCE"]
|
||||||
|
|
||||||
ret.genericToggle = bool(cp.vl["LIGHT_STALK"]["AUTO_HIGH_BEAM"])
|
ret.genericToggle = bool(cp.vl["LIGHT_STALK"]["AUTO_HIGH_BEAM"])
|
||||||
ret.espDisabled = cp.vl["ESP_CONTROL"]["TC_DISABLED"] != 0
|
ret.espDisabled = cp.vl["ESP_CONTROL"]["TC_DISABLED"] != 0
|
||||||
|
@ -144,7 +144,17 @@ class CarInterface(CarInterfaceBase):
|
|||||||
tune = ret.longitudinalTuning
|
tune = ret.longitudinalTuning
|
||||||
tune.deadzoneBP = [0., 9.]
|
tune.deadzoneBP = [0., 9.]
|
||||||
tune.deadzoneV = [.0, .15]
|
tune.deadzoneV = [.0, .15]
|
||||||
if candidate in TSS2_CAR or ret.enableGasInterceptor:
|
if params.get_bool("CydiaTune"):
|
||||||
|
# on stock Toyota this is -2.5
|
||||||
|
ret.stopAccel = -2.5
|
||||||
|
tune.deadzoneBP = [0., 16., 20., 30.]
|
||||||
|
tune.deadzoneV = [.04, .05, .08, .15]
|
||||||
|
ret.stoppingDecelRate = 0.17
|
||||||
|
tune.kpBP = [0., 5.]
|
||||||
|
tune.kpV = [0.8, 1.]
|
||||||
|
tune.kiBP = [0., 5.]
|
||||||
|
tune.kiV = [0.3, 1.]
|
||||||
|
elif candidate in TSS2_CAR or ret.enableGasInterceptor:
|
||||||
tune.kpBP = [0., 5., 20.]
|
tune.kpBP = [0., 5., 20.]
|
||||||
tune.kpV = [1.3, 1.0, 0.7]
|
tune.kpV = [1.3, 1.0, 0.7]
|
||||||
tune.kiBP = [0., 5., 12., 20., 27.]
|
tune.kiBP = [0., 5., 12., 20., 27.]
|
||||||
|
@ -33,10 +33,10 @@ def create_lta_steer_command(packer, steer_control_type, steer_angle, steer_req,
|
|||||||
return packer.make_can_msg("STEERING_LTA", 0, values)
|
return packer.make_can_msg("STEERING_LTA", 0, values)
|
||||||
|
|
||||||
|
|
||||||
def create_accel_command(packer, accel, pcm_cancel, standstill_req, lead, acc_type, fcw_alert, distance, frogpilot_variables):
|
def create_accel_command(packer, accel, accel_raw, pcm_cancel, standstill_req, lead, acc_type, fcw_alert, distance, frogpilot_variables):
|
||||||
# TODO: find the exact canceling bit that does not create a chime
|
# TODO: find the exact canceling bit that does not create a chime
|
||||||
values = {
|
values = {
|
||||||
"ACCEL_CMD": accel,
|
"ACCEL_CMD": accel, # compensated accel command
|
||||||
"ACC_TYPE": acc_type,
|
"ACC_TYPE": acc_type,
|
||||||
"DISTANCE": distance,
|
"DISTANCE": distance,
|
||||||
"MINI_CAR": lead,
|
"MINI_CAR": lead,
|
||||||
@ -45,6 +45,7 @@ def create_accel_command(packer, accel, pcm_cancel, standstill_req, lead, acc_ty
|
|||||||
"CANCEL_REQ": pcm_cancel,
|
"CANCEL_REQ": pcm_cancel,
|
||||||
"ALLOW_LONG_PRESS": 2 if frogpilot_variables.reverse_cruise_increase else 1,
|
"ALLOW_LONG_PRESS": 2 if frogpilot_variables.reverse_cruise_increase else 1,
|
||||||
"ACC_CUT_IN": fcw_alert, # only shown when ACC enabled
|
"ACC_CUT_IN": fcw_alert, # only shown when ACC enabled
|
||||||
|
"ACCEL_CMD_ALT": accel_raw, # raw accel command, pcm uses this to calculate a compensatory force
|
||||||
}
|
}
|
||||||
return packer.make_can_msg("ACC_CONTROL", 0, values)
|
return packer.make_can_msg("ACC_CONTROL", 0, values)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user