Skip to content

feat: Go2 3D navigation (MLS planner, ray tracing) + mid360 mount shim#2670

Draft
jeff-hykin wants to merge 98 commits into
mainfrom
jeff/hack/kronk-nav-4
Draft

feat: Go2 3D navigation (MLS planner, ray tracing) + mid360 mount shim#2670
jeff-hykin wants to merge 98 commits into
mainfrom
jeff/hack/kronk-nav-4

Conversation

@jeff-hykin

@jeff-hykin jeff-hykin commented Jun 30, 2026

Copy link
Copy Markdown
Member

Rebuild the Point-LIO to avoid stale binary

cd dimos/hardware/sensors/lidar/pointlio/cpp
nix build .#pointlio_native

Run the recording blueprint

export ROBOT_IP=<go2-ip>                     # find it: dimos go2tool discover
export DIMOS_MID360_LIDAR_IP=192.168.1.155   # your lidar's IP
export DIMOS_MID360_PCAP_IFACE=<wired-iface> # find it: ip -br link

# SF office 
dimos run unitree-go2-nav-3d
# china office
dimos run unitree-go2-nav-3d-rotated

Drive it through the space, Ctrl+C when you're done. You get two files: recording.db (the cloud + odometry the stack used, replayable) and recordings/mid360_*.pcap (the raw Livox packets).

jeff-hykin added 30 commits May 23, 2026 14:19
Use Go2Config.static_transforms + local _odom_to_tf helper, and the
public camera_info_static() (was the removed _camera_info_static).
aclauer and others added 24 commits June 24, 2026 12:36
The sqlite-vec 0.1.6 aarch64 wheel ships a 32-bit vec0.so (upstream
packaging bug) which fails to load on the Jetson with "wrong ELF class:
ELFCLASS32". Pin >=0.1.7 to skip it (resolves to 0.1.9).

Also fix the unitree-go2-nav-3d PointLio config: pass gravity_align=False
instead of the removed config="no_gravity_align.yaml", drop the redundant
body_frame_id, and set auto_build=True so the native binary recompiles.
… frames

Add a row-major 4x4 transform to PointLioConfig so the C++ rewrites the
cloud, odometry, and odom->body TF into a corrected mount frame, replacing
the StaticTfCorrection hack. Drop frame_id/child_frame_id/sensor_frame_id
config fields in favor of frame_mapping, injected into the C++ args at start.
…ecording

Move the mid360 mount URDFs up to the go2 package and export their paths from
config. nav_3d now builds the mount correction from those URDFs (replacing the
deleted PointLioHack), records the corrected pointlio streams, and captures the
raw Livox pcap.
…/hack/kronk-nav-4

# Conflicts:
#	dimos/robot/unitree/go2/blueprints/navigation/unitree_go2_nav_3d.py
PointLio reads the same physical Mid-360 as the rest of the rig, so collapse
its DIMOS_POINTLIO_LIDAR_IP onto the shared DIMOS_MID360_LIDAR_IP — one env var
for both modules instead of duplicating the same IP.
The rotated-mount un-rotation assumed the sensor was always physically rotated.
Gate it behind USE_ROTATED_MID360_MOUNT (default off) so the blueprint runs the
normal mount with an identity transform unless the rotated rig is in use.
@codecov

codecov Bot commented Jun 30, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 76.88442% with 92 lines in your changes missing coverage. Please review.
✅ All tests successful. No failed tests found.

