diff --git a/docs/SAFETY.md b/docs/SAFETY.md index 23ee251af..49f88df8c 100644 --- a/docs/SAFETY.md +++ b/docs/SAFETY.md @@ -22,7 +22,7 @@ Following Hazard and Risk Analysis and FMEA, at a very high level, we have desig ensuring two main safety requirements. 1. The driver must always be capable to immediately retake manual control of the vehicle, - by stepping on either pedal or by pressing the cancel button. + by stepping on the brake pedal or by pressing the cancel button. 2. The vehicle must not alter its trajectory too quickly for the driver to safely react. This means that while the system is engaged, the actuators are constrained to operate within reasonable limits. diff --git a/selfdrive/assets/offroad/icon_disengage_on_accelerator.svg b/selfdrive/assets/offroad/icon_disengage_on_accelerator.svg new file mode 100644 index 000000000..0175e672c --- /dev/null +++ b/selfdrive/assets/offroad/icon_disengage_on_accelerator.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index f01c8a8aa..34ca75cd4 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -124,8 +124,6 @@ class CarInterfaceBase(ABC): events.add(EventName.wrongCarMode) if cs_out.espDisabled: events.add(EventName.espDisabled) - if cs_out.gasPressed: - events.add(EventName.pedalPressedPreEnable) if cs_out.stockFcw: events.add(EventName.stockFcw) if cs_out.stockAeb: diff --git a/selfdrive/common/params.cc b/selfdrive/common/params.cc index 8180ee429..0c36511be 100644 --- a/selfdrive/common/params.cc +++ b/selfdrive/common/params.cc @@ -98,6 +98,7 @@ std::unordered_map keys = { {"DisableRadar_Allow", PERSISTENT}, {"DisableRadar", PERSISTENT}, // WARNING: THIS DISABLES AEB {"DisableUpdates", PERSISTENT}, + {"DisengageOnAccelerator", PERSISTENT}, {"DongleId", PERSISTENT}, {"DoReboot", CLEAR_ON_MANAGER_START}, {"DoShutdown", CLEAR_ON_MANAGER_START}, diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index 3ad8ce166..5f2fe3472 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -10,6 +10,7 @@ from common.profiler import Profiler from common.params import Params, put_nonblocking import cereal.messaging as messaging from common.conversions import Conversions as CV +from panda import ALTERNATIVE_EXPERIENCE from selfdrive.swaglog import cloudlog from selfdrive.boardd.boardd import can_list_to_can_capnp from selfdrive.car.car_helpers import get_car, get_startup_event, get_one_can @@ -100,7 +101,11 @@ class Controls: else: self.CI, self.CP = CI, CI.CP - self.CP.alternativeExperience = 0 # see panda/board/safety_declarations.h for allowed values + # set alternative experiences from parameters + self.disengage_on_accelerator = params.get_bool("DisengageOnAccelerator") + self.CP.alternativeExperience = 0 + if not self.disengage_on_accelerator: + self.CP.alternativeExperience |= ALTERNATIVE_EXPERIENCE.DISABLE_DISENGAGE_ON_GAS # read params self.is_metric = params.get_bool("IsMetric") @@ -200,11 +205,15 @@ class Controls: self.events.add(EventName.controlsInitializing) return - # Disable on rising edge of gas or brake. Also disable on brake when speed > 0 - if (CS.gasPressed and not self.CS_prev.gasPressed) or \ + # Disable on rising edge of accelerator or brake. Also disable on brake when speed > 0 + if (CS.gasPressed and not self.CS_prev.gasPressed and self.disengage_on_accelerator) or \ (CS.brakePressed and (not self.CS_prev.brakePressed or not CS.standstill)): self.events.add(EventName.pedalPressed) + if CS.gasPressed: + self.events.add(EventName.pedalPressedPreEnable if self.disengage_on_accelerator else + EventName.gasPressedOverride) + self.events.add_from_msg(CS.events) if not self.CP.notCar: diff --git a/selfdrive/controls/lib/longcontrol.py b/selfdrive/controls/lib/longcontrol.py index 21682d826..f91ddcf44 100644 --- a/selfdrive/controls/lib/longcontrol.py +++ b/selfdrive/controls/lib/longcontrol.py @@ -87,7 +87,7 @@ class LongControl(): v_target, v_target_future, CS.brakePressed, CS.cruiseState.standstill) - if self.long_control_state == LongCtrlState.off or CS.gasPressed: + if self.long_control_state == LongCtrlState.off: self.reset(CS.vEgo) output_accel = 0. diff --git a/selfdrive/controls/lib/longitudinal_planner.py b/selfdrive/controls/lib/longitudinal_planner.py index 8aade9b9c..41c41e549 100755 --- a/selfdrive/controls/lib/longitudinal_planner.py +++ b/selfdrive/controls/lib/longitudinal_planner.py @@ -71,7 +71,6 @@ class Planner: # Reset current state when not engaged, or user is controlling the speed reset_state = long_control_state == LongCtrlState.off - reset_state = reset_state or sm['carState'].gasPressed # No change cost when user is controlling the speed, or when standstill prev_accel_constraint = not (reset_state or sm['carState'].standstill) diff --git a/selfdrive/manager/manager.py b/selfdrive/manager/manager.py index 21b8cb965..b5fa43967 100755 --- a/selfdrive/manager/manager.py +++ b/selfdrive/manager/manager.py @@ -38,6 +38,7 @@ def manager_init() -> None: default_params: List[Tuple[str, Union[str, bytes]]] = [ ("CompletedTrainingVersion", "0"), + ("DisengageOnAccelerator", "1"), ("HasAcceptedTerms", "0"), ("OpenpilotEnabledToggle", "1"), ] diff --git a/selfdrive/test/process_replay/process_replay.py b/selfdrive/test/process_replay/process_replay.py index 6e3398f9c..9a2a16156 100755 --- a/selfdrive/test/process_replay/process_replay.py +++ b/selfdrive/test/process_replay/process_replay.py @@ -346,6 +346,7 @@ def setup_env(simulation=False): params.clear_all() params.put_bool("OpenpilotEnabledToggle", True) params.put_bool("Passive", False) + params.put_bool("DisengageOnAccelerator", True) os.environ["NO_RADAR_SLEEP"] = "1" os.environ["REPLAY"] = "1" diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index a0cebb096..cd6ae5f31 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -ad17c3c1d11691bc35efe3de78a7cef3daf5dbdf \ No newline at end of file +5f9efe721de4d947567eae55a8dd331f0bae4ded \ No newline at end of file diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index f3584460d..4fde62734 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -65,6 +65,12 @@ TogglesPanel::TogglesPanel(SettingsWindow *parent) : ListWidget(parent) { "In this mode openpilot will ignore lanelines and just drive how it thinks a human would.", "../assets/offroad/icon_road.png", }, + { + "DisengageOnAccelerator", + "Disengage On Accelerator Pedal", + "When enabled, openpilot will disengage when the accelerator pedal is pressed.", + "../assets/offroad/icon_disengage_on_accelerator.svg", + }, #ifdef ENABLE_MAPS { "NavSettingTime24h",