feat: multi level navigation#2570
Conversation
Codecov Report❌ Patch coverage is @@ Coverage Diff @@
## main #2570 +/- ##
==========================================
- Coverage 70.77% 70.68% -0.09%
==========================================
Files 873 877 +4
Lines 77628 77885 +257
Branches 6894 6912 +18
==========================================
+ Hits 54940 55052 +112
- Misses 20887 21030 +143
- Partials 1801 1803 +2
Flags with carried forward coverage won't be shown. Click here to find out more.
... and 2 files with indirect coverage changes 🚀 New features to boost your workflow:
|
Greptile SummaryThis PR wires together a full 3-D click-to-navigate stack on the Unitree Go2: PointLio odometry → odometry-registered ray-traced voxel map → incremental MLS planner → pure-pursuit path follower. The Rust planner is substantially rewritten with multi-candidate start snapping, a string-pull smoother, a cached-path safe-truncation fallback, and a separate worker task so map ingestion never blocks replanning.
Confidence Score: 3/5Navigation-critical code: the path follower's stop_movement handler is momentarily effective but gets overridden by the next planner publish, so any runtime stop signal is functionally ignored. The path follower's dimos/navigation/basic_path_follower/module.py (stop_movement latch) and dimos/mapping/ray_tracing/rust/src/main.rs (region_bounds quaternion encoding convention). Important Files Changed
Sequence Diagram%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
participant Go2 as GO2Connection
participant PL as PointLio
participant RT as RayTracingVoxelMap
participant MLS as MLSPlannerNative (Worker)
participant GR as GoalRelay
participant BPF as BasicPathFollower
participant MM as MovementManager
Go2->>PL: lidar_l1 (PointCloud2)
Go2->>PL: odom_go2 (Odometry)
PL->>RT: lidar (sensor-frame cloud)
PL->>RT: odometry (pose)
RT->>RT: rotate cloud into world frame
RT->>MLS: local_map + region_bounds (paired by stamp)
RT->>MLS: global_map (every 50 frames)
Go2->>GR: odometry
GR->>MLS: start_pose (PoseStamped)
Note over GR: User clicks goal in Rerun
GR->>MLS: goal_pose (PoseStamped)
MLS->>MLS: update_region / update_global_map
MLS->>MLS: plan_or_truncate (plan + string_pull OR truncate_to_safe)
MLS->>BPF: path (Path)
Go2->>GR: odometry
GR->>BPF: odometry (for position)
BPF->>MM: nav_cmd_vel (Twist)
MM->>Go2: cmd_vel
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
participant Go2 as GO2Connection
participant PL as PointLio
participant RT as RayTracingVoxelMap
participant MLS as MLSPlannerNative (Worker)
participant GR as GoalRelay
participant BPF as BasicPathFollower
participant MM as MovementManager
Go2->>PL: lidar_l1 (PointCloud2)
Go2->>PL: odom_go2 (Odometry)
PL->>RT: lidar (sensor-frame cloud)
PL->>RT: odometry (pose)
RT->>RT: rotate cloud into world frame
RT->>MLS: local_map + region_bounds (paired by stamp)
RT->>MLS: global_map (every 50 frames)
Go2->>GR: odometry
GR->>MLS: start_pose (PoseStamped)
Note over GR: User clicks goal in Rerun
GR->>MLS: goal_pose (PoseStamped)
MLS->>MLS: update_region / update_global_map
MLS->>MLS: plan_or_truncate (plan + string_pull OR truncate_to_safe)
MLS->>BPF: path (Path)
Go2->>GR: odometry
GR->>BPF: odometry (for position)
BPF->>MM: nav_cmd_vel (Twist)
MM->>Go2: cmd_vel
Reviews (11): Last reviewed commit: "Merge remote-tracking branch 'origin/mai..." | Re-trigger Greptile |
leshy
left a comment
There was a problem hiding this comment.
just one question around AI / normal mode switcher
aclauer
left a comment
There was a problem hiding this comment.
How come this was introduced? generally we never run in "normal" mode - only way we ever used go2 is in sport mode
Yeah it isn't strictly necessary, but probably good to have a way to configure. For example, "AI" mode is actually deprecated as of firmware < 1.1.6 and "MCF" is the new string.
02f42cf to
c25585b
Compare
# Conflicts: # dimos/robot/all_blueprints.py
Problem
3d navigation and ray tracing integration
Closes DIM-XXX
Solution
Creates a blueprint using ray tracing and mls planner, plus improvements to other modules. Click and point to navigate to goals.
Ray tracer:
Planner:
Other things:
How to Test
build native modules:
run! (on jetson on go2)
other things not tested but would be awesome to try:
Contributor License Agreement