mirror of
https://github.com/MoreTore/openpilot.git
synced 2026-07-26 20:32:04 +08:00
Update2
This commit is contained in:
@@ -1 +0,0 @@
|
||||
2025-04-26
|
||||
+28
-27
@@ -57,33 +57,34 @@ struct FrogPilotPlan @0x80ae746ee2596b11 {
|
||||
dangerJerk @2 :Float32;
|
||||
desiredFollowDistance @3 :Int64;
|
||||
experimentalMode @4 :Bool;
|
||||
forcingStop @5 :Bool;
|
||||
forcingStopLength @6 :Float32;
|
||||
frogpilotEvents @7 :List(Car.CarEvent);
|
||||
lateralCheck @8 :Bool;
|
||||
laneWidthLeft @9 :Float32;
|
||||
laneWidthRight @10 :Float32;
|
||||
maxAcceleration @11 :Float32;
|
||||
minAcceleration @12 :Float32;
|
||||
mtscSpeed @13 :Float32;
|
||||
redLight @14 :Bool;
|
||||
roadCurvature @15 :Float32;
|
||||
slcMapSpeedLimit @16 :Float32;
|
||||
slcMapboxSpeedLimit @17 :Float32;
|
||||
slcNextSpeedLimit @18 :Float32;
|
||||
slcOverriddenSpeed @19 :Float32;
|
||||
slcSpeedLimit @20 :Float32;
|
||||
slcSpeedLimitOffset @21 :Float32;
|
||||
slcSpeedLimitSource @22 :Text;
|
||||
speedJerk @23 :Float32;
|
||||
speedJerkStock @24 :Float32;
|
||||
speedLimitChanged @25 :Bool;
|
||||
tFollow @26 :Float32;
|
||||
togglesUpdated @27 :Bool;
|
||||
unconfirmedSlcSpeedLimit @28 :Float32;
|
||||
vCruise @29 :Float32;
|
||||
vtscControllingCurve @30 :Bool;
|
||||
vtscSpeed @31 :Float32;
|
||||
trackingLead @5 :Bool;
|
||||
forcingStop @6 :Bool;
|
||||
forcingStopLength @7 :Float32;
|
||||
frogpilotEvents @8 :List(Car.CarEvent);
|
||||
lateralCheck @9 :Bool;
|
||||
laneWidthLeft @10 :Float32;
|
||||
laneWidthRight @11 :Float32;
|
||||
maxAcceleration @12 :Float32;
|
||||
minAcceleration @13 :Float32;
|
||||
mtscSpeed @14 :Float32;
|
||||
redLight @15 :Bool;
|
||||
roadCurvature @16 :Float32;
|
||||
slcMapSpeedLimit @17 :Float32;
|
||||
slcMapboxSpeedLimit @18 :Float32;
|
||||
slcNextSpeedLimit @19 :Float32;
|
||||
slcOverriddenSpeed @20 :Float32;
|
||||
slcSpeedLimit @21 :Float32;
|
||||
slcSpeedLimitOffset @22 :Float32;
|
||||
slcSpeedLimitSource @23 :Text;
|
||||
speedJerk @24 :Float32;
|
||||
speedJerkStock @25 :Float32;
|
||||
speedLimitChanged @26 :Bool;
|
||||
tFollow @27 :Float32;
|
||||
togglesUpdated @28 :Bool;
|
||||
unconfirmedSlcSpeedLimit @29 :Float32;
|
||||
vCruise @30 :Float32;
|
||||
vtscControllingCurve @31 :Bool;
|
||||
vtscSpeed @32 :Float32;
|
||||
}
|
||||
|
||||
struct CustomReserved5 @0xa5cd762cd951a455 {
|
||||
|
||||
@@ -638,6 +638,7 @@ struct RadarState @0x9a185389d6fdd05f {
|
||||
modelProb @13 :Float32;
|
||||
radar @14 :Bool;
|
||||
radarTrackId @15 :Int32 = -1;
|
||||
farLead @16 :Bool;
|
||||
|
||||
aLeadDEPRECATED @5 :Float32;
|
||||
}
|
||||
|
||||
+10
-2
@@ -284,6 +284,16 @@ std::unordered_map<std::string, uint32_t> keys = {
|
||||
{"CustomUI", PERSISTENT},
|
||||
{"DebugMode", CLEAR_ON_OFFROAD_TRANSITION},
|
||||
{"DecelerationProfile", PERSISTENT},
|
||||
{"DeveloperMetrics", PERSISTENT},
|
||||
{"DeveloperSidebar", PERSISTENT},
|
||||
{"DeveloperSidebarMetric1", PERSISTENT},
|
||||
{"DeveloperSidebarMetric2", PERSISTENT},
|
||||
{"DeveloperSidebarMetric3", PERSISTENT},
|
||||
{"DeveloperSidebarMetric4", PERSISTENT},
|
||||
{"DeveloperSidebarMetric5", PERSISTENT},
|
||||
{"DeveloperSidebarMetric6", PERSISTENT},
|
||||
{"DeveloperSidebarMetric7", PERSISTENT},
|
||||
{"DeveloperWidgets", PERSISTENT},
|
||||
{"DeveloperUI", PERSISTENT},
|
||||
{"DeviceManagement", PERSISTENT},
|
||||
{"DeviceShutdown", PERSISTENT},
|
||||
@@ -344,7 +354,6 @@ std::unordered_map<std::string, uint32_t> keys = {
|
||||
{"IncreasedStoppedDistance", PERSISTENT},
|
||||
{"IncreaseThermalLimits", PERSISTENT},
|
||||
{"IssueReported", CLEAR_ON_MANAGER_START},
|
||||
{"JerkInfo", PERSISTENT},
|
||||
{"KonikDongleId", PERSISTENT},
|
||||
{"KonikMinutes", PERSISTENT},
|
||||
{"LaneChangeCustomizations", PERSISTENT},
|
||||
@@ -527,7 +536,6 @@ std::unordered_map<std::string, uint32_t> keys = {
|
||||
{"TrafficJerkSpeed", PERSISTENT},
|
||||
{"TrafficJerkSpeedDecrease", PERSISTENT},
|
||||
{"TrafficPersonalityProfile", PERSISTENT},
|
||||
{"TuningInfo", PERSISTENT},
|
||||
{"TuningLevel", PERSISTENT},
|
||||
{"TuningLevelConfirmed", PERSISTENT},
|
||||
{"TurnAggressiveness", PERSISTENT},
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 778 KiB After Width: | Height: | Size: 911 KiB |
@@ -81,15 +81,18 @@ def calculate_lane_width(lane, current_lane, road_edge=None):
|
||||
current_y = np.asarray(current_lane.y)
|
||||
|
||||
lane_y_interp = np.interp(current_x, np.asarray(lane.x), np.asarray(lane.y))
|
||||
|
||||
distance_to_lane = np.mean(np.abs(current_y - lane_y_interp))
|
||||
|
||||
if road_edge is None:
|
||||
return float(distance_to_lane)
|
||||
|
||||
road_edge_y_interp = np.interp(current_x, np.asarray(road_edge.x), np.asarray(road_edge.y))
|
||||
|
||||
distance_to_road_edge = np.mean(np.abs(current_y - road_edge_y_interp))
|
||||
return float(min(distance_to_lane, distance_to_road_edge))
|
||||
|
||||
if distance_to_road_edge < distance_to_lane:
|
||||
return 0.0
|
||||
|
||||
return float(distance_to_lane)
|
||||
|
||||
# Credit goes to Pfeiferj!
|
||||
def calculate_road_curvature(modelData, v_ego):
|
||||
|
||||
@@ -137,6 +137,16 @@ frogpilot_default_params: list[tuple[str, str | bytes, int]] = [
|
||||
("CustomSounds", "frog", 0),
|
||||
("CustomUI", "1", 1),
|
||||
("DecelerationProfile", "1", 2),
|
||||
("DeveloperMetrics", "1", 2),
|
||||
("DeveloperSidebar", "1", 2),
|
||||
("DeveloperSidebarMetric1", "1", 2),
|
||||
("DeveloperSidebarMetric2", "2", 2),
|
||||
("DeveloperSidebarMetric3", "3", 2),
|
||||
("DeveloperSidebarMetric4", "4", 2),
|
||||
("DeveloperSidebarMetric5", "5", 2),
|
||||
("DeveloperSidebarMetric6", "6", 2),
|
||||
("DeveloperSidebarMetric7", "7", 2),
|
||||
("DeveloperWidgets", "1", 2),
|
||||
("DeveloperUI", "0", 2),
|
||||
("DeviceManagement", "1", 1),
|
||||
("DeviceShutdown", "9", 1),
|
||||
@@ -150,7 +160,7 @@ frogpilot_default_params: list[tuple[str, str | bytes, int]] = [
|
||||
("DynamicPedalsOnUI", "1", 2),
|
||||
("EngageVolume", "101", 2),
|
||||
("ExperimentalGMTune", "0", 2),
|
||||
("ExperimentalLongitudinalEnabled", "1", 0),
|
||||
("ExperimentalLongitudinalEnabled", "0", 0),
|
||||
("ExperimentalMode", "0", 0),
|
||||
("ExperimentalModeConfirmed", "0", 0),
|
||||
("ExperimentalModels", "", 1),
|
||||
@@ -184,7 +194,6 @@ frogpilot_default_params: list[tuple[str, str | bytes, int]] = [
|
||||
("IncreaseThermalLimits", "0", 2),
|
||||
("IsLdwEnabled", "0", 0),
|
||||
("IsMetric", "0", 0),
|
||||
("JerkInfo", "0", 3),
|
||||
("KonikDongleId", "", 3),
|
||||
("KonikMinutes", "0", 0),
|
||||
("LaneChangeCustomizations", "0", 0),
|
||||
@@ -345,7 +354,6 @@ frogpilot_default_params: list[tuple[str, str | bytes, int]] = [
|
||||
("TrafficJerkSpeed", "50", 3),
|
||||
("TrafficJerkSpeedDecrease", "50", 3),
|
||||
("TrafficPersonalityProfile", "1", 2),
|
||||
("TuningInfo", "0", 3),
|
||||
("TuningLevel", "0", 0),
|
||||
("TuningLevelConfirmed", "0", 0),
|
||||
("TurnAggressiveness", "100", 2),
|
||||
@@ -366,8 +374,6 @@ frogpilot_default_params: list[tuple[str, str | bytes, int]] = [
|
||||
]
|
||||
|
||||
misc_tuning_levels: list[tuple[str, str | bytes, int]] = [
|
||||
("DeveloperMetrics", "", 2),
|
||||
("DeveloperWidgets", "", 2),
|
||||
("SLCPriority", "", 2),
|
||||
("WheelControls", "", 2)
|
||||
]
|
||||
@@ -597,29 +603,37 @@ class FrogPilotVariables:
|
||||
toggle.rotating_wheel = custom_ui and (params.get_bool("RotatingWheel") if tuning_level >= level["RotatingWheel"] else default.get_bool("RotatingWheel"))
|
||||
|
||||
toggle.developer_ui = params.get_bool("DeveloperUI") if tuning_level >= level["DeveloperUI"] else default.get_bool("DeveloperUI")
|
||||
toggle.adjacent_lead_tracking = has_radar and ((params.get_bool("AdjacentLeadsUI") if tuning_level >= level["AdjacentLeadsUI"] else default.get_bool("AdjacentLeadsUI")) or toggle.debug_mode)
|
||||
border_metrics = toggle.developer_ui and (params.get_bool("BorderMetrics") if tuning_level >= level["BorderMetrics"] else default.get_bool("BorderMetrics"))
|
||||
developer_metrics = toggle.developer_ui and params.get_bool("DeveloperMetrics") if tuning_level >= level["DeveloperMetrics"] else default.get_bool("DeveloperMetrics")
|
||||
border_metrics = developer_metrics and (params.get_bool("BorderMetrics") if tuning_level >= level["BorderMetrics"] else default.get_bool("BorderMetrics"))
|
||||
toggle.blind_spot_metrics = has_bsm and border_metrics and (params.get_bool("BlindSpotMetrics") if tuning_level >= level["BlindSpotMetrics"] else default.get_bool("BlindSpotMetrics")) or toggle.debug_mode
|
||||
toggle.signal_metrics = border_metrics and (params.get_bool("SignalMetrics") if tuning_level >= level["SignalMetrics"] else default.get_bool("SignalMetrics")) or toggle.debug_mode
|
||||
toggle.steering_metrics = border_metrics and (params.get_bool("ShowSteering") if tuning_level >= level["ShowSteering"] else default.get_bool("ShowSteering")) or toggle.debug_mode
|
||||
toggle.show_fps = toggle.developer_ui and (params.get_bool("FPSCounter") if tuning_level >= level["FPSCounter"] else default.get_bool("FPSCounter")) or toggle.debug_mode
|
||||
lateral_metrics = toggle.developer_ui and (params.get_bool("LateralMetrics") if tuning_level >= level["LateralMetrics"] else default.get_bool("LateralMetrics"))
|
||||
toggle.adjacent_path_metrics = lateral_metrics and (params.get_bool("AdjacentPathMetrics") if tuning_level >= level["AdjacentPathMetrics"] else default.get_bool("AdjacentPathMetrics")) or toggle.debug_mode
|
||||
toggle.lateral_tuning_metrics = (has_auto_tune or toggle.force_auto_tune) and lateral_metrics and (params.get_bool("TuningInfo") if tuning_level >= level["TuningInfo"] else default.get_bool("TuningInfo")) or toggle.debug_mode
|
||||
longitudinal_metrics = openpilot_longitudinal and (toggle.developer_ui and (params.get_bool("LongitudinalMetrics") if tuning_level >= level["LongitudinalMetrics"] else default.get_bool("LongitudinalMetrics")))
|
||||
toggle.lead_metrics = longitudinal_metrics and (params.get_bool("LeadInfo") if tuning_level >= level["LeadInfo"] else default.get_bool("LeadInfo")) or toggle.debug_mode
|
||||
toggle.jerk_metrics = longitudinal_metrics and (params.get_bool("JerkInfo") if tuning_level >= level["JerkInfo"] else default.get_bool("JerkInfo")) or toggle.debug_mode
|
||||
toggle.numerical_temp = toggle.developer_ui and (params.get_bool("NumericalTemp") if tuning_level >= level["NumericalTemp"] else default.get_bool("NumericalTemp")) or toggle.debug_mode
|
||||
toggle.show_fps = developer_metrics and (params.get_bool("FPSCounter") if tuning_level >= level["FPSCounter"] else default.get_bool("FPSCounter")) or toggle.debug_mode
|
||||
toggle.adjacent_path_metrics = (developer_metrics and params.get_bool("AdjacentPathMetrics") if tuning_level >= level["AdjacentPathMetrics"] else default.get_bool("AdjacentPathMetrics")) or toggle.debug_mode
|
||||
toggle.lead_metrics = (developer_metrics and params.get_bool("LeadInfo") if tuning_level >= level["LeadInfo"] else default.get_bool("LeadInfo")) or toggle.debug_mode
|
||||
toggle.numerical_temp = developer_metrics and (params.get_bool("NumericalTemp") if tuning_level >= level["NumericalTemp"] else default.get_bool("NumericalTemp")) or toggle.debug_mode
|
||||
toggle.fahrenheit = toggle.numerical_temp and (params.get_bool("Fahrenheit") if tuning_level >= level["Fahrenheit"] else default.get_bool("Fahrenheit")) and not toggle.debug_mode
|
||||
toggle.radar_tracks = has_radar and ((params.get_bool("RadarTracksUI") if tuning_level >= level["RadarTracksUI"] else default.get_bool("RadarTracksUI")) or toggle.debug_mode)
|
||||
toggle.sidebar_metrics = toggle.developer_ui and (params.get_bool("SidebarMetrics") if tuning_level >= level["SidebarMetrics"] else default.get_bool("SidebarMetrics")) or toggle.debug_mode
|
||||
toggle.sidebar_metrics = developer_metrics and (params.get_bool("SidebarMetrics") if tuning_level >= level["SidebarMetrics"] else default.get_bool("SidebarMetrics")) or toggle.debug_mode
|
||||
toggle.cpu_metrics = toggle.sidebar_metrics and (params.get_bool("ShowCPU") if tuning_level >= level["ShowCPU"] else default.get_bool("ShowCPU")) or toggle.debug_mode
|
||||
toggle.gpu_metrics = toggle.sidebar_metrics and (params.get_bool("ShowGPU") if tuning_level >= level["ShowGPU"] else default.get_bool("ShowGPU")) and not toggle.debug_mode
|
||||
toggle.ip_metrics = toggle.sidebar_metrics and (params.get_bool("ShowIP") if tuning_level >= level["ShowIP"] else default.get_bool("ShowIP"))
|
||||
toggle.memory_metrics = toggle.sidebar_metrics and (params.get_bool("ShowMemoryUsage") if tuning_level >= level["ShowMemoryUsage"] else default.get_bool("ShowMemoryUsage")) or toggle.debug_mode
|
||||
toggle.storage_left_metrics = toggle.sidebar_metrics and (params.get_bool("ShowStorageLeft") if tuning_level >= level["ShowStorageLeft"] else default.get_bool("ShowStorageLeft")) and not toggle.debug_mode
|
||||
toggle.storage_used_metrics = toggle.sidebar_metrics and (params.get_bool("ShowStorageUsed") if tuning_level >= level["ShowStorageUsed"] else default.get_bool("ShowStorageUsed")) and not toggle.debug_mode
|
||||
toggle.use_si_metrics = toggle.developer_ui and (params.get_bool("UseSI") if tuning_level >= level["UseSI"] else default.get_bool("UseSI")) or toggle.debug_mode
|
||||
toggle.use_si_metrics = developer_metrics and (params.get_bool("UseSI") if tuning_level >= level["UseSI"] else default.get_bool("UseSI")) or toggle.debug_mode
|
||||
toggle.developer_sidebar = toggle.developer_ui and (params.get_bool("DeveloperSidebar") if tuning_level >= level["DeveloperSidebar"] else default.get_bool("DeveloperSidebar"))
|
||||
toggle.developer_sidebar_metric1 = params.get_int("DeveloperSidebarMetric1") if toggle.developer_sidebar and tuning_level >= level["DeveloperSidebarMetric1"] else default.get_float("DeveloperSidebarMetric1")
|
||||
toggle.developer_sidebar_metric2 = params.get_int("DeveloperSidebarMetric2") if toggle.developer_sidebar and tuning_level >= level["DeveloperSidebarMetric2"] else default.get_float("DeveloperSidebarMetric2")
|
||||
toggle.developer_sidebar_metric3 = params.get_int("DeveloperSidebarMetric3") if toggle.developer_sidebar and tuning_level >= level["DeveloperSidebarMetric3"] else default.get_float("DeveloperSidebarMetric3")
|
||||
toggle.developer_sidebar_metric4 = params.get_int("DeveloperSidebarMetric4") if toggle.developer_sidebar and tuning_level >= level["DeveloperSidebarMetric4"] else default.get_float("DeveloperSidebarMetric4")
|
||||
toggle.developer_sidebar_metric5 = params.get_int("DeveloperSidebarMetric5") if toggle.developer_sidebar and tuning_level >= level["DeveloperSidebarMetric5"] else default.get_float("DeveloperSidebarMetric5")
|
||||
toggle.developer_sidebar_metric6 = params.get_int("DeveloperSidebarMetric6") if toggle.developer_sidebar and tuning_level >= level["DeveloperSidebarMetric6"] else default.get_float("DeveloperSidebarMetric6")
|
||||
toggle.developer_sidebar_metric7 = params.get_int("DeveloperSidebarMetric7") if toggle.developer_sidebar and tuning_level >= level["DeveloperSidebarMetric7"] else default.get_float("DeveloperSidebarMetric7")
|
||||
developer_widgets = toggle.developer_ui and params.get_bool("DeveloperWidgets") if tuning_level >= level["DeveloperWidgets"] else default.get_bool("DeveloperWidgets")
|
||||
toggle.adjacent_lead_tracking = has_radar and ((developer_widgets and params.get_bool("AdjacentLeadsUI") if tuning_level >= level["AdjacentLeadsUI"] else default.get_bool("AdjacentLeadsUI")) or toggle.debug_mode)
|
||||
toggle.radar_tracks = has_radar and ((developer_widgets and params.get_bool("RadarTracksUI") if tuning_level >= level["RadarTracksUI"] else default.get_bool("RadarTracksUI")) or toggle.debug_mode)
|
||||
toggle.show_stopping_point = openpilot_longitudinal and (developer_widgets and (params.get_bool("ShowStoppingPoint") if tuning_level >= level["ShowStoppingPoint"] else default.get_bool("ShowStoppingPoint")) or toggle.debug_mode)
|
||||
toggle.show_stopping_point_metrics = toggle.show_stopping_point and (params.get_bool("ShowStoppingPointMetrics") if tuning_level >= level["ShowStoppingPointMetrics"] else default.get_bool("ShowStoppingPointMetrics") or toggle.debug_mode)
|
||||
|
||||
device_management = params.get_bool("DeviceManagement") if tuning_level >= level["DeviceManagement"] else default.get_bool("DeviceManagement")
|
||||
device_shutdown_setting = params.get_int("DeviceShutdown") if device_management and tuning_level >= level["DeviceShutdown"] else default.get_int("DeviceShutdown")
|
||||
@@ -752,8 +766,6 @@ class FrogPilotVariables:
|
||||
toggle.path_edge_width = params.get_int("PathEdgeWidth") if toggle.model_ui and tuning_level >= level["PathEdgeWidth"] else default.get_int("PathEdgeWidth")
|
||||
toggle.path_width = params.get_float("PathWidth") * distance_conversion / 2 if toggle.model_ui and tuning_level >= level["PathWidth"] else default.get_float("PathWidth") * CV.FOOT_TO_METER / 2
|
||||
toggle.road_edge_width = params.get_int("RoadEdgesWidth") * small_distance_conversion / 200 if toggle.model_ui and tuning_level >= level["RoadEdgesWidth"] else default.get_int("RoadEdgesWidth") * CV.INCH_TO_CM / 200
|
||||
toggle.show_stopping_point = openpilot_longitudinal and (toggle.model_ui and (params.get_bool("ShowStoppingPoint") if tuning_level >= level["ShowStoppingPoint"] else default.get_bool("ShowStoppingPoint")) or toggle.debug_mode)
|
||||
toggle.show_stopping_point_metrics = toggle.show_stopping_point and (params.get_bool("ShowStoppingPointMetrics") if tuning_level >= level["ShowStoppingPointMetrics"] else default.get_bool("ShowStoppingPointMetrics") or toggle.debug_mode)
|
||||
toggle.unlimited_road_ui_length = toggle.model_ui and (params.get_bool("UnlimitedLength") if tuning_level >= level["UnlimitedLength"] else default.get_bool("UnlimitedLength"))
|
||||
|
||||
toggle.navigation_ui = params.get_bool("NavigationUI") if tuning_level >= level["NavigationUI"] else default.get_bool("NavigationUI")
|
||||
|
||||
@@ -173,6 +173,8 @@ class FrogPilotPlanner:
|
||||
|
||||
frogpilotPlan.togglesUpdated = toggles_updated
|
||||
|
||||
frogpilotPlan.trackingLead = self.tracking_lead
|
||||
|
||||
frogpilotPlan.vCruise = self.v_cruise
|
||||
|
||||
pm.send("frogpilotPlan", frogpilot_plan_send)
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
#!/usr/bin/env python3
|
||||
import numpy as np
|
||||
|
||||
from openpilot.common.realtime import DT_MDL
|
||||
from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import COMFORT_BRAKE
|
||||
|
||||
@@ -47,7 +45,7 @@ class FrogPilotVCruise:
|
||||
|
||||
if not self.frogpilot_planner.frogpilot_following.following_lead and self.linear_braking_active:
|
||||
decel_rate = (v_ego - self.frogpilot_planner.lead_one.vLead)**2 / self.frogpilot_planner.lead_one.dRel
|
||||
self.braking_target = float(np.clip(v_ego - (decel_rate * DT_MDL), self.frogpilot_planner.lead_one.vLead + CRUISING_SPEED, v_cruise))
|
||||
self.braking_target = max(v_ego - (decel_rate * DT_MDL), self.frogpilot_planner.lead_one.vLead + CRUISING_SPEED)
|
||||
else:
|
||||
self.braking_target = v_cruise
|
||||
else:
|
||||
@@ -65,7 +63,7 @@ class FrogPilotVCruise:
|
||||
self.mtsc_target = v_cruise
|
||||
else:
|
||||
mtsc_speed = ((TARGET_LAT_A * frogpilot_toggles.turn_aggressiveness) / (self.mtsc.get_map_curvature(gps_position, v_ego) * frogpilot_toggles.curve_sensitivity))**0.5
|
||||
self.mtsc_target = float(np.clip(mtsc_speed, CRUISING_SPEED, v_cruise))
|
||||
self.mtsc_target = max(CRUISING_SPEED, mtsc_speed)
|
||||
else:
|
||||
self.mtsc_target = v_cruise
|
||||
|
||||
@@ -89,8 +87,8 @@ class FrogPilotVCruise:
|
||||
|
||||
# Pfeiferj's Vision Turn Controller
|
||||
if v_ego > CRUISING_SPEED and sm["controlsState"].enabled and self.frogpilot_planner.road_curvature_detected and frogpilot_toggles.vision_turn_speed_controller:
|
||||
self.vtsc_target = ((TARGET_LAT_A * frogpilot_toggles.turn_aggressiveness) / (abs(self.frogpilot_planner.road_curvature) * frogpilot_toggles.curve_sensitivity))**0.5
|
||||
self.vtsc_target = float(np.clip(self.vtsc_target, CRUISING_SPEED, v_cruise))
|
||||
vtsc_speed = ((TARGET_LAT_A * frogpilot_toggles.turn_aggressiveness) / (abs(self.frogpilot_planner.road_curvature) * frogpilot_toggles.curve_sensitivity))**0.5
|
||||
self.vtsc_target = max(CRUISING_SPEED, vtsc_speed)
|
||||
else:
|
||||
self.vtsc_target = v_cruise
|
||||
|
||||
@@ -110,7 +108,7 @@ class FrogPilotVCruise:
|
||||
|
||||
self.tracked_model_length = self.frogpilot_planner.model_length
|
||||
|
||||
targets = [self.braking_target, self.mtsc_target, self.vtsc_target]
|
||||
targets = [self.braking_target, self.mtsc_target, self.vtsc_target, v_cruise]
|
||||
if frogpilot_toggles.speed_limit_controller:
|
||||
targets.append(max(self.slc.overridden_speed, self.slc_target + self.slc_offset))
|
||||
|
||||
|
||||
@@ -300,7 +300,7 @@ class SpeedLimitController:
|
||||
if self.override_slc:
|
||||
if self.frogpilot_toggles.speed_limit_controller_override_manual:
|
||||
if sm["carState"].gasPressed:
|
||||
self.overridden_speed = v_ego
|
||||
self.overridden_speed = max(v_ego, self.overridden_speed)
|
||||
self.overridden_speed = float(np.clip(self.overridden_speed, self.target + self.offset, v_cruise))
|
||||
elif self.frogpilot_toggles.speed_limit_controller_override_set_speed:
|
||||
self.overridden_speed = v_cruise
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 441 KiB |
@@ -1,59 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
from time import sleep
|
||||
|
||||
from panda import Panda
|
||||
|
||||
BODY_CAN_IDS = {0x750, 0x752, 0x660, 0x285}
|
||||
|
||||
def hw_name(hw_type):
|
||||
names = {
|
||||
Panda.HW_TYPE_WHITE_PANDA: 'white',
|
||||
Panda.HW_TYPE_GREY_PANDA: 'grey',
|
||||
Panda.HW_TYPE_BLACK_PANDA: 'black',
|
||||
Panda.HW_TYPE_UNO: 'uno',
|
||||
Panda.HW_TYPE_DOS: 'dos',
|
||||
Panda.HW_TYPE_RED_PANDA: 'red',
|
||||
Panda.HW_TYPE_RED_PANDA_V2: 'red v2',
|
||||
Panda.HW_TYPE_TRES: 'tres',
|
||||
Panda.HW_TYPE_CUATRO: 'cuatro',
|
||||
}
|
||||
return names.get(hw_type, 'unknown')
|
||||
|
||||
def expected_body_bus(hw_type, flipped):
|
||||
if hw_type in Panda.H7_DEVICES:
|
||||
return 1 if flipped else 0
|
||||
if hw_type in (Panda.HW_TYPE_UNO, Panda.HW_TYPE_DOS, Panda.HW_TYPE_BLACK_PANDA):
|
||||
return 1
|
||||
return None
|
||||
|
||||
def scan_can(panda, secs=1):
|
||||
seen = set()
|
||||
end = panda.get_microsecond_timer() + secs * 1_000_000
|
||||
while panda.get_microsecond_timer() < end:
|
||||
for addr, _, _, bus in panda.can_recv():
|
||||
if addr in BODY_CAN_IDS:
|
||||
seen.add(bus)
|
||||
return sorted(seen)
|
||||
|
||||
def main():
|
||||
serials = Panda.list()
|
||||
print(f'Found {len(serials)} panda(serial): {serials}\n')
|
||||
|
||||
for serial in serials:
|
||||
with Panda(serial, claim=False) as panda:
|
||||
hw_type = panda.get_type()
|
||||
if isinstance(hw_type, bytearray):
|
||||
hw_type = bytes(hw_type)
|
||||
flipped = panda.health()['car_harness_status'] == Panda.HARNESS_STATUS_FLIPPED
|
||||
body_bus = expected_body_bus(hw_type, flipped)
|
||||
|
||||
print(f'Panda {serial[:8]}…')
|
||||
print(f' hw: {hw_name(hw_type)}, mcu: {"H7" if hw_type in Panda.H7_DEVICES else "F4"}')
|
||||
print(f' harness flipped: {flipped}')
|
||||
print(f' expected Toyota body bus: {body_bus}')
|
||||
print(' sniffing CAN for one second…')
|
||||
buses = scan_can(panda)
|
||||
print(f' body-CAN traffic seen on: {buses}\n')
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -56,7 +56,8 @@ void update_theme(FrogPilotUIState *fs) {
|
||||
FrogPilotUIState::FrogPilotUIState(QObject *parent) : QObject(parent) {
|
||||
sm = std::make_unique<SubMaster, const std::initializer_list<const char *>>({
|
||||
"carControl", "carState", "controlsState", "deviceState", "frogpilotCarState", "frogpilotDeviceState",
|
||||
"frogpilotNavigation", "frogpilotPlan", "liveTracks", "navInstruction"
|
||||
"frogpilotNavigation", "frogpilotPlan", "liveDelay", "liveParameters", "liveTorqueParameters", "liveTracks",
|
||||
"navInstruction"
|
||||
});
|
||||
|
||||
wifi = new WifiManager(this);
|
||||
|
||||
@@ -140,7 +140,7 @@ FrogPilotSettingsWindow::FrogPilotSettingsWindow(SettingsWindow *parent) : QFram
|
||||
"../../frogpilot/assets/toggle_icons/icon_customization.png",
|
||||
togglePresets, true);
|
||||
|
||||
int timeTo100FPHours = 100 - (paramsTracking.getInt("FrogPilotMinutes") / 60);
|
||||
int timeTo100FPHours = 100 - (params_tracking.getInt("FrogPilotMinutes") / 60);
|
||||
int timeTo250OPHours = 250 - (params.getInt("KonikMinutes") / 60) - (params.getInt("openpilotMinutes") / 60);
|
||||
togglePreset->setEnabledButtons(3, timeTo100FPHours <= 0 || timeTo250OPHours <= 0);
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@ private:
|
||||
|
||||
Params params;
|
||||
Params params_memory{"/dev/shm/params"};
|
||||
Params paramsTracking{"/cache/tracking"};
|
||||
Params params_tracking{"/cache/tracking"};
|
||||
|
||||
QStackedLayout *mainLayout;
|
||||
|
||||
|
||||
@@ -275,7 +275,7 @@ void FrogPilotLateralPanel::updateMetric(bool metric, bool bootRun) {
|
||||
}
|
||||
|
||||
for (int i = 0; i <= 99; ++i) {
|
||||
imperialSpeedLabels[i] = i == 0 ? tr("Off") : QString::number(i) + tr("mph");
|
||||
imperialSpeedLabels[i] = i == 0 ? tr("Off") : QString::number(i) + tr(" mph");
|
||||
}
|
||||
|
||||
for (int i = 0; i <= 50; ++i) {
|
||||
@@ -284,7 +284,7 @@ void FrogPilotLateralPanel::updateMetric(bool metric, bool bootRun) {
|
||||
}
|
||||
|
||||
for (int i = 0; i <= 150; ++i) {
|
||||
metricSpeedLabels[i] = i == 0 ? tr("Off") : QString::number(i) + tr("km/h");
|
||||
metricSpeedLabels[i] = i == 0 ? tr("Off") : QString::number(i) + tr(" km/h");
|
||||
}
|
||||
|
||||
labelsInitialized = true;
|
||||
|
||||
@@ -228,8 +228,8 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow *
|
||||
});
|
||||
longitudinalToggle = conditionalExperimentalToggle;
|
||||
} else if (param == "CESpeed") {
|
||||
FrogPilotParamValueControl *CESpeed = new FrogPilotParamValueControl(param, title, desc, icon, 0, 99, tr("mph"), std::map<float, QString>(), 1, true, true);
|
||||
FrogPilotParamValueControl *CESpeedLead = new FrogPilotParamValueControl("CESpeedLead", tr("With Lead"), tr("Switch to <b>Experimental Mode</b> when driving below this speed with a lead."), icon, 0, 99, tr("mph"), std::map<float, QString>(), 1, true, true);
|
||||
FrogPilotParamValueControl *CESpeed = new FrogPilotParamValueControl(param, title, desc, icon, 0, 99, tr(" mph"), std::map<float, QString>(), 1, true, true);
|
||||
FrogPilotParamValueControl *CESpeedLead = new FrogPilotParamValueControl("CESpeedLead", tr("With Lead"), tr("Switch to <b>Experimental Mode</b> when driving below this speed with a lead."), icon, 0, 99, tr(" mph"), std::map<float, QString>(), 1, true, true);
|
||||
FrogPilotDualParamValueControl *conditionalSpeeds = new FrogPilotDualParamValueControl(CESpeed, CESpeedLead);
|
||||
longitudinalToggle = reinterpret_cast<AbstractControl*>(conditionalSpeeds);
|
||||
} else if (param == "CECurves") {
|
||||
@@ -253,7 +253,7 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow *
|
||||
} else if (param == "CESignalSpeed") {
|
||||
std::vector<QString> ceSignalToggles{"CESignalLaneDetection"};
|
||||
std::vector<QString> ceSignalToggleNames{"Only For Detected Lanes"};
|
||||
longitudinalToggle = new FrogPilotParamValueButtonControl(param, title, desc, icon, 0, 99, tr("mph"), std::map<float, QString>(), 1.0, true, ceSignalToggles, ceSignalToggleNames, true);
|
||||
longitudinalToggle = new FrogPilotParamValueButtonControl(param, title, desc, icon, 0, 99, tr(" mph"), std::map<float, QString>(), 1.0, true, ceSignalToggles, ceSignalToggleNames, true);
|
||||
|
||||
} else if (param == "CurveSpeedControl") {
|
||||
FrogPilotManageControl *curveControlToggle = new FrogPilotManageControl(param, title, desc, icon);
|
||||
@@ -303,7 +303,7 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow *
|
||||
} else if (param == "LeadDetectionThreshold") {
|
||||
longitudinalToggle = new FrogPilotParamValueControl(param, title, desc, icon, 1, 99, "%");
|
||||
} else if (param == "MaxDesiredAcceleration") {
|
||||
longitudinalToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0.1, 4.0, "m/s", std::map<float, QString>(), 0.1);
|
||||
longitudinalToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0.1, 4.0, tr(" m/s²"), std::map<float, QString>(), 0.1);
|
||||
|
||||
} else if (param == "QOLLongitudinal") {
|
||||
FrogPilotManageControl *qolLongitudinalToggle = new FrogPilotManageControl(param, title, desc, icon);
|
||||
@@ -312,9 +312,9 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow *
|
||||
});
|
||||
longitudinalToggle = qolLongitudinalToggle;
|
||||
} else if (param == "CustomCruise") {
|
||||
longitudinalToggle = new FrogPilotParamValueControl(param, title, desc, icon, 1, 99, tr("mph"));
|
||||
longitudinalToggle = new FrogPilotParamValueControl(param, title, desc, icon, 1, 99, tr(" mph"));
|
||||
} else if (param == "CustomCruiseLong") {
|
||||
longitudinalToggle = new FrogPilotParamValueControl(param, title, desc, icon, 1, 99, tr("mph"));
|
||||
longitudinalToggle = new FrogPilotParamValueControl(param, title, desc, icon, 1, 99, tr(" mph"));
|
||||
} else if (param == "IncreasedStoppedDistance") {
|
||||
longitudinalToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 10, tr(" feet"));
|
||||
} else if (param == "MapGears") {
|
||||
@@ -322,7 +322,7 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow *
|
||||
std::vector<QString> mapGearsToggleNames{tr("Acceleration"), tr("Deceleration")};
|
||||
longitudinalToggle = new FrogPilotButtonToggleControl(param, title, desc, icon, mapGearsToggles, mapGearsToggleNames);
|
||||
} else if (param == "SetSpeedOffset") {
|
||||
longitudinalToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 99, tr("mph"));
|
||||
longitudinalToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 99, tr(" mph"));
|
||||
|
||||
} else if (param == "SpeedLimitController") {
|
||||
FrogPilotManageControl *speedLimitControllerToggle = new FrogPilotManageControl(param, title, desc, icon);
|
||||
@@ -405,7 +405,7 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow *
|
||||
});
|
||||
longitudinalToggle = manageSLCOffsetsBtn;
|
||||
} else if (speedLimitControllerOffsetsKeys.find(param) != speedLimitControllerOffsetsKeys.end()) {
|
||||
longitudinalToggle = new FrogPilotParamValueControl(param, title, desc, icon, -99, 99, tr("mph"));
|
||||
longitudinalToggle = new FrogPilotParamValueControl(param, title, desc, icon, -99, 99, tr(" mph"));
|
||||
} else if (param == "SLCQOL") {
|
||||
ButtonControl *manageSLCQOLBtn = new ButtonControl(title, tr("MANAGE"), desc);
|
||||
QObject::connect(manageSLCQOLBtn, &ButtonControl::clicked, [this, longitudinalLayout, speedLimitControllerQOLPanel]() {
|
||||
@@ -732,7 +732,7 @@ void FrogPilotLongitudinalPanel::updateMetric(bool metric, bool bootRun) {
|
||||
}
|
||||
|
||||
for (int i = 0; i <= 99; ++i) {
|
||||
imperialSpeedLabels[i] = i == 0 ? tr("Off") : QString::number(i) + tr("mph");
|
||||
imperialSpeedLabels[i] = i == 0 ? tr("Off") : QString::number(i) + tr(" mph");
|
||||
}
|
||||
|
||||
for (int i = 0; i <= 3; ++i) {
|
||||
@@ -740,7 +740,7 @@ void FrogPilotLongitudinalPanel::updateMetric(bool metric, bool bootRun) {
|
||||
}
|
||||
|
||||
for (int i = 0; i <= 150; ++i) {
|
||||
metricSpeedLabels[i] = i == 0 ? tr("Off") : QString::number(i) + tr("km/h");
|
||||
metricSpeedLabels[i] = i == 0 ? tr("Off") : QString::number(i) + tr(" km/h");
|
||||
}
|
||||
|
||||
labelsInitialized = true;
|
||||
|
||||
@@ -13,6 +13,7 @@ FrogPilotVisualsPanel::FrogPilotVisualsPanel(FrogPilotSettingsWindow *parent) :
|
||||
FrogPilotListWidget *advancedCustomList = new FrogPilotListWidget(this);
|
||||
FrogPilotListWidget *customUIList = new FrogPilotListWidget(this);
|
||||
FrogPilotListWidget *developerMetricList = new FrogPilotListWidget(this);
|
||||
FrogPilotListWidget *developerSidebarList = new FrogPilotListWidget(this);
|
||||
FrogPilotListWidget *developerUIList = new FrogPilotListWidget(this);
|
||||
FrogPilotListWidget *developerWidgetList = new FrogPilotListWidget(this);
|
||||
FrogPilotListWidget *modelUIList = new FrogPilotListWidget(this);
|
||||
@@ -22,6 +23,7 @@ FrogPilotVisualsPanel::FrogPilotVisualsPanel(FrogPilotSettingsWindow *parent) :
|
||||
ScrollView *advancedCustomPanel = new ScrollView(advancedCustomList, this);
|
||||
ScrollView *customUIPanel = new ScrollView(customUIList, this);
|
||||
ScrollView *developerMetricPanel = new ScrollView(developerMetricList, this);
|
||||
ScrollView *developerSidebarPanel = new ScrollView(developerSidebarList, this);
|
||||
ScrollView *developerUIPanel = new ScrollView(developerUIList, this);
|
||||
ScrollView *developerWidgetPanel = new ScrollView(developerWidgetList, this);
|
||||
ScrollView *modelUIPanel = new ScrollView(modelUIList, this);
|
||||
@@ -31,6 +33,7 @@ FrogPilotVisualsPanel::FrogPilotVisualsPanel(FrogPilotSettingsWindow *parent) :
|
||||
visualsLayout->addWidget(advancedCustomPanel);
|
||||
visualsLayout->addWidget(customUIPanel);
|
||||
visualsLayout->addWidget(developerMetricPanel);
|
||||
visualsLayout->addWidget(developerSidebarPanel);
|
||||
visualsLayout->addWidget(developerUIPanel);
|
||||
visualsLayout->addWidget(developerWidgetPanel);
|
||||
visualsLayout->addWidget(modelUIPanel);
|
||||
@@ -48,14 +51,22 @@ FrogPilotVisualsPanel::FrogPilotVisualsPanel(FrogPilotSettingsWindow *parent) :
|
||||
{"WheelSpeed", tr("Use Wheel Speed"), tr("Use the vehicle's wheel speed instead of the cluster speed. This is purely a visual change and doesn't impact how openpilot drives."), ""},
|
||||
|
||||
{"DeveloperUI", tr("Developer UI"), tr("Detailed information about openpilot's internal operations."), "../assets/offroad/icon_shell.png"},
|
||||
{"AdjacentPathMetrics", tr("Adjacent Path Metrics"), tr("Metrics displayed on top of the adjacent lanes measuring their current width."), ""},
|
||||
{"DeveloperMetrics", tr("Developer Metrics"), tr("Performance data, sensor readings, and system metrics for debugging and optimizing openpilot."), ""},
|
||||
{"BorderMetrics", tr("Border Metrics"), tr("Metrics displayed around the border of the driving screen.<br><br><b>Blind Spot</b>: Turn the border red when a vehicle is detected in a blind spot<br><b>Steering Torque</b>: Highlight the border green to red in accordance to the amount of steering torque being used<br><b>Turn Signal</b>: Flash the border yellow when a turn signal is active"), ""},
|
||||
{"LeadInfo", tr("Lead Info"), tr("Metrics displayed under vehicle markers listing their distance and current speed."), ""},
|
||||
{"FPSCounter", tr("FPS Display"), tr("Display the <b>Frames Per Second (FPS)</b> at the bottom of the driving screen."), ""},
|
||||
{"LateralMetrics", tr("Lateral Metrics"), tr("Metrics related to steering control.<br><br><b>Adjacent Path Metrics</b>: Paint the adjacent lanes and their width measurements<br><b>Auto Tune</b>: Display the <b>Friction</b> and <b>Lateral Acceleration</b> values from comma's auto tune at the top of the driving screen"), ""},
|
||||
{"LongitudinalMetrics", tr("Longitudinal Metrics"), tr("Metrics related to gas/brake control.<br><br><b>Lead Info</b>: Display the lead vehicle's distance and speed on the lead marker<br><b>Jerk Values</b>: Display the current longitudinal jerk values and any offsets from FrogPilot functions at the top of the driving screen"), ""},
|
||||
{"NumericalTemp", tr("Numerical Temperature Gauge"), tr("Use numerical temperature readings instead of status labels in the sidebar."), ""},
|
||||
{"SidebarMetrics", tr("Sidebar"), tr("Display system information (<b>CPU</b>, <b>GPU</b>, <b>RAM usage</b>, <b>IP address</b>, <b>device storage</b>) in the sidebar."), ""},
|
||||
{"UseSI", tr("Use International System of Units"), tr("Display measurements using the <b>International System of Units (SI)</b> standard."), ""},
|
||||
{"DeveloperSidebar", tr("Developer Sidebar"), tr("Display debugging info and metrics in a dedicated sidebar on the right side of the screen."), ""},
|
||||
{"DeveloperSidebarMetric1", tr("Metric #1"), tr("Metric to display in the first metric in the \"Developer Sidebar\"."), ""},
|
||||
{"DeveloperSidebarMetric2", tr("Metric #2"), tr("Metric to display in the second metric in the \"Developer Sidebar\"."), ""},
|
||||
{"DeveloperSidebarMetric3", tr("Metric #3"), tr("Metric to display in the third metric in the \"Developer Sidebar\"."), ""},
|
||||
{"DeveloperSidebarMetric4", tr("Metric #4"), tr("Metric to display in the fourth metric in the \"Developer Sidebar\"."), ""},
|
||||
{"DeveloperSidebarMetric5", tr("Metric #5"), tr("Metric to display in the fifth metric in the \"Developer Sidebar\"."), ""},
|
||||
{"DeveloperSidebarMetric6", tr("Metric #6"), tr("Metric to display in the sixth metric in the \"Developer Sidebar\"."), ""},
|
||||
{"DeveloperSidebarMetric7", tr("Metric #7"), tr("Metric to display in the seventh metric in the \"Developer Sidebar\"."), ""},
|
||||
{"DeveloperWidgets", tr("Developer Widgets"), tr("Overlays displaying debugging visuals, internal states, and model predictions on the driving screen."), ""},
|
||||
{"AdjacentLeadsUI", tr("Adjacent Leads Tracking"), tr("Adjacent leads detected by the car's radar to the left and right of the current driving path."), ""},
|
||||
{"ShowStoppingPoint", tr("Model Stopping Point"), tr("Display an image on the screen where openpilot is wanting to stop."), ""},
|
||||
@@ -109,8 +120,8 @@ FrogPilotVisualsPanel::FrogPilotVisualsPanel(FrogPilotSettingsWindow *parent) :
|
||||
});
|
||||
visualToggle = developerUIToggle;
|
||||
} else if (param == "DeveloperMetrics") {
|
||||
ButtonControl *developerMetricsToggle = new ButtonControl(title, tr("MANAGE"), desc);
|
||||
QObject::connect(developerMetricsToggle, &ButtonControl::clicked, [this, visualsLayout, developerMetricPanel]() {
|
||||
FrogPilotManageControl *developerMetricsToggle = new FrogPilotManageControl(param, title, desc, icon);
|
||||
QObject::connect(developerMetricsToggle, &FrogPilotManageControl::manageButtonClicked, [this, visualsLayout, developerMetricPanel]() {
|
||||
openSubSubPanel();
|
||||
|
||||
visualsLayout->setCurrentWidget(developerMetricPanel);
|
||||
@@ -123,16 +134,6 @@ FrogPilotVisualsPanel::FrogPilotVisualsPanel(FrogPilotSettingsWindow *parent) :
|
||||
std::vector<QString> borderToggleNames{tr("Blind Spot"), tr("Steering Torque"), tr("Turn Signal")};
|
||||
borderMetricsBtn = new FrogPilotButtonToggleControl(param, title, desc, icon, borderToggles, borderToggleNames);
|
||||
visualToggle = borderMetricsBtn;
|
||||
} else if (param == "LateralMetrics") {
|
||||
std::vector<QString> lateralToggles{"AdjacentPathMetrics", "TuningInfo"};
|
||||
std::vector<QString> lateralToggleNames{tr("Adjacent Path Metrics"), tr("Auto Tune")};
|
||||
lateralMetricsBtn = new FrogPilotButtonToggleControl(param, title, desc, icon, lateralToggles, lateralToggleNames);
|
||||
visualToggle = lateralMetricsBtn;
|
||||
} else if (param == "LongitudinalMetrics") {
|
||||
std::vector<QString> longitudinalToggles{"LeadInfo", "JerkInfo"};
|
||||
std::vector<QString> longitudinalToggleNames{tr("Lead Info"), tr("Jerk Values")};
|
||||
longitudinalMetricsBtn = new FrogPilotButtonToggleControl(param, title, desc, icon, longitudinalToggles, longitudinalToggleNames);
|
||||
visualToggle = longitudinalMetricsBtn;
|
||||
} else if (param == "NumericalTemp") {
|
||||
std::vector<QString> temperatureToggles{"Fahrenheit"};
|
||||
std::vector<QString> temperatureToggleNames{tr("Fahrenheit")};
|
||||
@@ -159,9 +160,54 @@ FrogPilotVisualsPanel::FrogPilotVisualsPanel(FrogPilotSettingsWindow *parent) :
|
||||
sidebarMetricsToggle->refresh();
|
||||
});
|
||||
visualToggle = sidebarMetricsToggle;
|
||||
} else if (param == "DeveloperSidebar") {
|
||||
FrogPilotManageControl *developerSidebarToggle = new FrogPilotManageControl(param, title, desc, icon);
|
||||
QObject::connect(developerSidebarToggle, &FrogPilotManageControl::manageButtonClicked, [this, visualsLayout, developerSidebarPanel]() {
|
||||
openSubSubPanel();
|
||||
|
||||
visualsLayout->setCurrentWidget(developerSidebarPanel);
|
||||
|
||||
developerUIOpen = true;
|
||||
});
|
||||
visualToggle = developerSidebarToggle;
|
||||
} else if (developerSidebarKeys.find(param) != developerSidebarKeys.end()) {
|
||||
QMap<int, QString> developerSidebarMetricOptions {
|
||||
{0, tr("None")},
|
||||
{1, tr("Acceleration: Current")},
|
||||
{2, tr("Acceleration: Max")},
|
||||
{3, tr("Auto Tune: Actuator Delay")},
|
||||
{4, tr("Auto Tune: Friction")},
|
||||
{5, tr("Auto Tune: Lateral Acceleration")},
|
||||
{6, tr("Auto Tune: Steer Ratio")},
|
||||
{7, tr("Auto Tune: Stiffness Factor")},
|
||||
{8, tr("Engagement %: Lateral")},
|
||||
{9, tr("Engagement %: Longitudinal")},
|
||||
{10, tr("Lateral Control: Steering Angle")},
|
||||
{11, tr("Lateral Control: Torque % Used")},
|
||||
{12, tr("Longitudinal Control: Actuator Acceleration Output")},
|
||||
{13, tr("Longitudinal MPC Jerk: Acceleration")},
|
||||
{14, tr("Longitudinal MPC Jerk: Danger Zone")},
|
||||
{15, tr("Longitudinal MPC Jerk: Speed Control")},
|
||||
};
|
||||
|
||||
ButtonControl *metricToggle = new ButtonControl(title, tr("SELECT"), desc);
|
||||
QObject::connect(metricToggle, &ButtonControl::clicked, [this, metricToggle, key = param, developerSidebarMetricOptions]() mutable {
|
||||
QString current = developerSidebarMetricOptions.value(params.getInt(key.toStdString()), tr("None"));
|
||||
QString selection = MultiOptionDialog::getSelection(tr("Select a metric to display"), developerSidebarMetricOptions.values(), current, this);
|
||||
|
||||
if (!selection.isEmpty()) {
|
||||
int selectedMetric = developerSidebarMetricOptions.key(selection);
|
||||
|
||||
params.putInt(key.toStdString(), selectedMetric);
|
||||
|
||||
metricToggle->setValue(selection);
|
||||
}
|
||||
});
|
||||
metricToggle->setValue(developerSidebarMetricOptions.value(params.getInt(param.toStdString()), tr("None")));
|
||||
visualToggle = metricToggle;
|
||||
} else if (param == "DeveloperWidgets") {
|
||||
ButtonControl *developerWidgetsToggle = new ButtonControl(title, tr("MANAGE"), desc);
|
||||
QObject::connect(developerWidgetsToggle, &ButtonControl::clicked, [this, visualsLayout, developerWidgetPanel]() {
|
||||
FrogPilotManageControl *developerWidgetsToggle = new FrogPilotManageControl(param, title, desc, icon);
|
||||
QObject::connect(developerWidgetsToggle, &FrogPilotManageControl::manageButtonClicked, [this, visualsLayout, developerWidgetPanel]() {
|
||||
openSubSubPanel();
|
||||
|
||||
visualsLayout->setCurrentWidget(developerWidgetPanel);
|
||||
@@ -274,6 +320,8 @@ FrogPilotVisualsPanel::FrogPilotVisualsPanel(FrogPilotSettingsWindow *parent) :
|
||||
customUIList->addItem(visualToggle);
|
||||
} else if (developerMetricKeys.find(param) != developerMetricKeys.end()) {
|
||||
developerMetricList->addItem(visualToggle);
|
||||
} else if (developerSidebarKeys.find(param) != developerSidebarKeys.end()) {
|
||||
developerSidebarList->addItem(visualToggle);
|
||||
} else if (developerUIKeys.find(param) != developerUIKeys.end()) {
|
||||
developerUIList->addItem(visualToggle);
|
||||
} else if (developerWidgetKeys.find(param) != developerWidgetKeys.end()) {
|
||||
@@ -413,7 +461,7 @@ void FrogPilotVisualsPanel::updateToggles() {
|
||||
setVisible &= hasOpenpilotLongitudinal;
|
||||
}
|
||||
|
||||
if (key == "LongitudinalMetrics") {
|
||||
if (key == "LeadInfo") {
|
||||
setVisible &= hasOpenpilotLongitudinal;
|
||||
}
|
||||
|
||||
@@ -461,8 +509,6 @@ void FrogPilotVisualsPanel::updateToggles() {
|
||||
}
|
||||
|
||||
borderMetricsBtn->setVisibleButton(0, hasBSM);
|
||||
lateralMetricsBtn->setVisibleButton(1, hasAutoTune);
|
||||
longitudinalMetricsBtn->setVisibleButton(1, tuningLevel >= frogpilotToggleLevels["JerkInfo"].toDouble());
|
||||
|
||||
update();
|
||||
}
|
||||
|
||||
@@ -33,8 +33,9 @@ private:
|
||||
|
||||
std::set<QString> advancedCustomOnroadUIKeys = {"HideAlerts", "HideLeadMarker", "HideMapIcon", "HideMaxSpeed", "HideSpeed", "HideSpeedLimit", "WheelSpeed"};
|
||||
std::set<QString> customOnroadUIKeys = {"AccelerationPath", "AdjacentPath", "BlindSpotPath", "Compass", "OnroadDistanceButton", "PedalsOnUI", "RotatingWheel"};
|
||||
std::set<QString> developerMetricKeys = {"BorderMetrics", "FPSCounter", "LateralMetrics", "LongitudinalMetrics", "NumericalTemp", "SidebarMetrics", "UseSI"};
|
||||
std::set<QString> developerUIKeys = {"DeveloperMetrics", "DeveloperWidgets"};
|
||||
std::set<QString> developerMetricKeys = {"AdjacentPathMetrics", "BorderMetrics", "FPSCounter", "LeadInfo", "NumericalTemp", "SidebarMetrics", "UseSI"};
|
||||
std::set<QString> developerSidebarKeys = {"DeveloperSidebarMetric1", "DeveloperSidebarMetric2", "DeveloperSidebarMetric3", "DeveloperSidebarMetric4", "DeveloperSidebarMetric5", "DeveloperSidebarMetric6", "DeveloperSidebarMetric7"};
|
||||
std::set<QString> developerUIKeys = {"DeveloperMetrics", "DeveloperSidebar", "DeveloperWidgets"};
|
||||
std::set<QString> developerWidgetKeys = {"AdjacentLeadsUI", "RadarTracksUI", "ShowStoppingPoint"};
|
||||
std::set<QString> modelUIKeys = {"DynamicPathWidth", "LaneLinesWidth", "PathEdgeWidth", "PathWidth", "RoadEdgesWidth", "UnlimitedLength"};
|
||||
std::set<QString> navigationUIKeys = {"BigMap", "MapStyle", "RoadNameUI", "ShowSpeedLimits", "UseVienna"};
|
||||
@@ -43,8 +44,6 @@ private:
|
||||
std::set<QString> parentKeys;
|
||||
|
||||
FrogPilotButtonToggleControl *borderMetricsBtn;
|
||||
FrogPilotButtonToggleControl *lateralMetricsBtn;
|
||||
FrogPilotButtonToggleControl *longitudinalMetricsBtn;
|
||||
|
||||
FrogPilotSettingsWindow *parent;
|
||||
|
||||
|
||||
@@ -40,17 +40,17 @@ void FrogPilotAnnotatedCameraWidget::showEvent(QShowEvent *event) {
|
||||
UIScene &scene = s.scene;
|
||||
|
||||
if (scene.is_metric || frogpilot_toggles.value("use_si_metrics").toBool()) {
|
||||
accelerationUnit = tr("m/s²");
|
||||
leadDistanceUnit = tr("meters");
|
||||
leadSpeedUnit = frogpilot_toggles.value("use_si_metrics").toBool() ? tr("m/s") : tr("km/h");
|
||||
accelerationUnit = tr(" m/s²");
|
||||
leadDistanceUnit = tr(" meters");
|
||||
leadSpeedUnit = frogpilot_toggles.value("use_si_metrics").toBool() ? tr(" m/s") : tr(" km/h");
|
||||
|
||||
distanceConversion = 1.0f;
|
||||
speedConversion = scene.is_metric ? MS_TO_KPH : MS_TO_MPH;
|
||||
speedConversionMetrics = frogpilot_toggles.value("use_si_metrics").toBool() ? 1.0f : MS_TO_KPH;
|
||||
} else {
|
||||
accelerationUnit = tr("ft/s²");
|
||||
leadDistanceUnit = tr("feet");
|
||||
leadSpeedUnit = tr("mph");
|
||||
accelerationUnit = tr(" ft/s²");
|
||||
leadDistanceUnit = tr(" feet");
|
||||
leadSpeedUnit = tr(" mph");
|
||||
|
||||
distanceConversion = METER_TO_FOOT;
|
||||
speedConversion = MS_TO_MPH;
|
||||
@@ -132,9 +132,9 @@ void FrogPilotAnnotatedCameraWidget::updateState(const FrogPilotUIState &fs, con
|
||||
|
||||
float speedLimitOffset = frogpilotPlan.getSlcSpeedLimitOffset() * speedConversion;
|
||||
|
||||
mtscSpeedStr = (frogpilotPlan.getMtscSpeed() != 0) ? QString::number(std::nearbyint(fmin(speed, frogpilotPlan.getMtscSpeed()))) + speedUnit : "–";
|
||||
mtscSpeedStr = (frogpilotPlan.getMtscSpeed() != 0) ? QString::number(std::nearbyint(fmin(speed, frogpilotPlan.getMtscSpeed() * speedConversion))) + speedUnit : "–";
|
||||
speedLimitOffsetStr = (speedLimitOffset != 0) ? QString::number(speedLimitOffset, 'f', 0).prepend((speedLimitOffset > 0) ? "+" : "-") : "–";
|
||||
vtscSpeedStr = (frogpilotPlan.getVtscSpeed() != 0) ? QString::number(std::nearbyint(fmin(speed, frogpilotPlan.getVtscSpeed()))) + speedUnit : "–";
|
||||
vtscSpeedStr = (frogpilotPlan.getVtscSpeed() != 0) ? QString::number(std::nearbyint(fmin(speed, frogpilotPlan.getVtscSpeed() * speedConversion))) + speedUnit : "–";
|
||||
|
||||
if (frogpilot_scene.standstill && frogpilot_toggles.value("stopped_timer").toBool()) {
|
||||
if (!standstillTimer.isValid()) {
|
||||
@@ -226,7 +226,7 @@ void FrogPilotAnnotatedCameraWidget::paintFrogPilotWidgets(QPainter &p, UIState
|
||||
}
|
||||
}
|
||||
|
||||
void FrogPilotAnnotatedCameraWidget::paintAdjacentPaths(QPainter &p, const cereal::CarState::Reader &carState, const cereal::ModelDataV2::Reader &model, const UIScene &scene, const FrogPilotUIScene &frogpilot_scene, const QJsonObject &frogpilot_toggles) {
|
||||
void FrogPilotAnnotatedCameraWidget::paintAdjacentPaths(QPainter &p, const cereal::CarState::Reader &carState, const FrogPilotUIScene &frogpilot_scene, const QJsonObject &frogpilot_toggles) {
|
||||
std::function<void(bool, float, float, const QPolygonF &)> drawAdjacentPath = [this, &p, &frogpilot_toggles](bool isBlindSpot, float width, float requirement, const QPolygonF &polygon) {
|
||||
QLinearGradient gradient(0, height(), 0, 0);
|
||||
if (isBlindSpot && frogpilot_toggles.value("blind_spot_path").toBool()) {
|
||||
@@ -254,7 +254,7 @@ void FrogPilotAnnotatedCameraWidget::paintAdjacentPaths(QPainter &p, const cerea
|
||||
p.drawText(polygon.boundingRect(), Qt::AlignCenter, text);
|
||||
};
|
||||
|
||||
if (frogpilot_scene.lane_width_left != 0 && frogpilot_scene.track_adjacent_vertices[0][0].y() > scene.road_edge_vertices[0][0].y()) {
|
||||
if (frogpilot_scene.lane_width_left >= frogpilot_toggles.value("lane_detection_width").toDouble()) {
|
||||
p.save();
|
||||
|
||||
drawAdjacentPath(carState.getLeftBlindspot(), frogpilot_scene.lane_width_left, frogpilot_toggles.value("lane_detection_width").toDouble(), frogpilot_scene.track_adjacent_vertices[0]);
|
||||
@@ -266,7 +266,7 @@ void FrogPilotAnnotatedCameraWidget::paintAdjacentPaths(QPainter &p, const cerea
|
||||
p.restore();
|
||||
}
|
||||
|
||||
if (frogpilot_scene.lane_width_right != 0 && frogpilot_scene.track_adjacent_vertices[1][0].y() < scene.road_edge_vertices[1][0].y()) {
|
||||
if (frogpilot_scene.lane_width_right >= frogpilot_toggles.value("lane_detection_width").toDouble()) {
|
||||
p.save();
|
||||
|
||||
drawAdjacentPath(carState.getRightBlindspot(), frogpilot_scene.lane_width_right, frogpilot_toggles.value("lane_detection_width").toDouble(), frogpilot_scene.track_adjacent_vertices[1]);
|
||||
@@ -472,20 +472,25 @@ void FrogPilotAnnotatedCameraWidget::paintCurveSpeedControl(QPainter &p, const c
|
||||
|
||||
p.setOpacity(1.0);
|
||||
|
||||
if ((setSpeed - frogpilotPlan.getMtscSpeed() > 1) && frogpilot_toggles.value("map_turn_speed_controller").toBool()) {
|
||||
if (frogpilotPlan.getVCruise() == frogpilotPlan.getMtscSpeed() && frogpilot_toggles.value("map_turn_speed_controller").toBool()) {
|
||||
QRect mtscRect(curveSpeedRect.topLeft() + QPoint(0, curveSpeedRect.height() + 10), QSize(curveSpeedRect.width(), frogpilotPlan.getVtscControllingCurve() ? 50 : 100));
|
||||
drawCurveSpeedControl(mtscRect, mtscSpeedStr, true);
|
||||
|
||||
if ((setSpeed - frogpilotPlan.getVtscSpeed() > 1) && frogpilot_toggles.value("vision_turn_speed_controller").toBool()) {
|
||||
if (frogpilot_toggles.value("vision_turn_speed_controller").toBool()) {
|
||||
QRect vtscRect(mtscRect.topLeft() + QPoint(0, mtscRect.height() + 20), QSize(mtscRect.width(), frogpilotPlan.getVtscControllingCurve() ? 100 : 50));
|
||||
drawCurveSpeedControl(vtscRect, vtscSpeedStr, false);
|
||||
}
|
||||
|
||||
p.drawPixmap(curveSpeedRect, scaledCurveSpeedIcon);
|
||||
} else if ((setSpeed - frogpilotPlan.getVtscSpeed() > 1) && frogpilot_toggles.value("vision_turn_speed_controller").toBool()) {
|
||||
QRect vtscRect(curveSpeedRect.topLeft() + QPoint(0, curveSpeedRect.height() + 10), QSize(curveSpeedRect.width(), 150));
|
||||
} else if (frogpilotPlan.getVCruise() == frogpilotPlan.getVtscSpeed() && frogpilot_toggles.value("vision_turn_speed_controller").toBool()) {
|
||||
QRect vtscRect(curveSpeedRect.topLeft() + QPoint(0, curveSpeedRect.height() + 10), QSize(curveSpeedRect.width(), frogpilotPlan.getVtscControllingCurve() ? 100 : 50));
|
||||
drawCurveSpeedControl(vtscRect, vtscSpeedStr, false);
|
||||
|
||||
if (frogpilot_toggles.value("map_turn_speed_controller").toBool()) {
|
||||
QRect mtscRect(vtscRect.topLeft() + QPoint(0, vtscRect.height() + 20), QSize(vtscRect.width(), frogpilotPlan.getVtscControllingCurve() ? 50 : 100));
|
||||
drawCurveSpeedControl(mtscRect, mtscSpeedStr, true);
|
||||
}
|
||||
|
||||
p.drawPixmap(curveSpeedRect, scaledCurveSpeedIcon);
|
||||
}
|
||||
|
||||
@@ -536,7 +541,7 @@ void FrogPilotAnnotatedCameraWidget::paintLeadMetrics(QPainter &p, bool adjacent
|
||||
.arg(qRound(leadSpeed * speedConversionMetrics))
|
||||
.arg(leadSpeedUnit);
|
||||
} else {
|
||||
text = QString("%1 %2 (%3) | %4 %5 | %6%7")
|
||||
text = QString("%1 %2 (%3) | %4 %5 | %6 %7")
|
||||
.arg(qRound(leadDistance * distanceConversion))
|
||||
.arg(leadDistanceUnit)
|
||||
.arg(QString("Desired: %1").arg(frogpilotPlan.getDesiredFollowDistance() * distanceConversion))
|
||||
@@ -792,7 +797,7 @@ void FrogPilotAnnotatedCameraWidget::paintSpeedLimitSources(QPainter &p, const c
|
||||
|
||||
QString speedText;
|
||||
if (speedLimitValue != 0) {
|
||||
speedText = QString::number(std::nearbyint(speedLimitValue)) + " " + speedUnit;
|
||||
speedText = QString::number(std::nearbyint(speedLimitValue)) + speedUnit;
|
||||
} else {
|
||||
speedText = "N/A";
|
||||
}
|
||||
@@ -917,8 +922,7 @@ void FrogPilotAnnotatedCameraWidget::paintTurnSignals(QPainter &p, const cereal:
|
||||
signalXPosition = carState.getLeftBlinker() ? width() - ((animationFrameIndex + 1) * signalWidth) : animationFrameIndex * signalWidth;
|
||||
}
|
||||
|
||||
int signalYPosition = height() - signalHeight;
|
||||
signalYPosition -= alertHeight;
|
||||
int signalYPosition = height() - signalHeight - alertHeight;
|
||||
|
||||
if (blindspotActive && !blindspotImages.empty()) {
|
||||
p.drawPixmap(carState.getLeftBlinker() ? width() - signalWidth : 0, signalYPosition, signalWidth, signalHeight, blindspotImages[carState.getLeftBlinker() ? 0 : 1]);
|
||||
|
||||
@@ -11,7 +11,7 @@ class FrogPilotAnnotatedCameraWidget : public QWidget {
|
||||
public:
|
||||
explicit FrogPilotAnnotatedCameraWidget(QWidget *parent = 0);
|
||||
|
||||
void paintAdjacentPaths(QPainter &p, const cereal::CarState::Reader &carState, const cereal::ModelDataV2::Reader &model, const UIScene &scene, const FrogPilotUIScene &frogpilot_scene, const QJsonObject &frogpilot_toggles);
|
||||
void paintAdjacentPaths(QPainter &p, const cereal::CarState::Reader &carState, const FrogPilotUIScene &frogpilot_scene, const QJsonObject &frogpilot_toggles);
|
||||
void paintBlindSpotPath(QPainter &p, const cereal::CarState::Reader &carState, const FrogPilotUIScene &frogpilot_scene);
|
||||
void paintFrogPilotWidgets(QPainter &p, UIState &s, FrogPilotUIState &fs, SubMaster &sm, SubMaster &fpsm, QJsonObject &frogpilot_toggles);
|
||||
void paintLeadMetrics(QPainter &p, bool adjacent, QPointF *chevron, const cereal::FrogPilotPlan::Reader &frogpilotPlan, const cereal::RadarState::LeadData::Reader &lead_data);
|
||||
@@ -32,7 +32,6 @@ public:
|
||||
int standstillDuration;
|
||||
|
||||
float distanceConversion;
|
||||
float setSpeed;
|
||||
float speed;
|
||||
float speedConversion;
|
||||
float speedConversionMetrics;
|
||||
|
||||
@@ -44,10 +44,6 @@ void FrogPilotOnroadWindow::paintEvent(QPaintEvent *event) {
|
||||
marginRegion += QRegion(rect.width() - UI_BORDER_SIZE, UI_BORDER_SIZE, UI_BORDER_SIZE, rect.height() - 2 * UI_BORDER_SIZE);
|
||||
p.setClipRegion(marginRegion);
|
||||
|
||||
if (showFPS) {
|
||||
paintFPS(p, rect);
|
||||
}
|
||||
|
||||
if (showSteering) {
|
||||
paintSteeringTorqueBorder(p, rect);
|
||||
}
|
||||
@@ -64,6 +60,10 @@ void FrogPilotOnroadWindow::paintEvent(QPaintEvent *event) {
|
||||
} else if (signalTimer->isActive()) {
|
||||
signalTimer->stop();
|
||||
}
|
||||
|
||||
if (showFPS) {
|
||||
paintFPS(p, rect);
|
||||
}
|
||||
}
|
||||
|
||||
void FrogPilotOnroadWindow::paintFPS(QPainter &p, const QRect &rect) {
|
||||
|
||||
@@ -0,0 +1,154 @@
|
||||
#include "frogpilot/ui/qt/widgets/developer_sidebar.h"
|
||||
|
||||
void DeveloperSidebar::drawMetric(QPainter &p, const QPair<QString, QString> &label, QColor c, int y) {
|
||||
const QRect rect = {12, y, 275, 126};
|
||||
|
||||
p.setPen(Qt::NoPen);
|
||||
p.setBrush(QBrush(c));
|
||||
p.setClipRect(rect.x() + 4, rect.y(), 18, rect.height(), Qt::ClipOperation::ReplaceClip);
|
||||
p.drawRoundedRect(QRect(rect.x() + 4, rect.y() + 4, 100, 118), 18, 18);
|
||||
p.setClipping(false);
|
||||
|
||||
QPen pen = QPen(QColor(0xff, 0xff, 0xff, 0x55));
|
||||
pen.setWidth(2);
|
||||
p.setPen(pen);
|
||||
p.setBrush(Qt::NoBrush);
|
||||
p.drawRoundedRect(rect, 20, 20);
|
||||
|
||||
p.setPen(QColor(0xff, 0xff, 0xff));
|
||||
p.setFont(InterFont(35, QFont::DemiBold));
|
||||
p.drawText(rect.adjusted(22, 0, 0, 0), Qt::AlignCenter, label.first + "\n" + label.second);
|
||||
}
|
||||
|
||||
DeveloperSidebar::DeveloperSidebar(QWidget *parent) : QFrame(parent) {
|
||||
setAttribute(Qt::WA_OpaquePaintEvent);
|
||||
setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
|
||||
setFixedWidth(300);
|
||||
|
||||
QObject::connect(uiState(), &UIState::uiUpdate, this, &DeveloperSidebar::updateState);
|
||||
}
|
||||
|
||||
void DeveloperSidebar::showEvent(QShowEvent *event) {
|
||||
update_theme(frogpilotUIState());
|
||||
|
||||
FrogPilotUIState &fs = *frogpilotUIState();
|
||||
FrogPilotUIScene &frogpilot_scene = fs.frogpilot_scene;
|
||||
QJsonObject &frogpilot_toggles = fs.frogpilot_toggles;
|
||||
|
||||
metricAssignments.clear();
|
||||
for (int i = 1; i <= 7; ++i) {
|
||||
QString key = QString("developer_sidebar_metric%1").arg(i);
|
||||
int metricId = frogpilot_toggles.value(key).toInt();
|
||||
metricAssignments.push_back(metricId);
|
||||
}
|
||||
|
||||
metricColor = frogpilot_scene.use_stock_colors ? QColor(255, 255, 255) : frogpilot_scene.sidebar_color1;
|
||||
}
|
||||
|
||||
void DeveloperSidebar::updateState(const UIState &s, const FrogPilotUIState &fs) {
|
||||
if (!isVisible()) {
|
||||
return;
|
||||
}
|
||||
|
||||
const FrogPilotUIScene &frogpilot_scene = fs.frogpilot_scene;
|
||||
const SubMaster &fpsm = *(fs.sm);
|
||||
|
||||
const cereal::CarControl::Reader &carControl = fpsm["carControl"].getCarControl();
|
||||
const cereal::CarState::Reader &carState = fpsm["carState"].getCarState();
|
||||
const cereal::FrogPilotPlan::Reader &frogpilotPlan = fpsm["frogpilotPlan"].getFrogpilotPlan();
|
||||
const cereal::LiveDelayData::Reader &liveDelay = fpsm["liveDelay"].getLiveDelay();
|
||||
const cereal::LiveParametersData::Reader &liveParameters = fpsm["liveParameters"].getLiveParameters();
|
||||
const cereal::LiveTorqueParametersData::Reader &liveTorqueParameters = fpsm["liveTorqueParameters"].getLiveTorqueParameters();
|
||||
|
||||
const bool is_metric = s.scene.is_metric;
|
||||
const bool use_si = fs.frogpilot_toggles.value("use_si_metrics").toBool();
|
||||
|
||||
const QString accelerationUnit = (is_metric || use_si) ? tr(" m/s²") : tr(" ft/s²");
|
||||
const float accelerationConversion = (is_metric || use_si) ? 1.0f : METER_TO_FOOT;
|
||||
|
||||
double acceleration = carState.getAEgo() * accelerationConversion;
|
||||
static double maxAcceleration = 0.0;
|
||||
maxAcceleration = std::max(maxAcceleration, acceleration);
|
||||
|
||||
static double lateralEngagementTime = 0.0;
|
||||
lateralEngagementTime += carControl.getLatActive() && !frogpilot_scene.reverse && !frogpilot_scene.standstill ? 1 : 0;
|
||||
|
||||
static double longitudinalEngagementTime = 0.0;
|
||||
longitudinalEngagementTime += carControl.getLongActive() && !frogpilot_scene.reverse && !frogpilot_scene.standstill ? 1 : 0;
|
||||
|
||||
static double totalEngagementTime = 0.0;
|
||||
totalEngagementTime += !(frogpilot_scene.reverse || frogpilot_scene.standstill) ? 1 : 0;
|
||||
|
||||
accelerationStatus = ItemStatus(QPair<QString, QString>(tr("ACCEL"), QString::number(acceleration, 'f', 2) + accelerationUnit), metricColor);
|
||||
accelerationJerkStatus = ItemStatus(QPair<QString, QString>(tr("ACCEL JERK"), QString::number(frogpilotPlan.getAccelerationJerk(), 'f', 2)), metricColor);
|
||||
actuatorAccelerationStatus = ItemStatus(QPair<QString, QString>(tr("ACT ACCEL"), QString::number(carControl.getActuators().getAccel() * accelerationConversion, 'f', 2) + accelerationUnit), metricColor);
|
||||
dangerJerkStatus = ItemStatus(QPair<QString, QString>(tr("DANGER JERK"), QString::number(frogpilotPlan.getDangerJerk(), 'f', 2)), metricColor);
|
||||
delayStatus = ItemStatus(QPair<QString, QString>(tr("STEER DELAY"), QString::number(liveDelay.getLateralDelay(), 'f', 5)), metricColor);
|
||||
frictionStatus = ItemStatus(QPair<QString, QString>(tr("FRICTION"), QString::number(liveTorqueParameters.getFrictionCoefficientFiltered(), 'f', 5)), metricColor);
|
||||
latAccelStatus = ItemStatus(QPair<QString, QString>(tr("LAT ACCEL"), QString::number(liveTorqueParameters.getLatAccelFactorFiltered(), 'f', 5)), metricColor);
|
||||
lateralEngagementStatus = ItemStatus(QPair<QString, QString>(tr("LATERAL %"), QString::number((lateralEngagementTime / totalEngagementTime) * 100.0f, 'f', 2) + "%"), metricColor);
|
||||
longitudinalEngagementStatus = ItemStatus(QPair<QString, QString>(tr("LONG %"), QString::number((longitudinalEngagementTime / totalEngagementTime) * 100.0f, 'f', 2) + "%"), metricColor);
|
||||
maxAccelerationStatus = ItemStatus(QPair<QString, QString>(tr("MAX ACCEL"), QString::number(maxAcceleration, 'f', 2) + accelerationUnit), metricColor);
|
||||
speedJerkStatus = ItemStatus(QPair<QString, QString>(tr("SPEED JERK"), QString::number(frogpilotPlan.getSpeedJerk(), 'f', 2)), metricColor);
|
||||
steerAngleStatus = ItemStatus(QPair<QString, QString>(tr("STEER ANGLE"), QString::number(fabs(carState.getSteeringAngleDeg()), 'f', 2)), metricColor);
|
||||
steerRatioStatus = ItemStatus(QPair<QString, QString>(tr("STEER RATIO"), QString::number(liveParameters.getSteerRatio(), 'f', 5)), metricColor);
|
||||
stiffnessFactorStatus = ItemStatus(QPair<QString, QString>(tr("STEER STIFF"), QString::number(liveParameters.getStiffnessFactor(), 'f', 5)), metricColor);
|
||||
torqueStatus = ItemStatus(QPair<QString, QString>(tr("TORQUE %"), QString::number(fabs(carControl.getActuators().getSteer() * 100.0f), 'f', 2)), metricColor);
|
||||
|
||||
update();
|
||||
}
|
||||
|
||||
void DeveloperSidebar::paintEvent(QPaintEvent *event) {
|
||||
QPainter p(this);
|
||||
p.setPen(Qt::NoPen);
|
||||
p.setRenderHint(QPainter::Antialiasing);
|
||||
|
||||
p.fillRect(rect(), QColor(57, 57, 57));
|
||||
|
||||
QMap<int, ItemStatus*> metricMap;
|
||||
metricMap.insert(1, &accelerationStatus);
|
||||
metricMap.insert(2, &maxAccelerationStatus);
|
||||
metricMap.insert(3, &delayStatus);
|
||||
metricMap.insert(4, &frictionStatus);
|
||||
metricMap.insert(5, &latAccelStatus);
|
||||
metricMap.insert(6, &steerRatioStatus);
|
||||
metricMap.insert(7, &stiffnessFactorStatus);
|
||||
metricMap.insert(8, &lateralEngagementStatus);
|
||||
metricMap.insert(9, &longitudinalEngagementStatus);
|
||||
metricMap.insert(10, &steerAngleStatus);
|
||||
metricMap.insert(11, &torqueStatus);
|
||||
metricMap.insert(12, &actuatorAccelerationStatus);
|
||||
metricMap.insert(13, &accelerationJerkStatus);
|
||||
metricMap.insert(14, &dangerJerkStatus);
|
||||
metricMap.insert(15, &speedJerkStatus);
|
||||
|
||||
int count = 0;
|
||||
for (size_t i = 0; i < metricAssignments.size(); ++i) {
|
||||
if (metricAssignments[i] > 0 && metricMap.contains(metricAssignments[i])) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
if (count == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
int metricHeight = 126;
|
||||
int spacing = (height() - (count * metricHeight)) / (count + 1);
|
||||
int y = spacing;
|
||||
|
||||
for (size_t i = 0; i < metricAssignments.size(); ++i) {
|
||||
int metricId = metricAssignments[i];
|
||||
|
||||
if (metricId == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!metricMap.contains(metricId)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
ItemStatus *status = metricMap[metricId];
|
||||
drawMetric(p, status->first, status->second, y);
|
||||
y += metricHeight + spacing;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
#pragma once
|
||||
|
||||
#include "selfdrive/ui/qt/sidebar.h"
|
||||
|
||||
class DeveloperSidebar : public QFrame {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit DeveloperSidebar(QWidget* parent = 0);
|
||||
|
||||
private:
|
||||
void drawMetric(QPainter &p, const QPair<QString, QString> &label, QColor c, int y);
|
||||
void paintEvent(QPaintEvent *event) override;
|
||||
void showEvent(QShowEvent *event);
|
||||
void updateState(const UIState &s, const FrogPilotUIState &fs);
|
||||
|
||||
std::vector<int> metricAssignments;
|
||||
|
||||
QColor metricColor;
|
||||
|
||||
ItemStatus accelerationJerkStatus;
|
||||
ItemStatus accelerationStatus;
|
||||
ItemStatus actuatorAccelerationStatus;
|
||||
ItemStatus dangerJerkStatus;
|
||||
ItemStatus delayStatus;
|
||||
ItemStatus frictionStatus;
|
||||
ItemStatus latAccelStatus;
|
||||
ItemStatus lateralEngagementStatus;
|
||||
ItemStatus longitudinalEngagementStatus;
|
||||
ItemStatus maxAccelerationStatus;
|
||||
ItemStatus speedJerkStatus;
|
||||
ItemStatus steerAngleStatus;
|
||||
ItemStatus steerRatioStatus;
|
||||
ItemStatus stiffnessFactorStatus;
|
||||
ItemStatus torqueStatus;
|
||||
};
|
||||
@@ -22,24 +22,28 @@ bool useKonikServer() {
|
||||
}
|
||||
|
||||
void loadImage(const QString &basePath, QPixmap &pixmap, QMovie *&movie, const QSize &size, QWidget *parent, Qt::AspectRatioMode aspectRatioMode) {
|
||||
delete movie;
|
||||
movie = nullptr;
|
||||
if (movie) {
|
||||
movie->stop();
|
||||
movie->deleteLater();
|
||||
movie = nullptr;
|
||||
}
|
||||
|
||||
QFileInfo gifFile(basePath + ".gif");
|
||||
if (gifFile.exists()) {
|
||||
movie = new QMovie(gifFile.filePath(), QByteArray(), parent);
|
||||
if (movie->isValid()) {
|
||||
movie->setCacheMode(QMovie::CacheAll);
|
||||
movie->setScaledSize(size);
|
||||
QMovie *newMovie = new QMovie(gifFile.filePath(), QByteArray(), parent);
|
||||
if (newMovie->isValid()) {
|
||||
newMovie->setCacheMode(QMovie::CacheAll);
|
||||
newMovie->setScaledSize(size);
|
||||
|
||||
QObject::connect(movie, &QMovie::frameChanged, parent, [parent](int){parent->update();});
|
||||
QObject::connect(newMovie, &QMovie::frameChanged, parent, [parent](int) { parent->update(); });
|
||||
|
||||
movie->start();
|
||||
newMovie->start();
|
||||
movie = newMovie;
|
||||
|
||||
pixmap = QPixmap();
|
||||
return;
|
||||
} else {
|
||||
delete movie;
|
||||
movie = nullptr;
|
||||
}
|
||||
newMovie->deleteLater();
|
||||
}
|
||||
|
||||
pixmap = loadPixmap(basePath + ".png", size, aspectRatioMode);
|
||||
|
||||
@@ -371,14 +371,13 @@ void OmxEncoder::handle_out_buf(OmxEncoder *encoder, OMX_BUFFERHEADERTYPE *out_b
|
||||
AVRational in_timebase = {1, 1000000};
|
||||
|
||||
AVPacket pkt;
|
||||
av_new_packet(&pkt, out_buf->nFilledLen);
|
||||
memcpy(pkt.data, buf_data, out_buf->nFilledLen);
|
||||
av_init_packet(&pkt);
|
||||
pkt.data = buf_data;
|
||||
pkt.size = out_buf->nFilledLen;
|
||||
|
||||
enum AVRounding rnd = static_cast<enum AVRounding>(AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
|
||||
pkt.pts = pkt.dts = av_rescale_q_rnd(out_buf->nTimeStamp, in_timebase, encoder->ofmt_ctx->streams[0]->time_base, rnd);
|
||||
pkt.duration = av_rescale_q(50 * 1000, in_timebase, encoder->ofmt_ctx->streams[0]->time_base);
|
||||
pkt.pts = pkt.dts = av_rescale_q_rnd(out_buf->nTimeStamp, in_timebase, encoder->out_stream->time_base, rnd);
|
||||
pkt.duration = av_rescale_q(1, AVRational{1, encoder->fps}, encoder->out_stream->time_base);
|
||||
|
||||
if (out_buf->nFlags & OMX_BUFFERFLAG_SYNCFRAME) {
|
||||
pkt.flags |= AV_PKT_FLAG_KEY;
|
||||
@@ -452,18 +451,35 @@ int OmxEncoder::encode_frame_rgba(const uint8_t *ptr, int in_width, int in_heigh
|
||||
}
|
||||
|
||||
void OmxEncoder::encoder_open(const char* filename) {
|
||||
if (!filename || strlen(filename) == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (strlen(filename) + path.size() + 2 > sizeof(vid_path)) {
|
||||
return;
|
||||
}
|
||||
|
||||
struct stat st = {0};
|
||||
if (stat(path.c_str(), &st) == -1) {
|
||||
mkdir(path.c_str(), 0755);
|
||||
if (mkdir(path.c_str(), 0755) == -1) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
snprintf(vid_path, sizeof(vid_path), "%s/%s", path.c_str(), filename);
|
||||
|
||||
avformat_alloc_output_context2(&ofmt_ctx, NULL, NULL, vid_path);
|
||||
assert(ofmt_ctx);
|
||||
if (avformat_alloc_output_context2(&ofmt_ctx, NULL, NULL, vid_path) < 0 || !ofmt_ctx) {
|
||||
return;
|
||||
}
|
||||
|
||||
out_stream = avformat_new_stream(ofmt_ctx, NULL);
|
||||
assert(out_stream);
|
||||
if (!out_stream) {
|
||||
avformat_free_context(ofmt_ctx);
|
||||
ofmt_ctx = nullptr;
|
||||
return;
|
||||
}
|
||||
|
||||
out_stream->time_base = AVRational{1, fps};
|
||||
|
||||
out_stream->codecpar->codec_id = AV_CODEC_ID_H264;
|
||||
out_stream->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
|
||||
@@ -471,26 +487,36 @@ void OmxEncoder::encoder_open(const char* filename) {
|
||||
out_stream->codecpar->height = height;
|
||||
|
||||
int err = avio_open(&ofmt_ctx->pb, vid_path, AVIO_FLAG_WRITE);
|
||||
assert(err >= 0);
|
||||
if (err < 0) {
|
||||
avformat_free_context(ofmt_ctx);
|
||||
ofmt_ctx = nullptr;
|
||||
return;
|
||||
}
|
||||
|
||||
wrote_codec_config = false;
|
||||
|
||||
// create camera lock file
|
||||
snprintf(lock_path, sizeof(lock_path), "%s/%s.lock", path.c_str(), filename);
|
||||
int lock_fd = HANDLE_EINTR(open(lock_path, O_RDWR | O_CREAT, 0664));
|
||||
assert(lock_fd >= 0);
|
||||
if (lock_fd < 0) {
|
||||
avio_closep(&ofmt_ctx->pb);
|
||||
avformat_free_context(ofmt_ctx);
|
||||
ofmt_ctx = nullptr;
|
||||
return;
|
||||
}
|
||||
close(lock_fd);
|
||||
|
||||
is_open = true;
|
||||
counter = 0;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void OmxEncoder::encoder_close() {
|
||||
if (is_open) {
|
||||
if (dirty) {
|
||||
// drain output only if there could be frames in the encoder
|
||||
if (!is_open) return;
|
||||
|
||||
OMX_BUFFERHEADERTYPE* in_buf = free_in.pop();
|
||||
if (dirty) {
|
||||
OMX_BUFFERHEADERTYPE* in_buf = free_in.pop();
|
||||
if (in_buf) {
|
||||
in_buf->nFilledLen = 0;
|
||||
in_buf->nOffset = 0;
|
||||
in_buf->nFlags = OMX_BUFFERFLAG_EOS;
|
||||
@@ -500,6 +526,7 @@ void OmxEncoder::encoder_close() {
|
||||
|
||||
while (true) {
|
||||
OMX_BUFFERHEADERTYPE *out_buf = done_out.pop();
|
||||
if (!out_buf) break;
|
||||
|
||||
handle_out_buf(this, out_buf);
|
||||
|
||||
@@ -507,17 +534,32 @@ void OmxEncoder::encoder_close() {
|
||||
break;
|
||||
}
|
||||
}
|
||||
dirty = false;
|
||||
}
|
||||
dirty = false;
|
||||
}
|
||||
|
||||
if (out_stream) {
|
||||
out_stream->nb_frames = counter;
|
||||
out_stream->duration = counter;
|
||||
}
|
||||
|
||||
if (ofmt_ctx) {
|
||||
ofmt_ctx->duration = av_rescale_q(counter, AVRational{1, fps}, out_stream->time_base);
|
||||
av_write_trailer(ofmt_ctx);
|
||||
avio_closep(&ofmt_ctx->pb);
|
||||
if (out_stream && out_stream->codecpar && out_stream->codecpar->extradata) {
|
||||
av_free(out_stream->codecpar->extradata);
|
||||
out_stream->codecpar->extradata = nullptr;
|
||||
}
|
||||
avformat_free_context(ofmt_ctx);
|
||||
ofmt_ctx = nullptr;
|
||||
}
|
||||
|
||||
if (out_stream && out_stream->codecpar && out_stream->codecpar->extradata) {
|
||||
av_free(out_stream->codecpar->extradata);
|
||||
out_stream->codecpar->extradata = nullptr;
|
||||
}
|
||||
|
||||
if (lock_path[0] != '\0') {
|
||||
unlink(lock_path);
|
||||
}
|
||||
|
||||
is_open = false;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@ export OPENBLAS_NUM_THREADS=1
|
||||
export VECLIB_MAXIMUM_THREADS=1
|
||||
|
||||
if [ -z "$AGNOS_VERSION" ]; then
|
||||
export AGNOS_VERSION="10.1"
|
||||
export AGNOS_VERSION="10.1.1"
|
||||
fi
|
||||
|
||||
export STAGING_ROOT="/data/safe_staging"
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 108 KiB After Width: | Height: | Size: 371 KiB |
@@ -102,6 +102,7 @@ class Track:
|
||||
"modelProb": model_prob,
|
||||
"radar": True,
|
||||
"radarTrackId": self.identifier,
|
||||
"farLead": False,
|
||||
}
|
||||
|
||||
def potential_adjacent_lead(self, left: bool, standstill: bool, model_data: capnp._DynamicStructReader):
|
||||
@@ -180,6 +181,7 @@ def get_RadarState_from_vision(lead_msg: capnp._DynamicStructReader, v_ego: floa
|
||||
"status": True,
|
||||
"radar": False,
|
||||
"radarTrackId": -1,
|
||||
"farLead": False,
|
||||
}
|
||||
|
||||
|
||||
@@ -213,6 +215,7 @@ def get_lead(v_ego: float, ready: bool, tracks: dict[int, Track], lead_msg: capn
|
||||
if len(far_lead_tracks) > 0:
|
||||
closest_track = min(far_lead_tracks, key=lambda c: c.dRel)
|
||||
lead_dict = closest_track.get_RadarState()
|
||||
lead_dict['farLead'] = True
|
||||
lead_dict['vLead'] = lead_dict['vLeadK']
|
||||
|
||||
for track in tracks.values():
|
||||
|
||||
@@ -54,10 +54,10 @@ frogpilot_src = ["../../frogpilot/ui/frogpilot_ui.cc", "../../frogpilot/ui/qt/of
|
||||
"../../frogpilot/ui/qt/offroad/theme_settings.cc", "../../frogpilot/ui/qt/offroad/utilities.cc",
|
||||
"../../frogpilot/ui/qt/offroad/vehicle_settings.cc", "../../frogpilot/ui/qt/offroad/visual_settings.cc",
|
||||
"../../frogpilot/ui/qt/offroad/wheel_settings.cc", "../../frogpilot/ui/qt/onroad/frogpilot_annotated_camera.cc",
|
||||
"../../frogpilot/ui/qt/onroad/frogpilot_buttons.cc", "../../frogpilot/ui/qt/onroad/frogpilot_onroad.cc",
|
||||
"../../frogpilot/ui/qt/widgets/drive_stats.cc", "../../frogpilot/ui/qt/widgets/model_reviewer.cc",
|
||||
"../../frogpilot/ui/qt/widgets/navigation_functions.cc", "../../frogpilot/ui/screenrecorder/omx_encoder.cc",
|
||||
"../../frogpilot/ui/screenrecorder/screenrecorder.cc"]
|
||||
"../../frogpilot/ui/qt/onroad/frogpilot_buttons.cc", "../../frogpilot/ui/qt/onroad/frogpilot_onroad.cc",
|
||||
"../../frogpilot/ui/qt/widgets/developer_sidebar.cc", "../../frogpilot/ui/qt/widgets/drive_stats.cc",
|
||||
"../../frogpilot/ui/qt/widgets/model_reviewer.cc", "../../frogpilot/ui/qt/widgets/navigation_functions.cc",
|
||||
"../../frogpilot/ui/screenrecorder/omx_encoder.cc", "../../frogpilot/ui/screenrecorder/screenrecorder.cc"]
|
||||
|
||||
qt_src += frogpilot_src
|
||||
|
||||
|
||||
@@ -50,6 +50,10 @@ HomeWindow::HomeWindow(QWidget* parent) : QWidget(parent) {
|
||||
QObject::connect(uiState(), &UIState::uiUpdate, this, &HomeWindow::updateState);
|
||||
QObject::connect(uiState(), &UIState::offroadTransition, this, &HomeWindow::offroadTransition);
|
||||
QObject::connect(uiState(), &UIState::offroadTransition, sidebar, &Sidebar::offroadTransition);
|
||||
|
||||
// FrogPilot variables
|
||||
developer_sidebar = new DeveloperSidebar(this);
|
||||
main_layout->addWidget(developer_sidebar);
|
||||
}
|
||||
|
||||
void HomeWindow::showSidebar(bool show) {
|
||||
@@ -86,6 +90,9 @@ void HomeWindow::offroadTransition(bool offroad) {
|
||||
} else {
|
||||
slayout->setCurrentWidget(onroad);
|
||||
}
|
||||
|
||||
// FrogPilot variables
|
||||
developer_sidebar->setVisible(!offroad && frogpilotUIState()->frogpilot_toggles.value("developer_sidebar").toBool());
|
||||
}
|
||||
|
||||
void HomeWindow::showDriverView(bool show, bool started) {
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
#include "selfdrive/ui/qt/widgets/offroad_alerts.h"
|
||||
#include "selfdrive/ui/ui.h"
|
||||
|
||||
#include "frogpilot/ui/qt/widgets/developer_sidebar.h"
|
||||
|
||||
class OffroadHome : public QFrame {
|
||||
Q_OBJECT
|
||||
|
||||
@@ -75,6 +77,8 @@ private:
|
||||
// FrogPilot variables
|
||||
Params params;
|
||||
|
||||
DeveloperSidebar *developer_sidebar;
|
||||
|
||||
private slots:
|
||||
void updateState(const UIState &s, const FrogPilotUIState &fs);
|
||||
};
|
||||
|
||||
@@ -117,6 +117,7 @@ void AnnotatedCameraWidget::updateState(const UIState &s, const FrogPilotUIState
|
||||
distance_btn->move(rightHandDM ? width() - UI_BORDER_SIZE - distance_btn->width() - (UI_BORDER_SIZE / 2) : UI_BORDER_SIZE, frogpilot_nvg->dmIconPosition.y() - distance_btn->height() / 2);
|
||||
distance_btn->updateState(s.scene, fs.frogpilot_scene);
|
||||
}
|
||||
screen_recorder->setVisible(frogpilot_nvg->standstillDuration == 0 && !fs.frogpilot_scene.map_open && frogpilot_toggles.value("screen_recorder").toBool());
|
||||
|
||||
frogpilot_nvg->updateState(fs, frogpilot_toggles);
|
||||
}
|
||||
@@ -256,7 +257,6 @@ void AnnotatedCameraWidget::drawHud(QPainter &p, const cereal::FrogPilotPlan::Re
|
||||
frogpilot_nvg->mapButtonVisible = map_settings_btn->isVisible();
|
||||
frogpilot_nvg->mutcdSpeedLimit = has_us_speed_limit;
|
||||
frogpilot_nvg->rightHandDM = rightHandDM;
|
||||
frogpilot_nvg->setSpeed = setSpeed / (is_metric ? MS_TO_KPH : MS_TO_MPH);
|
||||
frogpilot_nvg->setSpeedRect = set_speed_rect;
|
||||
frogpilot_nvg->signMargin = sign_margin;
|
||||
frogpilot_nvg->speed = speed;
|
||||
@@ -386,7 +386,7 @@ void AnnotatedCameraWidget::drawLaneLines(QPainter &painter, const UIState *s, c
|
||||
|
||||
// paint path edges
|
||||
if (frogpilot_toggles.value("adjacent_path_metrics").toBool() || frogpilot_toggles.value("adjacent_paths").toBool()) {
|
||||
frogpilot_nvg->paintAdjacentPaths(painter, sm["carState"].getCarState(), sm["modelV2"].getModelV2(), scene, frogpilot_scene, frogpilot_toggles);
|
||||
frogpilot_nvg->paintAdjacentPaths(painter, sm["carState"].getCarState(), frogpilot_scene, frogpilot_toggles);
|
||||
} else if ((sm["carState"].getCarState().getLeftBlindspot() || sm["carState"].getCarState().getRightBlindspot()) && frogpilot_toggles.value("blind_spot_path").toBool()) {
|
||||
frogpilot_nvg->paintBlindSpotPath(painter, sm["carState"].getCarState(), frogpilot_scene);
|
||||
}
|
||||
@@ -405,9 +405,9 @@ void AnnotatedCameraWidget::drawDriverState(QPainter &painter, const UIState *s,
|
||||
int x = rightHandDM ? width() - offset : offset;
|
||||
if (distance_btn->isEnabled()) {
|
||||
if (rightHandDM) {
|
||||
x -= distance_btn->width() + UI_BORDER_SIZE;
|
||||
x -= UI_BORDER_SIZE + distance_btn->width() + UI_BORDER_SIZE;
|
||||
} else {
|
||||
x += distance_btn->width() + UI_BORDER_SIZE;
|
||||
x += UI_BORDER_SIZE + distance_btn->width() + UI_BORDER_SIZE;
|
||||
}
|
||||
}
|
||||
if (frogpilot_toggles.value("road_name_ui").toBool()) {
|
||||
@@ -452,17 +452,17 @@ void AnnotatedCameraWidget::drawLead(QPainter &painter, const cereal::RadarState
|
||||
painter.save();
|
||||
|
||||
const float speedBuff = 10.;
|
||||
const float leadBuff = 40.;
|
||||
const float leadBuff = std::max((speed / frogpilot_nvg->speedConversion) * 10.0f, 40.0f);
|
||||
const float d_rel = lead_data.getDRel() + (adjacent ? fabs(lead_data.getYRel()) : 0);
|
||||
const float v_rel = lead_data.getVRel();
|
||||
|
||||
float fillAlpha = 0;
|
||||
if (d_rel < leadBuff) {
|
||||
if (frogpilotPlan.getTrackingLead() || adjacent) {
|
||||
fillAlpha = 255 * (1.0 - (d_rel / leadBuff));
|
||||
if (v_rel < 0) {
|
||||
fillAlpha += 255 * (-1 * (v_rel / speedBuff));
|
||||
}
|
||||
fillAlpha = (int)(fmin(fillAlpha, 255));
|
||||
fillAlpha = std::clamp(fillAlpha, 0.f, 255.f);
|
||||
}
|
||||
|
||||
float sz = std::clamp((25 * 30) / (d_rel / 3 + 30), 15.0f, 30.0f) * 2.35;
|
||||
@@ -473,7 +473,11 @@ void AnnotatedCameraWidget::drawLead(QPainter &painter, const cereal::RadarState
|
||||
float g_yo = sz / 10;
|
||||
|
||||
QPointF glow[] = {{x + (sz * 1.35) + g_xo, y + sz + g_yo}, {x, y - g_yo}, {x - (sz * 1.35) - g_xo, y + sz + g_yo}};
|
||||
painter.setBrush(QColor(218, 202, 37, 255));
|
||||
if (lead_data.getFarLead()) {
|
||||
painter.setBrush(QColor(0, 255, 255, 255));
|
||||
} else {
|
||||
painter.setBrush(QColor(218, 202, 37, 255));
|
||||
}
|
||||
painter.drawPolygon(glow, std::size(glow));
|
||||
|
||||
// chevron
|
||||
@@ -567,6 +571,12 @@ void AnnotatedCameraWidget::paintEvent(QPaintEvent *event) {
|
||||
auto lead_two = radar_state.getLeadTwo();
|
||||
auto lead_left = radar_state.getLeadLeft();
|
||||
auto lead_right = radar_state.getLeadRight();
|
||||
if (lead_left.getStatus()) {
|
||||
drawLead(painter, lead_left, frogpilotPlan, s->scene.lead_vertices[2], frogpilot_nvg->blueColor(), fs, true);
|
||||
}
|
||||
if (lead_right.getStatus()) {
|
||||
drawLead(painter, lead_right, frogpilotPlan, s->scene.lead_vertices[3], frogpilot_nvg->purpleColor(), fs, true);
|
||||
}
|
||||
if (lead_one.getStatus()) {
|
||||
drawLead(painter, lead_one, frogpilotPlan, s->scene.lead_vertices[0], fs->frogpilot_scene.lead_marker_color, fs);
|
||||
} else {
|
||||
@@ -575,12 +585,6 @@ void AnnotatedCameraWidget::paintEvent(QPaintEvent *event) {
|
||||
if (lead_two.getStatus() && (std::abs(lead_one.getDRel() - lead_two.getDRel()) > 3.0)) {
|
||||
drawLead(painter, lead_two, frogpilotPlan, s->scene.lead_vertices[1], fs->frogpilot_scene.lead_marker_color, fs);
|
||||
}
|
||||
if (lead_left.getStatus()) {
|
||||
drawLead(painter, lead_left, frogpilotPlan, s->scene.lead_vertices[2], frogpilot_nvg->blueColor(), fs, true);
|
||||
}
|
||||
if (lead_right.getStatus()) {
|
||||
drawLead(painter, lead_right, frogpilotPlan, s->scene.lead_vertices[3], frogpilot_nvg->purpleColor(), fs, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -127,8 +127,7 @@ void OnroadWindow::mousePressEvent(QMouseEvent* e) {
|
||||
alerts->setVisible(true);
|
||||
nvg->setVisible(true);
|
||||
}
|
||||
nvg->screen_recorder->setEnabled(!map->isVisible() && frogpilot_toggles.value("screen_recorder").toBool());
|
||||
nvg->screen_recorder->setVisible(nvg->screen_recorder->isEnabled());
|
||||
nvg->screen_recorder->setVisible(!map->isVisible() && frogpilot_toggles.value("screen_recorder").toBool());
|
||||
}
|
||||
#endif
|
||||
// propagation event to parent(HomeWindow)
|
||||
|
||||
@@ -134,10 +134,8 @@ void Sidebar::offroadTransition(bool offroad) {
|
||||
onroad = !offroad;
|
||||
|
||||
// FrogPilot variables
|
||||
if (!onroad) {
|
||||
QTimer::singleShot(100, this, [this] {
|
||||
updateTheme();
|
||||
});
|
||||
if (onroad) {
|
||||
updateTheme();
|
||||
}
|
||||
|
||||
update();
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:76a780657d874ef7d9464ae576c45392128a38bed4f963305be6ba2c12d04699
|
||||
size 108573
|
||||
@@ -1,16 +0,0 @@
|
||||
{% extends "layout.html" %}
|
||||
|
||||
{% block title %}
|
||||
Home
|
||||
{% endblock %}
|
||||
|
||||
{% block main %}
|
||||
<br>
|
||||
<h1>Fleet Manager</h1>
|
||||
<br>
|
||||
<a href='/footage'>View Dashcam Footage</a><br>
|
||||
<br><a href='/screenrecords'>View Screen Recordings</a><br>
|
||||
<br><a href='/error_logs'>Access Error Logs</a><br>
|
||||
<br><a href='/addr_input'>Navigation</a><br>
|
||||
<br><a href='/tools'>Tools</a><br>
|
||||
{% endblock %}
|
||||
@@ -1,13 +1,18 @@
|
||||
[
|
||||
{
|
||||
"name": "boot",
|
||||
"url": "https://commadist.azureedge.net/agnosupdate/boot-5674ea6767e7198cf1e7def3de66a57061f001ed76d43dc4b4f84de545c53c6f.img.xz",
|
||||
"hash": "5674ea6767e7198cf1e7def3de66a57061f001ed76d43dc4b4f84de545c53c6f",
|
||||
"hash_raw": "5674ea6767e7198cf1e7def3de66a57061f001ed76d43dc4b4f84de545c53c6f",
|
||||
"url": "https://boot.frogpilot.download",
|
||||
"hash": "b997aae3f1c93de82449ef7f23f30ff482b0978f3d0ac08219366f9ce362ad7a",
|
||||
"hash_raw": "b997aae3f1c93de82449ef7f23f30ff482b0978f3d0ac08219366f9ce362ad7a",
|
||||
"size": 16029696,
|
||||
"sparse": false,
|
||||
"full_check": true,
|
||||
"has_ab": true
|
||||
"has_ab": true,
|
||||
"alt": {
|
||||
"hash": "5674ea6767e7198cf1e7def3de66a57061f001ed76d43dc4b4f84de545c53c6f",
|
||||
"url": "https://commadist.azureedge.net/agnosupdate/boot-5674ea6767e7198cf1e7def3de66a57061f001ed76d43dc4b4f84de545c53c6f.img.xz",
|
||||
"size": 16029696
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "abl",
|
||||
@@ -61,17 +66,17 @@
|
||||
},
|
||||
{
|
||||
"name": "system",
|
||||
"url": "https://commadist.azureedge.net/agnosupdate/system-1badfe72851628d6cf9200a53a6151bb4e797b49c717141409fc57138eae388a.img.xz",
|
||||
"hash": "328e90c62068222dfd98f71dd3f6251fcb962f082b49c6be66ab2699f5db6f4f",
|
||||
"hash_raw": "1badfe72851628d6cf9200a53a6151bb4e797b49c717141409fc57138eae388a",
|
||||
"url": "https://system.frogpilot.download",
|
||||
"hash": "be1c6bb9ee5e06779087b1b81e09b6df61d942566b0f8d4539c452179c661782",
|
||||
"hash_raw": "a5f84e68d199466fda5c9aead760b90a4cd2d2ef9a418708b9794d95bb03ec5b",
|
||||
"size": 10737418240,
|
||||
"sparse": true,
|
||||
"full_check": false,
|
||||
"has_ab": true,
|
||||
"alt": {
|
||||
"hash": "bc11d2148f29862ee1326aca2af1cf6bbf5fed831e3f8f6b8f7a0f110dfe8d26",
|
||||
"url": "https://commadist.azureedge.net/agnosupdate/system-skip-chunks-1badfe72851628d6cf9200a53a6151bb4e797b49c717141409fc57138eae388a.img.xz",
|
||||
"size": 4548070000
|
||||
"hash": "328e90c62068222dfd98f71dd3f6251fcb962f082b49c6be66ab2699f5db6f4f",
|
||||
"url": "https://commadist.azureedge.net/agnosupdate/system-1badfe72851628d6cf9200a53a6151bb4e797b49c717141409fc57138eae388a.img.xz",
|
||||
"size": 10737418240
|
||||
}
|
||||
}
|
||||
]
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user