@@ -93,6 +93,45 @@ value proposition explicit.
9393- Hybrid A* + a local replanner (MPC or DWA) inside the planned
9494 corridor, which is the common production split.
9595
96+ ## Dynamic-aware Hybrid A* alone is not enough: hybrid_astar_dyn_pp (planner_kind=5)
97+
98+ ` hybrid_astar_dyn_pp ` runs the same Hybrid A* search but with each
99+ dynamic obstacle's predicted position along the candidate trajectory
100+ inflated by ` hap_robot_radius + hap_dyn_inflation ` (default 0.6 + 1.0
101+ = 1.6 m of buffer). The tracker is the same pure-pursuit as
102+ ` hybrid_astar_pp ` . The point is to test whether the global planner
103+ * can* avoid moving obstacles without a local replanner.
104+
105+ The result on the same 30-cell sweep is a clear negative: the dyn-
106+ aware variant is ** worse** than the blind one on hard cells.
107+
108+ | planner | family | hard cells | solved | mean succ | mean coll |
109+ | ---------------------| -----------| -----------:| -------:| ----------:| ----------:|
110+ | hybrid_astar_pp | Hybrid-A* | 12 | 3 | 0.25 | 15.58 |
111+ | hybrid_astar_dyn_pp | Hybrid-A* | 12 | 2 | 0.17 | 15.92 |
112+ | hybrid_astar_dwa | Hybrid-A* | 12 | 12 | 1.00 | 0.00 |
113+
114+ Across all 30 cells ` hybrid_astar_dyn_pp ` solves 20 (mean coll 6.37)
115+ vs. ` hybrid_astar_pp ` 21 (6.23). On easier cells the dyn-aware path is
116+ slightly * more* direct and occasionally beats the blind variant, but
117+ on the hard half the dynamic prediction backfires.
118+
119+ Why does it fail: the search uses a constant ` v_search ` for time
120+ stamps along the candidate, but the simulator starts from rest and
121+ accelerates to ` target_speed ` , so the robot arrives at each pose
122+ * earlier* than the search predicts. Linearised obstacle prediction
123+ along the search timestamp is therefore offset from reality by
124+ ~ 1 s, which against a 2 m/s obstacle is ~ 2 m -- the same scale as
125+ the inflated robot circle. The search avoids "ghost" positions and
126+ walks into the real obstacle.
127+
128+ Inflating the buffer larger (we tested 2.0 m) just makes the search
129+ either fail to find a path through the pincer convergence or fall
130+ back to the same path as the static search; smaller buffers leave
131+ the brittleness in place. The fundamental fix is to close the loop
132+ with a per-step local controller, which is exactly what
133+ ` hybrid_astar_dwa ` (below) does.
134+
96135## Closing the paradigm gap: hybrid_astar_dwa (planner_kind=4)
97136
98137The follow-up variant ` hybrid_astar_dwa ` takes the third option above
0 commit comments