Require matching blinkers for navigation turn desires

Cherry-picked Feature Request 1267242 from ab98ae54bb. Prevent sharp or ordinary navigation turn desires from being issued unless the corresponding turn signal is active, and add regression coverage for missing and opposite signals.

Co-Authored-By: Prabhaav Pillai <prabhaav@msu.edu>
This commit is contained in:
firestar5683
2026-08-21 12:04:11 -05:00
parent 269562e73a
commit 05e9dfd5d0
2 changed files with 21 additions and 3 deletions
+2 -2
View File
@@ -224,12 +224,12 @@ class DesireHelper:
if desired_lane_width >= starpilot_toggles.lane_detection_width and self._nav_torque_applied(carstate, lane_change_direction):
return log.Desire.keepRight
elif modifier in ("left", "sharpLeft"):
turn_allowed = not carstate.rightBlinker and not carstate.leftBlindspot
turn_allowed = carstate.leftBlinker and not carstate.rightBlinker and not carstate.leftBlindspot
turn_allowed &= carstate.vEgo < starpilot_toggles.minimum_lane_change_speed and not carstate.standstill
if turn_allowed and self._nav_turn_is_imminent(carstate, maneuver_distance):
return log.Desire.turnLeft
elif modifier in ("right", "sharpRight"):
turn_allowed = not carstate.leftBlinker and not carstate.rightBlindspot
turn_allowed = carstate.rightBlinker and not carstate.leftBlinker and not carstate.rightBlindspot
turn_allowed &= carstate.vEgo < starpilot_toggles.minimum_lane_change_speed and not carstate.standstill
if turn_allowed and self._nav_turn_is_imminent(carstate, maneuver_distance):
return log.Desire.turnRight
@@ -71,7 +71,7 @@ def test_nav_desires_turn_right_below_lane_change_speed():
helper._nav_instruction_state = {"valid": True, "maneuverModifier": "right", "maneuverDistance": 10.0}
helper.update(
make_car_state(vEgo=5.0),
make_car_state(vEgo=5.0, rightBlinker=True),
True,
0.0,
make_plan(),
@@ -81,6 +81,24 @@ def test_nav_desires_turn_right_below_lane_change_speed():
assert helper.desire == log.Desire.turnRight
def test_nav_desires_turn_requires_matching_blinker():
for modifier, opposite_blinker in (("left", "rightBlinker"), ("right", "leftBlinker")):
helper = DesireHelper()
helper.nav_desires_allowed = True
helper._update_nav_params = lambda: None
helper._nav_instruction_state = {"valid": True, "maneuverModifier": modifier, "maneuverDistance": 10.0}
helper.update(
make_car_state(vEgo=5.0, **{opposite_blinker: True}),
True,
0.0,
make_plan(),
make_toggles(minimum_lane_change_speed=10.0, nav_lane_positioning_allowed=False),
)
assert helper.desire == log.Desire.none
def test_nav_desires_turn_right_waits_until_turn_is_close():
helper = DesireHelper()
helper.nav_desires_allowed = True