|
|
|
from collections import defaultdict
|
|
|
|
from dataclasses import dataclass
|
|
|
|
from enum import Enum, StrEnum
|
|
|
|
from typing import Dict, List, Union
|
|
|
|
|
|
|
|
from cereal import car
|
|
|
|
from openpilot.selfdrive.car import dbc_dict
|
|
|
|
from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Column
|
|
|
|
Ecu = car.CarParams.Ecu
|
|
|
|
|
|
|
|
|
|
|
|
class CarControllerParams:
|
|
|
|
STEER_MAX = 300 # GM limit is 3Nm. Used by carcontroller to generate LKA output
|
|
|
|
STEER_STEP = 3 # Active control frames per command (~33hz)
|
|
|
|
INACTIVE_STEER_STEP = 10 # Inactive control frames per command (10hz)
|
|
|
|
STEER_DELTA_UP = 10 # Delta rates require review due to observed EPS weakness
|
|
|
|
STEER_DELTA_DOWN = 15
|
|
|
|
STEER_DRIVER_ALLOWANCE = 65
|
|
|
|
STEER_DRIVER_MULTIPLIER = 4
|
|
|
|
STEER_DRIVER_FACTOR = 100
|
|
|
|
NEAR_STOP_BRAKE_PHASE = 0.5 # m/s
|
|
|
|
|
|
|
|
# Heartbeat for dash "Service Adaptive Cruise" and "Service Front Camera"
|
|
|
|
ADAS_KEEPALIVE_STEP = 100
|
|
|
|
CAMERA_KEEPALIVE_STEP = 100
|
|
|
|
|
|
|
|
# Allow small margin below -3.5 m/s^2 from ISO 15622:2018 since we
|
|
|
|
# perform the closed loop control, and might need some
|
|
|
|
# to apply some more braking if we're on a downhill slope.
|
|
|
|
# Our controller should still keep the 2 second average above
|
|
|
|
# -3.5 m/s^2 as per planner limits
|
|
|
|
ACCEL_MAX = 2. # m/s^2
|
|
|
|
ACCEL_MIN = -4. # m/s^2
|
|
|
|
|
|
|
|
def __init__(self, CP):
|
|
|
|
# Gas/brake lookups
|
|
|
|
self.ZERO_GAS = 2048 # Coasting
|
|
|
|
self.MAX_BRAKE = 400 # ~ -4.0 m/s^2 with regen
|
|
|
|
|
|
|
|
if CP.carFingerprint in CAMERA_ACC_CAR:
|
|
|
|
self.MAX_GAS = 3400
|
|
|
|
self.MAX_ACC_REGEN = 1514
|
|
|
|
self.INACTIVE_REGEN = 1554
|
|
|
|
# Camera ACC vehicles have no regen while enabled.
|
|
|
|
# Camera transitions to MAX_ACC_REGEN from ZERO_GAS and uses friction brakes instantly
|
|
|
|
max_regen_acceleration = 0.
|
|
|
|
|
|
|
|
else:
|
|
|
|
self.MAX_GAS = 3072 # Safety limit, not ACC max. Stock ACC >4096 from standstill.
|
|
|
|
self.MAX_ACC_REGEN = 1404 # Max ACC regen is slightly less than max paddle regen
|
|
|
|
self.INACTIVE_REGEN = 1404
|
|
|
|
# ICE has much less engine braking force compared to regen in EVs,
|
|
|
|
# lower threshold removes some braking deadzone
|
|
|
|
max_regen_acceleration = -1. if CP.carFingerprint in EV_CAR else -0.1
|
|
|
|
|
|
|
|
self.GAS_LOOKUP_BP = [max_regen_acceleration, 0., self.ACCEL_MAX]
|
|
|
|
self.GAS_LOOKUP_V = [self.MAX_ACC_REGEN, self.ZERO_GAS, self.MAX_GAS]
|
|
|
|
|
|
|
|
self.BRAKE_LOOKUP_BP = [self.ACCEL_MIN, max_regen_acceleration]
|
|
|
|
self.BRAKE_LOOKUP_V = [self.MAX_BRAKE, 0.]
|
|
|
|
|
|
|
|
|
|
|
|
class CAR(StrEnum):
|
|
|
|
HOLDEN_ASTRA = "HOLDEN ASTRA RS-V BK 2017"
|
|
|
|
VOLT = "CHEVROLET VOLT PREMIER 2017"
|
|
|
|
CADILLAC_ATS = "CADILLAC ATS Premium Performance 2018"
|
|
|
|
MALIBU = "CHEVROLET MALIBU PREMIER 2017"
|
|
|
|
ACADIA = "GMC ACADIA DENALI 2018"
|
GM: Buick LaCrosse 2017-19 support (#27332)
* Added Buick LaCrosse 2017
* Added Buick LaCrosse as candidate
* Added Buick LaCrosse CAR_INFO and Fingerprint
* Added Buick LaCrosse to non_tested_cars
* Added Buick LaCrosse
* Updated number of supported cars to 237
* Added ACC and LKAS description to Buick LaCrosse
* Updated CAR_INFO for Buick LaCrosse
* Added the Escalade which was recently updated
* Update selfdrive/car/gm/values.py
Suggested fingerprint by @sshane
Co-authored-by: Shane Smiskol <shane@smiskol.com>
* Premium is a trim with ACC. Use package name instead
* lacrosse custom FF;
fit info:
describe(steer_offsets) = DescribeResult(nobs=1649402, minmax=(-0.7127894163131714, 5.3997602462768555), mean=3.3090523060153645, variance=0.3130325564084465, skewness=-1.5986155151533736, kurtosis=8.18810418298873)
Samples: 1357787
Regularizing...
Regularized samples: 1140
speed: DescribeResult(nobs=1140, minmax=(8.478170424241286, 35.837870224662446), mean=27.888804767013475, variance=34.16742353763829, skewness=-1.068587303119431, kurtosis=0.6193071765927134)
angle: DescribeResult(nobs=1140, minmax=(-21.057768565637094, 28.516874490999708), mean=-0.4328602593886506, variance=43.19046813273241, skewness=0.001966426701503317, kurtosis=0.20547357649038434)
steer: DescribeResult(nobs=1140, minmax=(-0.8432471203007578, 0.9634959333674695), mean=-0.021981142946747863, variance=0.20152217060233915, skewness=0.03202313890158864, kurtosis=-1.2318826088567174)
Performing fit...
Fit: [5.85397825e-01 3.27650818e-01 4.60531117e-03 1.32307599e+01
1.37194709e-01 1.33099557e-01 6.14782304e-02]
ANGLE_COEF = 0.58539783
ANGLE_COEF2 = 0.32765082
ANGLE_OFFSET = 0.00460531
SPEED_OFFSET = 13.23075991
SIGMOID_COEF_RIGHT = 0.13719471
SIGMOID_COEF_LEFT = 0.13309956
SPEED_COEF = 0.06147823
MAE old 0.2098, new 0.0309
STD old 0.1021, new 0.0273
deg 00-03:457, deg 03-06:258, deg 06-09:218, deg 09-12:132, deg 12-15:62
deg 15-18:6, deg 18-21:4, deg 21-24:1, deg 24-27:0, deg 27-30:2
deg 30-33:0, deg 33-36:0, deg 36-39:0, deg 39-42:0, deg 42-45:0
mph 10-15:0, mph 15-20:1, mph 20-25:18, mph 25-30:12, mph 30-35:30
mph 35-40:26, mph 40-45:52, mph 45-50:54, mph 50-55:73, mph 55-60:86
mph 60-65:204, mph 65-70:228, mph 70-75:179, mph 75-80:176, mph 80-85:1
mph 85-90:0,
* Update routes.py
* remove from non tested routes
* use torque controller
* update docs
* update releases
---------
Co-authored-by: Shane Smiskol <shane@smiskol.com>
Co-authored-by: Tim Wilson <twilsonco@gmail.com>
2 years ago
|
|
|
BUICK_LACROSSE = "BUICK LACROSSE 2017"
|
|
|
|
BUICK_REGAL = "BUICK REGAL ESSENCE 2018"
|
|
|
|
ESCALADE = "CADILLAC ESCALADE 2017"
|
|
|
|
ESCALADE_ESV = "CADILLAC ESCALADE ESV 2016"
|
|
|
|
ESCALADE_ESV_2019 = "CADILLAC ESCALADE ESV 2019"
|
|
|
|
BOLT_EUV = "CHEVROLET BOLT EUV 2022"
|
|
|
|
SILVERADO = "CHEVROLET SILVERADO 1500 2020"
|
|
|
|
EQUINOX = "CHEVROLET EQUINOX 2019"
|
|
|
|
TRAILBLAZER = "CHEVROLET TRAILBLAZER 2021"
|
|
|
|
|
|
|
|
|
|
|
|
class Footnote(Enum):
|
|
|
|
OBD_II = CarFootnote(
|
|
|
|
'Requires a <a href="https://github.com/commaai/openpilot/wiki/GM#hardware" target="_blank">community built ASCM harness</a>. ' +
|
|
|
|
'<b><i>NOTE: disconnecting the ASCM disables Automatic Emergency Braking (AEB).</i></b>',
|
|
|
|
Column.MODEL)
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
|
|
|
class GMCarInfo(CarInfo):
|
|
|
|
package: str = "Adaptive Cruise Control (ACC)"
|
|
|
|
|
|
|
|
def init_make(self, CP: car.CarParams):
|
|
|
|
if CP.networkLocation == car.CarParams.NetworkLocation.fwdCamera:
|
|
|
|
self.car_parts = CarParts.common([CarHarness.gm])
|
|
|
|
else:
|
|
|
|
self.car_parts = CarParts.common([CarHarness.obd_ii])
|
|
|
|
self.footnotes.append(Footnote.OBD_II)
|
|
|
|
|
|
|
|
|
|
|
|
CAR_INFO: Dict[str, Union[GMCarInfo, List[GMCarInfo]]] = {
|
|
|
|
CAR.HOLDEN_ASTRA: GMCarInfo("Holden Astra 2017"),
|
|
|
|
CAR.VOLT: GMCarInfo("Chevrolet Volt 2017-18", min_enable_speed=0, video_link="https://youtu.be/QeMCN_4TFfQ"),
|
|
|
|
CAR.CADILLAC_ATS: GMCarInfo("Cadillac ATS Premium Performance 2018"),
|
|
|
|
CAR.MALIBU: GMCarInfo("Chevrolet Malibu Premier 2017"),
|
|
|
|
CAR.ACADIA: GMCarInfo("GMC Acadia 2018", video_link="https://www.youtube.com/watch?v=0ZN6DdsBUZo"),
|
GM: Buick LaCrosse 2017-19 support (#27332)
* Added Buick LaCrosse 2017
* Added Buick LaCrosse as candidate
* Added Buick LaCrosse CAR_INFO and Fingerprint
* Added Buick LaCrosse to non_tested_cars
* Added Buick LaCrosse
* Updated number of supported cars to 237
* Added ACC and LKAS description to Buick LaCrosse
* Updated CAR_INFO for Buick LaCrosse
* Added the Escalade which was recently updated
* Update selfdrive/car/gm/values.py
Suggested fingerprint by @sshane
Co-authored-by: Shane Smiskol <shane@smiskol.com>
* Premium is a trim with ACC. Use package name instead
* lacrosse custom FF;
fit info:
describe(steer_offsets) = DescribeResult(nobs=1649402, minmax=(-0.7127894163131714, 5.3997602462768555), mean=3.3090523060153645, variance=0.3130325564084465, skewness=-1.5986155151533736, kurtosis=8.18810418298873)
Samples: 1357787
Regularizing...
Regularized samples: 1140
speed: DescribeResult(nobs=1140, minmax=(8.478170424241286, 35.837870224662446), mean=27.888804767013475, variance=34.16742353763829, skewness=-1.068587303119431, kurtosis=0.6193071765927134)
angle: DescribeResult(nobs=1140, minmax=(-21.057768565637094, 28.516874490999708), mean=-0.4328602593886506, variance=43.19046813273241, skewness=0.001966426701503317, kurtosis=0.20547357649038434)
steer: DescribeResult(nobs=1140, minmax=(-0.8432471203007578, 0.9634959333674695), mean=-0.021981142946747863, variance=0.20152217060233915, skewness=0.03202313890158864, kurtosis=-1.2318826088567174)
Performing fit...
Fit: [5.85397825e-01 3.27650818e-01 4.60531117e-03 1.32307599e+01
1.37194709e-01 1.33099557e-01 6.14782304e-02]
ANGLE_COEF = 0.58539783
ANGLE_COEF2 = 0.32765082
ANGLE_OFFSET = 0.00460531
SPEED_OFFSET = 13.23075991
SIGMOID_COEF_RIGHT = 0.13719471
SIGMOID_COEF_LEFT = 0.13309956
SPEED_COEF = 0.06147823
MAE old 0.2098, new 0.0309
STD old 0.1021, new 0.0273
deg 00-03:457, deg 03-06:258, deg 06-09:218, deg 09-12:132, deg 12-15:62
deg 15-18:6, deg 18-21:4, deg 21-24:1, deg 24-27:0, deg 27-30:2
deg 30-33:0, deg 33-36:0, deg 36-39:0, deg 39-42:0, deg 42-45:0
mph 10-15:0, mph 15-20:1, mph 20-25:18, mph 25-30:12, mph 30-35:30
mph 35-40:26, mph 40-45:52, mph 45-50:54, mph 50-55:73, mph 55-60:86
mph 60-65:204, mph 65-70:228, mph 70-75:179, mph 75-80:176, mph 80-85:1
mph 85-90:0,
* Update routes.py
* remove from non tested routes
* use torque controller
* update docs
* update releases
---------
Co-authored-by: Shane Smiskol <shane@smiskol.com>
Co-authored-by: Tim Wilson <twilsonco@gmail.com>
2 years ago
|
|
|
CAR.BUICK_LACROSSE: GMCarInfo("Buick LaCrosse 2017-19", "Driver Confidence Package 2"),
|
|
|
|
CAR.BUICK_REGAL: GMCarInfo("Buick Regal Essence 2018"),
|
|
|
|
CAR.ESCALADE: GMCarInfo("Cadillac Escalade 2017", "Driver Assist Package"),
|
|
|
|
CAR.ESCALADE_ESV: GMCarInfo("Cadillac Escalade ESV 2016", "Adaptive Cruise Control (ACC) & LKAS"),
|
|
|
|
CAR.ESCALADE_ESV_2019: GMCarInfo("Cadillac Escalade ESV 2019", "Adaptive Cruise Control (ACC) & LKAS"),
|
|
|
|
CAR.BOLT_EUV: [
|
|
|
|
GMCarInfo("Chevrolet Bolt EUV 2022-23", "Premier or Premier Redline Trim without Super Cruise Package", video_link="https://youtu.be/xvwzGMUA210"),
|
|
|
|
GMCarInfo("Chevrolet Bolt EV 2022-23", "2LT Trim with Adaptive Cruise Control Package"),
|
|
|
|
],
|
|
|
|
CAR.SILVERADO: [
|
|
|
|
GMCarInfo("Chevrolet Silverado 1500 2020-21", "Safety Package II"),
|
|
|
|
GMCarInfo("GMC Sierra 1500 2020-21", "Driver Alert Package II", video_link="https://youtu.be/5HbNoBLzRwE"),
|
|
|
|
],
|
|
|
|
CAR.EQUINOX: GMCarInfo("Chevrolet Equinox 2019-22"),
|
|
|
|
CAR.TRAILBLAZER: GMCarInfo("Chevrolet Trailblazer 2021-22"),
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class CruiseButtons:
|
|
|
|
INIT = 0
|
|
|
|
UNPRESS = 1
|
|
|
|
RES_ACCEL = 2
|
|
|
|
DECEL_SET = 3
|
|
|
|
MAIN = 5
|
|
|
|
CANCEL = 6
|
|
|
|
|
|
|
|
class AccState:
|
|
|
|
OFF = 0
|
|
|
|
ACTIVE = 1
|
|
|
|
FAULTED = 3
|
|
|
|
STANDSTILL = 4
|
|
|
|
|
|
|
|
class CanBus:
|
|
|
|
POWERTRAIN = 0
|
|
|
|
OBSTACLE = 1
|
|
|
|
CAMERA = 2
|
|
|
|
CHASSIS = 2
|
|
|
|
LOOPBACK = 128
|
|
|
|
DROPPED = 192
|
|
|
|
|
|
|
|
|
|
|
|
GM_RX_OFFSET = 0x400
|
|
|
|
|
|
|
|
DBC: Dict[str, Dict[str, str]] = defaultdict(lambda: dbc_dict('gm_global_a_powertrain_generated', 'gm_global_a_object', chassis_dbc='gm_global_a_chassis'))
|
|
|
|
|
|
|
|
EV_CAR = {CAR.VOLT, CAR.BOLT_EUV}
|
|
|
|
|
|
|
|
# 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}
|
|
|
|
|
|
|
|
STEER_THRESHOLD = 1.0
|