Skip to content

Modular manipulation stack#1079

Merged
spomichter merged 31 commits intodevfrom
modular_manipulation_stack
Feb 1, 2026
Merged

Modular manipulation stack#1079
spomichter merged 31 commits intodevfrom
modular_manipulation_stack

Conversation

@mustafab0
Copy link
Contributor

Summary

  • Refactored manipulation planning stack for clean backend-agnostic/backend-specific separation
  • Protocol based architecture
  • Planning stack is comprised of 3 pieces - World (Sim enginer), Kinematics (IK,FK solvers), Planners

@mustafab0
Copy link
Contributor Author

@greptile

@mustafab0 mustafab0 requested review from a team, paul-nechifor and spomichter January 21, 2026 06:41
@greptile-apps
Copy link
Contributor

greptile-apps bot commented Jan 21, 2026

Greptile Overview

Greptile Summary

Refactored manipulation planning stack into clean protocol-based architecture separating backend-agnostic interfaces from backend-specific implementations.

Architecture Changes:

  • Introduced WorldSpec, KinematicsSpec, and PlannerSpec protocols for backend abstraction
  • DrakeWorld implements WorldSpec using Drake's MultibodyPlant and SceneGraph
  • JacobianIK and DrakeOptimizationIK implement KinematicsSpec for iterative and optimization-based IK
  • RRTConnectPlanner implements PlannerSpec with backend-agnostic collision checking
  • Factory functions provide clean instantiation API (create_world, create_kinematics, create_planner)

Key Components:

  • WorldMonitor manages real-time robot state synchronization via WorldStateMonitor and obstacle updates via WorldObstacleMonitor
  • Context management enables thread-safe planning with live context (mirrors real robot) and scratch contexts (for planning/IK)
  • ManipulationModule integrates planning stack with ControlCoordinator for trajectory execution
  • Comprehensive utilities for kinematics, path manipulation, and URDF/xacro processing

Previous Issues Addressed:

  • Division-by-zero checks added to kinematics utilities
  • Explicit tolerances for joint-space duplicate detection in path utils
  • Exception handling narrowed to RuntimeError in Drake world operations
  • Obstacle removal properly handles missing objects with logging

The refactor successfully achieves separation of concerns with protocols defining clear contracts, making it easier to add new backends (MuJoCo, PyBullet) without changing planner/IK implementations.

Confidence Score: 4/5

  • This PR is safe to merge with minor attention to documentation
  • Well-architected protocol-based refactor with comprehensive tests and previous review issues addressed. The separation of concerns is excellent, making the codebase more maintainable and extensible. Score is 4/5 rather than 5/5 because this is a large architectural change that adds significant new code (~7k+ lines), though the implementation quality is high and tests are thorough.
  • All files are well-implemented. Pay attention to dimos/manipulation/planning/utils/mesh_utils.py which uses xacro monkey-patching (acknowledged as acceptable by senior developer)

Important Files Changed

Filename Overview
dimos/manipulation/planning/spec/protocols.py Introduces clean protocol-based architecture for manipulation stack with WorldSpec, KinematicsSpec, and PlannerSpec protocols
dimos/manipulation/planning/factory.py Clean factory functions for creating planning stack components with clear backend selection
dimos/manipulation/planning/world/drake_world.py Complete Drake-based WorldSpec implementation with robot/obstacle management and collision checking
dimos/manipulation/planning/kinematics/jacobian_ik.py Backend-agnostic Jacobian IK with iterative and differential modes, division-by-zero checks addressed
dimos/manipulation/planning/planners/rrt_planner.py Backend-agnostic RRT-Connect planner with comprehensive input validation and collision checking
dimos/manipulation/planning/monitor/world_monitor.py Thread-safe WorldMonitor for synchronizing real robot state with planning world
dimos/manipulation/manipulation_module.py Main manipulation module integrating planning stack with coordinator execution
dimos/manipulation/planning/utils/mesh_utils.py URDF/xacro processing with mesh conversion and xacro monkey-patching for ROS-free usage

Sequence Diagram

sequenceDiagram
    participant Client as Client Code
    participant Factory as Planning Factory
    participant Module as ManipulationModule
    participant Monitor as WorldMonitor
    participant World as DrakeWorld
    participant IK as JacobianIK/DrakeOptimizationIK
    participant Planner as RRTConnectPlanner
    participant Coord as ControlCoordinator

    Note over Client,Coord: Initialization Phase
    Client->>Factory: create_planning_stack(robot_config)
    Factory->>World: create_world(backend="drake")
    Factory->>IK: create_kinematics(name="jacobian")
    Factory->>Planner: create_planner(name="rrt_connect")
    Factory->>World: add_robot(config)
    Factory->>World: finalize()
    Factory-->>Client: (world, kinematics, planner, robot_id)

    Note over Module,Coord: Module Startup
    Module->>Monitor: WorldMonitor(enable_viz=True)
    Monitor->>World: add_robot(config)
    World-->>Monitor: robot_id
    Module->>Monitor: finalize()
    Module->>Monitor: start_state_monitor(robot_id)
    Monitor->>Coord: subscribe to joint_state updates
    
    Note over Client,Coord: Runtime - State Synchronization
    Coord->>Monitor: joint_state updates
    Monitor->>World: sync_from_joint_state(robot_id, positions)
    World->>World: update live_context

    Note over Client,Coord: Runtime - IK Solve
    Client->>Module: solve_ik(target_pose)
    Module->>World: scratch_context()
    World-->>Module: scratch_ctx
    Module->>IK: solve(world, robot_id, target_pose, seed)
    loop Multiple Attempts
        IK->>World: get_positions(ctx, robot_id)
        IK->>World: get_jacobian(ctx, robot_id)
        IK->>World: get_ee_pose(ctx, robot_id)
        IK->>World: set_positions(ctx, robot_id, new_q)
        IK->>World: is_collision_free(ctx, robot_id)
    end
    IK-->>Module: IKResult(joint_positions)
    Module-->>Client: joint_positions

    Note over Client,Coord: Runtime - Motion Planning
    Client->>Module: plan_to_pose(target_pose)
    Module->>IK: solve(world, robot_id, target_pose)
    IK-->>Module: IKResult(q_goal)
    Module->>World: get_positions(live_ctx, robot_id)
    World-->>Module: q_start
    Module->>Planner: plan_joint_path(world, robot_id, q_start, q_goal)
    loop RRT-Connect Iterations
        Planner->>World: check_config_collision_free(robot_id, q)
        Planner->>World: check_edge_collision_free(robot_id, q1, q2)
    end
    Planner-->>Module: PlanningResult(path)
    Module->>Module: generate_trajectory(path)
    Module-->>Client: JointTrajectory

    Note over Client,Coord: Runtime - Execution
    Client->>Module: execute_trajectory(trajectory)
    Module->>Coord: execute_trajectory RPC
    Coord->>Coord: follow trajectory
    Coord-->>Monitor: joint_state updates
    Monitor->>World: sync_from_joint_state()

Loading

Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

33 files reviewed, 14 comments

Edit Code Review Agent Settings | Greptile

@mustafab0 mustafab0 force-pushed the modular_manipulation_stack branch 3 times, most recently from ec17f02 to 8d2020a Compare January 22, 2026 23:01

def _get_xarm_urdf_path() -> str:
"""Get path to xarm URDF."""
return str(get_data("xarm_description") / "urdf/xarm_device.urdf.xacro")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

get_data("xarm_description/urdf/xarm_device.urdf.xacro") is now supported - returns full Path

def solve(
self,
world: WorldSpec,
robot_id: str,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm never sure if we should use robot_ids or actual instances/classes, it's more easy to not maintain ID -> something layer if you can use something directly

(world.robot1) ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe the sim creates a robot object that it manages. perhaps best to use that instance itself. WIll look at this or mark it as an issue for future improvement.

@mustafab0 mustafab0 force-pushed the modular_manipulation_stack branch from 8d2020a to ea8f51d Compare January 26, 2026 23:22
@mustafab0 mustafab0 marked this pull request as ready for review January 27, 2026 02:26
Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No files reviewed, no comments

Edit Code Review Agent Settings | Greptile

@mustafab0 mustafab0 force-pushed the modular_manipulation_stack branch from 7415456 to be7d5a4 Compare January 30, 2026 19:34
leshy
leshy previously approved these changes Jan 31, 2026
Copy link
Contributor

@leshy leshy left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

great



@dataclass
class PlanningResult:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

😍

from enum import Enum, auto


class ObstacleType(Enum):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

rlly great

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

stash loves enums

# See the License for the specific language governing permissions and
# limitations under the License.

"""Factory functions for manipulation planning components."""
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Factory probably not the best approach here

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@leshy also agrees this is bad

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think all good for the first pass, mustafa will ask if he wants a brainstorm on worlds

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree.

I will use the registry approach similar to the adapter registry

… implementation, split kinematics into JacobianIK and DrakeOptimizationIK
manipulation_blueprint - Added optional add_gripper: bool = True to make xarm6 ans xarm7 config consistent.
world_obstacle_monitor - Added warning log when obstacle not found during cleanup
manipulation_client - Removed unused numpy impor
path_utils - Added explicit tolerances atol=1e-6, rtol=0 to np.allclose() for stricter joint-space duplicate detection
jacobian_ik - Added division-by-zero protection for velocity limits using nonzero_mask to skip zero-valued limits
drake_world.py - added more specific exception handling (avoids hiding bugs)
mesh_utils - regex fixes
…ternal storage/helpers still use NDArrays in some places
@mustafab0 mustafab0 force-pushed the modular_manipulation_stack branch from cb782e6 to 6dbdf84 Compare February 1, 2026 00:45
@mustafab0 mustafab0 requested a review from spomichter February 1, 2026 02:05
@spomichter spomichter merged commit 7052565 into dev Feb 1, 2026
16 checks passed
@spomichter spomichter deleted the modular_manipulation_stack branch February 1, 2026 03:32
mustafab0 added a commit that referenced this pull request Feb 2, 2026
…#1079)

* added robot_description folders to data/ folder with lfs tracking

* Base types: RobotModelConfig, Obstacle, Protocol specs for defining  manipulation scenes

* Mesh conversion utils for converting any urdf to drake compatible mesh files

* DrakeWorld implementation that maintains all objects, robots in the scene and owns the scene graph

* Monitor system keeps the world model (drake planning world) in synb with real world. manages obstacle lifecycle and more

* FK and IK solver implementation with drake

* RRT path planner using default drake planner

* factory for building implementation of the different world, viz, planner etc specs

* utils for ik solver and path planning

* manipulation module manages the world monitor, planner, kinematics planner and interfaces with other modules

* added blueprints and manipulation client for testing

* added unit test, e2e tests and readme

* general cleanup

* added multi robot management  and control to the manipulation module

* refactored planning stack

* Refactored manipulation planning stack: seperated planners from world implementation,  split kinematics into JacobianIK and DrakeOptimizationIK

* updated README

* Address greptile comments:
manipulation_blueprint - Added optional add_gripper: bool = True to make xarm6 ans xarm7 config consistent.
world_obstacle_monitor - Added warning log when obstacle not found during cleanup
manipulation_client - Removed unused numpy impor
path_utils - Added explicit tolerances atol=1e-6, rtol=0 to np.allclose() for stricter joint-space duplicate detection
jacobian_ik - Added division-by-zero protection for velocity limits using nonzero_mask to skip zero-valued limits
drake_world.py - added more specific exception handling (avoids hiding bugs)
mesh_utils - regex fixes

* fix mypy import error with manipulation interface (file is deprecated)

* protocol now only requires solve() method.

* moved to using standard  LCM data types and added type alias for readability

* updated all coordinator references

* fixed all bluepirnts order

* updated paths to use Path object instead of str

* mypy type fixes

* all public api boundaries use standard message types, sim specific internal storage/helpers still use NDArrays in some places

* removed unused import

* removed manipulation history reference

* added a Jacobian typealias

* fixed mypy errors

* updated manipulation dependencies in pyproject.toml
mustafab0 added a commit that referenced this pull request Feb 6, 2026
* added HardwareComponent defining universal schema fo robot type and joint type classes

* removed simple HardwareConfig and replaced with new HardwareComponent dataclass

* added JointState dataclass and JointName str alias for better readability

* renamed control orchestrator to control coordinator as its easier to say

* added explicit type alias for JointName in ControlTask

* addded new joint position controller and joint velocity controller tasks

* added Input for coordinator for LCM streams and replaced task specific rpcs to 1  rpc to interact with all ControlTasks

* updated blueprints

* CI code cleanup

* added robot description to lfs

* PoseStamped stream adde to coordinator module

* cartesian ik task with internal pinnochio ik solver

* updated blueprints and added a pygame jogger for teleop

* mypy type fixes

* CI test fixes

* addressed latent type errors in testdata.py and seg.py that were always there but not caught before

mypy wasn't strict enough to catch them until pinocchio's numpy type annotations tightened the checking.

* Modular manipulation stack with Kinematics (IK,FK solvers) & Planners (#1079)

* added robot_description folders to data/ folder with lfs tracking

* Base types: RobotModelConfig, Obstacle, Protocol specs for defining  manipulation scenes

* Mesh conversion utils for converting any urdf to drake compatible mesh files

* DrakeWorld implementation that maintains all objects, robots in the scene and owns the scene graph

* Monitor system keeps the world model (drake planning world) in synb with real world. manages obstacle lifecycle and more

* FK and IK solver implementation with drake

* RRT path planner using default drake planner

* factory for building implementation of the different world, viz, planner etc specs

* utils for ik solver and path planning

* manipulation module manages the world monitor, planner, kinematics planner and interfaces with other modules

* added blueprints and manipulation client for testing

* added unit test, e2e tests and readme

* general cleanup

* added multi robot management  and control to the manipulation module

* refactored planning stack

* Refactored manipulation planning stack: seperated planners from world implementation,  split kinematics into JacobianIK and DrakeOptimizationIK

* updated README

* Address greptile comments:
manipulation_blueprint - Added optional add_gripper: bool = True to make xarm6 ans xarm7 config consistent.
world_obstacle_monitor - Added warning log when obstacle not found during cleanup
manipulation_client - Removed unused numpy impor
path_utils - Added explicit tolerances atol=1e-6, rtol=0 to np.allclose() for stricter joint-space duplicate detection
jacobian_ik - Added division-by-zero protection for velocity limits using nonzero_mask to skip zero-valued limits
drake_world.py - added more specific exception handling (avoids hiding bugs)
mesh_utils - regex fixes

* fix mypy import error with manipulation interface (file is deprecated)

* protocol now only requires solve() method.

* moved to using standard  LCM data types and added type alias for readability

* updated all coordinator references

* fixed all bluepirnts order

* updated paths to use Path object instead of str

* mypy type fixes

* all public api boundaries use standard message types, sim specific internal storage/helpers still use NDArrays in some places

* removed unused import

* removed manipulation history reference

* added a Jacobian typealias

* fixed mypy errors

* updated manipulation dependencies in pyproject.toml

* reverted blueprints to standalone style
@mustafab0 mustafab0 linked an issue Feb 8, 2026 that may be closed by this pull request
spomichter added a commit that referenced this pull request Feb 21, 2026
Release v0.0.10: Manipulation Stack, MuJoCo Simulation, DDS Transport, Web and Native Visualization via Rerun


## Highlights

88+ commits, 20 contributors, 700+ files changed.

The TLDR: **a complete manipulation stack**, **MuJoCo simulation**, **DDS transport**, and **a rewritten visualization pipeline**. Agents are no longer bolted on top — they're refactored as native modules with direct stream access. The entire ROS message dependency has been removed from core DimOS, and we've added VR, phone, and arm teleoperation stacks. You can now vibecode a pick-and-place task from natural language to motor commands. Installation has been significantly streamlined — no more direnv, simpler setup, and the web viewer is now the default.

---

## 🚀 New Features

### Simulation
- **MuJoCo simulation module** — Run any DimOS blueprint in simulation with no hardware. Supports xArm and Unitree embodiments, parses MJCF/URDF for robot properties, monotonic clock timing (no `time.sleep`). `dimos --simulation run unitree-go2` ([#1035](#1035)) by @jca0
- **Simulation teleop blueprints** — Added simulation teleop blueprints for Piper, xArm6, and xArm7. ([#1308](#1308)) by @mustafab0

### Manipulation
- **Modular manipulation stack** — Full planning stack with Drake: FK/IK solvers (Jacobian + Drake optimization), RRT path planning, world model with obstacle monitoring, multi-robot management. xArm6/7 and Piper support. ([#1079](#1079)) by @mustafab0
- **Joint servo and cartesian controllers** — Joint position/velocity controllers and cartesian IK task with Pinocchio solver. PoseStamped stream input for real-time control. ([#1116](#1116)) by @mustafab0
- **GraspGen integration** — Grasp generation via Docker-hosted GPU model. Lazy container startup, thread-safe init, RPC `generate_grasps()` returns ranked PoseArray. ([#1119](#1119), [#1234](#1234)) by @JalajShuklaSS
- **Gripper control** — Gripper RPC methods on control coordinator, exposed adapter property for custom implementations. ([#1213](#1213)) by @mustafab0
- **Detection3D and Object support** — Object input topics, TF support on manipulation module, pointcloud-to-convex-hull for Drake imports. ([#1236](#1236)) by @mustafab0
- **Agentic pick and place** — Reimplemented manipulation skills for agent-driven pick-and-place workflows. ([#1237](#1237)) by @mustafab0

### Teleoperation
- **Quest VR teleoperation** — Full WebXR + Deno bridge stack. Quest controller data (pose, trigger, grip) streamed to DimOS modules. Monitor-style locking for control loops. ([#1215](#1215)) by @ruthwikdasyam
- **Phone teleoperation** — Control Go2 from your phone with a web-based teleop interface. ([#1280](#1280)) by @ruthwikdasyam
- **Arm teleop with Pinocchio IK** — Single and dual arm teleoperation using Pinocchio inverse kinematics. Blueprints for xArm, Piper, and dual configurations. ([#1246](#1246)) by @ruthwikdasyam

### Transports & Infrastructure
- **DDS transport protocol** — CycloneDDS transport with configurable QoS (high-throughput and reliable profiles). Optional install, benchmark integration. ([#1174](#1174)) by @Kaweees
- **Pubsub pattern subscriptions** — Glob and regex pattern matching for topic subscriptions. `subscribe_all()` for bridge-style consumers. Topic type encoding in channel strings (`/topic#module.ClassName`). ([#1114](#1114)) by @leshy
- **LCM raw bytes passthrough** — Skip `lcm_encode()` when message is already bytes. ([#1223](#1223)) by @leshy
- **Unified TimeSeriesStore** — Pluggable backends (InMemory, SQLite, Pickle, PostgreSQL) with SortedKeyList for O(log n) operations. Replaces the old replay system and TimestampedCollection. Collection API with slice, range, and streaming methods. ([#1080](#1080)) by @leshy
- **DimosROS benchmark tests** — Benchmark suite for ROS transport performance. ([#1087](#1087)) by @leshy

### Navigation
- **FASTLIO2 support** — Hardware-verified localization with arm64 support. Docker deployment with FAR Planner, terrain analysis, and bagfile playback mode. Builds or-tools from source on arm64. ([#1149](#1149)) by @baishibona
- **Native Livox + FASTLIO2 module** — First-class DimOS native module for Livox Mid-360 lidar with FASTLIO2 localization. ([#1235](#1235)) by @leshy

### Visualization
- **RerunBridge module and CLI** — New bridge that subscribes to all LCM messages and logs those with `to_rerun()` to Rerun viewer. GlobalConfig singleton, web viewer support. Replaces the old rerun initialization system. ([#1154](#1154)) by @leshy
- **Webcam rerun visualization** — Camera module logs to Rerun with pinhole projection for 3D visualization. ([#1117](#1117)) by @ruthwikdasyam
- **Default viewer switched to rerun-web** — Browser-based viewer is now the default for broader compatibility. No native viewer install needed. ([#1324](#1324)) by @spomichter

### Agents
- **Agent refactor** — Restructured agent module with cleaner imports and global config integration. ([#1211](#1211)) by @paul-nechifor
- **Timestamp knowledge** — Agents now have timestamp awareness in prompts for temporal reasoning. ([#1093](#1093)) by @ClaireBookworm
- **Observe skill** — Go2 can now observe (capture and describe) its environment via agent skill. ([#1109](#1109)) by @paul-nechifor

### Platform & Hardware
- **G1 without ROS** — Unitree G1 blueprints decoupled from ROS dependency. Lazy imports for fast startup. ([#1221](#1221)) by @jeff-hykin
- **ARM (aarch64) support** — DimOS runs on ARM hardware. Platform-conditional dependencies, open3d source builds for arm64. ([#1229](#1229)) by @jeff-hykin
- **Universal joint/hardware schema** — `HardwareComponent` dataclass with `JointState`, `JointName` type aliases. Backend registry with auto-discovery for SDK adapters. ([#1040](#1040), [#1067](#1067)) by @mustafab0

---

## 🔧 Improvements

- **Optional Dask** — Start without Dask using `--no-dask` flag. Startup time reduced from ~60s to ~45s. ([#1111](#1111), [#1232](#1232)) by @paul-nechifor
- **RPC rework** — Renamed `ModuleBlueprint` → `_BlueprintAtom`, `ModuleBlueprintSet` → `Blueprint`, `ModuleConnection` → `Stream`. Added `ModuleRef`, improved type hints throughout. ([#1143](#1143)) by @jeff-hykin
- **Image class simplification** — Rewritten as pure NumPy dataclass. Removed CUDA backend, unused methods (solve_pnp, csrt_tracker), and image_impls/ directory. ([#1161](#1161)) by @leshy
- **Odometry message cleanup** — Simplified Odometry message type. ([#1256](#1256)) by @leshy
- **Remove all ROS message dependencies** — Purged ROS message types from core DimOS. Refactored rosnav to use ROSTransport. Removed dead ROS bridge code. ([#1230](#1230)) by @alexlin2
- **Removed bad function serialization** — Eliminated unnecessary serialization of Python functions. ([#1121](#1121)) by @paul-nechifor
- **Benchmark IEC units** — Switched bandwidth benchmarks from SI to IEC units for accuracy. ([#1147](#1147)) by @leshy
- **Pubsub typing improvements** — Thread-safety locks on `subscribe_new_topics` and `subscribe_all`. Proper type params across pubsub stack. ([#1153](#1153)) by @leshy
- **Autogenerated blueprint list** — Blueprints are now auto-discovered and listed. ([#1100](#1100)) by @paul-nechifor
- **Generic Buttons message** — Renamed `QuestButtons` to `Buttons` with generic field names for cross-platform teleop. ([#1261](#1261)) by @ruthwikdasyam
- **Dev container uses ros-dev image** — `./bin/dev` now runs the ROS-enabled dev image. ([#1170](#1170)) by @leshy
- **LSP support** — Added python-lsp-server and python-lsp-ruff to dev dependencies. ([#1169](#1169)) by @leshy
- **Lazy-load pyrealsense2** — RealSense camera module uses lazy imports to avoid errors in simulation environments without the SDK. ([#1309](#1309)) by @spomichter
- **Removed unused mmcv and mmengine** — Dead Detic dependencies removed, eliminating slow source builds from install. ([#1319](#1319)) by @spomichter
- **Simplified installation** — Removed direnv requirement, streamlined install instructions across all platforms. ([#1315](#1315)) by @spomichter
- **DDS extra excluded from --all-extras** — `cyclonedds` requires a source build, so `dds` is now excluded from `uv sync --all-extras` by default. ([#1318](#1318)) by @spomichter
- **Nix pre-commit skip** — Skip pre-commit install if hooks already exist. ([#1162](#1162)) by @leshy
- **Removed base-requirements** — Consolidated dependency management. ([#1098](#1098)) by @paul-nechifor
- **Removed old graspnet** — Cleaned up deprecated graspnet version. ([#1248](#1248)) by @paul-nechifor
- **Code cleanup** — Removed `tofix` markers ([#1216](#1216)), fixed ruff issues ([#1112](#1112)), removed old README_installation.md ([#1101](#1101)) by @paul-nechifor

---

## 🐛 Bug Fixes

- Fix LFS updating (move from .local to venv) ([#1090](#1090)) by @jeff-hykin
- Launch hotfixes: git clone HTTPS, get_data main branch ([#1091](#1091)) by @spomichter
- Fix camera demo not showing in Rerun ([#1148](#1148)) by @jeff-hykin
- Default to rerun native viewer ([#1099](#1099)) by @Nabla7
- Fix exploration blocking agent loop ([#1258](#1258)) by @paul-nechifor
- Fix person-follow blocking agent loop ([#1278](#1278)) by @paul-nechifor
- Skip metric3d tests on unsupported xformers GPUs (Blackwell compute capability >9.0) ([#1225](#1225)) by @leshy
- Fix manipulation tests ([#1218](#1218), [#1247](#1247)) by @jeff-hykin, @paul-nechifor
- Fix control coordinator e2e test ([#1212](#1212)) by @mustafab0
- Fix xarm7-sim broken e2e tests ([#1294](#1294)) by @paul-nechifor
- Pin langchain to restore supported providers ([#1241](#1241)) by @spomichter
- Fix missing library dependencies in Nix flake ([#1240](#1240)) by @Kaweees
- Fix discord invite link ([#1122](#1122)) by @spomichter
- macOS edgecase fix ([#1096](#1096)) by @jeff-hykin
- Fix second N in logo ([#1250](#1250)) by @jeff-hykin
- Fix Unitree Go2 minor issues ([#1307](#1307)) by @paul-nechifor
- Fix broken tests ([#1305](#1305)) by @ruthwikdasyam
- Fix `uv sync` for some macOS systems ([#1322](#1322)) by @jeff-hykin
- Fix mmcv install ([#1313](#1313)) by @paul-nechifor
- Fix mypy issues ([#1150](#1150), [#1167](#1167), [#1257](#1257)) by @leshy, @paul-nechifor, @jeff-hykin
- Fix Nix install uv pip extras ([#1321](#1321)) by @spomichter

---

## 📚 Documentation

- **Major docs overhaul** — New README with feature grid, hardware table, quickstart. Navigation, transports, data streams, and agent docs. ([#1295](#1295)) by @leshy
- **Day 1 docs** — Comprehensive getting started guide, development docs, contributing guide, architecture overview. Executable blueprint docs via md-babel-py. ([#1064](#1064)) by @jeff-hykin
- **Arm integration guide** — How-to for integrating new robotic arms with DimOS. ([#1238](#1238)) by @mustafab0
- **MCP documentation update** — Updated MCP install and usage instructions. ([#1251](#1251)) by @Kaweees
- **Docker docs** — First pass on Docker deployment documentation. ([#1151](#1151)) by @leshy
- **Transports documentation** — Encode/decode mixins, SHM examples, ROS/DDS transport docs. ([#1107](#1107)) by @leshy
- **Rerun API examples** — Updated examples for the new RerunBridge API. ([#1262](#1262)) by @jeff-hykin
- **PR template** added ([#1172](#1172)) by @christiefhyang
- **Simplified install instructions** — Removed direnv, streamlined across all platforms. ([#1315](#1315)) by @spomichter
- **Python example restored** — Added back the Python usage example. ([#1317](#1317)) by @jeff-hykin
- **Nix install updated** — Replaced uv with pip for Nix compatibility. ([#1326](#1326)) by @ruthwikdasyam
- **README improvements** ([#1311](#1311)) by @paul-nechifor
- **Simplified writing docs** — Consolidated writing_docs to a single markdown file. ([#1254](#1254)) by @jeff-hykin

---

## 🏗️ CI & Build

- **ci-complete gate** — Dynamic branch protection via single aggregated status check. MD-only PRs no longer blocked. ([#1279](#1279)) by @spomichter
- **Path-based test filtering** — Test jobs fully skip (no container spin-up) when no relevant code changed. ([#1284](#1284), [#1286](#1286)) by @spomichter
- **Navigation docker build workflow** — CI builds for the ROS navigation stack. ([#1259](#1259)) by @spomichter
- **CUDA test marker** — `@pytest.mark.cuda` for GPU-dependent tests. ([#1220](#1220)) by @jeff-hykin
- **e2e test marker** — Marked end-to-end tests for selective CI runs. ([#1110](#1110)) by @paul-nechifor
- **pytest stdin fix** — Added `-s` to default addopts for LCM autoconf compatibility. ([#1320](#1320)) by @spomichter

---

## ⚠️ Breaking Changes

- **RPC renames**: `ModuleBlueprint` → `_BlueprintAtom`, `ModuleBlueprintSet` → `Blueprint`, `ModuleConnection` → `Stream` ([#1143](#1143))
- **Image class rewrite**: `CudaImage` and `NumpyImage` removed. Image is now a pure NumPy dataclass. Methods like `solve_pnp`, `csrt_tracker`, `from_depth`, `to_depth_meters` removed. ([#1161](#1161))
- **ROS messages removed from core**: All `to_ros`/`from_ros` conversion methods removed. Use `ROSTransport` instead. ([#1230](#1230))
- **QuestButtons → Buttons**: Renamed with generic field names. ([#1261](#1261))
- **RerunBridge replaces old rerun init**: `dimos.dashboard.rerun_init` removed. Use `RerunBridgeModule` or the `rerun-bridge` CLI. ([#1154](#1154))
- **Unitree directory restructuring**: `unitree_go2` → `unitree/go2`, `unitree_g1` → `unitree/g1`. Blueprint names updated. ([#1221](#1221))
- **Default viewer is now rerun-web**: Use `--viewer-backend rerun` to restore native viewer. ([#1324](#1324))

---

## Quickstart

```bash
# Install
uv pip install dimos[base,unitree]

# Try it (no hardware needed)
# NOTE: First run downloads ~2.4 GB from LFS
dimos --replay run unitree-go2

# Simulate
uv pip install dimos[base,unitree,sim]
dimos --simulation run unitree-go2
```

---

## New Contributors 🎉

- @ruthwikdasyam — Quest VR teleoperation, phone teleop, arm teleop, webcam rerun viz
- @JalajShuklaSS — GraspGen integration
- @jca0 — MuJoCo simulation module
- @christiefhyang — PR template

---

**Full Changelog**: [v0.0.9...v0.0.10](v0.0.9...v0.0.10)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Manipulation SDK final cleanup, final API definition

3 participants