From d6f067205284cc0dca79e8d5a476a8333b04a74c Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Sun, 2 Mar 2025 18:15:28 -0800 Subject: [PATCH 1/5] Update carcontroller.py --- opendbc/car/rivian/carcontroller.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/opendbc/car/rivian/carcontroller.py b/opendbc/car/rivian/carcontroller.py index e7efa5331d..07d74b8c32 100644 --- a/opendbc/car/rivian/carcontroller.py +++ b/opendbc/car/rivian/carcontroller.py @@ -1,9 +1,12 @@ from opendbc.can.packer import CANPacker from opendbc.car import Bus, apply_driver_steer_torque_limits from opendbc.car.interfaces import CarControllerBase -from opendbc.car.rivian.riviancan import create_lka_steering, create_longitudinal, create_wheel_touch +from opendbc.car.rivian.riviancan import create_lka_steering, create_longitudinal, create_wheel_touch, common_fault_avoidance from opendbc.car.rivian.values import CarControllerParams +MAX_STEER_RATE = 90 # deg/s +MAX_STEER_RATE_FRAMES = 10 # tx control frames needed before torque can be cut + class CarController(CarControllerBase): def __init__(self, dbc_names, CP): @@ -11,10 +14,16 @@ def __init__(self, dbc_names, CP): self.apply_torque_last = 0 self.packer = CANPacker(dbc_names[Bus.pt]) + self.steer_rate_counter = 0 + def update(self, CC, CS, now_nanos): actuators = CC.actuators can_sends = [] + # >100 degree/sec steering fault prevention + self.steer_rate_counter, apply_steer_req = common_fault_avoidance(abs(CS.out.steeringRateDeg) >= MAX_STEER_RATE, CC.latActive, + self.steer_rate_counter, MAX_STEER_RATE_FRAMES) + apply_torque = 0 if CC.latActive: new_torque = int(round(CC.actuators.torque * CarControllerParams.STEER_MAX)) @@ -23,7 +32,7 @@ def update(self, CC, CS, now_nanos): # send steering command self.apply_torque_last = apply_torque - can_sends.append(create_lka_steering(self.packer, CS.acm_lka_hba_cmd, apply_torque, CC.latActive)) + can_sends.append(create_lka_steering(self.packer, CS.acm_lka_hba_cmd, apply_torque, apply_steer_req)) if self.frame % 5 == 0: can_sends.append(create_wheel_touch(self.packer, CS.sccm_wheel_touch, CC.enabled)) From 8448fe3b076ef318bbaacccc7a78deddd47928dc Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Sun, 2 Mar 2025 18:17:26 -0800 Subject: [PATCH 2/5] safety --- opendbc/safety/safety/safety_rivian.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/opendbc/safety/safety/safety_rivian.h b/opendbc/safety/safety/safety_rivian.h index 0e01f8f1a4..197f030f94 100644 --- a/opendbc/safety/safety/safety_rivian.h +++ b/opendbc/safety/safety/safety_rivian.h @@ -54,6 +54,13 @@ static bool rivian_tx_hook(const CANPacket_t *to_send) { .driver_torque_multiplier = 2, .driver_torque_allowance = 100, .type = TorqueDriverLimited, + + // the EPS faults when the steering angle rate is above a certain threshold for too long. to prevent this, + // we allow setting STEER_REQUEST bit to 0 while maintaining the requested torque value for a single frame + .min_valid_request_frames = 10, + .max_invalid_request_frames = 1, + .min_valid_request_rt_interval = 90000, // 170ms; a ~10% buffer on cutting every 19 frames + .has_steer_req_tolerance = true, }; const LongitudinalLimits RIVIAN_LONG_LIMITS = { From e68eb7d40c23e785b5e03ded3e6222b0d1f80e3c Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 12 Mar 2025 13:26:19 -0700 Subject: [PATCH 3/5] fix --- opendbc/car/rivian/carcontroller.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/opendbc/car/rivian/carcontroller.py b/opendbc/car/rivian/carcontroller.py index 8b9e7c73d7..0698d94d44 100644 --- a/opendbc/car/rivian/carcontroller.py +++ b/opendbc/car/rivian/carcontroller.py @@ -1,7 +1,7 @@ from opendbc.can.packer import CANPacker -from opendbc.car import Bus, apply_driver_steer_torque_limits +from opendbc.car import Bus, apply_driver_steer_torque_limits, common_fault_avoidance from opendbc.car.interfaces import CarControllerBase -from opendbc.car.rivian.riviancan import create_lka_steering, create_longitudinal, create_wheel_touch, create_adas_status, common_fault_avoidance +from opendbc.car.rivian.riviancan import create_lka_steering, create_longitudinal, create_wheel_touch, create_adas_status from opendbc.car.rivian.values import CarControllerParams MAX_STEER_RATE = 90 # deg/s From 1aa173c3e285e394d4c775fd42928ea3aa580336 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 12 Mar 2025 15:29:16 -0700 Subject: [PATCH 4/5] fix these --- opendbc/car/rivian/carcontroller.py | 5 +++-- opendbc/car/rivian/riviancan.py | 12 +++++++----- opendbc/safety/safety/safety_rivian.h | 4 ++-- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/opendbc/car/rivian/carcontroller.py b/opendbc/car/rivian/carcontroller.py index 0698d94d44..7ffdb92499 100644 --- a/opendbc/car/rivian/carcontroller.py +++ b/opendbc/car/rivian/carcontroller.py @@ -5,7 +5,7 @@ from opendbc.car.rivian.values import CarControllerParams MAX_STEER_RATE = 90 # deg/s -MAX_STEER_RATE_FRAMES = 10 # tx control frames needed before torque can be cut +MAX_STEER_RATE_FRAMES = 4 # tx control frames needed before torque can be cut class CarController(CarControllerBase): @@ -24,6 +24,7 @@ def update(self, CC, CS, now_nanos): # >100 degree/sec steering fault prevention self.steer_rate_counter, apply_steer_req = common_fault_avoidance(abs(CS.out.steeringRateDeg) >= MAX_STEER_RATE, CC.latActive, self.steer_rate_counter, MAX_STEER_RATE_FRAMES) + torque_fault = CC.latActive and not apply_steer_req apply_torque = 0 if CC.latActive: @@ -33,7 +34,7 @@ def update(self, CC, CS, now_nanos): # send steering command self.apply_torque_last = apply_torque - can_sends.append(create_lka_steering(self.packer, CS.acm_lka_hba_cmd, apply_torque, apply_steer_req)) + can_sends.append(create_lka_steering(self.packer, CS.acm_lka_hba_cmd, apply_torque, CC.enabled, apply_steer_req, torque_fault)) if self.frame % 5 == 0: can_sends.append(create_wheel_touch(self.packer, CS.sccm_wheel_touch, CC.enabled)) diff --git a/opendbc/car/rivian/riviancan.py b/opendbc/car/rivian/riviancan.py index 9961306c7e..078c3fe181 100644 --- a/opendbc/car/rivian/riviancan.py +++ b/opendbc/car/rivian/riviancan.py @@ -11,15 +11,15 @@ def checksum(data, poly, xor_output): return crc ^ xor_output -def create_lka_steering(packer, acm_lka_hba_cmd, apply_torque, enabled): +def create_lka_steering(packer, acm_lka_hba_cmd, apply_torque, enabled, apply_steer_req, torque_fault): values = {s: acm_lka_hba_cmd[s] for s in [ "ACM_lkaHbaCmd_Counter", "ACM_lkaHbaCmd_Checksum", "ACM_HapticRequest", - "ACM_lkaStrToqReq", + # "ACM_lkaStrToqReq", "ACM_lkaSymbolState", "ACM_lkaToiFlt", - "ACM_lkaActToi", + # "ACM_lkaActToi", "ACM_hbaSysState", "ACM_FailinfoAeb", "ACM_lkaRHWarning", @@ -36,11 +36,13 @@ def create_lka_steering(packer, acm_lka_hba_cmd, apply_torque, enabled): "ACM_unkown6", ]} + values["ACM_lkaStrToqReq"] = apply_torque + values["ACM_lkaActToi"] = apply_steer_req + values["ACM_lkaToiFlt"] = torque_fault + if enabled: - values["ACM_lkaActToi"] = 1 values["ACM_lkaSymbolState"] = 3 values["ACM_lkaLaneRecogState"] = 3 - values["ACM_lkaStrToqReq"] = apply_torque values["ACM_unkown2"] = 1 values["ACM_unkown3"] = 4 values["ACM_unkown4"] = 160 diff --git a/opendbc/safety/safety/safety_rivian.h b/opendbc/safety/safety/safety_rivian.h index 2aa5761fd4..f0b0ce46e7 100644 --- a/opendbc/safety/safety/safety_rivian.h +++ b/opendbc/safety/safety/safety_rivian.h @@ -53,9 +53,9 @@ static bool rivian_tx_hook(const CANPacket_t *to_send) { // the EPS faults when the steering angle rate is above a certain threshold for too long. to prevent this, // we allow setting STEER_REQUEST bit to 0 while maintaining the requested torque value for a single frame - .min_valid_request_frames = 10, + .min_valid_request_frames = 4, .max_invalid_request_frames = 1, - .min_valid_request_rt_interval = 90000, // 170ms; a ~10% buffer on cutting every 19 frames + .min_valid_request_rt_interval = 36000, // 170ms; a ~10% buffer on cutting every 19 frames .has_steer_req_tolerance = true, }; From 5c021d6ad64966c99e5e0c6c1ba598acfa4b63ed Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 13 Mar 2025 18:57:29 -0700 Subject: [PATCH 5/5] try this --- opendbc/car/rivian/riviancan.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opendbc/car/rivian/riviancan.py b/opendbc/car/rivian/riviancan.py index 078c3fe181..edb82d4fda 100644 --- a/opendbc/car/rivian/riviancan.py +++ b/opendbc/car/rivian/riviancan.py @@ -38,7 +38,7 @@ def create_lka_steering(packer, acm_lka_hba_cmd, apply_torque, enabled, apply_st values["ACM_lkaStrToqReq"] = apply_torque values["ACM_lkaActToi"] = apply_steer_req - values["ACM_lkaToiFlt"] = torque_fault + values["ACM_lkaToiFlt"] = 0 # torque_fault if enabled: values["ACM_lkaSymbolState"] = 3