diff --git a/README.md b/README.md index 63c96555f3..e0eb4e1529 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ FrogPilot is a fully open-sourced fork of openpilot, featuring clear and concise ------ FrogPilot was last updated on: -**September 1st, 2024** +**September 5th, 2024** Features ------ diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index f71254f877..1a708e00b9 100644 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -717,6 +717,7 @@ class Controls: self.always_on_lateral_active &= self.sm['frogpilotPlan'].lateralCheck self.always_on_lateral_active &= not (self.frogpilot_toggles.always_on_lateral_lkas and self.sm['frogpilotCarState'].alwaysOnLateralDisabled) self.always_on_lateral_active &= not (CS.brakePressed and CS.vEgo < self.frogpilot_toggles.always_on_lateral_pause_speed) or CS.standstill + self.always_on_lateral_active = bool(self.always_on_lateral_active) if self.frogpilot_toggles.conditional_experimental_mode: self.experimental_mode = self.sm['frogpilotPlan'].experimentalMode @@ -735,7 +736,7 @@ class Controls: self.resume_previously_pressed = self.resume_pressed FPCC = custom.FrogPilotCarControl.new_message() - FPCC.alwaysOnLateralActive = bool(self.always_on_lateral_active) + FPCC.alwaysOnLateralActive = self.always_on_lateral_active FPCC.fcwEventTriggered = self.fcw_event_triggered FPCC.noEntryEventTriggered = self.no_entry_alert_triggered FPCC.resumePressed = self.resume_previously_pressed diff --git a/selfdrive/frogpilot/controls/frogpilot_planner.py b/selfdrive/frogpilot/controls/frogpilot_planner.py index b7666dea7e..911f64636b 100644 --- a/selfdrive/frogpilot/controls/frogpilot_planner.py +++ b/selfdrive/frogpilot/controls/frogpilot_planner.py @@ -13,7 +13,7 @@ from openpilot.selfdrive.frogpilot.controls.lib.conditional_experimental_mode im from openpilot.selfdrive.frogpilot.controls.lib.frogpilot_acceleration import FrogPilotAcceleration from openpilot.selfdrive.frogpilot.controls.lib.frogpilot_events import FrogPilotEvents from openpilot.selfdrive.frogpilot.controls.lib.frogpilot_following import FrogPilotFollowing -from openpilot.selfdrive.frogpilot.controls.lib.frogpilot_functions import WeightedMovingAverageCalculator, calculate_lane_width, calculate_road_curvature, update_frogpilot_toggles +from openpilot.selfdrive.frogpilot.controls.lib.frogpilot_functions import MovingAverageCalculator, calculate_lane_width, calculate_road_curvature, update_frogpilot_toggles from openpilot.selfdrive.frogpilot.controls.lib.frogpilot_variables import CITY_SPEED_LIMIT, CRUISING_SPEED, MODEL_LENGTH, PLANNER_TIME, THRESHOLD from openpilot.selfdrive.frogpilot.controls.lib.frogpilot_vcruise import FrogPilotVCruise @@ -30,7 +30,7 @@ class FrogPilotPlanner: self.frogpilot_vcruise = FrogPilotVCruise(self) self.lead_one = Lead() - self.tracking_lead_mac = WeightedMovingAverageCalculator(window_size=5) + self.tracking_lead_mac = MovingAverageCalculator() self.lateral_check = False self.lead_departing = False @@ -128,7 +128,7 @@ class FrogPilotPlanner: following_lead &= v_ego > CRUISING_SPEED or self.tracking_lead self.tracking_lead_mac.add_data(following_lead) - return self.tracking_lead_mac.get_weighted_average() >= THRESHOLD + return self.tracking_lead_mac.get_moving_average() >= THRESHOLD def publish(self, sm, pm, frogpilot_toggles): frogpilot_plan_send = messaging.new_message('frogpilotPlan') diff --git a/selfdrive/frogpilot/controls/lib/conditional_experimental_mode.py b/selfdrive/frogpilot/controls/lib/conditional_experimental_mode.py index 6a766c5c36..31e908b0e2 100644 --- a/selfdrive/frogpilot/controls/lib/conditional_experimental_mode.py +++ b/selfdrive/frogpilot/controls/lib/conditional_experimental_mode.py @@ -1,6 +1,6 @@ from openpilot.common.params import Params -from openpilot.selfdrive.frogpilot.controls.lib.frogpilot_functions import WeightedMovingAverageCalculator +from openpilot.selfdrive.frogpilot.controls.lib.frogpilot_functions import MovingAverageCalculator from openpilot.selfdrive.frogpilot.controls.lib.frogpilot_variables import CITY_SPEED_LIMIT, THRESHOLD class ConditionalExperimentalMode: @@ -9,8 +9,8 @@ class ConditionalExperimentalMode: self.params_memory = Params("/dev/shm/params") - self.curvature_wmac = WeightedMovingAverageCalculator(window_size=5) - self.stop_light_wmac = WeightedMovingAverageCalculator(window_size=5) + self.curvature_mac = MovingAverageCalculator() + self.stop_light_mac = MovingAverageCalculator() self.curve_detected = False self.experimental_mode = False @@ -74,10 +74,10 @@ class ConditionalExperimentalMode: curve_detected = (1 / self.frogpilot_planner.road_curvature)**0.5 < v_ego curve_active = (0.9 / self.frogpilot_planner.road_curvature)**0.5 < v_ego and self.curve_detected - self.curvature_wmac.add_data(curve_detected or curve_active) - self.curve_detected = self.curvature_wmac.get_weighted_average() >= THRESHOLD + self.curvature_mac.add_data(curve_detected or curve_active) + self.curve_detected = self.curvature_mac.get_moving_average() >= THRESHOLD else: - self.curvature_wmac.reset_data() + self.curvature_mac.reset_data() self.curve_detected = False def slow_lead(self, tracking_lead, v_lead, frogpilot_toggles): @@ -93,8 +93,8 @@ class ConditionalExperimentalMode: if not (self.curve_detected or tracking_lead): model_stopping = self.frogpilot_planner.model_length < v_ego * frogpilot_toggles.conditional_model_stop_time - self.stop_light_wmac.add_data(self.frogpilot_planner.model_stopped or model_stopping) - self.stop_light_detected = self.stop_light_wmac.get_weighted_average() >= THRESHOLD + self.stop_light_mac.add_data(self.frogpilot_planner.model_stopped or model_stopping) + self.stop_light_detected = self.stop_light_mac.get_moving_average() >= THRESHOLD else: - self.stop_light_wmac.reset_data() + self.stop_light_mac.reset_data() self.stop_light_detected = False diff --git a/selfdrive/frogpilot/controls/lib/frogpilot_functions.py b/selfdrive/frogpilot/controls/lib/frogpilot_functions.py index bba42100b6..2fbe366b32 100644 --- a/selfdrive/frogpilot/controls/lib/frogpilot_functions.py +++ b/selfdrive/frogpilot/controls/lib/frogpilot_functions.py @@ -169,6 +169,14 @@ def convert_params(params, params_storage): for key in ["CustomColors", "CustomDistanceIcons", "CustomIcons", "CustomSignals", "CustomSounds", "WheelIcon"]: remove_param(key) + if params.get("LowVoltageShutdown", encoding='utf-8') == "VBATT_PAUSE_CHARGING": + params.remove("LowVoltageShutdown") + params_storage.remove("LowVoltageShutdown") + + if params.get("MinimumLaneChangeSpeed", encoding='utf-8') == "LANE_CHANGE_SPEED_MIN": + params.remove("MinimumLaneChangeSpeed") + params_storage.remove("MinimumLaneChangeSpeed") + print("Param conversion completed") def delete_file(file): @@ -284,23 +292,21 @@ def uninstall_frogpilot(): HARDWARE.uninstall() -class WeightedMovingAverageCalculator: - def __init__(self, window_size): - self.window_size = window_size - self.data = [] - self.weights = np.linspace(1, 2, window_size) +class MovingAverageCalculator: + def __init__(self): + self.reset_data() def add_data(self, value): - if len(self.data) == self.window_size: - self.data.pop(0) + if len(self.data) == 5: + self.total -= self.data.pop(0) self.data.append(value) + self.total += value - def get_weighted_average(self): + def get_moving_average(self): if len(self.data) == 0: return None - weighted_sum = np.dot(self.data, self.weights[-len(self.data):]) - weight_total = np.sum(self.weights[-len(self.data):]) - return weighted_sum / weight_total + return self.total / len(self.data) def reset_data(self): self.data = [] + self.total = 0 diff --git a/selfdrive/frogpilot/controls/lib/frogpilot_variables.py b/selfdrive/frogpilot/controls/lib/frogpilot_variables.py index d567d83b1f..f3aaf77de3 100644 --- a/selfdrive/frogpilot/controls/lib/frogpilot_variables.py +++ b/selfdrive/frogpilot/controls/lib/frogpilot_variables.py @@ -125,7 +125,7 @@ class FrogPilotVariables: device_shutdown_setting = self.params.get_int("DeviceShutdown") if toggle.device_management else 33 toggle.device_shutdown_time = (device_shutdown_setting - 3) * 3600 if device_shutdown_setting >= 4 else device_shutdown_setting * (60 * 15) toggle.increase_thermal_limits = toggle.device_management and self.params.get_bool("IncreaseThermalLimits") - toggle.low_voltage_shutdown = self.params.get_float("LowVoltageShutdown") if toggle.device_management else VBATT_PAUSE_CHARGING + toggle.low_voltage_shutdown = self.params.get_float("LowVoltageShutdown") if toggle.device_management and openpilot_installed else VBATT_PAUSE_CHARGING toggle.offline_mode = toggle.device_management and self.params.get_bool("OfflineMode") driving_personalities = toggle.openpilot_longitudinal and self.params.get_bool("DrivingPersonalities") @@ -161,7 +161,7 @@ class FrogPilotVariables: toggle.lane_change_delay = self.params.get_int("LaneChangeTime") if lane_change_customizations else 0 toggle.lane_detection_width = self.params.get_int("LaneDetectionWidth") * distance_conversion / 10. if lane_change_customizations else 0 toggle.lane_detection = toggle.lane_detection_width != 0 - toggle.minimum_lane_change_speed = self.params.get_int("MinimumLaneChangeSpeed") * speed_conversion if lane_change_customizations else LANE_CHANGE_SPEED_MIN + toggle.minimum_lane_change_speed = self.params.get_int("MinimumLaneChangeSpeed") * speed_conversion if lane_change_customizations and openpilot_installed else LANE_CHANGE_SPEED_MIN toggle.nudgeless = lane_change_customizations and self.params.get_bool("NudgelessLaneChange") toggle.one_lane_change = lane_change_customizations and self.params.get_bool("OneLaneChange") diff --git a/selfdrive/frogpilot/controls/lib/model_manager.py b/selfdrive/frogpilot/controls/lib/model_manager.py index f3d7f68285..a8f2f34c22 100644 --- a/selfdrive/frogpilot/controls/lib/model_manager.py +++ b/selfdrive/frogpilot/controls/lib/model_manager.py @@ -173,17 +173,11 @@ class ModelManager: print(f"Source default model not found at {source_path}. Exiting...") def update_models(self, boot_run=True): - self.repo_url = get_repository_url() if boot_run: self.copy_default_model() - boot_checks = 0 - while self.repo_url is None and boot_checks < 60: - boot_checks += 1 - if boot_checks > 60: - break - time.sleep(1) - self.validate_models() - elif self.repo_url is None: + + self.repo_url = get_repository_url() + if self.repo_url is None: print("GitHub and GitLab are offline...") return diff --git a/selfdrive/frogpilot/controls/lib/theme_manager.py b/selfdrive/frogpilot/controls/lib/theme_manager.py index 7a1e31045d..e7a4f27925 100644 --- a/selfdrive/frogpilot/controls/lib/theme_manager.py +++ b/selfdrive/frogpilot/controls/lib/theme_manager.py @@ -366,20 +366,12 @@ class ThemeManager: self.previous_assets = {} self.update_active_theme() - def update_themes(self, boot_run=True): + def update_themes(self): if not os.path.exists(THEME_SAVE_PATH): return repo_url = get_repository_url() - if boot_run: - boot_checks = 0 - while repo_url is None and boot_checks < 60: - boot_checks += 1 - if boot_checks > 60: - break - time.sleep(1) - self.validate_themes() - elif repo_url is None: + if repo_url is None: print("GitHub and GitLab are offline...") return diff --git a/selfdrive/frogpilot/frogpilot_process.py b/selfdrive/frogpilot/frogpilot_process.py index 0e3c4ce388..2531d8fb40 100644 --- a/selfdrive/frogpilot/frogpilot_process.py +++ b/selfdrive/frogpilot/frogpilot_process.py @@ -89,7 +89,7 @@ def time_checks(automatic_updates, deviceState, model_manager, now, started, the model_manager.update_models(boot_run=False) with locks["update_themes"]: - theme_manager.update_themes(boot_run=False) + theme_manager.update_themes() def toggle_updates(frogpilot_toggles, started, time_validated, params, params_storage): FrogPilotVariables.update_frogpilot_params(started, True) @@ -194,8 +194,9 @@ def frogpilot_thread(): time_validated = system_time_valid() if not time_validated: continue - run_thread_with_lock("update_models", model_manager.update_models) - run_thread_with_lock("update_themes", theme_manager.update_themes) + if deviceState.networkType == WIFI: + run_thread_with_lock("update_models", model_manager.update_models) + run_thread_with_lock("update_themes", theme_manager.update_themes) theme_manager.update_holiday() diff --git a/system/manager/manager.py b/system/manager/manager.py index 55dbe0f128..d51fcb2663 100755 --- a/system/manager/manager.py +++ b/system/manager/manager.py @@ -9,6 +9,7 @@ import traceback from cereal import log import cereal.messaging as messaging import openpilot.system.sentry as sentry +from openpilot.common.conversions import Conversions as CV from openpilot.common.params import Params, ParamKeyType from openpilot.common.text_window import TextWindow from openpilot.selfdrive.controls.lib.desire_helper import LANE_CHANGE_SPEED_MIN @@ -203,7 +204,7 @@ def manager_init() -> None: ("LosAngelesLiveTorqueParameters", ""), ("LosAngelesScore", "0"), ("LoudBlindspotAlert", "0"), - ("LowVoltageShutdown", "VBATT_PAUSE_CHARGING"), + ("LowVoltageShutdown", str(VBATT_PAUSE_CHARGING)), ("MapAcceleration", "0"), ("MapDeceleration", "0"), ("MapGears", "0"), @@ -211,7 +212,7 @@ def manager_init() -> None: ("MapboxSecretKey", ""), ("MapsSelected", ""), ("MapStyle", "10"), - ("MinimumLaneChangeSpeed", "LANE_CHANGE_SPEED_MIN"), + ("MinimumLaneChangeSpeed", str(LANE_CHANGE_SPEED_MIN / CV.MPH_TO_MS)), ("Model", DEFAULT_MODEL), ("ModelManagement", "0"), ("ModelName", DEFAULT_MODEL_NAME),