From 7bd73401cd11667813a92b0df59011e47f995c7d Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Sat, 13 Jun 2026 21:48:35 -0500 Subject: [PATCH] oopsie --- selfdrive/controls/radard.py | 28 ++++++++++++++++---------- selfdrive/controls/tests/test_leads.py | 22 ++++++++++++++++++++ 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/selfdrive/controls/radard.py b/selfdrive/controls/radard.py index cedf80dac..1bfcb6a07 100644 --- a/selfdrive/controls/radard.py +++ b/selfdrive/controls/radard.py @@ -202,30 +202,36 @@ VISION_DUPLICATE_LEAD_MAX_YREL_DIFF = 0.4 VISION_DUPLICATE_LEAD_MIN_MODEL_PROB = 0.7 -def leads_are_duplicate(lead_one: dict[str, Any], lead_two: dict[str, Any]) -> bool: - if not lead_one.get("status", False) or not lead_two.get("status", False): +def get_lead_field(lead: Any, field: str, default: Any) -> Any: + if isinstance(lead, dict): + return lead.get(field, default) + return getattr(lead, field, default) + + +def leads_are_duplicate(lead_one: Any, lead_two: Any) -> bool: + if not get_lead_field(lead_one, "status", False) or not get_lead_field(lead_two, "status", False): return False - lead_one_radar = bool(lead_one.get("radar", False)) - lead_two_radar = bool(lead_two.get("radar", False)) + lead_one_radar = bool(get_lead_field(lead_one, "radar", False)) + lead_two_radar = bool(get_lead_field(lead_two, "radar", False)) if lead_one_radar and lead_two_radar: - lead_one_track_id = int(lead_one.get("radarTrackId", -1)) - lead_two_track_id = int(lead_two.get("radarTrackId", -1)) + lead_one_track_id = int(get_lead_field(lead_one, "radarTrackId", -1)) + lead_two_track_id = int(get_lead_field(lead_two, "radarTrackId", -1)) return lead_one_track_id != -1 and lead_one_track_id == lead_two_track_id if lead_one_radar or lead_two_radar: return False - lead_one_prob = float(lead_one.get("modelProb", 0.0)) - lead_two_prob = float(lead_two.get("modelProb", 0.0)) + lead_one_prob = float(get_lead_field(lead_one, "modelProb", 0.0)) + lead_two_prob = float(get_lead_field(lead_two, "modelProb", 0.0)) if min(lead_one_prob, lead_two_prob) < VISION_DUPLICATE_LEAD_MIN_MODEL_PROB: return False return ( - abs(float(lead_one.get("dRel", 0.0)) - float(lead_two.get("dRel", 0.0))) <= VISION_DUPLICATE_LEAD_MAX_DREL_DIFF and - abs(float(lead_one.get("vLead", 0.0)) - float(lead_two.get("vLead", 0.0))) <= VISION_DUPLICATE_LEAD_MAX_VLEAD_DIFF and - abs(float(lead_one.get("yRel", 0.0)) - float(lead_two.get("yRel", 0.0))) <= VISION_DUPLICATE_LEAD_MAX_YREL_DIFF + abs(float(get_lead_field(lead_one, "dRel", 0.0)) - float(get_lead_field(lead_two, "dRel", 0.0))) <= VISION_DUPLICATE_LEAD_MAX_DREL_DIFF and + abs(float(get_lead_field(lead_one, "vLead", 0.0)) - float(get_lead_field(lead_two, "vLead", 0.0))) <= VISION_DUPLICATE_LEAD_MAX_VLEAD_DIFF and + abs(float(get_lead_field(lead_one, "yRel", 0.0)) - float(get_lead_field(lead_two, "yRel", 0.0))) <= VISION_DUPLICATE_LEAD_MAX_YREL_DIFF ) diff --git a/selfdrive/controls/tests/test_leads.py b/selfdrive/controls/tests/test_leads.py index 09fce2ab4..29410a699 100644 --- a/selfdrive/controls/tests/test_leads.py +++ b/selfdrive/controls/tests/test_leads.py @@ -80,6 +80,28 @@ class TestLeads: assert leads_are_duplicate(lead_one, lead_two) assert not leads_are_duplicate(lead_one, distinct_lead) + def test_duplicate_lead_helper_supports_attribute_objects(self): + lead_one = SimpleNamespace( + status=True, + radar=False, + radarTrackId=-1, + dRel=32.1, + vLead=14.2, + yRel=0.03, + modelProb=0.98, + ) + lead_two = SimpleNamespace( + status=True, + radar=False, + radarTrackId=-1, + dRel=32.2, + vLead=14.1, + yRel=0.05, + modelProb=0.97, + ) + + assert leads_are_duplicate(lead_one, lead_two) + def test_radar_fault(self): # if there's no radar-related can traffic, radard should either not respond or respond with an error # this is tightly coupled with underlying car radar_interface implementation, but it's a good sanity check