Files with missing lines Patch % Lines
dimos/protocol/tf/tf.py 37.33% 43 Missing and 4 partials ⚠️
dimos/robot/unitree/go2/connection.py 50.00% 9 Missing ⚠️
dimos/core/tf_module.py 86.20% 3 Missing and 5 partials ⚠️
dimos/robot/urdf_loader.py 83.33% 5 Missing and 3 partials ⚠️
dimos/core/module.py 66.66% 2 Missing and 2 partials ⚠️
dimos/hardware/sensors/lidar/pointlio/module.py 66.66% 4 Missing ⚠️
dimos/mapping/utils/cli/map.py 25.00% 3 Missing ⚠️
dimos/robot/model_parser.py 76.92% 1 Missing and 2 partials ⚠️
...ee/go2/blueprints/navigation/unitree_go2_nav_3d.py 83.33% 3 Missing ⚠️
dimos/robot/diy/alfred/config.py 71.42% 2 Missing ⚠️
... and 1 more
@@            Coverage Diff             @@
##             main    #2670      +/-   ##
==========================================
+ Coverage   70.82%   71.33%   +0.50%     
==========================================
  Files         903      896       -7     
  Lines       81524    80958     -566     
  Branches     7354     7401      +47     
==========================================
+ Hits        57740    57750      +10     
+ Misses      21857    21257     -600     
- Partials     1927     1951      +24     
Flag Coverage Δ
OS-ubuntu-24.04-arm 63.85% <73.65%> (+0.48%) ⬆️
OS-ubuntu-latest 66.53% <73.65%> (+0.50%) ⬆️
Py-3.10 66.53% <73.65%> (+0.50%) ⬆️
Py-3.11 66.53% <73.65%> (+0.51%) ⬆️
Py-3.12 66.53% <73.65%> (+0.51%) ⬆️
Py-3.13 66.52% <73.65%> (+0.50%) ⬆️
Py-3.14 66.54% <73.65%> (+0.49%) ⬆️
Py-3.14t 66.53% <73.65%> (+0.50%) ⬆️
SelfHosted-Large 29.93% <32.09%> (-0.09%) ⬇️
SelfHosted-Linux 37.30% <44.24%> (+0.01%) ⬆️
SelfHosted-macOS 36.16% <45.42%> (+0.02%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
dimos/constants.py 80.95% <100.00%> (+2.00%) ⬆️
...ardware/sensors/lidar/pointlio/mount_correction.py 100.00% <100.00%> (ø)
dimos/mapping/utils/cli/replay.py 77.24% <100.00%> (ø)
dimos/mapping/utils/cli/replay_marker.py 65.11% <100.00%> (ø)
dimos/memory2/module.py 42.66% <100.00%> (+0.26%) ⬆️
dimos/perception/detection/conftest.py 88.37% <100.00%> (ø)
dimos/protocol/tf/test_tf.py 100.00% <100.00%> (ø)
dimos/robot/all_blueprints.py 100.00% <ø> (ø)
dimos/robot/assembly/mid360_realsense_30.py 97.77% <100.00%> (+0.05%) ⬆️
dimos/robot/diy/alfred/blueprints/alfred_nav.py 100.00% <ø> (ø)
... and 15 more

... and 31 files with indirect coverage changes

🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

The camera block referenced onimage/Thread/publish_camera_info, none of which
exist after camera_info publishing moved to the _on_static_publish hook. Subscribe
the on_image closure and drop the stale thread wiring so mypy passes.
@jeff-hykin jeff-hykin added the backport:skip Skip creating a backport to any release branches label Jun 30, 2026
…eprint

Replace the USE_ROTATED_MID360_MOUNT constant with two blueprints from a shared
_nav_3d() factory: unitree-go2-nav-3d (normal mount) and
unitree-go2-nav-3d-rotated (applies the mount_correction transform).
… rerun

Standalone tool: loads the TF tree if present, then logs every PointCloud2 and
Odometry stream (clouds placed via TF frame_id when TF exists). --seconds bounds
the window from the recording start.
Point-LIO clouds are already registered in their world frame, and the recorded
TF tree usually lacks the sensor frames, so referencing tf#/<frame_id> left
clouds unplaced. Log clouds raw. Also move each odom trail off the posed entity
(was double-transformed by the pose) onto world/trails/<name>.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport:skip Skip creating a backport to any release branches

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants