Files
StarPilot/selfdrive/frogpilot/controls/lib/speed_limit_controller.py
T
2025-04-15 22:03:14 -07:00

127 lines
5.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# PFEIFER - SLC - Modified by FrogAi for FrogPilot
#!/usr/bin/env python3
import json
from openpilot.selfdrive.frogpilot.frogpilot_utilities import calculate_distance_to_point
from openpilot.selfdrive.frogpilot.frogpilot_variables import TO_RADIANS, params, params_memory
class SpeedLimitController:
def __init__(self):
self.experimental_mode = False
self.speed_limit_changed = False
self.desired_speed_limit = 0
self.map_speed_limit = 0
self.speed_limit = 0
self.upcoming_speed_limit = 0
self.source = "None"
self.previous_speed_limit = params.get_float("PreviousSpeedLimit")
def update(self, dashboard_speed_limit, enabled, navigation_speed_limit, v_cruise, v_ego, frogpilot_toggles):
self.update_map_speed_limit(v_ego, frogpilot_toggles)
max_speed_limit = v_cruise if enabled else 0
self.speed_limit = self.get_speed_limit(dashboard_speed_limit, max_speed_limit, navigation_speed_limit, frogpilot_toggles)
self.desired_speed_limit = self.get_desired_speed_limit()
self.experimental_mode = frogpilot_toggles.slc_fallback_experimental_mode and self.speed_limit == 0
def get_desired_speed_limit(self):
if self.speed_limit > 1:
if abs(self.speed_limit - self.previous_speed_limit) > 1:
params.put_float_nonblocking("PreviousSpeedLimit", self.speed_limit)
self.previous_speed_limit = self.speed_limit
self.speed_limit_changed = True
return self.speed_limit
else:
self.speed_limit_changed = False
return 0
def update_map_speed_limit(self, v_ego, frogpilot_toggles):
position = json.loads(params_memory.get("LastGPSPosition") or "{}")
if not position:
self.map_speed_limit = 0
return
self.map_speed_limit = params_memory.get_float("MapSpeedLimit")
next_map_speed_limit = json.loads(params_memory.get("NextMapSpeedLimit") or "{}")
self.upcoming_speed_limit = next_map_speed_limit.get("speedlimit", 0)
if self.upcoming_speed_limit > 1:
current_latitude = position.get("latitude")
current_longitude = position.get("longitude")
upcoming_latitude = next_map_speed_limit.get("latitude")
upcoming_longitude = next_map_speed_limit.get("longitude")
distance_to_upcoming = calculate_distance_to_point(current_latitude * TO_RADIANS, current_longitude * TO_RADIANS, upcoming_latitude * TO_RADIANS, upcoming_longitude * TO_RADIANS)
if self.previous_speed_limit < self.upcoming_speed_limit:
max_distance = frogpilot_toggles.map_speed_lookahead_higher * v_ego
else:
max_distance = frogpilot_toggles.map_speed_lookahead_lower * v_ego
if distance_to_upcoming < max_distance:
self.map_speed_limit = self.upcoming_speed_limit
def get_offset(self, speed_limit, frogpilot_toggles):
if frogpilot_toggles.is_metric:
offset_map = [
(0, 8.1, frogpilot_toggles.speed_limit_offset1), # 029 km/h
(8.1, 13.6, frogpilot_toggles.speed_limit_offset2), # 3049
(13.6, 16.4, frogpilot_toggles.speed_limit_offset3), # 5059
(16.4, 21.9, frogpilot_toggles.speed_limit_offset4), # 6079
(21.9, 27.5, frogpilot_toggles.speed_limit_offset5), # 8099
(27.5, 33.1, frogpilot_toggles.speed_limit_offset6), # 100119
(33.1, 38.9, frogpilot_toggles.speed_limit_offset7), # 120140
]
else:
offset_map = [
(0, 11.2, frogpilot_toggles.speed_limit_offset1), # 024 mph
(11.2, 15.2, frogpilot_toggles.speed_limit_offset2), # 2534
(15.2, 19.6, frogpilot_toggles.speed_limit_offset3), # 3544
(19.6, 24.1, frogpilot_toggles.speed_limit_offset4), # 4554
(24.1, 28.6, frogpilot_toggles.speed_limit_offset5), # 5564
(28.6, 33.1, frogpilot_toggles.speed_limit_offset6), # 6574
(33.1, 44.2, frogpilot_toggles.speed_limit_offset7), # 7599
]
return next((offset for low, high, offset in offset_map if low < speed_limit < high), 0)
def get_speed_limit(self, dashboard_speed_limit, max_speed_limit, navigation_speed_limit, frogpilot_toggles):
limits = {
"Dashboard": dashboard_speed_limit,
"Map Data": self.map_speed_limit,
"Navigation": navigation_speed_limit
}
filtered_limits = {source: float(limit) for source, limit in limits.items() if limit > 1}
if filtered_limits:
if frogpilot_toggles.speed_limit_priority_highest:
self.source = max(filtered_limits, key=filtered_limits.get)
return filtered_limits[self.source]
if frogpilot_toggles.speed_limit_priority_lowest:
self.source = min(filtered_limits, key=filtered_limits.get)
return filtered_limits[self.source]
for priority in [
frogpilot_toggles.speed_limit_priority1,
frogpilot_toggles.speed_limit_priority2,
frogpilot_toggles.speed_limit_priority3
]:
if priority is not None and priority in filtered_limits:
self.source = priority
return filtered_limits[priority]
self.source = "None"
if frogpilot_toggles.slc_fallback_previous_speed_limit:
return self.previous_speed_limit
if frogpilot_toggles.slc_fallback_set_speed:
return max_speed_limit
return 0