Copied from the dyna360 research stack into lerobot.navigation:
- voxel_map.py: sparse-hash VoxelMap (5 cm default), count-weighted
running-mean geometry + optional per-voxel semantic feature; carve()
for DynaMem-style free-space removal (dynamic updates), query() for
top-k cosine text matches, remove_voxels_in_box() for scene mutation.
Added an inverse.reshape(-1) guard for numpy 2.x's np.unique.
- occupancy.py: derived 3-class top-down grid (UNOBSERVED/NAVIGABLE/
OBSTACLE) projected from the voxel map, A* with no corner-cutting,
obstacle inflation, and frontier extraction for exploration. Added
OccupancyGrid.is_obstacle() used by SafeBaseController's occupancy gate.
Pure numpy, no torch/hardware/SDK. 42 new tests (71 total in
tests/navigation/). Next: LingBot-Map geometry runner + integration.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
unitree_go2 robot: high-level sport-mode body-velocity control over DDS
(unitree_sdk2py) straight from the host — no companion computer, unlike
the G1's low-level ZMQ bridge. Actions x.vel/y.vel/theta.vel; observation
is planar odometry (rt/sportmodestate) + the built-in front camera via
VideoClient. SDK imported only in connect() so configs/features/tests
work without it; 20 tests via mocks. unitree_go2 pyproject extra.
lerobot.navigation package: BaseController protocol + StubBaseController +
SafeBaseController (velocity clamp, occupancy gate, keyframe watchdog,
e-stop latch) + RobotBaseController wrapping any Robot on the standard
REP-103 mobile-base contract, carrying the world<->body velocity and
odometry<->world pose frame math. Robot-agnostic: the SDK lives only in
the robot class. 29 tests, SDK/torch-free.
First step of consolidating the dyna360 DynaMem navigation stack into
lerobot; dyna360 is a source to copy from, not a runtime dependency.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>