--simulation (a replay cannot work here: the robot has to be able to move to navigate, and a recording cannot act).
Start the stack
On a real Go2 (network setup: Go2 platform guide):Explore and tag
Drive the robot somewhere worth remembering, then name the spot. You can do all of it in natural language from a second terminal:tag_location("kitchen"), which stores the robot’s current pose under that name. The reply confirms the tag with coordinates.
Move somewhere else and tag more places. The more the robot has driven with the perceive loop running, the richer its place map: SpatialMemory continuously embeds camera frames (CLIP) against poses, so it remembers what places look like, not just the spots you named.
Send it back
navigate_with_text("kitchen"), and the skill resolves the query in three layers:
- Tagged locations - exact name match on places you tagged.
- Vision - if the described thing is visible in the camera right now, navigate toward it.
- Semantic map - CLIP search over everything the robot has seen; the best-matching place becomes the goal.
dimos agent-send "stop" (the agent calls stop_navigation()).
Same thing, no LLM
Every step above is a skill call, so you can drive the whole demo deterministically:navigate_with_text fails here, the problem is in navigation or memory, not the agent.
What is happening underneath
NavigationSkillContainerholds references (Specs) to the running SpatialMemory and Navigation modules.tag_locationwrites a named pose;navigate_with_textresolves a query to a pose and callsset_goalon the navigation module.- Navigation itself is the ordinary DimOS nav stack - the same one you can drive by clicking in the viewer or calling
set_goalfrom Python. The agent is just one more client. - The camera never streams into the LLM. When the agent needs to see, it calls
observe()and gets one frame as a tool result.
Next
- Add your own skill to this stack - one line in the blueprint.
- Memory - what SpatialMemory does and does not remember.
