feat: MLS planner improvements#2483
Conversation
Codecov Report❌ Patch coverage is
Flags with carried forward coverage won't be shown. Click here to find out more.
... and 18 files with indirect coverage changes 🚀 New features to boost your workflow:
|
Greptile SummaryThis PR adds two significant improvements to the MLS 3-D planner: incremental regional map updates (avoiding full graph rebuilds on every LiDAR frame) and a string-pulling path smoother that collapses jagged cell-by-cell routes into straight-line segments where clearance allows.
Confidence Score: 5/5Safe to merge — the incremental regional update pipeline maintains the surface_lookup/cells invariant correctly, the string puller is conservative, and comprehensive round-trip tests verify that streaming-only regional builds produce equivalent plans to full global rebuilds. All findings are non-blocking. The robot_search penalized-cost vs. geometric-radius mismatch degrades path quality near dense wall regions but the fallback via walk_preds always produces a valid path. The MLSPlan breaking change is intentional and tested. No correctness bugs found in the incremental Dijkstra, node placement, edge caching, or path assembly logic. planner.rs (robot_search cost-budget semantics and los_on_surface gap handling) and transformer.py (breaking region_bounds requirement) are worth a second read before merge if any downstream callers outside this repo feed MLSPlan directly. Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
LiDAR["LiDAR frame (PointCloud2)"] --> RT["RayTraceMap\n(emit_local=True)"]
RT -->|"local_map + region_bounds"| MP["MlsPlanner\ntry_region_update"]
RT -->|global_map| MG["update_global_map\n(full rebuild)"]
MP --> URV["replace_region_voxels"]
URV --> ESR["extract_surfaces_region"]
ESR --> RSS["replace_surface_region"]
RSS --> RRG["rebuild_region_graph"]
RRG --> PNR["place_nodes_region\n(dijkstra_region wall dist + NMS + penalty)"]
PNR --> BNER["build_node_edges_region\n(dijkstra_region Voronoi + merge cached edges)"]
MG --> RN["rebuild_nodes\n(full wall dijkstra + penalty)"]
RN --> BNE["build_node_edges\n(full Voronoi dijkstra)"]
BNER --> PLAN["plan()"]
BNE --> PLAN
PLAN --> SC["snap_candidates"]
SC --> ND["node_dijkstra\n(goal-rooted cost-to-go)"]
ND --> SE["select_entry\n(robot_search + best connect+ctg)"]
SE --> AC["assemble_cells"]
AC --> SP["string_pull\n(los_on_surface clearance check)"]
SP --> WP["cells_to_waypoints"]
Reviews (3): Last reviewed commit: "Clean up" | Re-trigger Greptile |
Problem
3d nav improvements
Closes DIM-XXX
Solution
How to Test
large_plan.mp4
Contributor License Agreement