Skip to content

hybrid_astar_dyn_pp: control experiment shows dyn-aware search alone is brittle#8

Merged
rsasaki0109 merged 1 commit into
masterfrom
feat/hybrid-astar-dyn
May 19, 2026
Merged

hybrid_astar_dyn_pp: control experiment shows dyn-aware search alone is brittle#8
rsasaki0109 merged 1 commit into
masterfrom
feat/hybrid-astar-dyn

Conversation

@rsasaki0109
Copy link
Copy Markdown
Owner

Summary

A control experiment that complements PR #6 (hybrid_astar_dwa). Same Hybrid A* search as the baseline hybrid_astar_pp, but the search's collision check inflates each dynamic obstacle's predicted position along its time stamp. The tracker remains the same pure-pursuit. So the only difference vs. blind hybrid_astar_pp is the dynamic-aware search, and the question is: does global predictive avoidance close the gap without per-step local replanning?

Answer: no. The dyn-aware variant is worse than blind on hard cells.

planner cells solved mean coll hard solved hard coll
hybrid_astar_pp 30 21 6.23 3/12 15.58
hybrid_astar_dyn_pp 30 20 6.37 2/12 15.92
hybrid_astar_dwa 30 30 0.00 12/12 0.00

The linearised constant-speed prediction is offset from the simulator's acceleration-from-rest schedule by ~1 s; the search avoids the ghost position and walks into the real obstacle. Inflating the safety buffer beyond 1 m either kills the path through the pincer convergence or collapses to the static path. The negative result tightens the case for hybrid_astar_dwa by showing that a per-step local controller is not optional once the obstacle dynamics matter — a smarter global search alone doesn't compensate.

What changed

  • include/hybrid_astar_pp.h: hybrid_astar_plan now takes an optional vector<DynamicObstacleSpec> + t_offset. The Node tracks a per-node time stamp; each sub-step rejects expansions whose predicted obstacle position is inside (o.r + robot_radius). Lattice key is still (x, y, theta) (the standard 4D-without-time approximation).
  • benchmark_diff_mppi.cu: ensure_hap_path_planned takes an include_dynamic flag. When set, the search uses target_speed for its v_search (so search-t roughly matches sim-t) and inflates robot_radius by hap_dyn_inflation = 1.0 m to absorb the constant-speed-search vs. accelerate-from-rest mismatch.
  • Registered as hybrid_astar_dyn_pp (planner_kind=5).
  • docs/local_planner_comparison.md regenerated from a new 11-planner sweep.
  • docs/hybrid_astar_baseline.md extended with the negative-result section before the hybrid_astar_dwa section.

Test plan

  • Build: cd build && cmake --build . --target benchmark_diff_mppi -j\$(nproc) (clean).
  • Hard-cell smoke test on dynamic_pincer / crossing / slalom: confirmed dyn_pp collisions match pp ballpark, dwa is collision-free.
  • Full sweep (3 scenarios × 5 speed × 2 radius × 4 seeds × 11 planners) regenerated docs/local_planner_comparison.md.

Known CI failure

validate_design_workflow fails on experiments.horizon_selection is missing PROBLEM_KIND — same pre-existing breakage on master. PR #7 fixes that; merge order is independent.

A control experiment that complements hybrid_astar_dwa: same Hybrid A*
search but the candidate-trajectory collision check uses the predicted
position of each dynamic obstacle along its time stamp, and the tracker
is the same pure-pursuit used by hybrid_astar_pp -- so the *only*
difference vs. blind hybrid_astar_pp is the dynamic-aware search. The
question this answers: "does global predictive avoidance close the gap
without per-step local replanning?"

Search-side wiring:
- include/hybrid_astar_pp.h: hybrid_astar_plan now takes an optional
  vector<DynamicObstacleSpec> + t_offset. The Node tracks a per-node
  time stamp; each sub-step rejects expansions whose predicted obstacle
  position is inside (o.r + robot_radius). The lattice key is still
  (x, y, theta) -- the search inherits whichever arrival-time happens
  to reach a cell first, which is the standard 4D-lattice-without-time
  approximation.
- benchmark_diff_mppi.cu: ensure_hap_path_planned takes an
  include_dynamic flag. When set, the search uses target_speed for
  its v_search (so search-t roughly matches sim-t) and inflates
  robot_radius by hap_dyn_inflation = 1.0 m to absorb the
  constant-speed-search vs. accelerate-from-rest mismatch.

Sweep result (3 scenarios x 5 speed x 2 radius x 4 seeds, K=4096):

| planner             | cells | solved | mean coll | hard solved | hard coll |
|---------------------|------:|-------:|----------:|------------:|----------:|
| hybrid_astar_pp     |    30 |     21 |      6.23 |       3/12 |     15.58 |
| hybrid_astar_dyn_pp |    30 |     20 |      6.37 |       2/12 |     15.92 |
| hybrid_astar_dwa    |    30 |     30 |      0.00 |      12/12 |      0.00 |

Headline: dyn-aware search alone is *worse* than blind on hard cells.
The linearised constant-speed prediction is offset from the simulator's
acceleration-from-rest schedule by ~1 s; the search avoids the ghost
position and walks into the real obstacle. Inflating the buffer beyond
1 m either kills the path through the pincer convergence funnel or
collapses back to the static path.

The negative result is the point. It tightens the case for
hybrid_astar_dwa by demonstrating that a per-step local controller
isn't optional once the obstacle dynamics matter -- a smarter global
search alone doesn't compensate.

docs/local_planner_comparison.md regenerated from the new sweep, and
docs/hybrid_astar_baseline.md extended with the negative-result section.
@rsasaki0109 rsasaki0109 force-pushed the feat/hybrid-astar-dyn branch from 3bd3a09 to 2ff73c4 Compare May 19, 2026 08:02
@rsasaki0109 rsasaki0109 merged commit 0acb99d into master May 19, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant