From 3ff7704b51248b5e01816e065653a99c8fee0a68 Mon Sep 17 00:00:00 2001 From: Swastika Yadav Date: Wed, 13 May 2026 14:33:05 +0530 Subject: [PATCH 1/6] add Dimensional logo asset --- docs/assets/dimensional-logo-master-transparent.png | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 docs/assets/dimensional-logo-master-transparent.png diff --git a/docs/assets/dimensional-logo-master-transparent.png b/docs/assets/dimensional-logo-master-transparent.png new file mode 100644 index 0000000000..fd42835ede --- /dev/null +++ b/docs/assets/dimensional-logo-master-transparent.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8e3aa356739d10d839093e32bf7f78cad274e283ecb667a4e670256a7448aaf3 +size 18536 From 308a5a3b87fd1fb709ed619162601ba28b839612 Mon Sep 17 00:00:00 2001 From: Swastika Yadav Date: Wed, 13 May 2026 14:33:43 +0530 Subject: [PATCH 2/6] add docs.json for mintlify config --- docs/docs.json | 180 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 180 insertions(+) create mode 100644 docs/docs.json diff --git a/docs/docs.json b/docs/docs.json new file mode 100644 index 0000000000..394a5b1221 --- /dev/null +++ b/docs/docs.json @@ -0,0 +1,180 @@ +{ + "theme": "mint", + "name": "Dimensional", + "description": "Official documentation for Dimensional (DimOS) — the modern operating system for generalist robotics: Python-first, agent-native, and hardware-agnostic.", + "colors": { + "primary": "#1682a3", + "light": "#1682a3", + "dark": "#1682a3" + }, + "favicon": "/favicon.svg", + "seo": { + "metatags": { + "og:site_name": "Dimensional", + "apple-mobile-web-app-title": "Dimensional" + } + }, + "navigation": { + "groups": [ + { + "group": "Getting Started", + "pages": [ + "introduction", + "quickstart", + "requirements", + { + "group": "Installation", + "pages": [ + "installation/ubuntu", + "installation/osx", + "installation/nix" + ] + } + ] + }, + { + "group": "Usage", + "pages": [ + "usage/concepts", + "usage/blueprints", + "usage/modules", + "usage/native_modules", + "usage/configuration", + "usage/cli", + "usage/python-api", + "usage/lcm", + "usage/transforms", + "usage/tool_streams", + "usage/visualization", + { + "group": "Data Streams", + "pages": [ + "usage/data_streams/overview", + "usage/data_streams/reactivex", + "usage/data_streams/advanced_streams", + "usage/data_streams/quality_filter", + "usage/data_streams/temporal_alignment", + "usage/data_streams/storage_replay" + ] + }, + { + "group": "Sensor Streams", + "pages": [ + "usage/sensor_streams/overview", + "usage/sensor_streams/reactivex", + "usage/sensor_streams/advanced_streams", + "usage/sensor_streams/quality_filter", + "usage/sensor_streams/temporal_alignment", + "usage/sensor_streams/storage_replay" + ] + }, + { + "group": "Transports", + "pages": [ + "usage/transports/overview", + "usage/transports/dds" + ] + } + ] + }, + { + "group": "Capabilities", + "pages": [ + "capabilities/agents", + { + "group": "Navigation", + "pages": [ + "capabilities/navigation/overview", + "capabilities/navigation/native-go2" + ] + }, + { + "group": "Manipulation", + "pages": [ + "capabilities/manipulation/overview", + "capabilities/manipulation/adding_a_custom_arm", + "capabilities/manipulation/openarm_integration" + ] + }, + { + "group": "Memory", + "pages": [ + "capabilities/memory/overview", + "capabilities/memory/plot", + "capabilities/memory/algo_comparison" + ] + }, + "capabilities/perception" + ] + }, + { + "group": "Platforms", + "pages": [ + "platforms/quadruped-go2", + "platforms/humanoid-g1" + ] + }, + { + "group": "Development", + "pages": [ + "development/docker", + "development/testing", + "development/grid_testing", + "development/large_file_management", + "development/profiling_dimos", + "development/writing_docs" + ] + }, + { + "group": "For Agents", + "pages": [ + "agents/overview", + "agents/style", + "agents/testing", + { + "group": "Writing Docs", + "pages": [ + "agents/docs/overview", + "agents/docs/codeblocks", + "agents/docs/doclinks" + ] + } + ] + } + ] + }, + "logo": { + "light": "/assets/dimensional-logo-master-transparent.png", + "dark": "/assets/dimensional-logo-master-transparent.png" + }, + "navbar": { + "links": [ + { + "label": "Dimensional", + "href": "/" + } + ], + "primary": { + "type": "button", + "label": "Get started", + "href": "https://github.com/dimensionalOS/dimos" + } + }, + "contextual": { + "options": [ + "copy", + "view", + "chatgpt", + "claude", + "perplexity", + "mcp", + "cursor", + "vscode" + ] + }, + "footer": { + "socials": { + "github": "https://github.com/dimensionalOS/dimos" + } + } + } \ No newline at end of file From f10c08191cf0bd362943e12886bcc34d927d5be5 Mon Sep 17 00:00:00 2001 From: Swastika Yadav Date: Wed, 13 May 2026 14:34:13 +0530 Subject: [PATCH 3/6] add introduction page --- docs/introduction.mdx | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 docs/introduction.mdx diff --git a/docs/introduction.mdx b/docs/introduction.mdx new file mode 100644 index 0000000000..945aea6a08 --- /dev/null +++ b/docs/introduction.mdx @@ -0,0 +1,41 @@ +--- +title: "Welcome to Dimensional" +description: "An open source modern operating system for generalist robotics. Python-first, ROS-optional, and agent native." +sidebarTitle: Introduction +--- + +**Dimensional** is the modern operating system for generalist robotics. We are setting the next-generation SDK standard and integrating with the majority of robot manufacturers. + +With a simple install and no ROS required, you can build physical applications entirely in Python that run on humanoids, quadrupeds, or drones. + +Dimensional is agent native, describe behavior in natural language and build local and hosted multi-agent systems that work with your hardware. Agents run as native modules, subscribing to embedded streams from perception (LiDAR, camera) and spatial memory down to control loops and motor drivers. + +## Capabilities at a glance + + + + **SLAM**, dynamic obstacle avoidance, route planning, and autonomous exploration- via both DimOS native and ROS integrations. + + + Detectors, 3D projections, VLMs, and audio processing. + + + Agentive control and MCP. Example: *"Hey robot, go find the kitchen."* + + + Spatio-temporal RAG, dynamic memory, object localization and permanence. + + + +## Start here + +Use these pages to continue setup and then learn the core system model: + + + + Install DimOS, run your first blueprint, and inspect the running system. + + + Learn the core system model: modules, streams, blueprints, skills, and agents. + + \ No newline at end of file From 4d19290ebdfa58d3b6575869f5fc571b91479d52 Mon Sep 17 00:00:00 2001 From: Swastika Yadav Date: Wed, 13 May 2026 14:34:46 +0530 Subject: [PATCH 4/6] add quickstart page --- docs/quickstart.mdx | 132 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 docs/quickstart.mdx diff --git a/docs/quickstart.mdx b/docs/quickstart.mdx new file mode 100644 index 0000000000..7e42a649d6 --- /dev/null +++ b/docs/quickstart.mdx @@ -0,0 +1,132 @@ +--- +title: "Quickstart" +description: "Install DimOS, run a replay or simulation, then explore CLI and MCP. No hardware required." +--- + +In this quickstart, you will be able to replay a Unitree Go2 office navigation session with no hardware, switch to simulation or a live robot. + +If you use coding agents (OpenClaw, Claude Code or similar), point them at [`AGENTS.md`](https://github.com/dimensionalOS/dimos/blob/main/AGENTS.md). + +## System requirements + +| Component | Minimum | Recommended | +| --- | --- | --- | +| OS | Ubuntu 22.04, macOS 12.6+ | Ubuntu 24.04 | +| Python | 3.12 | Latest | +| RAM | 16 GB | 32 GB+ | +| Disk | 10 GB SSD | 25 GB+ SSD | +| CPU | 8-core Intel / AMD | 12+ cores | +| GPU (optional) | NVIDIA RTX 3000+ (8 GB VRAM) | RTX 4070+ (12 GB+ VRAM) | + +> GPU is required only for perception, VLMs, and AI features. Optional for basic robot control. + +## Interactive install + +```bash +curl -fsSL https://raw.githubusercontent.com/dimensionalOS/dimos/main/scripts/install.sh | bash +``` + +## Manual system install + +If you prefer to install system dependencies yourself, follow the guide for your OS: + +| OS Guide | Notes | +| --- | --- | +| [Ubuntu](/installation/ubuntu) | Primary tested path | +| [Nix](/installation/nix) | Flakes and dev shell | +| [macOS](/installation/osx) | Homebrew-based; less mature than Linux | + +## Python environment + +DimOS targets Python 3.12. The examples use [`uv`](https://docs.astral.sh/uv/); plain `python -m venv` and `pip` work too. + +```bash +uv venv --python "3.12" +source .venv/bin/activate # Windows: .venv\Scripts\activate +``` + +## Install DimOS + +```bash +uv pip install 'dimos[base,unitree]' +``` + +Extras keep installs lean: `base` is runtime, modules, transports, and CLI; `unitree` adds WebRTC and skills for Go2 / G1 (real or replayed). + +### Replay a recorded session (no hardware) + +On first run, the Rerun window may stay black briefly while roughly **75 MB** of data downloads from LFS. + +```bash +dimos --replay run unitree-go2 +``` + +### Simulation (MuJoCo) + +```bash +uv pip install 'dimos[base,unitree,sim]' +dimos --simulation run unitree-go2 +dimos --simulation run unitree-g1-sim # humanoid +``` + +### Real robot (example: Unitree Go2 over WebRTC) + +```bash +export ROBOT_IP= +dimos run unitree-go2 +``` + +Do not skip the platform guide - latency, time sync, and safety habits matter: [Unitree Go2](/platforms/quadruped-go2). + + + First replay failing? Most issues are network or LFS related. See [Replay troubleshooting](/troubleshooting/replay). + + +## Featured runfiles + +| Command | What it does | +| --- | --- | +| `dimos --replay run unitree-go2` | Quadruped navigation replay - SLAM, costmap, A-star planning | +| `dimos --replay --replay-db go2_bigoffice run unitree-go2-memory` | Quadruped temporal memory replay | +| `dimos --simulation run unitree-go2-agentic` | Quadruped agentic + MCP server in simulation | +| `dimos --simulation run unitree-g1` | Humanoid in MuJoCo simulation | +| `dimos --replay run drone-basic` | Drone video + telemetry replay | +| `dimos --replay run drone-agentic` | Drone + LLM agent with flight skills (replay) | +| `dimos run demo-camera` | Webcam demo - no hardware needed | +| `dimos run keyboard-teleop-xarm7` | Keyboard teleop with mock xArm7 (`dimos[manipulation]` extra) | +| `dimos --simulation run unitree-go2-agentic-ollama` | Quadruped agentic with local LLM (Ollama running, `ollama serve`) | + +Blueprint reference: [Blueprints](/usage/blueprints). + +## Agent CLI and MCP + +The `dimos` CLI runs blueprints, inspects state, talks to agents, and invokes skills via MCP. + +```bash +dimos run unitree-go2-agentic --daemon # background +dimos status +dimos log -f +dimos agent-send "explore the room" +dimos mcp list-tools +dimos mcp call relative_move --arg forward=0.5 +dimos stop +``` + +Full reference: [CLI](/usage/cli). + +## What next? + + + + Natural language control and MCP-exposed skills. + + + Hardware support matrix and bring-up guides. + + + Modules, streams, and blueprints behind every workflow. + + + Navigation, perception, spatial memory, and manipulation. + + \ No newline at end of file From 18f807d73be3ced24b7469410971baa47f542c11 Mon Sep 17 00:00:00 2001 From: Swastika Yadav Date: Wed, 13 May 2026 15:45:07 +0530 Subject: [PATCH 5/6] Fix MDX parsing in existing files --- docs/agents/docs/codeblocks.md | 22 ++++++------ docs/agents/docs/doclinks.md | 4 +-- docs/agents/docs/index.md | 10 +++--- docs/capabilities/memory/index.md | 10 +++--- docs/capabilities/memory/plot.md | 4 +-- docs/capabilities/navigation/native/index.md | 4 +-- docs/development/docker.md | 5 +-- docs/development/large_file_management.md | 20 ++++++----- docs/usage/blueprints.md | 4 +-- docs/usage/configuration.md | 4 +-- docs/usage/data_streams/advanced_streams.md | 18 +++++----- docs/usage/data_streams/quality_filter.md | 20 +++++------ docs/usage/data_streams/reactivex.md | 36 +++++++++---------- docs/usage/data_streams/temporal_alignment.md | 19 +++++----- docs/usage/lcm.md | 8 ++--- docs/usage/modules.md | 12 +++---- docs/usage/native_modules.md | 2 +- docs/usage/sensor_streams/advanced_streams.md | 18 +++++----- docs/usage/sensor_streams/quality_filter.md | 20 +++++------ docs/usage/sensor_streams/reactivex.md | 36 +++++++++---------- .../sensor_streams/temporal_alignment.md | 19 +++++----- docs/usage/transforms.md | 16 ++++----- docs/usage/transports/index.md | 17 ++++----- 23 files changed, 170 insertions(+), 158 deletions(-) diff --git a/docs/agents/docs/codeblocks.md b/docs/agents/docs/codeblocks.md index 958c14a7b1..80dfd78ea3 100644 --- a/docs/agents/docs/codeblocks.md +++ b/docs/agents/docs/codeblocks.md @@ -54,7 +54,7 @@ Execute code blocks in markdown files and insert the results. echo "cwd: $(pwd)" ``` - +{/* Result: */} ``` cwd: /work ``` @@ -66,7 +66,7 @@ a = "hello world" print(a) ``` - +{/* Result: */} ``` hello world ``` @@ -77,7 +77,7 @@ Sessions preserve state between code blocks: print(a, "again") ``` - +{/* Result: */} ``` hello world again ``` @@ -89,7 +89,7 @@ console.log("Hello from Node.js"); console.log(`Node version: ${process.version}`); ``` - +{/* Result: */} ``` Hello from Node.js Node version: v22.21.1 @@ -112,7 +112,7 @@ plt.grid(alpha=0.3) plt.savefig('{output}', transparent=True) ``` - +{/* Result: */} ![output](assets/matplotlib-demo.svg) ### Pikchr @@ -155,7 +155,7 @@ arrow from X to Out.w - +{/* Result: */} ![output](assets/pikchr-demo.svg) ### Asymptote @@ -183,7 +183,7 @@ xaxis("$x$",BottomTop,LeftTicks,p=white); yaxis("$dP/dx$",LeftRight,RightTicks(trailingzero),p=white); ``` - +{/* Result: */} ![output](assets/histogram.svg) ### Graphviz @@ -193,7 +193,7 @@ A -> B -> C A -> C ``` - +{/* Result: */} ![output](assets/graph.svg) ### OpenSCAD @@ -203,7 +203,7 @@ cube([10, 10, 10]); sphere(r=7); ``` - +{/* Result: */} ![output](assets/cube-sphere.png) ### Diagon @@ -214,7 +214,7 @@ ASCII art diagrams: 1 + 1/2 + sum(i,0,10) ``` - +{/* Result: */} ``` 10 ___ @@ -229,7 +229,7 @@ A -> B -> C A -> C ``` - +{/* Result: */} ``` ┌───┐ │A │ diff --git a/docs/agents/docs/doclinks.md b/docs/agents/docs/doclinks.md index d5533c5983..15c745ef6c 100644 --- a/docs/agents/docs/doclinks.md +++ b/docs/agents/docs/doclinks.md @@ -4,13 +4,13 @@ Full documentation if needed: [`utils/docs/doclinks.md`](/dimos/utils/docs/docli ## Syntax - +{/* doclinks-ignore-start */} | Pattern | Example | |-------------|-----------------------------------------------------| | Code file | `[`service/spec.py`]()` → resolves path | | With symbol | `Configurable` in `[`spec.py`]()` → adds `#L` | | Doc link | `[Configuration](.md)` → resolves to doc | - +{/* doclinks-ignore-end */} ## Usage diff --git a/docs/agents/docs/index.md b/docs/agents/docs/index.md index 09dabad7ee..edc246ac0e 100644 --- a/docs/agents/docs/index.md +++ b/docs/agents/docs/index.md @@ -75,7 +75,7 @@ C: box "Step 3" rad 5px fit wid 170% ht 170% - +{/* Result: */} ![output](assets/pikchr_basic.svg) ## Box sizing @@ -99,7 +99,7 @@ C: box "two lines" "of text" rad 5px fit wid 170% ht 170% - +{/* Result: */} ![output](assets/pikchr_sizing.svg) The pattern `fit wid 170% ht 170%` means: auto-size to text, then scale width by 170% and height by 170%. @@ -120,7 +120,7 @@ B: box "Step 2" rad 5px fit wid 170% ht 170% - +{/* Result: */} ![output](assets/pikchr_explicit.svg) ## Common settings @@ -156,7 +156,7 @@ D: box "Path B" rad 5px fit wid 170% ht 170% - +{/* Result: */} ![output](assets/pikchr_branch.svg) **Tip:** For tree/hierarchy diagrams, prefer left-to-right layout (root on left, children branching right). This reads more naturally and avoids awkward vertical stacking. @@ -176,7 +176,7 @@ text "label below" at (A.x, A.y - 0.4in) - +{/* Result: */} ![output](assets/pikchr_labels.svg) ## Reference diff --git a/docs/capabilities/memory/index.md b/docs/capabilities/memory/index.md index 290cdfd37d..759cd17e08 100644 --- a/docs/capabilities/memory/index.md +++ b/docs/capabilities/memory/index.md @@ -1,4 +1,5 @@ -
Python +
+Python ```python fold session=mem output=none import pickle @@ -23,7 +24,7 @@ for name, stream in store.streams.items(): print(stream.summary()) ``` - +{/* Result: */} ``` Stream("color_image"): 4164 items, 2025-12-26 11:09:08 — 2025-12-26 11:14:00 (292.5s) Stream("color_image_embedded"): 267 items, 2025-12-26 11:09:12 — 2025-12-26 11:14:00 (288.4s) @@ -160,7 +161,7 @@ drawing.add(matches) drawing.to_svg("assets/embedding_focused.svg") ``` - +{/* Result: */} ``` Stream("color_image_embedded") | vector_search(k=30) 08:19:54.129 [inf][dimos/mapping/voxels.py ] VoxelGrid using device: CUDA:0 @@ -168,7 +169,8 @@ Stream("color_image_embedded") | vector_search(k=30) ![output](assets/embedding_focused.svg) -
Python +
+Python ```python fold session=mem import matplotlib diff --git a/docs/capabilities/memory/plot.md b/docs/capabilities/memory/plot.md index 17420a4e5d..8bb8bdcce6 100644 --- a/docs/capabilities/memory/plot.md +++ b/docs/capabilities/memory/plot.md @@ -135,7 +135,7 @@ plot.add(plantness_similarity, plot.to_svg("assets/plot_plantness.svg") ``` - +{/* Result: */} ``` Stream("color_image_embedded") | vector_search() | order_by(ts) Stream("materialize") @@ -241,7 +241,7 @@ m = mosaic(semantic_peaks.map_data(lambda obs: moondream.query_detections(obs.da m.data.save("assets/plants_auto.png") ``` - +{/* Result: */} ``` 14:59:33.042 [inf][dimos/mapping/voxels.py ] VoxelGrid using device: CUDA:0 t= 14.1s score=0.224 prominence=0.031 diff --git a/docs/capabilities/navigation/native/index.md b/docs/capabilities/navigation/native/index.md index fb38a95e01..201fa5e74a 100644 --- a/docs/capabilities/navigation/native/index.md +++ b/docs/capabilities/navigation/native/index.md @@ -37,7 +37,7 @@ text "Twist" italic at (M4.x, Nav.s.y - 0.45in)
- +{/* Result: */} ![output](assets/go2nav_dataflow.svg) ## Pipeline Steps @@ -177,5 +177,5 @@ unitree_go2 = autoconnect( to_svg(unitree_go2, "assets/go2_blueprint.svg") ``` - +{/* Result: */} ![output](assets/go2_blueprint.svg) diff --git a/docs/development/docker.md b/docs/development/docker.md index c6622ff87f..8a5cb0e9c1 100644 --- a/docs/development/docker.md +++ b/docs/development/docker.md @@ -4,7 +4,8 @@ Dimos uses parallel Docker image hierarchies for ROS and non-ROS builds, allowin ## Image Hierarchy -
Pikchr +
+Pikchr ```pikchr fold output=assets/docker-hierarchy.svg color = white @@ -40,7 +41,7 @@ text "same dockerfiles" at (D.e.x + 1.2in, D.e.y + 0.4in)
- +{/* Result: */} ![output](assets/docker-hierarchy.svg) diff --git a/docs/development/large_file_management.md b/docs/development/large_file_management.md index 87fe6ce4be..f6731fd1ef 100644 --- a/docs/development/large_file_management.md +++ b/docs/development/large_file_management.md @@ -13,7 +13,7 @@ print(f"Path: {data_path}") print(f"Exists: {data_path.exists()}") ``` - +{/* Result: */} ``` Path: /home/lesh/coding/dimos/data/cafe.jpg Exists: True @@ -21,7 +21,8 @@ Exists: True ## How It Works -
Pikchr +
+Pikchr ```pikchr fold output=assets/get_data_flow.svg color = white @@ -46,7 +47,7 @@ F: box "Return path" rad 5px fit wid 170% ht 170%
- +{/* Result: */} ![output](assets/get_data_flow.svg) 1. Checks if `data/{name}` already exists locally @@ -66,7 +67,7 @@ image = Image.from_file(get_data("cafe.jpg")) print(f"Image shape: {image.data.shape}") ``` - +{/* Result: */} ``` Image shape: (771, 1024, 3) ``` @@ -81,7 +82,7 @@ checkpoint = model_dir / "yolo11n.pt" print(f"Checkpoint: {checkpoint.name} ({checkpoint.stat().st_size // 1024}KB)") ``` - +{/* Result: */} ``` Checkpoint: yolo11n.pt (5482KB) ``` @@ -98,7 +99,7 @@ print(f"Replay {replay} loaded from: {data_dir.name}") print(replay.find_closest_seek(1)) ``` - +{/* Result: */} ``` Replay loaded from: unitree_office_walk {'type': 'msg', 'topic': 'rt/utlidar/voxel_map_compressed', 'data': {'stamp': 1751591000.0, 'frame_id': 'odom', 'resolution': 0.05, 'src_size': 77824, 'origin': [-3.625, -3.275, -0.575], 'width': [128, 128, 38], 'data': {'points': array([[ 2.725, -1.025, -0.575], @@ -120,7 +121,7 @@ pointcloud = read_pointcloud(get_data("apartment") / "sum.ply") print(f"Loaded pointcloud with {len(pointcloud.points)} points") ``` - +{/* Result: */} ``` Loaded pointcloud with 63672 points ``` @@ -129,7 +130,8 @@ Loaded pointcloud with 63672 points Data files live in `data/` at the repo root. Large files are stored in `data/.lfs/` as `.tar.gz` archives tracked by Git LFS. -
Diagram +
+Diagram ```diagon fold mode=Tree data/ @@ -143,7 +145,7 @@ data/
- +{/* Result: */} ``` data/ ├──cafe.jpg diff --git a/docs/usage/blueprints.md b/docs/usage/blueprints.md index fcdae4c937..1d397ac7df 100644 --- a/docs/usage/blueprints.md +++ b/docs/usage/blueprints.md @@ -254,7 +254,7 @@ from dimos.robot.cli.dimos import arg_help print(arg_help(base_blueprint.config(), base_blueprint)) ``` - +{/* Result: */} ``` module1: * module1.default_rpc_timeout: float (default: 120.0) @@ -386,7 +386,7 @@ module_coordinator = ModuleCoordinator.build(SomeSkill.blueprint()) module_coordinator.stop() ``` - +{/* Result: */} ``` 16:30:00.119 [inf][dination/module_coordinator.py] Building the blueprint 16:30:00.133 [inf][dination/module_coordinator.py] Starting the modules diff --git a/docs/usage/configuration.md b/docs/usage/configuration.md index 8e0fc44b5a..9ccbf4452c 100644 --- a/docs/usage/configuration.md +++ b/docs/usage/configuration.md @@ -33,7 +33,7 @@ except (TypeError, ValidationError) as e: ``` - +{/* Result: */} ``` Config(x=3, hello='world') Config(x=3, hello='override') @@ -76,7 +76,7 @@ myModule = MyModule(frame_id="frame_id_override", device="CPU") ``` - +{/* Result: */} ``` Config( rpc_transport=, diff --git a/docs/usage/data_streams/advanced_streams.md b/docs/usage/data_streams/advanced_streams.md index 68c1ed5bfa..3ae891303a 100644 --- a/docs/usage/data_streams/advanced_streams.md +++ b/docs/usage/data_streams/advanced_streams.md @@ -9,7 +9,8 @@ In robotics, we deal with hardware that produces data at its own pace - a camera **The problem:** A fast producer can overwhelm a slow consumer, causing memory buildup or dropped frames. We might have multiple subscribers to the same hardware that operate at different speeds. -
Pikchr +
+Pikchr ```pikchr fold output=assets/backpressure.svg color = white @@ -26,7 +27,7 @@ text "items pile up!" at (Queue.x, Queue.y - 0.45in)
- +{/* Result: */} ![output](assets/backpressure.svg) @@ -67,7 +68,7 @@ print(f"slow got {len(slow_results)} items (skipped {len(fast_results) - len(slo scheduler.executor.shutdown(wait=True) ``` - +{/* Result: */} ``` fast got 20 items: [0, 1, 2, 3, 4]... slow got 7 items (skipped 13) @@ -76,7 +77,8 @@ slow got 7 items (skipped 13) ### How it works -
Pikchr +
+Pikchr ```pikchr fold output=assets/backpressure_solution.svg color = white @@ -96,7 +98,7 @@ Slow: box "Slow Sub" rad 5px fit wid 170% ht 170%
- +{/* Result: */} ![output](assets/backpressure_solution.svg) The `LATEST` strategy means: when the slow subscriber finishes processing, it gets whatever the most recent value is, skipping any values that arrived while it was busy. @@ -234,7 +236,7 @@ text "blocking" italic with .n at Blk2.n + (0, -0.05in)
- +{/* Result: */} ![output](assets/getter_hot_cold.svg) @@ -265,7 +267,7 @@ print("after 700ms:", get_val()) get_val.dispose() # Don't forget to clean up! ``` - +{/* Result: */} ``` first call: 0 after 350ms: 3 @@ -288,7 +290,7 @@ print("call 2:", get_val()) # subscribes again, gets 0, disposes print("call 3:", get_val()) # subscribes again, gets 0, disposes ``` - +{/* Result: */} ``` call 1: 0 call 2: 0 diff --git a/docs/usage/data_streams/quality_filter.md b/docs/usage/data_streams/quality_filter.md index c928b3ff97..57b201f936 100644 --- a/docs/usage/data_streams/quality_filter.md +++ b/docs/usage/data_streams/quality_filter.md @@ -40,7 +40,7 @@ print("Selected:", [r["id"] for r in result]) print("Qualities:", [r["quality"] for r in result]) ``` - +{/* Result: */} ``` Selected: [2] Qualities: [0.9] @@ -74,7 +74,7 @@ print("Sharpness scores:") show_frames(input_frames) ``` - +{/* Result: */} ``` Loaded 20 frames from Go2 camera Frame resolution: 1280x720 @@ -105,7 +105,7 @@ print(f"Output: {len(sharp_frames)} frame(s) (selected sharpest per window)") show_frames(sharp_frames) ``` - +{/* Result: */} ``` Output: 3 frame(s) (selected sharpest per window) Frame 0: 0.351 @@ -167,14 +167,14 @@ Visualizing which frames were selected (green border = selected as sharpest in w plot_mosaic(input_frames, sharp_frames, '{output}') ``` - +{/* Result: */} ![output](assets/frame_mosaic.jpg) ```python skip session=qb output=assets/sharpness_graph.svg plot_sharpness(input_frames, sharp_frames, '{output}') ``` - +{/* Result: */} ![output](assets/sharpness_graph.svg) Let's request a higher frequency. @@ -189,7 +189,7 @@ print(f"Output: {len(sharp_frames)} frame(s) (selected sharpest per window)") show_frames(sharp_frames) ``` - +{/* Result: */} ``` Output: 6 frame(s) (selected sharpest per window) Frame 0: 0.351 @@ -204,7 +204,7 @@ Output: 6 frame(s) (selected sharpest per window) plot_mosaic(input_frames, sharp_frames, '{output}') ``` - +{/* Result: */} ![output](assets/frame_mosaic2.jpg) @@ -212,7 +212,7 @@ plot_mosaic(input_frames, sharp_frames, '{output}') plot_sharpness(input_frames, sharp_frames, '{output}') ``` - +{/* Result: */} ![output](assets/sharpness_graph2.svg) As we can see the system is trying to strike a balance between requested frequency and quality that's available @@ -261,7 +261,7 @@ print(f"Mean gradient magnitude: {magnitude.mean():.2f}") print(f"Normalized sharpness: {img.sharpness:.3f}") ``` - +{/* Result: */} ``` Mean gradient magnitude: 230.00 Normalized sharpness: 0.332 @@ -287,7 +287,7 @@ result = rx.of(*detections).pipe( print(f"Selected: {result[0]['name']} (conf: {result[0]['confidence']})") ``` - +{/* Result: */} ``` Selected: dog (conf: 0.95) ``` diff --git a/docs/usage/data_streams/reactivex.md b/docs/usage/data_streams/reactivex.md index b356714083..471a12e0cd 100644 --- a/docs/usage/data_streams/reactivex.md +++ b/docs/usage/data_streams/reactivex.md @@ -19,7 +19,7 @@ source.subscribe(lambda x: received.append(x)) print("received:", received) ``` - +{/* Result: */} ``` received: [0, 1, 2, 3, 4] ``` @@ -43,7 +43,7 @@ observable.subscribe(lambda x: result.append(x)) print("transformed:", result) ``` - +{/* Result: */} ``` transformed: [6, 8] ``` @@ -58,7 +58,7 @@ rx.of(1, 2, 3).pipe( ).subscribe(print) ``` - +{/* Result: */} ``` item_1 item_2 @@ -74,7 +74,7 @@ rx.of(1, 2, 3, 4, 5).pipe( ).subscribe(print) ``` - +{/* Result: */} ``` 2 4 @@ -89,7 +89,7 @@ rx.of(1, 2, 3, 4, 5).pipe( ).subscribe(print) ``` - +{/* Result: */} ``` 1 2 @@ -106,7 +106,7 @@ rx.of(1, 2).pipe( ).subscribe(print) ``` - +{/* Result: */} ``` 1 10 @@ -133,7 +133,7 @@ results = rx.interval(0.05).pipe( print("sample() got:", results) ``` - +{/* Result: */} ``` sample() got: [2, 6, 9] ``` @@ -151,7 +151,7 @@ results = rx.interval(0.05).pipe( print("throttle_first() got:", results) ``` - +{/* Result: */} ``` throttle_first() got: [0, 3, 6, 9] ``` @@ -169,7 +169,7 @@ print("sample: latest value at each tick") print("throttle_first: first value, then block") ``` - +{/* Result: */} ``` sample: latest value at each tick throttle_first: first value, then block @@ -228,7 +228,7 @@ Handler: box "callback" rad 5px fit wid 170% ht 170%
- +{/* Result: */} ![output](assets/observable_flow.svg) @@ -244,7 +244,7 @@ rx.of(1, 2, 3).subscribe( ) ``` - +{/* Result: */} ``` value: 1 value: 2 @@ -268,7 +268,7 @@ subscription.dispose() # Stop receiving values, clean up resources print("disposed") ``` - +{/* Result: */} ``` disposed ``` @@ -305,7 +305,7 @@ time.sleep(0.25) module.stop() ``` - +{/* Result: */} ``` got 0 got 1 @@ -360,7 +360,7 @@ sub.dispose() print("callbacks after dispose:", len(sensor._callbacks)) ``` - +{/* Result: */} ``` received: ['reading_1', 'reading_2'] callbacks after dispose: 0 @@ -398,7 +398,7 @@ sub.dispose() print("callbacks after dispose:", len(pubsub._callbacks)) ``` - +{/* Result: */} ``` received: ['msg_1', 'msg_2'] callbacks after dispose: 0 @@ -425,7 +425,7 @@ obs.subscribe( print("results:", results) ``` - +{/* Result: */} ``` cleaned up results: ['first', 'second', 'DONE'] @@ -451,7 +451,7 @@ time.sleep(0.2) print(f"received {len(received)} items before dispose") ``` - +{/* Result: */} ``` received 2 items before dispose ``` @@ -474,7 +474,7 @@ disposables.dispose() print("after dispose:", disposables.is_disposed) ``` - +{/* Result: */} ``` subscriptions: 2 after dispose: True diff --git a/docs/usage/data_streams/temporal_alignment.md b/docs/usage/data_streams/temporal_alignment.md index 18f28b2e3d..5ef8ba5f15 100644 --- a/docs/usage/data_streams/temporal_alignment.md +++ b/docs/usage/data_streams/temporal_alignment.md @@ -4,7 +4,8 @@ Robots have multiple sensors emitting data at different rates and latencies. A c `align_timestamped` solves this by buffering messages and matching them within a time tolerance. -
Pikchr +
+Pikchr ```pikchr fold output=assets/alignment_overview.svg color = white @@ -23,7 +24,7 @@ Out: box "(image, pointcloud)" rad 5px fit wid 170% ht 170%
- +{/* Result: */} ![output](assets/alignment_overview.svg) @@ -95,7 +96,7 @@ if aligned_pairs: print(f"\nFirst matched pair: Δ{dt*1000:.1f}ms") ``` - +{/* Result: */} ``` Video: 29 frames, Lidar: 15 scans Aligned pairs: 11 out of 29 video frames @@ -163,7 +164,7 @@ def plot_alignment_timeline(video_frames, lidar_scans, aligned_pairs, path): plot_alignment_timeline(video_frames, lidar_scans, aligned_pairs, '{output}') ``` - +{/* Result: */} ![output](assets/alignment_timeline.png) If we loosen up our match tolerance, we might get multiple pairs matching the same lidar frame. @@ -180,7 +181,7 @@ print(f"Video: {len(video_frames)} frames, Lidar: {len(lidar_scans)} scans") print(f"Aligned pairs: {len(aligned_pairs)} out of {len(video_frames)} video frames") ``` - +{/* Result: */} ``` Video: 58 frames, Lidar: 30 scans Aligned pairs: 23 out of 58 video frames @@ -191,7 +192,7 @@ Aligned pairs: 23 out of 58 video frames plot_alignment_timeline(video_frames, lidar_scans, aligned_pairs, '{output}') ``` - +{/* Result: */} ![output](assets/alignment_timeline2.png) ## Combine Frame Alignment with a Quality Filter @@ -226,7 +227,7 @@ print(f"Aligned pairs: {len(aligned_pairs)} out of {len(video_frames)} video fra ``` - +{/* Result: */} ``` Video: 6 frames, Lidar: 15 scans Aligned pairs: 1 out of 6 video frames @@ -236,7 +237,7 @@ Aligned pairs: 1 out of 6 video frames plot_alignment_timeline(video_frames, lidar_scans, aligned_pairs, '{output}') ``` - +{/* Result: */} ![output](assets/alignment_timeline3.png) We are very picky but data is high quality. Best frame, with closest lidar match in this window. @@ -275,7 +276,7 @@ text "waiting..." at (Buffer.w.x - 0.4in, Buffer.w.y - 0.15in)
- +{/* Result: */} ![output](assets/alignment_flow.svg) ## Parameters diff --git a/docs/usage/lcm.md b/docs/usage/lcm.md index 38d2520822..8e52d22e41 100644 --- a/docs/usage/lcm.md +++ b/docs/usage/lcm.md @@ -45,7 +45,7 @@ decoded = LCMVector3.lcm_decode(binary) print(f"Decoded: x={decoded.x}, y={decoded.y}, z={decoded.z}") ``` - +{/* Result: */} ``` Encoded to 32 bytes: ae7e5fba5eeca11e3ff000000000000040000000000000004008000000000000 Decoded: x=1.0, y=2.0, z=3.0 @@ -78,7 +78,7 @@ binary = v1.lcm_encode() print(f"LCM encoded: {len(binary)} bytes") ``` - +{/* Result: */} ``` v1 + v2 = (5.0, 7.0, 9.0) v1 dot v2 = 32.0 @@ -117,7 +117,7 @@ pc2 = PointCloud2.lcm_decode(binary) print(f"Decoded: {len(pc2)} points") ``` - +{/* Result: */} ``` PointCloud: 100 points, frame=camera Center: ↘ Vector Vector([0.47497518 0.49878164 0.43788878]) @@ -151,7 +151,7 @@ decoded = Vector3.lcm_decode(binary) print(f"Raw binary transport: decoded {decoded}") ``` - +{/* Result: */} ``` Memory transport: received ↘ Vector Vector([1. 2. 3.]) Raw binary transport: decoded ↘ Vector Vector([1. 2. 3.]) diff --git a/docs/usage/modules.md b/docs/usage/modules.md index 687db5a8b9..ad3d7f1408 100644 --- a/docs/usage/modules.md +++ b/docs/usage/modules.md @@ -22,7 +22,7 @@ from dimos.robot.unitree.go2.blueprints.smart.unitree_go2 import unitree_go2 to_svg(unitree_go2, "assets/go2_nav.svg") ``` - +{/* Result: */} ![output](assets/go2_nav.svg) ## Camera Module @@ -43,7 +43,7 @@ from dimos.hardware.sensors.camera.module import CameraModule print(CameraModule.io()) ``` - +{/* Result: */} ``` ┌┴─────────────┐ │ CameraModule │ @@ -85,7 +85,7 @@ time.sleep(0.5) camera.stop() ``` - +{/* Result: */} ``` Out color_image[Image] @ CameraModule Image(shape=(480, 640, 3), format=RGB, dtype=uint8, dev=cpu, ts=2025-12-31 15:54:16) @@ -110,7 +110,7 @@ from dimos.perception.detection.module2D import Detection2DModule, Config print(Detection2DModule.io()) ``` - +{/* Result: */} ``` ├─ color_image: Image ┌┴──────────────────┐ @@ -130,7 +130,7 @@ print(Detection2DModule.io()) ├─ RPC stop() -> None ``` - +{/* TODO: add easy way to print config */} Looks like the detector just needs an image input and outputs some sort of detection and annotation messages. Let's connect it to a camera. @@ -379,7 +379,7 @@ from dimos.robot.unitree_webrtc.unitree_go2_blueprints import agentic to_svg(agentic, "assets/go2_agentic.svg") ``` - +{/* Result: */} ![output](assets/go2_agentic.svg) diff --git a/docs/usage/native_modules.md b/docs/usage/native_modules.md index e4af928ee3..04a960087a 100644 --- a/docs/usage/native_modules.md +++ b/docs/usage/native_modules.md @@ -67,7 +67,7 @@ mylidar.imu.transport = LCMTransport("/imu", Imu) mylidar.start() ``` - +{/* Result: */} ``` 2026-02-14T11:22:12.123963Z [info ] Starting native process [dimos/core/native_module.py] cmd='./build/my_lidar --pointcloud /lidar#sensor_msgs.PointCloud2 --imu /imu#sensor_msgs.Imu --host_ip 192.168.1.5 --frequency 10.0' cwd=/home/lesh/coding/dimos/docs/usage/build ``` diff --git a/docs/usage/sensor_streams/advanced_streams.md b/docs/usage/sensor_streams/advanced_streams.md index 588a7928ac..3495c36a6a 100644 --- a/docs/usage/sensor_streams/advanced_streams.md +++ b/docs/usage/sensor_streams/advanced_streams.md @@ -9,7 +9,8 @@ In robotics, we deal with hardware that produces data at its own pace - a camera **The problem:** A fast producer can overwhelm a slow consumer, causing memory buildup or dropped frames. We might have multiple subscribers to the same hardware that operate at different speeds. -
Pikchr +
+Pikchr ```pikchr fold output=assets/backpressure.svg color = white @@ -26,7 +27,7 @@ text "items pile up!" at (Queue.x, Queue.y - 0.45in)
- +{/* Result: */} ![output](assets/backpressure.svg) @@ -67,7 +68,7 @@ print(f"slow got {len(slow_results)} items (skipped {len(fast_results) - len(slo scheduler.executor.shutdown(wait=True) ``` - +{/* Result: */} ``` fast got 20 items: [0, 1, 2, 3, 4]... slow got 7 items (skipped 13) @@ -76,7 +77,8 @@ slow got 7 items (skipped 13) ### How it works -
Pikchr +
+Pikchr ```pikchr fold output=assets/backpressure_solution.svg color = white @@ -96,7 +98,7 @@ Slow: box "Slow Sub" rad 5px fit wid 170% ht 170%
- +{/* Result: */} ![output](assets/backpressure_solution.svg) The `LATEST` strategy means: when the slow subscriber finishes processing, it gets whatever the most recent value is, skipping any values that arrived while it was busy. @@ -234,7 +236,7 @@ text "blocking" italic with .n at Blk2.n + (0, -0.05in)
- +{/* Result: */} ![output](assets/getter_hot_cold.svg) @@ -265,7 +267,7 @@ print("after 700ms:", get_val()) get_val.dispose() # Don't forget to clean up! ``` - +{/* Result: */} ``` first call: 0 after 350ms: 3 @@ -288,7 +290,7 @@ print("call 2:", get_val()) # subscribes again, gets 0, disposes print("call 3:", get_val()) # subscribes again, gets 0, disposes ``` - +{/* Result: */} ``` call 1: 0 call 2: 0 diff --git a/docs/usage/sensor_streams/quality_filter.md b/docs/usage/sensor_streams/quality_filter.md index c928b3ff97..57b201f936 100644 --- a/docs/usage/sensor_streams/quality_filter.md +++ b/docs/usage/sensor_streams/quality_filter.md @@ -40,7 +40,7 @@ print("Selected:", [r["id"] for r in result]) print("Qualities:", [r["quality"] for r in result]) ``` - +{/* Result: */} ``` Selected: [2] Qualities: [0.9] @@ -74,7 +74,7 @@ print("Sharpness scores:") show_frames(input_frames) ``` - +{/* Result: */} ``` Loaded 20 frames from Go2 camera Frame resolution: 1280x720 @@ -105,7 +105,7 @@ print(f"Output: {len(sharp_frames)} frame(s) (selected sharpest per window)") show_frames(sharp_frames) ``` - +{/* Result: */} ``` Output: 3 frame(s) (selected sharpest per window) Frame 0: 0.351 @@ -167,14 +167,14 @@ Visualizing which frames were selected (green border = selected as sharpest in w plot_mosaic(input_frames, sharp_frames, '{output}') ``` - +{/* Result: */} ![output](assets/frame_mosaic.jpg) ```python skip session=qb output=assets/sharpness_graph.svg plot_sharpness(input_frames, sharp_frames, '{output}') ``` - +{/* Result: */} ![output](assets/sharpness_graph.svg) Let's request a higher frequency. @@ -189,7 +189,7 @@ print(f"Output: {len(sharp_frames)} frame(s) (selected sharpest per window)") show_frames(sharp_frames) ``` - +{/* Result: */} ``` Output: 6 frame(s) (selected sharpest per window) Frame 0: 0.351 @@ -204,7 +204,7 @@ Output: 6 frame(s) (selected sharpest per window) plot_mosaic(input_frames, sharp_frames, '{output}') ``` - +{/* Result: */} ![output](assets/frame_mosaic2.jpg) @@ -212,7 +212,7 @@ plot_mosaic(input_frames, sharp_frames, '{output}') plot_sharpness(input_frames, sharp_frames, '{output}') ``` - +{/* Result: */} ![output](assets/sharpness_graph2.svg) As we can see the system is trying to strike a balance between requested frequency and quality that's available @@ -261,7 +261,7 @@ print(f"Mean gradient magnitude: {magnitude.mean():.2f}") print(f"Normalized sharpness: {img.sharpness:.3f}") ``` - +{/* Result: */} ``` Mean gradient magnitude: 230.00 Normalized sharpness: 0.332 @@ -287,7 +287,7 @@ result = rx.of(*detections).pipe( print(f"Selected: {result[0]['name']} (conf: {result[0]['confidence']})") ``` - +{/* Result: */} ``` Selected: dog (conf: 0.95) ``` diff --git a/docs/usage/sensor_streams/reactivex.md b/docs/usage/sensor_streams/reactivex.md index 1498e46595..7848afe727 100644 --- a/docs/usage/sensor_streams/reactivex.md +++ b/docs/usage/sensor_streams/reactivex.md @@ -19,7 +19,7 @@ source.subscribe(lambda x: received.append(x)) print("received:", received) ``` - +{/* Result: */} ``` received: [0, 1, 2, 3, 4] ``` @@ -43,7 +43,7 @@ observable.subscribe(lambda x: result.append(x)) print("transformed:", result) ``` - +{/* Result: */} ``` transformed: [6, 8] ``` @@ -58,7 +58,7 @@ rx.of(1, 2, 3).pipe( ).subscribe(print) ``` - +{/* Result: */} ``` item_1 item_2 @@ -74,7 +74,7 @@ rx.of(1, 2, 3, 4, 5).pipe( ).subscribe(print) ``` - +{/* Result: */} ``` 2 4 @@ -89,7 +89,7 @@ rx.of(1, 2, 3, 4, 5).pipe( ).subscribe(print) ``` - +{/* Result: */} ``` 1 2 @@ -106,7 +106,7 @@ rx.of(1, 2).pipe( ).subscribe(print) ``` - +{/* Result: */} ``` 1 10 @@ -133,7 +133,7 @@ results = rx.interval(0.05).pipe( print("sample() got:", results) ``` - +{/* Result: */} ``` sample() got: [2, 6, 9] ``` @@ -151,7 +151,7 @@ results = rx.interval(0.05).pipe( print("throttle_first() got:", results) ``` - +{/* Result: */} ``` throttle_first() got: [0, 3, 6, 9] ``` @@ -169,7 +169,7 @@ print("sample: latest value at each tick") print("throttle_first: first value, then block") ``` - +{/* Result: */} ``` sample: latest value at each tick throttle_first: first value, then block @@ -228,7 +228,7 @@ Handler: box "callback" rad 5px fit wid 170% ht 170%
- +{/* Result: */} ![output](assets/observable_flow.svg) @@ -244,7 +244,7 @@ rx.of(1, 2, 3).subscribe( ) ``` - +{/* Result: */} ``` value: 1 value: 2 @@ -268,7 +268,7 @@ subscription.dispose() # Stop receiving values, clean up resources print("disposed") ``` - +{/* Result: */} ``` disposed ``` @@ -305,7 +305,7 @@ time.sleep(0.25) module.stop() ``` - +{/* Result: */} ``` got 0 got 1 @@ -361,7 +361,7 @@ sub.dispose() print("callbacks after dispose:", len(sensor._callbacks)) ``` - +{/* Result: */} ``` received: ['reading_1', 'reading_2'] callbacks after dispose: 0 @@ -399,7 +399,7 @@ sub.dispose() print("callbacks after dispose:", len(pubsub._callbacks)) ``` - +{/* Result: */} ``` received: ['msg_1', 'msg_2'] callbacks after dispose: 0 @@ -426,7 +426,7 @@ obs.subscribe( print("results:", results) ``` - +{/* Result: */} ``` cleaned up results: ['first', 'second', 'DONE'] @@ -452,7 +452,7 @@ time.sleep(0.2) print(f"received {len(received)} items before dispose") ``` - +{/* Result: */} ``` received 2 items before dispose ``` @@ -475,7 +475,7 @@ disposables.dispose() print("after dispose:", disposables.is_disposed) ``` - +{/* Result: */} ``` subscriptions: 2 after dispose: True diff --git a/docs/usage/sensor_streams/temporal_alignment.md b/docs/usage/sensor_streams/temporal_alignment.md index 7a7faa24a0..245ba53c82 100644 --- a/docs/usage/sensor_streams/temporal_alignment.md +++ b/docs/usage/sensor_streams/temporal_alignment.md @@ -4,7 +4,8 @@ Robots have multiple sensors emitting data at different rates and latencies. A c `align_timestamped` solves this by buffering messages and matching them within a time tolerance. -
Pikchr +
+Pikchr ```pikchr fold output=assets/alignment_overview.svg color = white @@ -23,7 +24,7 @@ Out: box "(image, pointcloud)" rad 5px fit wid 170% ht 170%
- +{/* Result: */} ![output](assets/alignment_overview.svg) @@ -95,7 +96,7 @@ if aligned_pairs: print(f"\nFirst matched pair: Δ{dt*1000:.1f}ms") ``` - +{/* Result: */} ``` Video: 29 frames, Lidar: 15 scans Aligned pairs: 11 out of 29 video frames @@ -163,7 +164,7 @@ def plot_alignment_timeline(video_frames, lidar_scans, aligned_pairs, path): plot_alignment_timeline(video_frames, lidar_scans, aligned_pairs, '{output}') ``` - +{/* Result: */} ![output](assets/alignment_timeline.png) If we loosen up our match tolerance, we might get multiple pairs matching the same lidar frame. @@ -180,7 +181,7 @@ print(f"Video: {len(video_frames)} frames, Lidar: {len(lidar_scans)} scans") print(f"Aligned pairs: {len(aligned_pairs)} out of {len(video_frames)} video frames") ``` - +{/* Result: */} ``` Video: 58 frames, Lidar: 30 scans Aligned pairs: 23 out of 58 video frames @@ -191,7 +192,7 @@ Aligned pairs: 23 out of 58 video frames plot_alignment_timeline(video_frames, lidar_scans, aligned_pairs, '{output}') ``` - +{/* Result: */} ![output](assets/alignment_timeline2.png) ## Combine Frame Alignment with a Quality Filter @@ -226,7 +227,7 @@ print(f"Aligned pairs: {len(aligned_pairs)} out of {len(video_frames)} video fra ``` - +{/* Result: */} ``` Video: 6 frames, Lidar: 15 scans Aligned pairs: 1 out of 6 video frames @@ -236,7 +237,7 @@ Aligned pairs: 1 out of 6 video frames plot_alignment_timeline(video_frames, lidar_scans, aligned_pairs, '{output}') ``` - +{/* Result: */} ![output](assets/alignment_timeline3.png) We are very picky but data is high quality. Best frame, with closest lidar match in this window. @@ -275,7 +276,7 @@ text "waiting..." at (Buffer.w.x - 0.4in, Buffer.w.y - 0.15in)
- +{/* Result: */} ![output](assets/alignment_flow.svg) ## Parameters diff --git a/docs/usage/transforms.md b/docs/usage/transforms.md index 8b31492ac2..2f9bd66250 100644 --- a/docs/usage/transforms.md +++ b/docs/usage/transforms.md @@ -42,7 +42,7 @@ text "target here" small italic at (GR.s.x, GR.s.y - 0.25in)
- +{/* Result: */} ![output](assets/transforms_tree.svg) @@ -92,7 +92,7 @@ camera_transform = Transform( print(camera_transform) ``` - +{/* Result: */} ``` base_link -> camera_link Translation: → Vector Vector([0.5 0. 0.3]) @@ -133,7 +133,7 @@ t_inverse = -t1 print(f"Inverse: {t_inverse.frame_id} -> {t_inverse.child_frame_id}") ``` - +{/* Result: */} ``` Composed: base_link -> end_effector Translation: (1.0, 0.5, 0.0) @@ -159,7 +159,7 @@ print("4x4 transformation matrix:") print(matrix) ``` - +{/* Result: */} ``` 4x4 transformation matrix: [[1. 0. 0. 1.] @@ -196,7 +196,7 @@ sensor2 = MySensorModule(frame_id_prefix="robot1") print(f"With prefix: {sensor2.frame_id}") ``` - +{/* Result: */} ``` Default frame_id: sensor_link With prefix: robot1/sensor_link @@ -332,7 +332,7 @@ if __name__ == "__main__": ``` - +{/* Result: */} ``` 16:21:45.203 [inf][ation/worker_manager_python.py] Worker pool started. n_workers=2 16:21:45.445 [inf][/coordination/python_worker.py] Deployed module. module=RobotBaseModule module_id=0 worker_id=0 @@ -422,7 +422,7 @@ text "CameraModule" italic at ((CL.x + CO.x)/2, CL.s.y - 0.25in)
- +{/* Result: */} ![output](assets/transforms_modules.svg) @@ -460,7 +460,7 @@ print(f"Buffer has {len(tf.buffers)} transform pair(s)") print(tf) ``` - +{/* Result: */} ``` Latest transform: x=4.0 Buffer has 1 transform pair(s) diff --git a/docs/usage/transports/index.md b/docs/usage/transports/index.md index 3319abc57b..47299dea78 100644 --- a/docs/usage/transports/index.md +++ b/docs/usage/transports/index.md @@ -43,7 +43,8 @@ python -m pytest -svm tool -k "not bytes" dimos/protocol/pubsub/benchmark/test_b ## Abstraction layers -
Pikchr +
+Pikchr ```pikchr output=../assets/abstraction_layers.svg fold color = white @@ -70,7 +71,7 @@ text "pub/sub API" at P.s + (0, -0.2in)
- +{/* Result: */} ![output](../assets/abstraction_layers.svg) We’ll go through these layers top-down. @@ -179,7 +180,7 @@ if __name__ == "__main__": dimos.stop() ``` - +{/* Result: */} ``` 02:57:31.428 [inf][ation/worker_manager_python.py] Worker pool started. n_workers=2 02:57:31.761 [inf][/coordination/python_worker.py] Deployed module. module=TickerCameraModule module_id=0 worker_id=0 @@ -255,7 +256,7 @@ print(inspect.getsource(PubSub.publish)) print(inspect.getsource(PubSub.subscribe)) ``` - +{/* Result: */} ``` @abstractmethod def publish(self, topic: TopicT, message: MsgT) -> None: @@ -297,7 +298,7 @@ print(f"Received velocity: x={received[0].x}, y={received[0].y}, z={received[0]. lcm.stop() ``` - +{/* Result: */} ``` Received velocity: x=1.0, y=0.0, z=0.5 ``` @@ -323,7 +324,7 @@ print(f"Received: {received}") shm.stop() ``` - +{/* Result: */} ``` Received: [{'data': [1, 2, 3]}] ``` @@ -358,7 +359,7 @@ print(f"Received: {received}") dds.stop() ``` - +{/* Result: */} ``` Received: [SensorReading(value=22.5)] ``` @@ -386,7 +387,7 @@ for msg in received: unsubscribe() ``` - +{/* Result: */} ``` Received 2 messages: {'temperature': 22.5} From 3a01db773fb43507b7a28b77c6bb797c3c76ac09 Mon Sep 17 00:00:00 2001 From: Swastika Yadav Date: Wed, 13 May 2026 16:07:06 +0530 Subject: [PATCH 6/6] Remove duplicate headings from all the pages --- docs/agents/docs/codeblocks.md | 2 -- docs/agents/docs/index.md | 2 -- docs/agents/index.md | 2 -- docs/agents/style.md | 2 -- docs/agents/testing.md | 2 -- docs/capabilities/agents/readme.md | 2 -- docs/capabilities/manipulation/adding_a_custom_arm.md | 2 -- docs/capabilities/manipulation/openarm_integration.md | 2 -- docs/capabilities/manipulation/readme.md | 2 -- docs/capabilities/navigation/native/index.md | 2 -- docs/capabilities/navigation/nav_stack.md | 2 -- docs/capabilities/navigation/readme.md | 1 - docs/capabilities/perception/readme.md | 2 -- docs/development/docker.md | 2 -- docs/development/grid_testing.md | 2 -- docs/development/large_file_management.md | 2 -- docs/development/profiling_dimos.md | 2 -- docs/development/testing.md | 2 -- docs/development/writing_docs.md | 2 -- docs/installation/nix.md | 2 -- docs/installation/osx.md | 2 -- docs/installation/ubuntu.md | 2 -- docs/platforms/humanoid/g1/index.md | 2 -- docs/platforms/quadruped/go2/index.md | 2 -- docs/requirements.md | 2 -- docs/usage/README.md | 2 -- docs/usage/blueprints.md | 2 -- docs/usage/cli.md | 2 -- docs/usage/configuration.md | 2 -- docs/usage/data_streams/README.md | 2 -- docs/usage/data_streams/advanced_streams.md | 2 -- docs/usage/data_streams/quality_filter.md | 2 -- docs/usage/data_streams/reactivex.md | 2 -- docs/usage/data_streams/storage_replay.md | 2 -- docs/usage/data_streams/temporal_alignment.md | 2 -- docs/usage/lcm.md | 2 -- docs/usage/modules.md | 2 -- docs/usage/native_modules.md | 2 -- docs/usage/python-api.md | 2 -- docs/usage/sensor_streams/README.md | 2 -- docs/usage/sensor_streams/advanced_streams.md | 2 -- docs/usage/sensor_streams/quality_filter.md | 2 -- docs/usage/sensor_streams/reactivex.md | 2 -- docs/usage/sensor_streams/storage_replay.md | 2 -- docs/usage/sensor_streams/temporal_alignment.md | 2 -- docs/usage/tool_streams.md | 2 -- docs/usage/transforms.md | 2 -- docs/usage/transports/dds.md | 2 -- docs/usage/transports/index.md | 2 -- docs/usage/visualization.md | 2 -- 50 files changed, 99 deletions(-) diff --git a/docs/agents/docs/codeblocks.md b/docs/agents/docs/codeblocks.md index 80dfd78ea3..7f589bd654 100644 --- a/docs/agents/docs/codeblocks.md +++ b/docs/agents/docs/codeblocks.md @@ -1,5 +1,3 @@ -# Executable Code Blocks - We use [md-babel-py](https://github.com/leshy/md-babel-py/) to execute code blocks in markdown and insert results. ## Golden Rule diff --git a/docs/agents/docs/index.md b/docs/agents/docs/index.md index edc246ac0e..aeeb1d3387 100644 --- a/docs/agents/docs/index.md +++ b/docs/agents/docs/index.md @@ -1,6 +1,4 @@ -# Code Blocks - **All code blocks must be executable.** Never write illustrative/pseudo code blocks. If you're showing an API usage pattern, create a minimal working example that actually runs. This ensures documentation stays correct as the codebase evolves. diff --git a/docs/agents/index.md b/docs/agents/index.md index 4170a0e898..657d39d5ac 100644 --- a/docs/agents/index.md +++ b/docs/agents/index.md @@ -1,5 +1,3 @@ -# For Agents - ├── testing.md (docs about writing tests) ├── docs (these are docs about writing docs) │   ├── codeblocks.md diff --git a/docs/agents/style.md b/docs/agents/style.md index 3e13faae9b..317e67c326 100644 --- a/docs/agents/style.md +++ b/docs/agents/style.md @@ -1,5 +1,3 @@ -# Code Style Guidelines - Rules for writing code in dimos. These address recurring issues found in code review. ## No comment banners diff --git a/docs/agents/testing.md b/docs/agents/testing.md index 4c556cfeca..fcafc47c39 100644 --- a/docs/agents/testing.md +++ b/docs/agents/testing.md @@ -1,5 +1,3 @@ -# Testing Guidelines - Rules for writing tests in dimos. These address recurring issues found in code review. For grid testing (spec/impl tests across multiple backends), see [Grid Testing Strategy](/docs/development/grid_testing.md). diff --git a/docs/capabilities/agents/readme.md b/docs/capabilities/agents/readme.md index 7cb26b7463..fb7f15ef1a 100644 --- a/docs/capabilities/agents/readme.md +++ b/docs/capabilities/agents/readme.md @@ -1,5 +1,3 @@ -# Agents - LLM agents run as native DimOS modules. They subscribe to camera, LiDAR, odometry, and spatial memory streams and they control the robot through skills. ## Architecture diff --git a/docs/capabilities/manipulation/adding_a_custom_arm.md b/docs/capabilities/manipulation/adding_a_custom_arm.md index 0fd27b4e46..6c25891605 100644 --- a/docs/capabilities/manipulation/adding_a_custom_arm.md +++ b/docs/capabilities/manipulation/adding_a_custom_arm.md @@ -1,5 +1,3 @@ -# How to Integrate a New Manipulator Arm - This guide walks through integrating a new robot arm with DimOS, from writing the hardware adapter to creating blueprints for planning and control. ## Architecture Overview diff --git a/docs/capabilities/manipulation/openarm_integration.md b/docs/capabilities/manipulation/openarm_integration.md index 6869864f5a..05c3bbb059 100644 --- a/docs/capabilities/manipulation/openarm_integration.md +++ b/docs/capabilities/manipulation/openarm_integration.md @@ -1,5 +1,3 @@ -# OpenArm Integration - Guide for running the **OpenArm** — an open-source bimanual 7-DOF research arm built from Damiao DM-J quasi-direct-drive motors — under the dimos manipulation + control stack. **If you're standing in front of the hardware and just want to run it, skip to [Quick start](#quick-start).** diff --git a/docs/capabilities/manipulation/readme.md b/docs/capabilities/manipulation/readme.md index 9a489c84b7..c1ea62637e 100644 --- a/docs/capabilities/manipulation/readme.md +++ b/docs/capabilities/manipulation/readme.md @@ -1,5 +1,3 @@ -# Manipulation - Motion planning and teleoperation for robotic manipulators. Uses Drake for physics simulation and Meshcat for 3D visualization. ## Quick Start diff --git a/docs/capabilities/navigation/native/index.md b/docs/capabilities/navigation/native/index.md index 201fa5e74a..c9436d157b 100644 --- a/docs/capabilities/navigation/native/index.md +++ b/docs/capabilities/navigation/native/index.md @@ -1,5 +1,3 @@ -# Go2 Non-ROS Navigation - The Go2 navigation stack runs entirely without ROS. It uses a **column-carving voxel map** strategy: each new LiDAR frame replaces the corresponding region of the global map entirely, ensuring the map always reflects the latest observations. diff --git a/docs/capabilities/navigation/nav_stack.md b/docs/capabilities/navigation/nav_stack.md index f09c16e2ae..6008792951 100644 --- a/docs/capabilities/navigation/nav_stack.md +++ b/docs/capabilities/navigation/nav_stack.md @@ -1,5 +1,3 @@ -# Nav Stack - A modular navigation stack for autonomous robot navigation: terrain classification, obstacle avoidance, global path planning, local trajectory selection, and loop-closure-corrected mapping — composed as Blueprint modules. Good fit when you have a lidar-equipped robot and need end-to-end autonomy: feed it a registered point cloud and odometry, and it produces velocity commands. No ROS — modules communicate over DimOS streams (LCM/SHM). diff --git a/docs/capabilities/navigation/readme.md b/docs/capabilities/navigation/readme.md index f284a68bf8..62d5a6ed64 100644 --- a/docs/capabilities/navigation/readme.md +++ b/docs/capabilities/navigation/readme.md @@ -1,4 +1,3 @@ -# Navigation Note: in the future these will be merged into one system. ## Nav Stack diff --git a/docs/capabilities/perception/readme.md b/docs/capabilities/perception/readme.md index 5d6e089dbf..afefda94bb 100644 --- a/docs/capabilities/perception/readme.md +++ b/docs/capabilities/perception/readme.md @@ -1,3 +1 @@ -# Perception - ## Detections diff --git a/docs/development/docker.md b/docs/development/docker.md index 8a5cb0e9c1..591ddd2425 100644 --- a/docs/development/docker.md +++ b/docs/development/docker.md @@ -1,5 +1,3 @@ -# Docker Images - Dimos uses parallel Docker image hierarchies for ROS and non-ROS builds, allowing you to choose the environment that fits your use case. ## Image Hierarchy diff --git a/docs/development/grid_testing.md b/docs/development/grid_testing.md index c72bda0fcb..006e509276 100644 --- a/docs/development/grid_testing.md +++ b/docs/development/grid_testing.md @@ -1,5 +1,3 @@ -# Grid Testing Strategy - Grid tests run the same test logic across multiple implementations or configurations using pytest's parametrize feature. ## Case Type Pattern diff --git a/docs/development/large_file_management.md b/docs/development/large_file_management.md index f6731fd1ef..6acd64f46a 100644 --- a/docs/development/large_file_management.md +++ b/docs/development/large_file_management.md @@ -1,5 +1,3 @@ -# Data Loading - The [`get_data`](/dimos/utils/data.py) function provides access to test data and model files, handling Git LFS downloads automatically. ## Basic Usage diff --git a/docs/development/profiling_dimos.md b/docs/development/profiling_dimos.md index 2ff3082299..d3a35a6b12 100644 --- a/docs/development/profiling_dimos.md +++ b/docs/development/profiling_dimos.md @@ -1,5 +1,3 @@ -# Profiling dimos - You can use py-spy to profile a particular blueprint: ```bash diff --git a/docs/development/testing.md b/docs/development/testing.md index 1ff6d1631b..bcd042c087 100644 --- a/docs/development/testing.md +++ b/docs/development/testing.md @@ -1,5 +1,3 @@ -# Testing - `uv run` syncs the project deps + `tests` group on demand, so the default test suite needs no upfront install — just `uv run pytest --numprocesses=auto dimos` (xdist parallelizes across cores). Self-hosted tests need the heavy optional extras (LFS data, perception models, simulation, hardware SDKs, …). Sync them explicitly before running: diff --git a/docs/development/writing_docs.md b/docs/development/writing_docs.md index 8b24dc620b..92e1c1b12d 100644 --- a/docs/development/writing_docs.md +++ b/docs/development/writing_docs.md @@ -1,5 +1,3 @@ -# Writing Docs - 1. Where to put your docs: - If it only matters to people who contribute to dimos (like this doc), put them in `docs/development` - Otherwise put them in `docs/usage` diff --git a/docs/installation/nix.md b/docs/installation/nix.md index 9543ee37af..0ddfeeda37 100644 --- a/docs/installation/nix.md +++ b/docs/installation/nix.md @@ -1,5 +1,3 @@ -# Nix install (required for nix managed dimos) - You need to have [nix](https://nixos.org/) installed and [flakes](https://nixos.wiki/wiki/Flakes) enabled, [official install docs](https://nixos.org/download/) recommended, but here is a quickstart: diff --git a/docs/installation/osx.md b/docs/installation/osx.md index e869241899..ca9ab0a092 100644 --- a/docs/installation/osx.md +++ b/docs/installation/osx.md @@ -1,5 +1,3 @@ -# macOS Install (12.6 or newer) - ```sh skip # install homebrew /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" diff --git a/docs/installation/ubuntu.md b/docs/installation/ubuntu.md index 442a6902f3..f6eaaa59ce 100644 --- a/docs/installation/ubuntu.md +++ b/docs/installation/ubuntu.md @@ -1,5 +1,3 @@ -# System Dependencies Install (Ubuntu 22.04 or 24.04) - ```sh skip sudo apt-get update sudo apt-get install -y curl g++ portaudio19-dev git-lfs libturbojpeg python3-dev pre-commit diff --git a/docs/platforms/humanoid/g1/index.md b/docs/platforms/humanoid/g1/index.md index f50cf0f2eb..bc83867c8d 100644 --- a/docs/platforms/humanoid/g1/index.md +++ b/docs/platforms/humanoid/g1/index.md @@ -1,5 +1,3 @@ -# Unitree G1 - ## Requirements - Unitree G1 EDU (need SDK/SSH access) diff --git a/docs/platforms/quadruped/go2/index.md b/docs/platforms/quadruped/go2/index.md index a0ad157be9..f9c135db2e 100644 --- a/docs/platforms/quadruped/go2/index.md +++ b/docs/platforms/quadruped/go2/index.md @@ -1,5 +1,3 @@ -# Unitree Go2 — Getting Started - The Unitree Go2 is DimOS's primary reference platform. Full autonomous navigation, mapping, and agentic control — no ROS required. ## Requirements diff --git a/docs/requirements.md b/docs/requirements.md index 850e2e6517..23110c69bb 100644 --- a/docs/requirements.md +++ b/docs/requirements.md @@ -1,5 +1,3 @@ -# System Requirements - ## Hardware | Component | Minimum | Recommended | diff --git a/docs/usage/README.md b/docs/usage/README.md index 071b6fc0b2..fbf2c98932 100644 --- a/docs/usage/README.md +++ b/docs/usage/README.md @@ -1,5 +1,3 @@ -# Concepts - This page explains general concepts. ## Table of Contents diff --git a/docs/usage/blueprints.md b/docs/usage/blueprints.md index 1d397ac7df..8cf699d0b5 100644 --- a/docs/usage/blueprints.md +++ b/docs/usage/blueprints.md @@ -1,5 +1,3 @@ -# Blueprints - Blueprints (`BlueprintAtom`) are instructions for how to initialize a `Module`. You don't typically want to run a single module, so multiple blueprints are handled together in `Blueprint`. diff --git a/docs/usage/cli.md b/docs/usage/cli.md index be5c36e24a..87ce0bef36 100644 --- a/docs/usage/cli.md +++ b/docs/usage/cli.md @@ -1,5 +1,3 @@ -# CLI Reference - The `dimos` CLI manages the full lifecycle of a DimOS robot stack — start, stop, inspect, and interact. ## Global Options diff --git a/docs/usage/configuration.md b/docs/usage/configuration.md index 9ccbf4452c..d9d239846c 100644 --- a/docs/usage/configuration.md +++ b/docs/usage/configuration.md @@ -1,5 +1,3 @@ -# Configuration - Dimos provides a `Configurable` base class. See [`service/spec.py`](/dimos/protocol/service/spec.py#L22). This allows using pydantic models to specify configuration structure and default values per module. diff --git a/docs/usage/data_streams/README.md b/docs/usage/data_streams/README.md index 014970a401..adbc8de962 100644 --- a/docs/usage/data_streams/README.md +++ b/docs/usage/data_streams/README.md @@ -1,5 +1,3 @@ -# Sensor Streams - Dimos uses reactive streams (RxPY) to handle sensor data. This approach naturally fits robotics where multiple sensors emit data asynchronously at different rates, and downstream processors may be slower than the data sources. ## Guides diff --git a/docs/usage/data_streams/advanced_streams.md b/docs/usage/data_streams/advanced_streams.md index 3ae891303a..5f67a241c4 100644 --- a/docs/usage/data_streams/advanced_streams.md +++ b/docs/usage/data_streams/advanced_streams.md @@ -1,5 +1,3 @@ -# Advanced Stream Handling - > **Prerequisite:** Read [ReactiveX Fundamentals](/docs/usage/data_streams/reactivex.md) first for Observable basics. ## Backpressure and Parallel Subscribers to Hardware diff --git a/docs/usage/data_streams/quality_filter.md b/docs/usage/data_streams/quality_filter.md index 57b201f936..8304d0d588 100644 --- a/docs/usage/data_streams/quality_filter.md +++ b/docs/usage/data_streams/quality_filter.md @@ -1,5 +1,3 @@ -# Quality-Based Stream Filtering - When processing sensor streams, you often want to reduce frequency while keeping the best quality data. For discrete data like images that can't be averaged or merged, instead of blindly dropping frames, `quality_barrier` selects the highest quality item within each time window. ## The Problem diff --git a/docs/usage/data_streams/reactivex.md b/docs/usage/data_streams/reactivex.md index 471a12e0cd..cf300e0b98 100644 --- a/docs/usage/data_streams/reactivex.md +++ b/docs/usage/data_streams/reactivex.md @@ -1,5 +1,3 @@ -# ReactiveX (RxPY) Quick Reference - RxPY provides composable asynchronous data streams. This is a practical guide focused on common patterns in this codebase. ## Quick Start: Using an Observable diff --git a/docs/usage/data_streams/storage_replay.md b/docs/usage/data_streams/storage_replay.md index 37777ce4d9..a11190010e 100644 --- a/docs/usage/data_streams/storage_replay.md +++ b/docs/usage/data_streams/storage_replay.md @@ -1,5 +1,3 @@ -# Sensor Storage and Replay - Record sensor streams to disk and replay them with original timing. Useful for testing, debugging, and creating reproducible datasets. ## Quick Start diff --git a/docs/usage/data_streams/temporal_alignment.md b/docs/usage/data_streams/temporal_alignment.md index 5ef8ba5f15..ac210357e7 100644 --- a/docs/usage/data_streams/temporal_alignment.md +++ b/docs/usage/data_streams/temporal_alignment.md @@ -1,5 +1,3 @@ -# Temporal Message Alignment - Robots have multiple sensors emitting data at different rates and latencies. A camera might run at 30fps, while lidar scans at 10Hz, and each has different processing delays. For perception tasks like projecting 2D detections into 3D pointclouds, we need to match data from these streams by timestamp. `align_timestamped` solves this by buffering messages and matching them within a time tolerance. diff --git a/docs/usage/lcm.md b/docs/usage/lcm.md index 8e52d22e41..fb70d12947 100644 --- a/docs/usage/lcm.md +++ b/docs/usage/lcm.md @@ -1,5 +1,3 @@ -# LCM Messages - DimOS uses [LCM (Lightweight Communications and Marshalling)](https://github.com/lcm-proj/lcm) for inter-process communication on a local machine (similar to how ROS uses DDS). LCM is a simple [UDP multicast](https://lcm-proj.github.io/lcm/content/udp-multicast-protocol.html#lcm-udp-multicast-protocol-description) pubsub protocol with a straightforward [message definition language](https://lcm-proj.github.io/lcm/content/lcm-type-ref.html#lcm-type-specification-language). The LCM project provides pubsub clients and code generators for many languages. For us the power of LCM is its message definition format, multi-language classes that encode themselves to a compact binary format. This means LCM messages can be sent over any transport (WebSocket, SSH, shared memory, etc.) between differnt programming languages. diff --git a/docs/usage/modules.md b/docs/usage/modules.md index ad3d7f1408..ed75400214 100644 --- a/docs/usage/modules.md +++ b/docs/usage/modules.md @@ -1,5 +1,3 @@ -# DimOS Modules - Modules are subsystems on a robot that operate autonomously and communicate with other subsystems using standardized messages. Some examples of modules are: diff --git a/docs/usage/native_modules.md b/docs/usage/native_modules.md index 04a960087a..c56e246ae0 100644 --- a/docs/usage/native_modules.md +++ b/docs/usage/native_modules.md @@ -1,5 +1,3 @@ -# Native Modules - Prerequisite for this is to understand dimos [Modules](/docs/usage/modules.md) and [Blueprints](/docs/usage/blueprints.md). Native modules let you wrap **any executable** as a first-class DimOS module, given it speaks LCM. diff --git a/docs/usage/python-api.md b/docs/usage/python-api.md index 8eb317e623..b3e9ad4872 100644 --- a/docs/usage/python-api.md +++ b/docs/usage/python-api.md @@ -1,5 +1,3 @@ -# Python API - The `Dimos` class is the main entry point for using DimOS from Python. There are two modes: 1. **Local** — `Dimos()` creates and runs modules in the current process. diff --git a/docs/usage/sensor_streams/README.md b/docs/usage/sensor_streams/README.md index 1f32897768..89a9752e19 100644 --- a/docs/usage/sensor_streams/README.md +++ b/docs/usage/sensor_streams/README.md @@ -1,5 +1,3 @@ -# Sensor Streams - Dimos uses reactive streams (RxPY) to handle sensor data. This approach naturally fits robotics where multiple sensors emit data asynchronously at different rates, and downstream processors may be slower than the data sources. ## Guides diff --git a/docs/usage/sensor_streams/advanced_streams.md b/docs/usage/sensor_streams/advanced_streams.md index 3495c36a6a..7952b5b2a6 100644 --- a/docs/usage/sensor_streams/advanced_streams.md +++ b/docs/usage/sensor_streams/advanced_streams.md @@ -1,5 +1,3 @@ -# Advanced Stream Handling - > **Prerequisite:** Read [ReactiveX Fundamentals](/docs/usage/sensor_streams/reactivex.md) first for Observable basics. ## Backpressure and Parallel Subscribers to Hardware diff --git a/docs/usage/sensor_streams/quality_filter.md b/docs/usage/sensor_streams/quality_filter.md index 57b201f936..8304d0d588 100644 --- a/docs/usage/sensor_streams/quality_filter.md +++ b/docs/usage/sensor_streams/quality_filter.md @@ -1,5 +1,3 @@ -# Quality-Based Stream Filtering - When processing sensor streams, you often want to reduce frequency while keeping the best quality data. For discrete data like images that can't be averaged or merged, instead of blindly dropping frames, `quality_barrier` selects the highest quality item within each time window. ## The Problem diff --git a/docs/usage/sensor_streams/reactivex.md b/docs/usage/sensor_streams/reactivex.md index 7848afe727..68c0e3858c 100644 --- a/docs/usage/sensor_streams/reactivex.md +++ b/docs/usage/sensor_streams/reactivex.md @@ -1,5 +1,3 @@ -# ReactiveX (RxPY) Quick Reference - RxPY provides composable asynchronous data streams. This is a practical guide focused on common patterns in this codebase. ## Quick Start: Using an Observable diff --git a/docs/usage/sensor_streams/storage_replay.md b/docs/usage/sensor_streams/storage_replay.md index 37777ce4d9..a11190010e 100644 --- a/docs/usage/sensor_streams/storage_replay.md +++ b/docs/usage/sensor_streams/storage_replay.md @@ -1,5 +1,3 @@ -# Sensor Storage and Replay - Record sensor streams to disk and replay them with original timing. Useful for testing, debugging, and creating reproducible datasets. ## Quick Start diff --git a/docs/usage/sensor_streams/temporal_alignment.md b/docs/usage/sensor_streams/temporal_alignment.md index 245ba53c82..48ae7e09ae 100644 --- a/docs/usage/sensor_streams/temporal_alignment.md +++ b/docs/usage/sensor_streams/temporal_alignment.md @@ -1,5 +1,3 @@ -# Temporal Message Alignment - Robots have multiple sensors emitting data at different rates and latencies. A camera might run at 30fps, while lidar scans at 10Hz, and each has different processing delays. For perception tasks like projecting 2D detections into 3D pointclouds, we need to match data from these streams by timestamp. `align_timestamped` solves this by buffering messages and matching them within a time tolerance. diff --git a/docs/usage/tool_streams.md b/docs/usage/tool_streams.md index 444183de35..4f314fcaa9 100644 --- a/docs/usage/tool_streams.md +++ b/docs/usage/tool_streams.md @@ -1,5 +1,3 @@ -# Tool Streams - Some tools return quickly but keep doing work in the background. For example, `look_out_for` starts a perception loop and waits minutes for a match; `follow_person` returns "started following" right away and then keeps publishing diff --git a/docs/usage/transforms.md b/docs/usage/transforms.md index 2f9bd66250..5c046b7b70 100644 --- a/docs/usage/transforms.md +++ b/docs/usage/transforms.md @@ -1,5 +1,3 @@ -# Transforms - ## The Problem: Everything Measures from Its Own Perspective Imagine your robot has an RGB-D camera—a camera that captures both color images and depth (distance to each pixel). These are common in robotics: Intel RealSense, Microsoft Kinect, and similar sensors. diff --git a/docs/usage/transports/dds.md b/docs/usage/transports/dds.md index 924b9d43e8..5a49e4b74a 100644 --- a/docs/usage/transports/dds.md +++ b/docs/usage/transports/dds.md @@ -1,5 +1,3 @@ -# Installing DDS Transport Libs on Ubuntu - The `dds` extra provides DDS (Data Distribution Service) transport support via [Eclipse Cyclone DDS](https://cyclonedds.io/docs/cyclonedds-python/latest/). The Python package builds C extensions against the CycloneDDS C library, so the C library must be installed before the Python package. ## Recommended: nix-provided cyclonedds diff --git a/docs/usage/transports/index.md b/docs/usage/transports/index.md index 47299dea78..37e4fb30f3 100644 --- a/docs/usage/transports/index.md +++ b/docs/usage/transports/index.md @@ -1,5 +1,3 @@ -# Transports - Transports connect **module streams** across **process boundaries** and/or **networks**. * **Module**: a running component (e.g., camera, mapping, nav). diff --git a/docs/usage/visualization.md b/docs/usage/visualization.md index a59d335e20..6211b80176 100644 --- a/docs/usage/visualization.md +++ b/docs/usage/visualization.md @@ -1,5 +1,3 @@ -# Viewer Backends - Dimos supports three visualization backends: `rerun` (default), `foxglove`, and `none`. ## Quick Start