Traffic Mode
This commit is contained in:
@@ -22,6 +22,7 @@ class FrogPilotCard:
|
||||
self.force_coast = False
|
||||
self.pause_lateral = False
|
||||
self.pause_longitudinal = False
|
||||
self.traffic_mode_enabled = False
|
||||
|
||||
self.gap_counter = 0
|
||||
|
||||
@@ -42,6 +43,8 @@ class FrogPilotCard:
|
||||
self.pause_lateral = not self.pause_lateral
|
||||
elif sm["carControl"].longActive and getattr(frogpilot_toggles, f"pause_longitudinal_via_{key}"):
|
||||
self.pause_longitudinal = not self.pause_longitudinal
|
||||
elif getattr(frogpilot_toggles, f"traffic_mode_via_{key}"):
|
||||
self.traffic_mode_enabled = not self.traffic_mode_enabled
|
||||
|
||||
def handle_experimental_mode(self, sm, frogpilot_toggles):
|
||||
if frogpilot_toggles.conditional_experimental_mode:
|
||||
@@ -108,5 +111,6 @@ class FrogPilotCard:
|
||||
frogpilotCarState.forceCoast = self.force_coast
|
||||
frogpilotCarState.pauseLateral = self.pause_lateral
|
||||
frogpilotCarState.pauseLongitudinal = self.pause_longitudinal
|
||||
frogpilotCarState.trafficModeEnabled = self.traffic_mode_enabled
|
||||
|
||||
return frogpilotCarState
|
||||
|
||||
@@ -144,7 +144,10 @@ class FrogPilotPlanner:
|
||||
|
||||
frogpilotPlan.frogpilotToggles = json.dumps(vars(frogpilot_toggles))
|
||||
|
||||
frogpilotPlan.increasedStoppedDistance = frogpilot_toggles.increase_stopped_distance
|
||||
if sm["frogpilotCarState"].trafficModeEnabled:
|
||||
frogpilotPlan.increasedStoppedDistance = 0
|
||||
else:
|
||||
frogpilotPlan.increasedStoppedDistance = frogpilot_toggles.increase_stopped_distance
|
||||
|
||||
frogpilotPlan.laneWidthLeft = self.lane_width_left
|
||||
frogpilotPlan.laneWidthRight = self.lane_width_right
|
||||
|
||||
@@ -52,7 +52,9 @@ class FrogPilotAcceleration:
|
||||
eco_gear = sm["frogpilotCarState"].ecoGear
|
||||
sport_gear = sm["frogpilotCarState"].sportGear
|
||||
|
||||
if (eco_gear or sport_gear) and frogpilot_toggles.map_acceleration:
|
||||
if sm["frogpilotCarState"].trafficModeEnabled:
|
||||
self.max_accel = get_max_accel(v_ego)
|
||||
elif (eco_gear or sport_gear) and frogpilot_toggles.map_acceleration:
|
||||
if eco_gear:
|
||||
self.max_accel = get_max_accel_eco(v_ego)
|
||||
else:
|
||||
|
||||
@@ -22,6 +22,7 @@ class FrogPilotEvents:
|
||||
self.events = Events(frogpilot=True)
|
||||
|
||||
self.always_on_lateral_enabled_previously = False
|
||||
self.previous_traffic_mode = False
|
||||
self.random_event_playing = False
|
||||
self.startup_seen = False
|
||||
self.stopped_for_light = False
|
||||
@@ -183,4 +184,12 @@ class FrogPilotEvents:
|
||||
|
||||
self.startup_seen |= sm["frogpilotSelfdriveState"].alertText1 == frogpilot_toggles.startup_alert_top and sm["frogpilotSelfdriveState"].alertText2 == frogpilot_toggles.startup_alert_bottom
|
||||
|
||||
if sm["frogpilotCarState"].trafficModeEnabled != self.previous_traffic_mode:
|
||||
if self.previous_traffic_mode:
|
||||
self.events.add(FrogPilotEventName.trafficModeInactive)
|
||||
else:
|
||||
self.events.add(FrogPilotEventName.trafficModeActive)
|
||||
|
||||
self.previous_traffic_mode = sm["frogpilotCarState"].trafficModeEnabled
|
||||
|
||||
self.played_events.update(FROGPILOT_EVENT_NAME[event] for event in self.events.names)
|
||||
|
||||
@@ -3,6 +3,10 @@ import numpy as np
|
||||
|
||||
from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import COMFORT_BRAKE, LEAD_DANGER_FACTOR, STOP_DISTANCE, desired_follow_distance, get_jerk_factor, get_T_FOLLOW
|
||||
|
||||
from openpilot.frogpilot.common.frogpilot_variables import CITY_SPEED_LIMIT
|
||||
|
||||
TRAFFIC_MODE_BP = [0., CITY_SPEED_LIMIT]
|
||||
|
||||
class FrogPilotFollowing:
|
||||
def __init__(self, FrogPilotPlanner):
|
||||
self.frogpilot_planner = FrogPilotPlanner
|
||||
@@ -16,7 +20,17 @@ class FrogPilotFollowing:
|
||||
self.t_follow = 0
|
||||
|
||||
def update(self, long_control_active, v_ego, sm, frogpilot_toggles):
|
||||
if long_control_active:
|
||||
if long_control_active and sm["frogpilotCarState"].trafficModeEnabled:
|
||||
if sm["carState"].aEgo >= 0:
|
||||
self.base_acceleration_jerk = np.interp(v_ego, TRAFFIC_MODE_BP, frogpilot_toggles.traffic_mode_jerk_acceleration)
|
||||
self.base_speed_jerk = np.interp(v_ego, TRAFFIC_MODE_BP, frogpilot_toggles.traffic_mode_jerk_speed)
|
||||
else:
|
||||
self.base_acceleration_jerk = np.interp(v_ego, TRAFFIC_MODE_BP, frogpilot_toggles.traffic_mode_jerk_deceleration)
|
||||
self.base_speed_jerk = np.interp(v_ego, TRAFFIC_MODE_BP, frogpilot_toggles.traffic_mode_jerk_speed_decrease)
|
||||
|
||||
self.base_danger_jerk = np.interp(v_ego, TRAFFIC_MODE_BP, frogpilot_toggles.traffic_mode_jerk_danger)
|
||||
self.t_follow = np.interp(v_ego, TRAFFIC_MODE_BP, frogpilot_toggles.traffic_mode_follow)
|
||||
elif long_control_active:
|
||||
if sm["carState"].aEgo >= 0:
|
||||
self.base_acceleration_jerk, self.base_danger_jerk, self.base_speed_jerk = get_jerk_factor(
|
||||
frogpilot_toggles.aggressive_jerk_acceleration, frogpilot_toggles.aggressive_jerk_danger, frogpilot_toggles.aggressive_jerk_speed,
|
||||
@@ -52,7 +66,7 @@ class FrogPilotFollowing:
|
||||
self.following_lead = self.frogpilot_planner.tracking_lead and self.frogpilot_planner.lead_one.dRel < (self.t_follow * 2) * v_ego
|
||||
|
||||
if long_control_active and self.frogpilot_planner.tracking_lead:
|
||||
if frogpilot_toggles.human_following:
|
||||
if not sm["frogpilotCarState"].trafficModeEnabled and frogpilot_toggles.human_following:
|
||||
self.update_follow_values(self.frogpilot_planner.lead_one.dRel, v_ego, self.frogpilot_planner.lead_one.vLead)
|
||||
self.desired_follow_distance = desired_follow_distance(v_ego, self.frogpilot_planner.lead_one.vLead, self.t_follow)
|
||||
else:
|
||||
|
||||
@@ -13,6 +13,7 @@ static void update_state(FrogPilotUIState *fs) {
|
||||
if (fpsm.updated("frogpilotCarState")) {
|
||||
const cereal::FrogPilotCarState::Reader &frogpilotCarState = fpsm["frogpilotCarState"].getFrogpilotCarState();
|
||||
frogpilot_scene.always_on_lateral_active = !frogpilot_scene.enabled && frogpilotCarState.getAlwaysOnLateralEnabled();
|
||||
frogpilot_scene.traffic_mode_enabled = frogpilotCarState.getTrafficModeEnabled();
|
||||
}
|
||||
if (fpsm.updated("frogpilotPlan")) {
|
||||
const cereal::FrogPilotPlan::Reader &frogpilotPlan = fpsm["frogpilotPlan"].getFrogpilotPlan();
|
||||
|
||||
@@ -15,6 +15,7 @@ struct FrogPilotUIScene {
|
||||
bool reverse;
|
||||
bool sidebars_open;
|
||||
bool standstill;
|
||||
bool traffic_mode_enabled;
|
||||
bool wake_up_screen;
|
||||
|
||||
int conditional_status;
|
||||
|
||||
@@ -730,6 +730,8 @@ void FrogPilotAnnotatedCameraWidget::paintPathEdges(QPainter &p, int height) {
|
||||
setPathEdgeColors(bg_colors[STATUS_CEM_DISABLED]);
|
||||
} else if (experimentalMode) {
|
||||
setPathEdgeColors(bg_colors[STATUS_EXPERIMENTAL_MODE_ENABLED]);
|
||||
} else if (frogpilot_scene.traffic_mode_enabled) {
|
||||
setPathEdgeColors(bg_colors[STATUS_TRAFFIC_MODE_ENABLED]);
|
||||
} else if (frogpilot_toggles.value("color_scheme").toString() != "stock") {
|
||||
setPathEdgeColors(QColor(frogpilot_toggles.value("path_edges_color").toString()));
|
||||
} else {
|
||||
|
||||
@@ -1188,6 +1188,22 @@ FROGPILOT_EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
|
||||
Priority.LOW, VisualAlert.none, AudibleAlert.prompt, 3.),
|
||||
},
|
||||
|
||||
FrogPilotEventName.trafficModeActive: {
|
||||
ET.WARNING: Alert(
|
||||
"Traffic Mode enabled",
|
||||
"",
|
||||
FrogPilotAlertStatus.frogpilot, AlertSize.small,
|
||||
Priority.LOW, VisualAlert.none, AudibleAlert.prompt, 3.),
|
||||
},
|
||||
|
||||
FrogPilotEventName.trafficModeInactive: {
|
||||
ET.WARNING: Alert(
|
||||
"Traffic Mode Disabled",
|
||||
"",
|
||||
FrogPilotAlertStatus.frogpilot, AlertSize.small,
|
||||
Priority.LOW, VisualAlert.none, AudibleAlert.prompt, 3.),
|
||||
},
|
||||
|
||||
# Random Events
|
||||
FrogPilotEventName.accel30: {
|
||||
ET.WARNING: Alert(
|
||||
|
||||
@@ -102,6 +102,8 @@ void ExperimentalButton::updateBackgroundColor() {
|
||||
background_color = bg_colors[STATUS_CEM_DISABLED];
|
||||
} else if (experimental_mode) {
|
||||
background_color = bg_colors[STATUS_EXPERIMENTAL_MODE_ENABLED];
|
||||
} else if (frogpilot_scene.traffic_mode_enabled) {
|
||||
background_color = bg_colors[STATUS_TRAFFIC_MODE_ENABLED];
|
||||
} else {
|
||||
background_color = QColor(0, 0, 0, 166);
|
||||
}
|
||||
|
||||
@@ -102,6 +102,8 @@ void UIState::updateStatus(FrogPilotUIState *fs) {
|
||||
status = STATUS_OVERRIDE;
|
||||
} else if (frogpilot_scene.always_on_lateral_active) {
|
||||
status = STATUS_ALWAYS_ON_LATERAL_ACTIVE;
|
||||
} else if (frogpilot_scene.traffic_mode_enabled && ss.getEnabled()) {
|
||||
status = STATUS_TRAFFIC_MODE_ENABLED;
|
||||
} else {
|
||||
status = ss.getEnabled() ? STATUS_ENGAGED : STATUS_DISENGAGED;
|
||||
}
|
||||
|
||||
@@ -49,6 +49,7 @@ typedef enum UIStatus {
|
||||
STATUS_ALWAYS_ON_LATERAL_ACTIVE,
|
||||
STATUS_CEM_DISABLED,
|
||||
STATUS_EXPERIMENTAL_MODE_ENABLED,
|
||||
STATUS_TRAFFIC_MODE_ENABLED,
|
||||
} UIStatus;
|
||||
|
||||
const QColor bg_colors [] = {
|
||||
@@ -60,6 +61,7 @@ const QColor bg_colors [] = {
|
||||
[STATUS_ALWAYS_ON_LATERAL_ACTIVE] = QColor(0x0a, 0xba, 0xb5, 0xf1),
|
||||
[STATUS_CEM_DISABLED] = QColor(0xff, 0xff, 0x00, 0xf1),
|
||||
[STATUS_EXPERIMENTAL_MODE_ENABLED] = QColor(0xda, 0x6f, 0x25, 0xf1),
|
||||
[STATUS_TRAFFIC_MODE_ENABLED] = QColor(0xc9, 0x22, 0x31, 0xf1),
|
||||
};
|
||||
|
||||
typedef struct UIScene {
|
||||
|
||||
Reference in New Issue
Block a user