RealFast v0.10.3 release

https://github.com/realfast/openpilot
This commit is contained in:
Vincent Wright
2025-09-22 21:17:00 -07:00
committed by James
parent fb428dfcbf
commit ff862a5f77
9 changed files with 95 additions and 15 deletions
@@ -2,7 +2,7 @@ from opendbc.can import CANPacker
from opendbc.car import Bus, DT_CTRL
from opendbc.car.lateral import apply_meas_steer_torque_limits
from opendbc.car.chrysler import chryslercan
from opendbc.car.chrysler.values import RAM_CARS, CarControllerParams, ChryslerFlags
from opendbc.car.chrysler.values import RAM_CARS, RAM_DT, CarControllerParams, ChryslerFlags
from opendbc.car.interfaces import CarControllerBase
@@ -31,12 +31,12 @@ class CarController(CarControllerBase):
# ACC cancellation
if CC.cruiseControl.cancel:
self.last_button_frame = self.frame
can_sends.append(chryslercan.create_cruise_buttons(self.packer, CS.button_counter + 1, das_bus, cancel=True))
can_sends.append(chryslercan.create_cruise_buttons(self.packer, CS.button_counter + 1, das_bus, CS.button_message, cancel=True))
# ACC resume from standstill
elif CC.cruiseControl.resume:
self.last_button_frame = self.frame
can_sends.append(chryslercan.create_cruise_buttons(self.packer, CS.button_counter + 1, das_bus, resume=True))
can_sends.append(chryslercan.create_cruise_buttons(self.packer, CS.button_counter + 1, das_bus, CS.button_message, resume=True))
# HUD alerts
if self.frame % 25 == 0:
@@ -50,7 +50,12 @@ class CarController(CarControllerBase):
# TODO: can we make this more sane? why is it different for all the cars?
lkas_control_bit = self.lkas_control_bit_prev
if CS.out.vEgo > self.CP.minSteerSpeed:
if self.CP.carFingerprint in RAM_DT:
if self.CP.minEnableSpeed <= CS.out.vEgo <= self.CP.minEnableSpeed + 0.5:
lkas_control_bit = True
if (self.CP.minEnableSpeed >= 14.5) and (CS.out.gearShifter != 2):
lkas_control_bit = False
elif CS.out.vEgo > self.CP.minSteerSpeed:
lkas_control_bit = True
elif self.CP.flags & ChryslerFlags.HIGHER_MIN_STEERING_SPEED:
if CS.out.vEgo < (self.CP.minSteerSpeed - 3.0):
@@ -1,6 +1,6 @@
from opendbc.can import CANDefine, CANParser
from opendbc.car import Bus, create_button_events, structs
from opendbc.car.chrysler.values import DBC, STEER_THRESHOLD, RAM_CARS
from opendbc.car.chrysler.values import DBC, STEER_THRESHOLD, RAM_CARS, ChryslerFrogPilotFlags
from opendbc.car.common.conversions import Conversions as CV
from opendbc.car.interfaces import CarStateBase
@@ -24,6 +24,9 @@ class CarState(CarStateBase):
self.distance_button = 0
# RealFast variables
self.button_message = "CRUISE_BUTTONS_ALT" if FPCP.flags & ChryslerFrogPilotFlags.RAM_HD_ALT_BUTTONS else "CRUISE_BUTTONS"
def update(self, can_parsers) -> structs.CarState:
cp = can_parsers[Bus.pt]
cp_cam = can_parsers[Bus.cam]
@@ -31,7 +34,7 @@ class CarState(CarStateBase):
ret = structs.CarState()
prev_distance_button = self.distance_button
self.distance_button = cp.vl["CRUISE_BUTTONS"]["ACC_Distance_Dec"]
self.distance_button = cp.vl[self.button_message]["ACC_Distance_Dec"]
# lock info
ret.doorOpen = any([cp.vl["BCM_1"]["DOOR_OPEN_FL"],
@@ -93,7 +96,7 @@ class CarState(CarStateBase):
ret.rightBlindspot = cp.vl["BSM_1"]["RIGHT_STATUS"] == 1
self.lkas_car_model = cp_cam.vl["DAS_6"]["CAR_MODEL"]
self.button_counter = cp.vl["CRUISE_BUTTONS"]["COUNTER"]
self.button_counter = cp.vl[self.button_message]["COUNTER"]
ret.buttonEvents = create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise})
@@ -64,13 +64,13 @@ def create_lkas_command(packer, CP, apply_torque, lkas_control_bit):
return packer.make_can_msg("LKAS_COMMAND", 0, values)
def create_cruise_buttons(packer, frame, bus, cancel=False, resume=False):
def create_cruise_buttons(packer, frame, bus, button_message, cancel=False, resume=False):
values = {
"ACC_Cancel": cancel,
"ACC_Resume": resume,
"COUNTER": frame % 0x10,
}
return packer.make_can_msg("CRUISE_BUTTONS", bus, values)
return packer.make_can_msg(button_message, bus, values)
def chrysler_checksum(address: int, sig, d: bytearray) -> int:
@@ -441,6 +441,7 @@ FW_VERSIONS = {
b'68453483AC',
b'68453483AD',
b'68453487AD',
b'68453485AC',
b'68453491AC',
b'68453491AD',
b'68453499AD',
@@ -461,6 +462,7 @@ FW_VERSIONS = {
b'68510282AG',
b'68510282AH',
b'68510283AG',
b'68510283AH',
b'68527346AE',
b'68527361AD',
b'68527375AD',
@@ -555,6 +557,7 @@ FW_VERSIONS = {
b'68552788AA',
b'68552789AA',
b'68552790AA',
b'68552791AA',
b'68552791AB',
b'68552794AA',
b'68552794AD',
@@ -575,6 +578,7 @@ FW_VERSIONS = {
b'05036067AE ',
b'05036193AA ',
b'05149368AA ',
b'05149390AA ',
b'05149374AA ',
b'05149591AD ',
b'05149591AE ',
@@ -590,6 +594,7 @@ FW_VERSIONS = {
b'05190346AD',
b'68378695AI ',
b'68378695AJ ',
b'68378696AI ',
b'68378695AK ',
b'68378696AJ ',
b'68378696AK ',
@@ -626,6 +631,7 @@ FW_VERSIONS = {
b'68500630AE',
b'68500630AF',
b'68500631AE',
b'68500631AF',
b'68502719AC ',
b'68502722AC ',
b'68502733AC ',
@@ -667,6 +673,7 @@ FW_VERSIONS = {
b'68360085AL',
b'68360085AO',
b'68360086AH',
b'68360086AL',
b'68360086AK',
b'68360086AN',
b'68384328AD',
@@ -685,6 +692,7 @@ FW_VERSIONS = {
b'68502994AC',
b'68502994AD',
b'68502996AD',
b'68502996AC',
b'68520867AE',
b'68520867AF',
b'68520870AC',
@@ -701,14 +709,22 @@ FW_VERSIONS = {
(Ecu.combinationMeter, 0x742, None): [
b'68361606AH',
b'68437735AC',
b'68437746AD',
b'68492682AD',
b'68525438AB',
b'68492693AD',
b'68525485AB',
b'68525487AB',
b'68525498AB',
b'68528791AF',
b'68620919AB',
b'68620921AC',
b'68620923AB',
b'68620923AC',
b'68628474AB',
],
(Ecu.srs, 0x744, None): [
b'68346749AB',
b'68399794AC',
b'68428503AA',
b'68428505AA',
@@ -722,6 +738,7 @@ FW_VERSIONS = {
b'68504022AC',
b'68530686AB',
b'68530686AC',
b'68530686AD',
b'68544596AC',
b'68641704AA',
],
@@ -744,14 +761,19 @@ FW_VERSIONS = {
b'52370131AF',
b'52370231AF',
b'52370231AG',
b'52370231AK',
b'52370491AA',
b'52370931CT',
b'52401032AE',
b'52421132AF',
b'52421332AF',
b'52421332AG',
b'68527616AD ',
b'68528545AF',
b'M2370131MB',
b'M2421132MB',
b'52421232AF',
b'52421492AA',
],
},
CAR.DODGE_DURANGO: {
@@ -62,9 +62,19 @@ class CarInterface(CarInterfaceBase):
if any(fw.ecu == 'eps' and b"68" < fw.fwVersion[:4] <= b"6831" for fw in car_fw):
ret.minSteerSpeed = 0.
# RealFast variables
ret.minEnableSpeed = 14.5
ret.minSteerSpeed = 0.5
elif candidate == CAR.RAM_HD_5TH_GEN:
ret.steerActuatorDelay = 0.2
# RealFast variables
ret.mass = 3405.
ret.minSteerSpeed = 16
ret.steerRatio = 15.61
ret.wheelbase = 3.785
else:
raise ValueError(f"Unsupported car: {candidate}")
+6 -1
View File
@@ -19,6 +19,11 @@ class ChryslerFlags(IntFlag):
HIGHER_MIN_STEERING_SPEED = 1
# FrogPilot variables
class ChryslerFrogPilotFlags(IntFlag):
RAM_HD_ALT_BUTTONS = 1
@dataclass
class ChryslerCarDocs(CarDocs):
package: str = "Adaptive Cruise Control (ACC)"
@@ -104,7 +109,7 @@ class CarControllerParams:
elif CP.carFingerprint in RAM_DT:
self.STEER_DELTA_UP = 6
self.STEER_DELTA_DOWN = 6
self.STEER_MAX = 261 # EPS allows more, up to 350?
self.STEER_MAX = 350 # EPS allows more, up to 350?
else:
self.STEER_DELTA_UP = 3
self.STEER_DELTA_DOWN = 3
+22 -1
View File
@@ -11,6 +11,9 @@ typedef struct {
const unsigned int DAS_6;
const unsigned int LKAS_COMMAND;
const unsigned int CRUISE_BUTTONS;
// RealFast variables
const unsigned int CRUISE_BUTTONS_ALT;
} ChryslerAddrs;
typedef enum {
@@ -145,7 +148,7 @@ static bool chrysler_tx_hook(const CANPacket_t *msg) {
}
// FORCE CANCEL: only the cancel button press is allowed
if (msg->addr == chrysler_addrs->CRUISE_BUTTONS) {
if (msg->addr == chrysler_addrs->CRUISE_BUTTONS || msg->addr == chrysler_addrs->CRUISE_BUTTONS_ALT) {
const bool is_cancel = msg->data[0] == 1U;
const bool is_resume = msg->data[0] == 0x10U;
const bool allowed = is_cancel || (is_resume && controls_allowed);
@@ -171,6 +174,9 @@ static safety_config chrysler_init(uint16_t param) {
.DAS_6 = 0x2A6, // LKAS HUD and auto headlight control from DASM
.LKAS_COMMAND = 0x292, // LKAS controls from DASM
.CRUISE_BUTTONS = 0x23B, // Cruise control buttons
// RealFast variables
.CRUISE_BUTTONS_ALT = 0x23B, // Cruise control buttons
};
// CAN messages for the 5th gen RAM DT platform
@@ -183,6 +189,9 @@ static safety_config chrysler_init(uint16_t param) {
.DAS_6 = 0xFA, // LKAS HUD and auto headlight control from DASM
.LKAS_COMMAND = 0xA6, // LKAS controls from DASM
.CRUISE_BUTTONS = 0xB1, // Cruise control buttons
// RealFast variables
.CRUISE_BUTTONS_ALT = 0xB1, // Cruise control buttons
};
static RxCheck chrysler_ram_dt_rx_checks[] = {
@@ -206,12 +215,18 @@ static safety_config chrysler_init(uint16_t param) {
{CHRYSLER_ADDRS.CRUISE_BUTTONS, 0, 3, .check_relay = false},
{CHRYSLER_ADDRS.LKAS_COMMAND, 0, 6, .check_relay = true},
{CHRYSLER_ADDRS.DAS_6, 0, 8, .check_relay = true},
// RealFast variables
{CHRYSLER_ADDRS.CRUISE_BUTTONS_ALT, 2, 3, .check_relay = false},
};
static const CanMsg CHRYSLER_RAM_DT_TX_MSGS[] = {
{CHRYSLER_RAM_DT_ADDRS.CRUISE_BUTTONS, 2, 3, .check_relay = false},
{CHRYSLER_RAM_DT_ADDRS.LKAS_COMMAND, 0, 8, .check_relay = true},
{CHRYSLER_RAM_DT_ADDRS.DAS_6, 0, 8, .check_relay = true},
// RealFast variables
{CHRYSLER_RAM_DT_ADDRS.CRUISE_BUTTONS_ALT, 2, 3, .check_relay = false},
};
#ifdef ALLOW_DEBUG
@@ -225,6 +240,9 @@ static safety_config chrysler_init(uint16_t param) {
.DAS_6 = 0x275, // LKAS HUD and auto headlight control from DASM
.LKAS_COMMAND = 0x276, // LKAS controls from DASM
.CRUISE_BUTTONS = 0x23A, // Cruise control buttons
// RealFast variables
.CRUISE_BUTTONS_ALT = 0x23B, // Cruise control buttons
};
static RxCheck chrysler_ram_hd_rx_checks[] = {
@@ -239,6 +257,9 @@ static safety_config chrysler_init(uint16_t param) {
{CHRYSLER_RAM_HD_ADDRS.CRUISE_BUTTONS, 2, 3, .check_relay = false},
{CHRYSLER_RAM_HD_ADDRS.LKAS_COMMAND, 0, 8, .check_relay = true},
{CHRYSLER_RAM_HD_ADDRS.DAS_6, 0, 8, .check_relay = true},
// RealFast variables
{CHRYSLER_RAM_HD_ADDRS.CRUISE_BUTTONS_ALT, 2, 3, .check_relay = false},
};
const uint32_t CHRYSLER_PARAM_RAM_HD = 2U; // set for Ram HD platform
+11 -4
View File
@@ -1,6 +1,7 @@
from cereal import car, log
import cereal.messaging as messaging
from opendbc.car import DT_CTRL, structs
from opendbc.car.chrysler.values import RAM_DT
from opendbc.car.gm.values import GMFlags
from opendbc.car.interfaces import MAX_CTRL_SPEED
@@ -58,10 +59,16 @@ class CarSpecificEvents:
events = self.create_common_events(CS, CS_prev, extra_gears=extra_gears)
# Low speed steer alert hysteresis logic
if self.CP.minSteerSpeed > 0. and CS.vEgo < (self.CP.minSteerSpeed + 0.5):
self.low_speed_alert = True
elif CS.vEgo > (self.CP.minSteerSpeed + 1.):
self.low_speed_alert = False
if self.CP.carFingerprint in RAM_DT:
if CS.vEgo >= self.CP.minEnableSpeed:
self.low_speed_alert = False
if (self.CP.minEnableSpeed >= 14.5) and (CS.gearShifter != GearShifter.drive):
self.low_speed_alert = True
else:
if self.CP.minSteerSpeed > 0. and CS.vEgo < (self.CP.minSteerSpeed + 0.5):
self.low_speed_alert = True
elif CS.vEgo > (self.CP.minSteerSpeed + 1.):
self.low_speed_alert = False
if self.low_speed_alert:
events.add(EventName.belowSteerSpeed)
+7
View File
@@ -57,6 +57,9 @@ class VehicleParamsLearner:
self.reset(None)
# FrogPilot variables
self.CP = CP
def reset(self, t: float | None):
self.kf.init_state(self.x_initial, covs=self.P_initial, filter_time=t)
@@ -187,6 +190,10 @@ class VehicleParamsLearner:
liveParameters.debugFilterState.value = x.tolist()
liveParameters.debugFilterState.std = P.tolist()
# FrogPilot variables
if self.CP.carFingerprint == "RAM_HD":
liveParameters.valid = True
return msg