This commit is contained in:
royjr
2026-07-15 13:52:39 -04:00
parent 40ad364a19
commit 9db3e95940
4 changed files with 15 additions and 5 deletions
+1 -1
View File
@@ -155,7 +155,7 @@ class ModelRenderer(Widget, ModelRendererSP):
if sm.valid['liveTracks'] and sm.recv_frame['liveTracks'] >= ui_state.started_frame:
self.radar_tracks.draw_radar_tracks(sm['liveTracks'], self._map_to_screen, self._path_offset_z, track_size=5,
screen_offset=(self._rect.x, self._rect.y))
screen_offset=(self._rect.x, self._rect.y), v_ego=sm['carState'].vEgo)
# if render_lead_indicator and radar_state:
# self._draw_lead_indicator()
+1 -1
View File
@@ -136,7 +136,7 @@ class ModelRenderer(Widget, ChevronMetrics, ModelRendererSP):
self._draw_path(sm)
if sm.valid['liveTracks'] and sm.recv_frame['liveTracks'] >= ui_state.started_frame:
self.radar_tracks.draw_radar_tracks(sm['liveTracks'], self._map_to_screen, self._path_offset_z)
self.radar_tracks.draw_radar_tracks(sm['liveTracks'], self._map_to_screen, self._path_offset_z, v_ego=sm['carState'].vEgo)
if render_lead_indicator and radar_state:
self._draw_lead_indicator()
@@ -8,13 +8,17 @@ import math
import pyray as rl
RELATIVE_SPEED_COLOR_RANGE = 10.0 # m/s; speeds beyond this use the full endpoint color
STATIONARY_SPEED_THRESHOLD = 1.0 # m/s estimated ground speed
APPROACHING_COLOR = (0, 128, 255)
NEUTRAL_COLOR = (255, 255, 255)
RECEDING_COLOR = (255, 32, 32)
def radar_track_color(v_rel: float) -> rl.Color:
def radar_track_color(v_rel: float, v_ego: float = 0.0) -> rl.Color:
"""Map relative speed from approaching blue through neutral white to receding red."""
if abs(v_ego + v_rel) <= STATIONARY_SPEED_THRESHOLD:
return rl.Color(*NEUTRAL_COLOR, 255)
blend = min(abs(v_rel) / RELATIVE_SPEED_COLOR_RANGE, 1.0)
target = APPROACHING_COLOR if v_rel < 0.0 else RECEDING_COLOR
rgb = tuple(round(neutral + (endpoint - neutral) * blend) for neutral, endpoint in zip(NEUTRAL_COLOR, target, strict=True))
@@ -40,7 +44,7 @@ def format_radar_tracks_onroad_columns(live_tracks) -> tuple[str, str]:
class RadarTracks:
def draw_radar_tracks(self, live_tracks, map_to_screen, path_offset_z, track_size=6, screen_offset=(0, 0)):
def draw_radar_tracks(self, live_tracks, map_to_screen, path_offset_z, track_size=6, screen_offset=(0, 0), v_ego=0.0):
for track in live_tracks.points:
d_rel, y_rel, v_rel = track.dRel, track.yRel, track.vRel
if not (math.isfinite(d_rel) and math.isfinite(y_rel) and math.isfinite(v_rel)):
@@ -51,4 +55,4 @@ class RadarTracks:
continue
x, y = pt[0] + screen_offset[0], pt[1] + screen_offset[1]
rl.draw_circle(int(x), int(y), track_size, radar_track_color(v_rel))
rl.draw_circle(int(x), int(y), track_size, radar_track_color(v_rel, v_ego))
@@ -19,6 +19,12 @@ def test_radar_track_relative_speed_colors():
assert receding == (255, 144, 144, 255)
def test_radar_track_stationary_world_object_is_white():
assert color_tuple(radar_track_color(-20.0, v_ego=20.0)) == (255, 255, 255, 255)
assert color_tuple(radar_track_color(-19.0, v_ego=20.0)) == (255, 255, 255, 255)
assert color_tuple(radar_track_color(-18.9, v_ego=20.0)) == (0, 128, 255, 255)
def test_format_radar_tracks_status_none():
live_tracks = car.RadarData.new_message()