GM truck gas tune

Co-Authored-By: garrettpall <76917194+garrettpall@users.noreply.github.com>
This commit is contained in:
FrogAi
2024-02-27 16:34:47 -07:00
parent 56f43a6494
commit 1d3a40aa7e
8 changed files with 37 additions and 25 deletions

View File

@@ -270,6 +270,7 @@ std::unordered_map<std::string, uint32_t> keys = {
{"FrogsGoMoo", PERSISTENT}, {"FrogsGoMoo", PERSISTENT},
{"FrogsGoMooTune", PERSISTENT}, {"FrogsGoMooTune", PERSISTENT},
{"FullMap", PERSISTENT}, {"FullMap", PERSISTENT},
{"GasRegenCmd", PERSISTENT},
{"GoatScream", PERSISTENT}, {"GoatScream", PERSISTENT},
{"LaneLinesWidth", PERSISTENT}, {"LaneLinesWidth", PERSISTENT},
{"LateralTune", PERSISTENT}, {"LateralTune", PERSISTENT},

View File

@@ -211,15 +211,14 @@ BO_ 711 BECMBatteryVoltageCurrent: 6 K17_EBCM
SG_ HVBatteryCurrent : 12|13@0- (0.15,0) [-614.4|614.25] "A" NEO SG_ HVBatteryCurrent : 12|13@0- (0.15,0) [-614.4|614.25] "A" NEO
BO_ 715 ASCMGasRegenCmd: 8 K124_ASCM BO_ 715 ASCMGasRegenCmd: 8 K124_ASCM
SG_ GasRegenAlwaysOne2 : 9|1@0+ (1,0) [0|1] "" NEO SG_ GasRegenCmdActive : 0|1@0+ (1,0) [0|0] "" NEO
SG_ GasRegenAlwaysOne : 14|1@0+ (1,0) [0|1] "" NEO SG_ RollingCounter : 7|2@0+ (1,0) [0|0] "" NEO
SG_ GasRegenChecksum : 47|24@0+ (1,0) [0|0] "" NEO SG_ GasRegenCmd : 8|14@0+ (1,0) [0|0] "" NEO
SG_ GasRegenCmdActiveInv : 32|1@0+ (1,0) [0|0] "" NEO SG_ GasRegenAlwaysOne2 : 9|1@0+ (1,0) [0|1] "" NEO
SG_ GasRegenFullStopActive : 13|1@0+ (1,0) [0|0] "" NEO SG_ GasRegenFullStopActive : 13|1@0+ (1,0) [0|0] "" NEO
SG_ GasRegenCmdActive : 0|1@0+ (1,0) [0|0] "" NEO SG_ GasRegenAlwaysOne : 14|1@0+ (1,0) [0|1] "" NEO
SG_ RollingCounter : 7|2@0+ (1,0) [0|0] "" NEO SG_ GasRegenCmdActiveInv : 32|1@0+ (1,0) [0|0] "" NEO
SG_ GasRegenAlwaysOne3 : 23|1@0+ (1,0) [0|1] "" NEO SG_ GasRegenChecksum : 47|24@0+ (1,0) [0|0] "" NEO
SG_ GasRegenCmd : 22|12@0+ (1,0) [0|0] "" NEO
BO_ 717 ASCM_2CD: 5 K124_ASCM BO_ 717 ASCM_2CD: 5 K124_ASCM

View File

@@ -18,8 +18,8 @@ const LongitudinalLimits GM_ASCM_LONG_LIMITS = {
const LongitudinalLimits GM_ASCM_LONG_LIMITS_SPORT = { const LongitudinalLimits GM_ASCM_LONG_LIMITS_SPORT = {
.max_gas = 8191, .max_gas = 8191,
.min_gas = 1404, .min_gas = 5500,
.inactive_gas = 1404, .inactive_gas = 5500,
.max_brake = 400, .max_brake = 400,
}; };
@@ -32,8 +32,8 @@ const LongitudinalLimits GM_CAM_LONG_LIMITS = {
const LongitudinalLimits GM_CAM_LONG_LIMITS_SPORT = { const LongitudinalLimits GM_CAM_LONG_LIMITS_SPORT = {
.max_gas = 8848, .max_gas = 8848,
.min_gas = 1514, .min_gas = 5610,
.inactive_gas = 1554, .inactive_gas = 5650,
.max_brake = 400, .max_brake = 400,
}; };
@@ -196,7 +196,7 @@ static bool gm_tx_hook(const CANPacket_t *to_send) {
// GAS/REGEN: safety check // GAS/REGEN: safety check
if (addr == 0x2CB) { if (addr == 0x2CB) {
bool apply = GET_BIT(to_send, 0U); bool apply = GET_BIT(to_send, 0U);
int gas_regen = ((GET_BYTE(to_send, 2) & 0x7FU) << 5) + ((GET_BYTE(to_send, 3) & 0xF8U) >> 3); int gas_regen = ((GET_BYTE(to_send, 1) & 0x1U) << 13) + ((GET_BYTE(to_send, 2) & 0xFFU) << 5) + ((GET_BYTE(to_send, 3) & 0xF8U) >> 3);
bool violation = false; bool violation = false;
// Allow apply bit in pre-enabled and overriding states // Allow apply bit in pre-enabled and overriding states

View File

@@ -65,7 +65,6 @@ def create_gas_regen_command(packer, bus, throttle, idx, enabled, at_full_stop):
"GasRegenFullStopActive": at_full_stop, "GasRegenFullStopActive": at_full_stop,
"GasRegenAlwaysOne": 1, "GasRegenAlwaysOne": 1,
"GasRegenAlwaysOne2": 1, "GasRegenAlwaysOne2": 1,
"GasRegenAlwaysOne3": 1,
} }
dat = packer.make_can_msg("ASCMGasRegenCmd", bus, values)[2] dat = packer.make_can_msg("ASCMGasRegenCmd", bus, values)[2]

View File

@@ -8,7 +8,7 @@ from openpilot.common.basedir import BASEDIR
from openpilot.common.conversions import Conversions as CV from openpilot.common.conversions import Conversions as CV
from openpilot.selfdrive.car import create_button_events, get_safety_config from openpilot.selfdrive.car import create_button_events, get_safety_config
from openpilot.selfdrive.car.gm.radar_interface import RADAR_HEADER_MSG 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, GMFlags, CC_ONLY_CAR, SDGM_CAR from openpilot.selfdrive.car.gm.values import CAR, CruiseButtons, CarControllerParams, EV_CAR, CAMERA_ACC_CAR, CanBus, GMFlags, CC_ONLY_CAR, SDGM_CAR, SLOW_ACC
from openpilot.selfdrive.car.interfaces import CarInterfaceBase, TorqueFromLateralAccelCallbackType, FRICTION_THRESHOLD, LatControlInputs, NanoFFModel from openpilot.selfdrive.car.interfaces import CarInterfaceBase, TorqueFromLateralAccelCallbackType, FRICTION_THRESHOLD, LatControlInputs, NanoFFModel
from openpilot.selfdrive.controls.lib.drive_helpers import get_friction from openpilot.selfdrive.controls.lib.drive_helpers import get_friction
@@ -122,6 +122,10 @@ class CarInterface(CarInterfaceBase):
ret.vEgoStopping = 0.25 ret.vEgoStopping = 0.25
ret.vEgoStarting = 0.25 ret.vEgoStarting = 0.25
if candidate in SLOW_ACC and params.get_bool("GasRegenCmd"):
ret.longitudinalTuning.kpV = [1.5, 1.125]
ret.stopAccel = -0.25
if experimental_long: if experimental_long:
ret.pcmCruise = False ret.pcmCruise = False
ret.openpilotLongitudinalControl = True and not params.get_bool("DisableOpenpilotLongitudinal") ret.openpilotLongitudinalControl = True and not params.get_bool("DisableOpenpilotLongitudinal")

View File

@@ -38,18 +38,23 @@ class CarControllerParams:
def __init__(self, CP): def __init__(self, CP):
# Gas/brake lookups # Gas/brake lookups
self.ZERO_GAS = 2048 # Coasting self.ZERO_GAS = 6144 # Coasting
self.MAX_BRAKE = 400 # ~ -4.0 m/s^2 with regen self.MAX_BRAKE = 400 # ~ -4.0 m/s^2 with regen
if CP.carFingerprint in CAMERA_ACC_CAR and CP.carFingerprint not in CC_ONLY_CAR: if CP.carFingerprint in CAMERA_ACC_CAR and CP.carFingerprint not in CC_ONLY_CAR:
self.MAX_GAS = 3400 self.MAX_GAS = 7496
self.MAX_GAS_PLUS = 8848 self.MAX_GAS_PLUS = 8848
self.MAX_ACC_REGEN = 1514 self.MAX_ACC_REGEN = 5610
self.INACTIVE_REGEN = 1554 self.INACTIVE_REGEN = 5650
# Camera ACC vehicles have no regen while enabled. # Camera ACC vehicles have no regen while enabled.
# Camera transitions to MAX_ACC_REGEN from ZERO_GAS and uses friction brakes instantly # Camera transitions to MAX_ACC_REGEN from ZERO_GAS and uses friction brakes instantly
max_regen_acceleration = 0. max_regen_acceleration = 0.
if CP.carFingerprint in SLOW_ACC and Params().get_bool("GasRegenCmd"):
self.MAX_GAS = 8650
self.MAX_GAS_PLUS = 8650 # Don't Stack Extra Speed
self.ACCEL_MAX_PLUS = 2
elif CP.carFingerprint in SDGM_CAR: elif CP.carFingerprint in SDGM_CAR:
self.MAX_GAS = 7496 self.MAX_GAS = 7496
self.MAX_GAS_PLUS = 7496 self.MAX_GAS_PLUS = 7496
@@ -58,10 +63,10 @@ class CarControllerParams:
max_regen_acceleration = 0. max_regen_acceleration = 0.
else: else:
self.MAX_GAS = 3072 # Safety limit, not ACC max. Stock ACC >4096 from standstill. self.MAX_GAS = 7168 # Safety limit, not ACC max. Stock ACC >8192 from standstill.
self.MAX_GAS_PLUS = 8191 # 8292 uses new bit, possible but not tested. Matches Twilsonco tw-main max self.MAX_GAS_PLUS = 8191 # 8292 uses new bit, possible but not tested. Matches Twilsonco tw-main max
self.MAX_ACC_REGEN = 1404 # Max ACC regen is slightly less than max paddle regen self.MAX_ACC_REGEN = 5500 # Max ACC regen is slightly less than max paddle regen
self.INACTIVE_REGEN = 1404 self.INACTIVE_REGEN = 5500
# ICE has much less engine braking force compared to regen in EVs, # ICE has much less engine braking force compared to regen in EVs,
# lower threshold removes some braking deadzone # lower threshold removes some braking deadzone
max_regen_acceleration = -1. if CP.carFingerprint in EV_CAR else -0.1 max_regen_acceleration = -1. if CP.carFingerprint in EV_CAR else -0.1
@@ -229,6 +234,9 @@ CC_ONLY_CAR = {CAR.VOLT_CC, CAR.BOLT_CC, CAR.EQUINOX_CC, CAR.SUBURBAN_CC, CAR.YU
# We're integrated at the Safety Data Gateway Module on these cars # We're integrated at the Safety Data Gateway Module on these cars
SDGM_CAR = {CAR.XT4} SDGM_CAR = {CAR.XT4}
# Slow acceleration cars
SLOW_ACC = {CAR.SILVERADO}
# We're integrated at the camera with VOACC on these cars (instead of ASCM w/ OBD-II harness) # We're integrated at the camera with VOACC on these cars (instead of ASCM w/ OBD-II harness)
CAMERA_ACC_CAR = {CAR.BOLT_EUV, CAR.SILVERADO, CAR.EQUINOX, CAR.TRAILBLAZER} CAMERA_ACC_CAR = {CAR.BOLT_EUV, CAR.SILVERADO, CAR.EQUINOX, CAR.TRAILBLAZER}
CAMERA_ACC_CAR.update({CAR.VOLT_CC, CAR.BOLT_CC, CAR.EQUINOX_CC, CAR.YUKON_CC, CAR.CT6_CC, CAR.TRAILBLAZER_CC}) CAMERA_ACC_CAR.update({CAR.VOLT_CC, CAR.BOLT_CC, CAR.EQUINOX_CC, CAR.YUKON_CC, CAR.CT6_CC, CAR.TRAILBLAZER_CC})

View File

@@ -110,6 +110,7 @@ FrogPilotVehiclesPanel::FrogPilotVehiclesPanel(SettingsWindow *parent) : FrogPil
}); });
std::vector<std::tuple<QString, QString, QString, QString>> vehicleToggles { std::vector<std::tuple<QString, QString, QString, QString>> vehicleToggles {
{"GasRegenCmd", "GM Truck Gas Tune", "Increase acceleration and smoothen brake to stop. For use on Silverado/Sierra only.", ""},
{"LongPitch", "Long Pitch Compensation", "Reduce speed and acceleration error for greater passenger comfort and improved vehicle efficiency.", ""}, {"LongPitch", "Long Pitch Compensation", "Reduce speed and acceleration error for greater passenger comfort and improved vehicle efficiency.", ""},
{"LongitudinalTune", "Longitudinal Tune", "Use a custom Toyota longitudinal tune.\n\nCydia = More focused on TSS-P vehicles but works for all Toyotas\n\nDragonPilot = Focused on TSS2 vehicles\n\nFrogPilot = Takes the best of both worlds with some personal tweaks focused around my 2019 Lexus ES 350", ""}, {"LongitudinalTune", "Longitudinal Tune", "Use a custom Toyota longitudinal tune.\n\nCydia = More focused on TSS-P vehicles but works for all Toyotas\n\nDragonPilot = Focused on TSS2 vehicles\n\nFrogPilot = Takes the best of both worlds with some personal tweaks focused around my 2019 Lexus ES 350", ""},
@@ -152,7 +153,7 @@ FrogPilotVehiclesPanel::FrogPilotVehiclesPanel(SettingsWindow *parent) : FrogPil
}); });
} }
std::set<std::string> rebootKeys = {}; std::set<std::string> rebootKeys = {"GasRegenCmd"};
for (const std::string &key : rebootKeys) { for (const std::string &key : rebootKeys) {
QObject::connect(toggles[key], &ToggleControl::toggleFlipped, [this]() { QObject::connect(toggles[key], &ToggleControl::toggleFlipped, [this]() {
if (started) { if (started) {

View File

@@ -28,7 +28,7 @@ private:
std::map<std::string, ParamControl*> toggles; std::map<std::string, ParamControl*> toggles;
std::set<QString> gmKeys = {"LongPitch"}; std::set<QString> gmKeys = {"GasRegenCmd", "LongPitch"};
std::set<QString> subaruKeys = {}; std::set<QString> subaruKeys = {};
std::set<QString> toyotaKeys = {"LongitudinalTune"}; std::set<QString> toyotaKeys = {"LongitudinalTune"};