Conversation
nav_3d/ is global_planner/. The Go2's own A* planner (and its RPC spec, the agent skills' contract with it) go under go2/; dannav, frontier_exploration and patrolling under experimental/; basic_path_follower becomes trajectory_follower/basic/; the visual servoing, its bbox goal module and navigation/visual/query join the skills that use them under agents/skills/visual_servoing/. Renames and import rewrites only.
topics= subscribes one zenoh key per name so an unlisted topic never crosses the link; serve_coordinator_rpc=False lets a viewer sit on a bus whose Coordinator name another stack owns. Both for a viewer on the far side of the robot's wifi.
local_planner/: an SE(2) search over the raycaster's local map, sliced through the body's own z-band, replanning to a carrot along the MLS route. trajectory_follower/fancy/: a pursuit law that reads the required precision off the path's own stamps. Each is a python module with a rust native twin (feature module) that is what runs; pyo3 (feature python) is test-only, for the parity tests. spec.py says what a GlobalPlanner, a Blind/Map LocalPlanner and a TrajectoryFollower are, as ports. An empty path is stop, a single pose is hold. embodiment/ is the measured Go2; tf_pose.py reads the body pose off tf with a deadman; cmd_vel_mux lets teleop preempt nav. go2-zenoh-motion, go2-zenoh-motion-pointlio (the Jetson rig, with its own Point-LIO and lidar addresses) and go2-viewer.
The config system feeds module fields from the environment (MID360__LIDAR_IP, .env, --mid360.lidar-ip); the Mid-360, virtual Mid-360, Point-LIO and FAST-LIO configs stop reading DIMOS_*_LIDAR_IP themselves.
The wire topic carries the message type in its last segment, so a dimos channel needs no codec registry; injected codecs still win.
… build A flake ref copies its whole source tree into the store; pointed at the repo root that is the build dirs, .venv and the LFS blobs. This directory is two files. The clippy hook skips the root flake for the same reason.
.pre-commit-config.yaml: main's, where #4202 turned the clippy hook off; our variant of that hook goes with it.
|
The raytracer and the local planner each carried a copy of the same cloud reader, and both trusted the wire counts: a negative width or offset wrapped through `as usize`, width*height*point_step overflowed, and a malformed cloud could panic the module instead of being dropped. The one copy lives in dimos-module now, every count is range-checked and multiplied with checked_mul, and both modules call it. The raytracer and MLS build_command go back to plain cargo (the nix toolchain flake served the clippy hook #4202 removed), so a no-nix install can still build them on first start.
Naming a dimos channel by its port dropped the type, so two types on one port collapsed to one stream and the later channel silently replaced the earlier one. Now the type tells them apart (shared, shared_Vector3), and two different ports folding to one slug is refused with both topics named; streams= is how they get names of their own.
A native module's tf port both subscribes and publishes, so its python wrapper declares it IO. The manifest check only knew In and Out and called tf "not a port". The motion twins are the first natives with one.
It did what MovementManager does (teleop preempts nav, cooldown, scaling, stop_movement) plus a watchdog, and the motion stacks ran both with the manager's outputs remapped into the void. One mux is enough.
| } | ||
|
|
||
| /// The finite xyz points of a little-endian float32 cloud, in order. | ||
| pub fn extract_xyz(msg: &PointCloud2) -> Result<Vec<[f32; 3]>, ExtractError> { |
There was a problem hiding this comment.
I think this should actually go in the lcm repository in the pointcloud struct, but we can do that later. I need to publish that crate on crates.io anyway.
There was a problem hiding this comment.
yeah I agree. TBH I'm not sure if lcm repository should go to dimos
| /// configured with, deserialised straight from its config. | ||
| #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] | ||
| #[serde(deny_unknown_fields)] | ||
| pub struct Emb { |
There was a problem hiding this comment.
should this struct be declared somewhere outside of the local planner? it doesn't seem like it really belongs with a specific module
| /// Adding 1.5 * 2^52 forces the significand to shed its fractional bits under | ||
| /// the ambient rounding mode -- which is round-to-nearest-ties-to-even, and | ||
| /// which Rust never changes -- leaving the rounded integer in the low mantissa | ||
| /// bits, biased by the constant. Subtracting the constant's own bit pattern |
There was a problem hiding this comment.
almost 1000 lines of this file are comments. If they were shortened I think it would help both the AI and me.
977 comment lines to 222. Contracts and python cross-references stay; perf narrative, measurement history and asides go.
146 sites in 42 files. Asides become colons, commas or parentheses; the essay blocks around them are cut to the contract.
Every comment and docstring the branch added, cut to the contract: one line, two where an invariant needs it, none where the code or the test name already says it. 40 files.
Neither is a layer anyone runs; the motion stacks are the path forward. Registry regenerated.
there are a few things here that can be split into separate PRs but nav team is the only consumer so keeping here unless we decide otherwise
restructure of navigation/ much cleaner folder, new specs
generic mcap mem2 decoder of all dimos msgs + tests
bridge hacky selective sub feature
we need to be able to explicitly subscribe to just SOME topics not all, so that they are not sent over network or decoded by py
module introspection fixes
module.io() hides default internal RPCs
lidar module config standardized
removed global env reading, switched to local module config
distributed zenoh architecture for nav
we run
go2-zenoh-motion-pointlioon go2 jetson anddimos --robot-ip go22 run go2-vieweron the laptopthis means zenoh (network robust) subs go over network, and rerun rendering and RPC happens locally on the laptop
TODO