← All reports

Weekly — 19 August 2026

Navigation Stack · Unitree Go2W · real hardware

Summary

Two parallel lines of work. Line 1 is the core navigation stack — LiDAR SLAM plus the SCAN-Planner occupancy planner; more real-robot testing this week turned "it sometimes fails" into four specific, separable failure modes, three with fixes and one under investigation. Line 2 is the perception line toward speech-driven, semantic navigation; this week the camera went from streaming-but-unused to wired into the SLAM — full-rate throughput, a solved camera-to-LiDAR calibration, and camera-LiDAR fusion running — and the semantic-mapping approach was chosen.

Recap — the navigation stack (SCAN-Planner)

The core stack navigates the legged robot with SCAN-Planner. Unlike a flat 2D-costmap planner, SCAN keeps its own 3D occupancy grid and optimises a smooth 3D B-spline trajectory through it, tracked by a closed-loop controller. Because both the map and the path are 3D, it can reason about a quadruped-traversable route over height — steps, ramps, thresholds — not just around obstacles on a plane. The command still passes through the one mux and safety gate that everything does.

LiDAR + SLAM odometry + 3D cloud SCAN 3D occupancy planner-owned 3D grid 3D B-spline plan smooth · replanned Closed-loop tracker upstream controller Mux → Safety → platform
SCAN-Planner pipeline. The 3D occupancy grid and 3D B-spline path are what make a quadruped-traversable, multilevel route representable — where a flat 2D costmap could only plan around obstacles on the floor.

Line 1Core navigation stack — four failure modes

More time driving the real robot (recordings available) separated the intermittent SLAM/planner failures into four distinct causes. Naming them individually is the point: each has its own fix, and lumping them together was hiding that.

Failure modeWhat happens · fixStatus
1. Compute starvation The estimator misses its 10-per-second deadline, its input queue backs up, and the estimate degrades. Fix: thin the LiDAR points (per-scan filter 3→1) and keep the estimator on the fast CPU cores in performance mode — frame time ~200 ms → ~50 ms. fixed, verified
2. Network transport Streaming raw LiDAR from the robot to the workstation adds latency on the critical path. Plan: move the SLAM onboard immediately, so the network leaves the loop; then, once the semantic-navigation line is settled, move the full stack onto a more capable onboard computer (Jetson AGX Orin). Sensor drivers already moved onboard last week. planned
3. Turning drift indoors Turning in the pit could send the estimate into a runaway (up to 84 m/s). Fix: the compute fix above, plus the camera-LiDAR fusion from Line 2 — on the exact recording that used to diverge, the fused estimate stays bounded. fix in hand
4. Planner fences itself in over a long run On a longer session, one goal became unreachable: ground points had accumulated as obstacles in the planner's map. The same goal from a fresh map planned fine — so it is accumulation over the run, not an infeasible goal. Consistent with map cells not being retracted as the estimate refines. Still being root-caused. under investigation
Current limitations

Line 2Camera line — toward speech-driven, semantic navigation

The camera earns its place on two fronts: it stabilises the LiDAR SLAM (Line 1, mode 3), and it is the sensor for the interaction line — speak a destination in plain language, and build a map the robot understands by object. It can serve both; we track it here, on Line 2. This week moved it from "streaming but used by nothing" to "wired into the SLAM".

Getting the camera in — the three things figured out

LiDAR points projected onto the camera photo and coloured by depth; a plywood board's point-cloud silhouette lands exactly on the board's outline
Calibration check: LiDAR points projected onto the camera photo with the solved geometry — the board's outline matches. A wrong calibration shifts them off it.
Top-down view of a camera-coloured 3D map of the pit arena, with the robot's trajectory drawn through the middle
Live camera-LiDAR fusion, top-down: the whole arena colour-mapped as the robot moves, with its path (green) through the centre. On the recording that used to diverge, the estimate stays bounded — 0.36 m and 0.47 m/s, versus the LiDAR-only 141 m and 84.7 m/s.
The camera-coloured LiDAR point cloud from the robot's viewpoint: grey floor and geometry, colour where the camera sees
The same fusion from the robot's viewpoint — the LiDAR cloud coloured by the camera (an RGB-D point cloud). Grey is geometry the LiDAR sees all around; colour is what the camera can label. This colour output is what feeds the semantic map.

Why the fusion holds where LiDAR-only breaks

The turning runaway (Line 1, mode 3) is a LiDAR failure: while rotating, the scan being matched is stale relative to the pose and the geometric match fails. FAST-LIVO2 adds a second, independent constraint — it aligns the camera image directly (photometric), using the LiDAR points as the 3D structure. When the geometry is ambiguous, the visual term still anchors the pose on scene texture, so the fused estimate does not run away. The camera supplies appearance, not depth; the LiDAR still supplies all geometry.

Mid360 LiDAR IMU D455 camera LiDAR scan-to-map geometric — degrades while turning Direct photometric align visual — independent of geometry IMU motion prior Fused iterated-EKF geometry × appearance redundant constraints Pose stays bounded
Two independent constraints reach one estimator. When the geometric (LiDAR) term is ambiguous — turning against a stale scan — the visual term still holds, so the fused pose stays bounded instead of running away.

Semantic mapping — approach chosen

Surveyed what actually runs on the laptop and is stable enough to demo, and converged on the scene-graph approach. Chose DualMap — a popular, lightweight open-vocabulary mapper (mobile-sized vision models) that builds a map you can query in plain language. Rejected ConceptGraphs: its full-size models need more GPU memory than the laptop has. DualMap consumes the fusion's pose and colour output, so it slots straight on top of Line 2.

Voice held-to-talk Parakeet S2T speech → text Grounding resolve to a place Goal pose as an RViz goal SCAN / Nav2 → mux → safety FAST-LIVO2 RGB-D + pose DualMap open-vocab 3D map query
Speech-driven semantic navigation: speak a destination → Parakeet transcribes it → grounding resolves it against the DualMap open-vocabulary map (built from the fusion's RGB-D and pose) → a goal pose enters the same chain as an operator-clicked goal. Nothing here drives the platform directly.
Current limitations

Project timeline

Where the two lines are heading, in three stages:

Stage 1 — MVP full stack · workstation 2D navigation 3D navigation semantic mapping & navigation in progress · ~half Stage 2 — Onboard Jetson backpack · AGX Orin hardware design sensor connectivity · battery · chassis port & adapt code to Jetson Jetson ↔ workstation / debug / web next Stage 3 — Multi-robot multi-robot testing later

Next