From 4c46ab8ff45c0866935b9dcde826038bb24778cb Mon Sep 17 00:00:00 2001 From: FrogAi <91348155+FrogAi@users.noreply.github.com> Date: Tue, 28 May 2024 22:57:04 -0700 Subject: [PATCH] Controls - Lane Change Customizations - Lane Detection Threshold Set the required lane width to be qualified as a lane. --- selfdrive/controls/controlsd.py | 10 ++++++++-- selfdrive/controls/lib/desire_helper.py | 8 +++++++- selfdrive/controls/lib/events.py | 14 ++++++++++++++ selfdrive/frogpilot/controls/frogpilot_planner.py | 3 ++- 4 files changed, 31 insertions(+), 4 deletions(-) diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index e9b3d6c81..4b55b11ee 100644 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -289,9 +289,15 @@ class Controls: self.events.add(EventName.laneChangeBlocked) else: if direction == LaneChangeDirection.left: - self.events.add(EventName.preLaneChangeLeft) + if self.sm['frogpilotPlan'].laneWidthLeft >= self.frogpilot_toggles.lane_detection_width: + self.events.add(EventName.preLaneChangeLeft) + else: + self.events.add(EventName.noLaneAvailable) else: - self.events.add(EventName.preLaneChangeRight) + if self.sm['frogpilotPlan'].laneWidthRight >= self.frogpilot_toggles.lane_detection_width: + self.events.add(EventName.preLaneChangeRight) + else: + self.events.add(EventName.noLaneAvailable) elif self.sm['modelV2'].meta.laneChangeState in (LaneChangeState.laneChangeStarting, LaneChangeState.laneChangeFinishing): self.events.add(EventName.laneChange) diff --git a/selfdrive/controls/lib/desire_helper.py b/selfdrive/controls/lib/desire_helper.py index 301a07839..a5e91a7ae 100644 --- a/selfdrive/controls/lib/desire_helper.py +++ b/selfdrive/controls/lib/desire_helper.py @@ -48,6 +48,12 @@ class DesireHelper: one_blinker = carstate.leftBlinker != carstate.rightBlinker below_lane_change_speed = v_ego < LANE_CHANGE_SPEED_MIN + if not (frogpilot_toggles.lane_detection and one_blinker) or below_lane_change_speed: + lane_available = True + else: + desired_lane = frogpilotPlan.laneWidthLeft if carstate.leftBlinker else frogpilotPlan.laneWidthRight + lane_available = desired_lane >= frogpilot_toggles.lane_detection_width + if not lateral_active or self.lane_change_timer > LANE_CHANGE_TIME_MAX: self.lane_change_state = LaneChangeState.off self.lane_change_direction = LaneChangeDirection.none @@ -79,7 +85,7 @@ class DesireHelper: if not one_blinker or below_lane_change_speed: self.lane_change_state = LaneChangeState.off self.lane_change_direction = LaneChangeDirection.none - elif torque_applied and not blindspot_detected and self.lane_change_wait_timer >= frogpilot_toggles.lane_change_delay: + elif torque_applied and not blindspot_detected and lane_available and self.lane_change_wait_timer >= frogpilot_toggles.lane_change_delay: self.lane_change_state = LaneChangeState.laneChangeStarting self.lane_change_wait_timer = 0.0 diff --git a/selfdrive/controls/lib/events.py b/selfdrive/controls/lib/events.py index 045038dca..86d837dff 100755 --- a/selfdrive/controls/lib/events.py +++ b/selfdrive/controls/lib/events.py @@ -330,6 +330,16 @@ def joystick_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, return NormalPermanentAlert("Joystick Mode", vals) +# FrogPilot Alerts +def no_lane_available_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int) -> Alert: + lane_width = sm['frogpilotPlan'].laneWidthLeft if CS.leftBlinker else sm['frogpilotPlan'].laneWidthRight + lane_width_msg = f"{lane_width:.1f} meters" if metric else f"{lane_width * CV.METER_TO_FOOT:.1f} feet" + + return Alert( + "No lane available", + f"Detected lane width is only {lane_width_msg}", + AlertStatus.normal, AlertSize.mid, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2) EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { # ********** events with no alerts ********** @@ -961,6 +971,10 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { ET.NO_ENTRY: NoEntryAlert("Please don't use the 'Development' branch!"), }, + EventName.noLaneAvailable: { + ET.PERMANENT: no_lane_available_alert, + }, + EventName.openpilotCrashed: { ET.PERMANENT: Alert( "openpilot crashed", diff --git a/selfdrive/frogpilot/controls/frogpilot_planner.py b/selfdrive/frogpilot/controls/frogpilot_planner.py index 61653e593..1454208e7 100644 --- a/selfdrive/frogpilot/controls/frogpilot_planner.py +++ b/selfdrive/frogpilot/controls/frogpilot_planner.py @@ -54,7 +54,8 @@ class FrogPilotPlanner: if run_cem and (controlsState.enabled or frogpilotCarControl.alwaysOnLateral) and driving_gear: self.cem.update(carState, frogpilotNavigation, modelData, v_ego, v_lead, frogpilot_toggles) - if v_ego >= frogpilot_toggles.minimum_lane_change_speed: + check_lane_width = frogpilot_toggles.lane_detection + if check_lane_width and v_ego >= frogpilot_toggles.minimum_lane_change_speed: self.lane_width_left = calculate_lane_width(modelData.laneLines[0], modelData.laneLines[1], modelData.roadEdges[0]) self.lane_width_right = calculate_lane_width(modelData.laneLines[3], modelData.laneLines[2], modelData.roadEdges[1]) else: