From 1f0bfa1f05b033e1d1fbdc02def8558d542f15ad Mon Sep 17 00:00:00 2001 From: royjr Date: Wed, 15 Jul 2026 17:38:53 -0400 Subject: [PATCH] better tracks --- selfdrive/ui/mici/onroad/model_renderer.py | 2 +- .../ui/sunnypilot/onroad/radar_tracks.py | 12 +++++++---- .../ui/sunnypilot/onroad/test_radar_tracks.py | 21 +++++++++++++++++-- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/selfdrive/ui/mici/onroad/model_renderer.py b/selfdrive/ui/mici/onroad/model_renderer.py index 05cd96aaa7..c361db3f5b 100644 --- a/selfdrive/ui/mici/onroad/model_renderer.py +++ b/selfdrive/ui/mici/onroad/model_renderer.py @@ -154,7 +154,7 @@ class ModelRenderer(Widget, 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, track_size=5, + self.radar_tracks.draw_radar_tracks(sm['liveTracks'], self._map_to_screen, self._path_offset_z, screen_offset=(self._rect.x, self._rect.y), v_ego=sm['carState'].vEgo) # if render_lead_indicator and radar_state: diff --git a/selfdrive/ui/sunnypilot/onroad/radar_tracks.py b/selfdrive/ui/sunnypilot/onroad/radar_tracks.py index e1b9eeb8f0..fb3e54bb80 100644 --- a/selfdrive/ui/sunnypilot/onroad/radar_tracks.py +++ b/selfdrive/ui/sunnypilot/onroad/radar_tracks.py @@ -18,13 +18,17 @@ RECEDING_COLOR = (255, 45, 45) def radar_track_color(v_rel: float, v_ego: float = 0.0) -> rl.Color: """Classify tracks as stationary, approaching, or receding with discrete colors.""" - if abs(v_ego + v_rel) <= STATIONARY_SPEED_THRESHOLD or abs(v_rel) <= RELATIVE_SPEED_MOVING_THRESHOLD: + if radar_track_is_stationary(v_rel, v_ego) or abs(v_rel) <= RELATIVE_SPEED_MOVING_THRESHOLD: return rl.Color(*NEUTRAL_COLOR, 255) color = APPROACHING_COLOR if v_rel < 0.0 else RECEDING_COLOR return rl.Color(*color, 255) +def radar_track_is_stationary(v_rel: float, v_ego: float = 0.0) -> bool: + return abs(v_ego + v_rel) <= STATIONARY_SPEED_THRESHOLD + + def format_radar_tracks_onroad_columns(live_tracks) -> tuple[str, str]: sources = sorted(live_tracks.trackSources, key=lambda source: (source.startAddress, source.endAddress, source.bus)) if not sources: @@ -128,7 +132,7 @@ class RadarTracksStatus: class RadarTracks: - def draw_radar_tracks(self, live_tracks, map_to_screen, path_offset_z, track_size=6, screen_offset=(0, 0), v_ego=0.0): + def draw_radar_tracks(self, live_tracks, map_to_screen, path_offset_z, track_size=7, 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)): @@ -140,5 +144,5 @@ class RadarTracks: x, y = pt[0] + screen_offset[0], pt[1] + screen_offset[1] color = radar_track_color(v_rel, v_ego) - neutral = (color.r, color.g, color.b) == NEUTRAL_COLOR - rl.draw_circle(int(x), int(y), max(1, track_size - 3) if neutral else track_size, color) + stationary = radar_track_is_stationary(v_rel, v_ego) + rl.draw_circle(int(x), int(y), max(1, track_size - 4) if stationary else track_size, color) diff --git a/selfdrive/ui/sunnypilot/onroad/test_radar_tracks.py b/selfdrive/ui/sunnypilot/onroad/test_radar_tracks.py index 3c11a415ef..cf0f33ffc1 100644 --- a/selfdrive/ui/sunnypilot/onroad/test_radar_tracks.py +++ b/selfdrive/ui/sunnypilot/onroad/test_radar_tracks.py @@ -94,7 +94,7 @@ def test_draw_radar_tracks_allows_unknown_acceleration(monkeypatch): assert drawn_colors == [color_tuple(radar_track_color(-5))] -def test_draw_radar_tracks_shrinks_neutral_dots(monkeypatch): +def test_draw_radar_tracks_shrinks_stationary_dots(monkeypatch): live_tracks = car.RadarData.new_message() point = live_tracks.init("points", 1)[0] point.dRel = 10 @@ -105,7 +105,24 @@ def test_draw_radar_tracks_shrinks_neutral_dots(monkeypatch): monkeypatch.setattr(radar_tracks.rl, "draw_circle", lambda x, y, size, color: drawn_sizes.append(size)) radar_tracks.RadarTracks().draw_radar_tracks( - live_tracks, lambda d_rel, y_rel, z: (20, 30), path_offset_z=1.2, track_size=5, v_ego=20, + live_tracks, lambda d_rel, y_rel, z: (20, 30), path_offset_z=1.2, track_size=6, v_ego=20, ) assert drawn_sizes == [2] + + +def test_draw_radar_tracks_keeps_moving_white_dots_large(monkeypatch): + live_tracks = car.RadarData.new_message() + point = live_tracks.init("points", 1)[0] + point.dRel = 10 + point.yRel = 1 + point.vRel = 0.5 + point.aRel = 0 + drawn_sizes = [] + monkeypatch.setattr(radar_tracks.rl, "draw_circle", lambda x, y, size, color: drawn_sizes.append(size)) + + radar_tracks.RadarTracks().draw_radar_tracks( + live_tracks, lambda d_rel, y_rel, z: (20, 30), path_offset_z=1.2, track_size=6, v_ego=20, + ) + + assert drawn_sizes == [6]