Skip to content

fix(blind_spot): ego passage interval is reversed on right turns, so the module never stops for a cyclist on the inside #13509

Open

Description

@jerry73204

Checklist

  • I've read the contribution guidelines.
  • I've searched other issues and no duplicate issues were found.
  • I'm convinced that this is not my fault but a bug.

Description

blind_spot never stops the ego for a cyclist on the inside of a right turn (right-hand traffic), even when the cyclist is perceived as BICYCLE with correct velocity and predicted paths and rides inside the attention area.

The ego's passage time interval is computed between two lines whose order is mirrored by turn direction:

https://github.com/autowarefoundation/autoware_universe/blob/f81a3bf089/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/scene.cpp#L184-L192
https://github.com/autowarefoundation/autoware_universe/blob/f81a3bf089/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/experimental/scene.cpp#L237-L245

const auto & first_line = (turn_direction_ == TurnDirection::Left)
                            ? virtual_ego_straight_path_after_turning
                            : virtual_blind_lane_boundary_after_turning;
const auto & second_line = (turn_direction_ == TurnDirection::Left)
                             ? virtual_blind_lane_boundary_after_turning
                             : virtual_ego_straight_path_after_turning;

Both lines are built relative to the turn (the ego's straight-on edge, and the blind side's road edge carried through the junction), so the ego always crosses virtual_ego_straight_path_after_turning first and virtual_blind_lane_boundary_after_turning second, for either turn direction. Swapping them for a right turn makes "entry" the later crossing, so the interval comes out reversed (exit before entry), e.g. the debug marker ego_passage_interval reads [5.57, 5.52] every frame. The collision check against the object's passage interval then never overlaps, and the decision stays Safe until OverPassJudge.

The mirroring is correct for the object side (ego_path_lanelet.leftBound() / rightBound(), L373-L378), only the ego side is wrong.

The same code is present in 0.47.0, 0.48.0, 0.49.0 and main (f81a3bf).

Expected behavior

On a right turn with a bicycle approaching on the right (inside), the ego passage interval is [entry, exit] with entry < exit, the module reports Unsafe, and the ego stops before the turn.

Actual behavior

ego_passage_interval is reversed ([5.57, 5.52]), the module stays Safe and the ego turns across the cyclist (contact in 2/2 runs).

With the ego lines taken in the left-turn order for both directions (no other change), the same scenario gives ego_passage_interval [5.13, 11.14], the decision goes Unsafe (time to collision 4.0 -> 1.4 s), and the ego stops ~4 m before the turn and yields: 3/3 runs without contact.

Steps to reproduce

  1. Autoware 1.5.0 (blind_spot 0.48.0, experimental plugin), lidar_detection_model:=centerpoint so the cyclist is classified BICYCLE.
  2. CARLA 0.9.16 Town01, ego at ~4 m/s turning right at a T junction; a bicycle at 5-6.6 m/s riding straight on, in the same lane, ~1.4 m right of the lane centre, starting ~7 m behind the ego.
  3. Watch /planning/.../blind_spot debug markers (ego_passage_interval) and the cooperate status.

The scenario (OpenSCENARIO, run through scenario_simulator_v2 with a CARLA backend) is public: https://github.com/NEWSLabNTU/carla-scenario-bridge/blob/main/scenarios/demo/town01_i6_cyclist_inside.xosc

Versions

  • OS: Ubuntu 22.04
  • ROS 2: Humble
  • Autoware: 1.5.0 (autoware_behavior_velocity_blind_spot_module 0.48.0); code unchanged on main f81a3bf

Possible causes

Ego-side line order mirrored by turn direction (see above); likely carried over from left-hand-traffic use, where the blind spot is on the left and the bug does not show.

Additional context

Proposed fix: use virtual_ego_straight_path_after_turning as the first line and virtual_blind_lane_boundary_after_turning as the second for both turn directions, in scene.cpp and experimental/scene.cpp. Happy to open a PR.

Activity

  1. jerry73204 commented on Oct 18, 2026

    @jerry73204
    Author

    I pushed a fix with a unit test to our fork:
    NEWSLabNTU/autoware_universe@main...fix/blind-spot-right-turn-ego-passage
    (branch fix/blind-spot-right-turn-ego-passage, on main f81a3bf).

    • test/test_ego_passage_interval.cpp checks a right turn against its mirrored left turn. On the current line order it fails (left [3.08, 5.60] s, mirrored right [4.56, 4.40] s); with the fix both give [3.08, 5.60] s.
    • The same change on the 0.48.0 module (Autoware 1.5.0) makes the ego yield to the cyclist in the reproducer: 3/3 runs without contact (2/2 contact before).

    I'll open the PR from that branch if the approach looks right.


    This comment, the issue analysis and the fix were written by Claude (Anthropic's AI assistant) via Claude Code, working on behalf of @jerry73204, who reviewed them before posting.

  2. jerry73204 commented on Oct 18, 2026

    @jerry73204
    Author

    Opened #13511 with the fix and the unit test from the branch above (unchanged apart from the test file's copyright header).


    Disclosure: this comment, PR #13511, the issue analysis and the fix were written by Claude (Anthropic's AI assistant) via Claude Code, working on behalf of @jerry73204, who reviewed them before posting.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions