Skip to content

Create DDS Transport Protocol#1174

Merged
spomichter merged 22 commits intodevfrom
miguel/dds_transport
Feb 14, 2026
Merged

Create DDS Transport Protocol#1174
spomichter merged 22 commits intodevfrom
miguel/dds_transport

Conversation

@Kaweees
Copy link
Member

@Kaweees Kaweees commented Feb 3, 2026

This merge request implements DDS (Data Distribution Service) transport layer using CycloneDDS, providing a new high-performance pub/sub transport option.

Quick Start

Note

We currently use Eclipse Cyclone DDS as our DDS implementation. Its IdlStruct feature lets you define DDS topic types in pure Python, eliminating the need for separate IDL files, with automatic serialization support.

from dataclasses import dataclass
from cyclonedds.idl import IdlStruct
from dimos.protocol.pubsub.ddspubsub import DDS, Topic

@dataclass
class SensorReading(IdlStruct):
    value: float

dds = DDS()
dds.start()

received = []
sensor_topic = Topic(name="sensors/temperature", data_type=SensorReading)

dds.subscribe(sensor_topic, lambda msg, t: received.append(msg))
dds.publish(sensor_topic, SensorReading(value=22.5))

import time
time.sleep(0.1)

print(f"Received: {received}")
dds.stop()
Received: [SensorReading(value=22.5)]

Unit Tests/Benchmarks

uv run pytest -svm tool dimos/protocol/pubsub/benchmark/test_benchmark.py --override-ini="addopts=" -k "DDS"
uv run pytest -svm tool dimos/protocol/pubsub/benchmark/test_benchmark.py
image

This builds off of #1144, which was closed due to having too many merge conflicts with dev and #1036, which was closed because the branch was renamed to miguel/dds_transport

@Kaweees Kaweees self-assigned this Feb 3, 2026
@greptile-apps
Copy link
Contributor

greptile-apps bot commented Feb 3, 2026

Greptile Overview

Greptile Summary

This PR adds DDS (Data Distribution Service) transport support using Eclipse CycloneDDS, providing a high-performance pub/sub transport option for network communication.

Key Changes:

  • Implements DDSTransport class with thread-safe initialization and lifecycle management
  • Adds DDS pub/sub implementation with proper listener pattern for callbacks
  • Implements DDSService with singleton DomainParticipant management per domain ID
  • Includes benchmark test cases comparing DDS with high-throughput and reliable QoS presets
  • Adds comprehensive documentation and installation instructions
  • Makes DDS an optional dependency via the [dds] extra

Implementation Details:

  • Uses RLock for thread-safe start/stop operations in DDSTransport
  • Properly implements the Transport.subscribe interface contract by returning unsubscribe functions
  • Handles optional CycloneDDS imports gracefully with feature flags
  • Follows existing patterns from LCM and ROS transports
  • Includes error handling in message listener callbacks

Confidence Score: 5/5

  • This PR is safe to merge - implementation follows established patterns and includes proper thread safety
  • The code is well-structured, follows existing transport patterns, includes comprehensive error handling, and properly manages resources. All previous review comments have been addressed.
  • No files require special attention

Important Files Changed

Filename Overview
dimos/core/transport.py Adds DDSTransport class with thread-safe start/stop and proper subscribe return type
dimos/protocol/pubsub/impl/ddspubsub.py New DDS pub/sub implementation with proper listener pattern and error handling
dimos/protocol/service/ddsservice.py New DDS service with singleton domain participant management per domain ID
dimos/protocol/pubsub/benchmark/testdata.py Adds DDS benchmark test cases with high-throughput and reliable QoS presets
docs/concepts/transports.md Adds DDS transport documentation with usage example
docs/development/README.md Adds DDS installation instructions for Ubuntu/Debian systems

Sequence Diagram

sequenceDiagram
    participant User
    participant DDSTransport
    participant DDS
    participant DDSService
    participant DomainParticipant
    participant DataWriter
    participant DataReader
    participant Listener

    User->>DDSTransport: __init__(topic, type, **kwargs)
    DDSTransport->>DDS: __init__(**kwargs)
    DDSTransport->>DDSTransport: Create RLock

    User->>DDSTransport: publish(message)
    DDSTransport->>DDSTransport: Check _started (with lock)
    alt Not started
        DDSTransport->>DDS: start()
        DDS->>DDSService: start()
        DDSService->>DDSService: Check _participants dict
        alt Domain not in _participants
            DDSService->>DomainParticipant: Create participant(domain_id)
            DDSService->>DDSService: Store in _participants[domain_id]
        end
    end
    DDSTransport->>DDS: publish(topic, message)
    DDS->>DDS: _get_writer(topic)
    alt Writer doesn't exist
        DDS->>DDSTopic: Create DDSTopic
        DDS->>DataWriter: Create DataWriter(participant, topic, qos)
        DDS->>DDS: Store in _writers[topic]
    end
    DDS->>DataWriter: write(message)

    User->>DDSTransport: subscribe(callback)
    DDSTransport->>DDSTransport: Check _started (with lock)
    alt Not started
        DDSTransport->>DDS: start()
    end
    DDSTransport->>DDS: subscribe(topic, callback)
    DDS->>DDS: _get_listener(topic)
    alt Listener doesn't exist
        DDS->>DDSTopic: Create DDSTopic
        DDS->>Listener: Create _DDSMessageListener(topic)
        DDS->>DataReader: Create DataReader(participant, topic, qos, listener)
        DDS->>DDS: Store reader and listener
    end
    DDS->>Listener: add_callback(callback)
    DDS-->>DDSTransport: Return unsubscribe lambda
    DDSTransport-->>User: Return unsubscribe function

    DataReader->>Listener: on_data_available(reader)
    Listener->>DataReader: take()
    loop For each sample
        loop For each callback
            Listener->>User: callback(sample, topic)
        end
    end

    User->>DDSTransport: stop()
    DDSTransport->>DDS: stop()
    DDS->>DDS: Clear _readers, _listeners, _writers
    DDS->>DDSService: stop()
    Note over DDSService,DomainParticipant: DomainParticipant persists<br/>for potential reuse
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.

4 files reviewed, 5 comments

Edit Code Review Agent Settings | Greptile

@Kaweees
Copy link
Member Author

Kaweees commented Feb 3, 2026

@greptile

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.

3 files reviewed, 4 comments

Edit Code Review Agent Settings | Greptile

@paul-nechifor
Copy link
Contributor

When installing I get this:

uv sync --all-extras
warning: The `extra-build-dependencies` option is experimental and may change without warning. Pass `--preview-features extra-build-dependencies` to disable this warning.
Resolved 452 packages in 0.95ms
  × Failed to build `cyclonedds==0.10.5`
  ├─▶ The build backend returned an error
  ╰─▶ Call to `setuptools.build_meta.build_wheel` failed (exit status: 1)

      [stdout]
      Could not locate cyclonedds. Try to set CYCLONEDDS_HOME or CMAKE_PREFIX_PATH

      [stderr]
      /home/p/.cache/uv/builds-v0/.tmp5R206l/lib/python3.12/site-packages/wheel/bdist_wheel.py:4: FutureWarning: The 'wheel' package is no longer the canonical location of the
      'bdist_wheel' command, and will be removed in a future release. Please update to setuptools v70.1 or later which contains an integrated version of this command.
        warn(

      hint: This usually indicates a problem with the package or the build environment.
  help: `cyclonedds` (v0.10.5) was included because `dimos` (v0.0.9) depends on `cyclonedds`

I think you need to add to the docs how to build it. I've tried sudo apt install cyclonedds-dev, but it doesn't look like it's enough.

@Kaweees
Copy link
Member Author

Kaweees commented Feb 4, 2026

When installing I get this:

uv sync --all-extras
warning: The `extra-build-dependencies` option is experimental and may change without warning. Pass `--preview-features extra-build-dependencies` to disable this warning.
Resolved 452 packages in 0.95ms
  × Failed to build `cyclonedds==0.10.5`
  ├─▶ The build backend returned an error
  ╰─▶ Call to `setuptools.build_meta.build_wheel` failed (exit status: 1)

      [stdout]
      Could not locate cyclonedds. Try to set CYCLONEDDS_HOME or CMAKE_PREFIX_PATH

      [stderr]
      /home/p/.cache/uv/builds-v0/.tmp5R206l/lib/python3.12/site-packages/wheel/bdist_wheel.py:4: FutureWarning: The 'wheel' package is no longer the canonical location of the
      'bdist_wheel' command, and will be removed in a future release. Please update to setuptools v70.1 or later which contains an integrated version of this command.
        warn(

      hint: This usually indicates a problem with the package or the build environment.
  help: `cyclonedds` (v0.10.5) was included because `dimos` (v0.0.9) depends on `cyclonedds`

I think you need to add to the docs how to build it. I've tried sudo apt install cyclonedds-dev, but it doesn't look like it's enough.

This makes sense, because I use Nix to run this. You need to build build CycloneDDS from source otherwise. Where should I add this functionality?

@paul-nechifor
Copy link
Contributor

paul-nechifor commented Feb 4, 2026

This makes sense, because I use Nix to run this. You need to build build CycloneDDS from source otherwise. Where should I add this functionality?

Since "cyclonedds>=0.10.5" is in the root dependencies it should be in README.md and docs/development/README.md.

But, should it be in the root dependencies? That is, I don't think everyone needs it. Currently, running uv sync requires we configure cyclonedds first.

@leshy
Copy link
Contributor

leshy commented Feb 4, 2026

This makes sense, because I use Nix to run this. You need to build build CycloneDDS from source otherwise. Where should I add this functionality?

ugh.. are we sure we can't just install cyclonedds on ubuntu? or ros-ubuntu?
I think assume system level is sorted out for your feature yes, this is good to merge imo and can check this in a follow up
but yeah as paul said, remove from root deps..

this will be annoying because
uv sync --all-extras
will break and tests/imports will crash tho? we don't have a policy yet for this, Paul what do you think?

@Kaweees
Copy link
Member Author

Kaweees commented Feb 4, 2026

Got it, moved to a extra group so now it is installed via
uv sync --extra dds

@paul-nechifor
Copy link
Contributor

@Kaweees @leshy

Now the build is failing because core imports actually depend on the cyclonedds. I'm not sure what the solution is here. Options are:

  1. Keep the package in root deps, but then we have to add to prolong the README because everyone will need cyclone dds to run dimos.

  2. Make sure the package is truly optional. I'm not sure how much work this is.


Separately, these are the instructions for how I got it running on Ubuntu (technically I'm running Linux Mint, but it's based on Ubuntu 24.04). You probably want to add this to the docs.

### Optional: DDS Transport Support

The `dds` extra provides DDS (Data Distribution Service) transport support via Eclipse Cyclone DDS. This requires installing system libraries before the Python package can be built.

**Ubuntu/Debian:**

```bash
# Install the CycloneDDS development library
sudo apt install cyclonedds-dev

# Create a compatibility directory structure
# (required because Ubuntu's multiarch layout doesn't match the expected CMake layout)
sudo mkdir -p /opt/cyclonedds/{lib,bin,include}
sudo ln -sf /usr/lib/x86_64-linux-gnu/libddsc.so* /opt/cyclonedds/lib/
sudo ln -sf /usr/lib/x86_64-linux-gnu/libcycloneddsidl.so* /opt/cyclonedds/lib/
sudo ln -sf /usr/bin/idlc /opt/cyclonedds/bin/
sudo ln -sf /usr/bin/ddsperf /opt/cyclonedds/bin/
sudo ln -sf /usr/include/dds /opt/cyclonedds/include/

# Install with the dds extra
CYCLONEDDS_HOME=/opt/cyclonedds uv pip install -e '.[dds]'
```

To install all extras including DDS:

```bash
CYCLONEDDS_HOME=/opt/cyclonedds uv sync --all-extras
```

@paul-nechifor
Copy link
Contributor

@Kaweees What is Deploy_SimToReal_RL_Go2 ? Seems unrelated.

@paul-nechifor
Copy link
Contributor

My results for reference (very similar):

2026-02-05_01-29

@Kaweees Kaweees force-pushed the miguel/dds_transport branch from fd7fd0c to 0246eae Compare February 4, 2026 23:52
@Kaweees
Copy link
Member Author

Kaweees commented Feb 4, 2026

@Kaweees What is Deploy_SimToReal_RL_Go2 ? Seems unrelated.

I've been trying to figure out how we would deploy locomotion polcies on the Go2 and G1 in preparation of AGI Bot. That was not supposed to be commit, just rebased it out

@Kaweees
Copy link
Member Author

Kaweees commented Feb 5, 2026

  1. Make sure the package is truly optional. I'm not sure how much work this is.

Perhaps in all cases where DDS is imported, we just try except as a hacky way to keep it optional.

@paul-nechifor
Copy link
Contributor

Perhaps in all cases where DDS is imported, we just try except as a hacky way to keep it optional.

👍

@spomichter
Copy link
Contributor

@Kaweees @leshy

Now the build is failing because core imports actually depend on the cyclonedds. I'm not sure what the solution is here. Options are:

  1. Keep the package in root deps, but then we have to add to prolong the README because everyone will need cyclone dds to run dimos.
  2. Make sure the package is truly optional. I'm not sure how much work this is.

Separately, these are the instructions for how I got it running on Ubuntu (technically I'm running Linux Mint, but it's based on Ubuntu 24.04). You probably want to add this to the docs.

### Optional: DDS Transport Support

The `dds` extra provides DDS (Data Distribution Service) transport support via Eclipse Cyclone DDS. This requires installing system libraries before the Python package can be built.

**Ubuntu/Debian:**

```bash
# Install the CycloneDDS development library
sudo apt install cyclonedds-dev

# Create a compatibility directory structure
# (required because Ubuntu's multiarch layout doesn't match the expected CMake layout)
sudo mkdir -p /opt/cyclonedds/{lib,bin,include}
sudo ln -sf /usr/lib/x86_64-linux-gnu/libddsc.so* /opt/cyclonedds/lib/
sudo ln -sf /usr/lib/x86_64-linux-gnu/libcycloneddsidl.so* /opt/cyclonedds/lib/
sudo ln -sf /usr/bin/idlc /opt/cyclonedds/bin/
sudo ln -sf /usr/bin/ddsperf /opt/cyclonedds/bin/
sudo ln -sf /usr/include/dds /opt/cyclonedds/include/

# Install with the dds extra
CYCLONEDDS_HOME=/opt/cyclonedds uv pip install -e '.[dds]'

To install all extras including DDS:

CYCLONEDDS_HOME=/opt/cyclonedds uv sync --all-extras

Yeah definitely can't have DDS in core deps so good removal there. Current failing tests should be fixed by just catching all of the cycloneDDS imports with try/catch importerror.

@Kaweees
Copy link
Member Author

Kaweees commented Feb 6, 2026

@spomichter @paul-nechifor Docs have been updated and DDS has been made an optional transport.

@Kaweees
Copy link
Member Author

Kaweees commented Feb 6, 2026

@greptile

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.

6 files reviewed, no comments

Edit Code Review Agent Settings | Greptile

paul-nechifor
paul-nechifor previously approved these changes Feb 6, 2026
@Kaweees
Copy link
Member Author

Kaweees commented Feb 6, 2026

It works on my machine, I think its because the tests aren't installing the dds extra

uv sync --extra dds

@spomichter spomichter merged commit db05bf0 into dev Feb 14, 2026
27 of 28 checks passed
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)
@Kaweees Kaweees deleted the miguel/dds_transport branch March 3, 2026 07:55
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.

4 participants