From ceb26162c63a79d76dd058cbe34d6e983bf8b39c Mon Sep 17 00:00:00 2001 From: Jeff Hykin Date: Sun, 11 Jan 2026 19:28:07 -0800 Subject: [PATCH 1/8] add main as a group in extras --- pyproject.toml | 6 +++++- uv.lock | 55 ++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 47 insertions(+), 14 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index b0a1e61415..ec144deedd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -162,7 +162,7 @@ perception = [ ] unitree = [ - "dimos[agents,web,perception,visualization]", + "dimos[main]", "unitree-webrtc-connect-leshy>=2.0.7" ] @@ -271,6 +271,10 @@ drone = [ "pymavlink" ] +main = [ + "dimos[agents,web,perception,visualization]", +] + [tool.ruff] line-length = 100 exclude = [ diff --git a/uv.lock b/uv.lock index 42aa4a9310..0e1bfa7af9 100644 --- a/uv.lock +++ b/uv.lock @@ -371,10 +371,10 @@ name = "bitsandbytes" version = "0.49.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "packaging" }, - { name = "torch" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11' and sys_platform != 'darwin' and sys_platform != 'win32'" }, + { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' and sys_platform != 'darwin' and sys_platform != 'win32'" }, + { name = "packaging", marker = "sys_platform != 'darwin' and sys_platform != 'win32'" }, + { name = "torch", marker = "sys_platform != 'darwin' and sys_platform != 'win32'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/11/dd/5820e09213a3f7c0ee5aff20fce8b362ce935f9dd9958827274de4eaeec6/bitsandbytes-0.49.1-py3-none-manylinux_2_24_aarch64.whl", hash = "sha256:acd4730a0db3762d286707f4a3bc1d013d21dd5f0e441900da57ec4198578d4e", size = 31065659, upload-time = "2026-01-08T14:31:28.676Z" }, @@ -1555,6 +1555,34 @@ dev = [ drone = [ { name = "pymavlink" }, ] +main = [ + { name = "anthropic" }, + { name = "bitsandbytes", marker = "sys_platform == 'linux'" }, + { name = "fastapi" }, + { name = "ffmpeg-python" }, + { name = "filterpy" }, + { name = "langchain" }, + { name = "langchain-chroma" }, + { name = "langchain-core" }, + { name = "langchain-huggingface" }, + { name = "langchain-ollama" }, + { name = "langchain-openai" }, + { name = "langchain-text-splitters" }, + { name = "lap" }, + { name = "mcp" }, + { name = "moondream" }, + { name = "ollama" }, + { name = "openai" }, + { name = "openai-whisper" }, + { name = "pillow" }, + { name = "rerun-sdk" }, + { name = "sounddevice" }, + { name = "soundfile" }, + { name = "sse-starlette" }, + { name = "transformers", extra = ["torch"] }, + { name = "ultralytics" }, + { name = "uvicorn" }, +] manipulation = [ { name = "contact-graspnet-pytorch" }, { name = "h5py" }, @@ -1668,7 +1696,8 @@ requires-dist = [ { name = "dask", extras = ["complete"], specifier = "==2025.5.1" }, { name = "dataclasses", marker = "extra == 'cuda'" }, { name = "detectron2", marker = "extra == 'cuda'", git = "https://github.com/facebookresearch/detectron2.git?tag=v0.6" }, - { name = "dimos", extras = ["agents", "web", "perception", "visualization"], marker = "extra == 'unitree'" }, + { name = "dimos", extras = ["agents", "web", "perception", "visualization"], marker = "extra == 'main'" }, + { name = "dimos", extras = ["main"], marker = "extra == 'unitree'" }, { name = "dimos-lcm" }, { name = "einops", marker = "extra == 'misc'", specifier = "==0.8.1" }, { name = "empy", marker = "extra == 'misc'", specifier = "==3.3.4" }, @@ -1792,7 +1821,7 @@ requires-dist = [ { name = "xformers", marker = "extra == 'cuda'", specifier = ">=0.0.20" }, { name = "yapf", marker = "extra == 'misc'", specifier = "==0.40.2" }, ] -provides-extras = ["misc", "visualization", "agents", "web", "perception", "unitree", "manipulation", "cpu", "cuda", "dev", "sim", "drone"] +provides-extras = ["misc", "visualization", "agents", "web", "perception", "unitree", "manipulation", "cpu", "cuda", "dev", "sim", "drone", "main"] [[package]] name = "dimos-lcm" @@ -1929,7 +1958,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -5193,7 +5222,7 @@ name = "nvidia-cudnn-cu12" version = "9.10.2.21" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas-cu12", version = "12.8.4.1", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "nvidia-cublas-cu12", version = "12.8.4.1", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/ba/51/e123d997aa098c61d029f76663dedbfb9bc8dcf8c60cbd6adbe42f76d049/nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:949452be657fa16687d0930933f032835951ef0892b37d2d53824d1a84dc97a8", size = 706758467, upload-time = "2025-06-06T21:54:08.597Z" }, @@ -5204,7 +5233,7 @@ name = "nvidia-cufft-cu12" version = "11.3.3.83" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/1f/13/ee4e00f30e676b66ae65b4f08cb5bcbb8392c03f54f2d5413ea99a5d1c80/nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d2dd21ec0b88cf61b62e6b43564355e5222e4a3fb394cac0db101f2dd0d4f74", size = 193118695, upload-time = "2025-03-07T01:45:27.821Z" }, @@ -5231,9 +5260,9 @@ name = "nvidia-cusolver-cu12" version = "11.7.3.90" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas-cu12", version = "12.8.4.1", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, - { name = "nvidia-cusparse-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, - { name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "nvidia-cublas-cu12", version = "12.8.4.1", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')" }, + { name = "nvidia-cusparse-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')" }, + { name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/85/48/9a13d2975803e8cf2777d5ed57b87a0b6ca2cc795f9a4f59796a910bfb80/nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:4376c11ad263152bd50ea295c05370360776f8c3427b30991df774f9fb26c450", size = 267506905, upload-time = "2025-03-07T01:47:16.273Z" }, @@ -5244,7 +5273,7 @@ name = "nvidia-cusparse-cu12" version = "12.5.8.93" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/c2/f5/e1854cb2f2bcd4280c44736c93550cc300ff4b8c95ebe370d0aa7d2b473d/nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ec05d76bbbd8b61b06a80e1eaf8cf4959c3d4ce8e711b65ebd0443bb0ebb13b", size = 288216466, upload-time = "2025-03-07T01:48:13.779Z" }, From da54feb99ba5343d98d8b44ee96a53c830f6ad10 Mon Sep 17 00:00:00 2001 From: Jeff Hykin Date: Sun, 11 Jan 2026 19:32:09 -0800 Subject: [PATCH 2/8] fix rerun being missing (temp fix for launch) --- pyproject.toml | 4 ++++ uv.lock | 2 ++ 2 files changed, 6 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index ec144deedd..49fa3eb466 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -64,6 +64,10 @@ dependencies = [ # Used for calculating the occupancy map. "numba>=0.60.0", # First version supporting Python 3.12 "llvmlite>=0.42.0", # Required by numba 0.60+ + + # TODO: rerun shouldn't be required but rn its in core (there is NO WAY to use dimos without rerun rn) + # remove this once rerun is optional in core + "rerun-sdk>=0.20.0", ] diff --git a/uv.lock b/uv.lock index 0e1bfa7af9..b6038722f5 100644 --- a/uv.lock +++ b/uv.lock @@ -1472,6 +1472,7 @@ dependencies = [ { name = "python-dotenv" }, { name = "pyturbojpeg" }, { name = "reactivex" }, + { name = "rerun-sdk" }, { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "scipy", version = "1.16.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sortedcontainers" }, @@ -1773,6 +1774,7 @@ requires-dist = [ { name = "reactivex" }, { name = "regex", marker = "extra == 'cuda'" }, { name = "requests-mock", marker = "extra == 'dev'", specifier = "==1.12.1" }, + { name = "rerun-sdk", specifier = ">=0.20.0" }, { name = "rerun-sdk", marker = "extra == 'visualization'", specifier = ">=0.20.0" }, { name = "rtree", marker = "extra == 'manipulation'" }, { name = "ruff", marker = "extra == 'dev'", specifier = "==0.14.3" }, From 88389a99077e5e432da1d1de01b0b8dc1f2cd2a5 Mon Sep 17 00:00:00 2001 From: Jeff Hykin Date: Mon, 12 Jan 2026 18:22:50 -0800 Subject: [PATCH 3/8] - --- pyproject.toml | 4 +-- rerun.py | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++ uv.lock | 62 ++++++++++++++++++++++----------------------- 3 files changed, 101 insertions(+), 33 deletions(-) create mode 100644 rerun.py diff --git a/pyproject.toml b/pyproject.toml index 49fa3eb466..745c1efe12 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -166,7 +166,7 @@ perception = [ ] unitree = [ - "dimos[main]", + "dimos[base]", "unitree-webrtc-connect-leshy>=2.0.7" ] @@ -275,7 +275,7 @@ drone = [ "pymavlink" ] -main = [ +base = [ "dimos[agents,web,perception,visualization]", ] diff --git a/rerun.py b/rerun.py new file mode 100644 index 0000000000..901d0fe7d8 --- /dev/null +++ b/rerun.py @@ -0,0 +1,68 @@ +# Copyright 2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from dashboard import RerunConnect, RerunOptions, rerun_module + +import rerun as rr + + +# basic +class Mod1(Module): + color_image: Out[Image] = RerunOptions(entity="color_image", rate_limit=1 / 60) + depth_image: Out[Image] = RerunOptions(disable=True) + + def __init__(self, *args, **kwargs) -> None: + super().__init__(*args, **kwargs) + + ... + + +# full custom +class Mod2(Module): + color_image: Out[Image] = None + + def __init__(self, *args, **kwargs) -> None: + super().__init__(*args, **kwargs) + + @rpc + def start(self) -> None: + super().start() + + self.rc = RerunConnect(self) # forces rr.init to happen + self.color_cycle = 0 + + def callback_func(img: Image) -> None: + self.color_cycle += 1 + if self.color_cycle > 10: + self.color_cycle = 0 + + customized_image = img.hue_shift(offset=self.color_cycle * 0.1 * 256) + self.rc.log("cam1/color", customized_image.to_rerun()) + + ... + + +# LATER: enable custom rrb.blueprints (layout) +# LATER: get rid of RerunConnect (just use rr.log thanks to rr.init inside of dimos core) + +autoconnect( + Mod1.blueprint(), + Mod2.blueprint(), + # rerun only ope up if added here: + rerun_module( + open_rerun=True, + open_browser=False, + disabled=False, + ), +).build().loop() diff --git a/uv.lock b/uv.lock index b6038722f5..fed1cbad42 100644 --- a/uv.lock +++ b/uv.lock @@ -1499,6 +1499,34 @@ agents = [ { name = "openai-whisper" }, { name = "sounddevice" }, ] +base = [ + { name = "anthropic" }, + { name = "bitsandbytes", marker = "sys_platform == 'linux'" }, + { name = "fastapi" }, + { name = "ffmpeg-python" }, + { name = "filterpy" }, + { name = "langchain" }, + { name = "langchain-chroma" }, + { name = "langchain-core" }, + { name = "langchain-huggingface" }, + { name = "langchain-ollama" }, + { name = "langchain-openai" }, + { name = "langchain-text-splitters" }, + { name = "lap" }, + { name = "mcp" }, + { name = "moondream" }, + { name = "ollama" }, + { name = "openai" }, + { name = "openai-whisper" }, + { name = "pillow" }, + { name = "rerun-sdk" }, + { name = "sounddevice" }, + { name = "soundfile" }, + { name = "sse-starlette" }, + { name = "transformers", extra = ["torch"] }, + { name = "ultralytics" }, + { name = "uvicorn" }, +] cpu = [ { name = "ctransformers" }, { name = "onnxruntime" }, @@ -1556,34 +1584,6 @@ dev = [ drone = [ { name = "pymavlink" }, ] -main = [ - { name = "anthropic" }, - { name = "bitsandbytes", marker = "sys_platform == 'linux'" }, - { name = "fastapi" }, - { name = "ffmpeg-python" }, - { name = "filterpy" }, - { name = "langchain" }, - { name = "langchain-chroma" }, - { name = "langchain-core" }, - { name = "langchain-huggingface" }, - { name = "langchain-ollama" }, - { name = "langchain-openai" }, - { name = "langchain-text-splitters" }, - { name = "lap" }, - { name = "mcp" }, - { name = "moondream" }, - { name = "ollama" }, - { name = "openai" }, - { name = "openai-whisper" }, - { name = "pillow" }, - { name = "rerun-sdk" }, - { name = "sounddevice" }, - { name = "soundfile" }, - { name = "sse-starlette" }, - { name = "transformers", extra = ["torch"] }, - { name = "ultralytics" }, - { name = "uvicorn" }, -] manipulation = [ { name = "contact-graspnet-pytorch" }, { name = "h5py" }, @@ -1697,8 +1697,8 @@ requires-dist = [ { name = "dask", extras = ["complete"], specifier = "==2025.5.1" }, { name = "dataclasses", marker = "extra == 'cuda'" }, { name = "detectron2", marker = "extra == 'cuda'", git = "https://github.com/facebookresearch/detectron2.git?tag=v0.6" }, - { name = "dimos", extras = ["agents", "web", "perception", "visualization"], marker = "extra == 'main'" }, - { name = "dimos", extras = ["main"], marker = "extra == 'unitree'" }, + { name = "dimos", extras = ["agents", "web", "perception", "visualization"], marker = "extra == 'base'" }, + { name = "dimos", extras = ["base"], marker = "extra == 'unitree'" }, { name = "dimos-lcm" }, { name = "einops", marker = "extra == 'misc'", specifier = "==0.8.1" }, { name = "empy", marker = "extra == 'misc'", specifier = "==3.3.4" }, @@ -1823,7 +1823,7 @@ requires-dist = [ { name = "xformers", marker = "extra == 'cuda'", specifier = ">=0.0.20" }, { name = "yapf", marker = "extra == 'misc'", specifier = "==0.40.2" }, ] -provides-extras = ["misc", "visualization", "agents", "web", "perception", "unitree", "manipulation", "cpu", "cuda", "dev", "sim", "drone", "main"] +provides-extras = ["misc", "visualization", "agents", "web", "perception", "unitree", "manipulation", "cpu", "cuda", "dev", "sim", "drone", "base"] [[package]] name = "dimos-lcm" From 3d08156b1a909cbc2d8cd5f6f254df5aefe852aa Mon Sep 17 00:00:00 2001 From: jeff-hykin <17692058+jeff-hykin@users.noreply.github.com> Date: Tue, 13 Jan 2026 02:23:25 +0000 Subject: [PATCH 4/8] CI code cleanup --- dimos/core/blueprints.py | 2 +- dimos/dashboard/rerun_init.py | 3 +-- dimos/dashboard/tf_rerun_module.py | 3 +-- dimos/mapping/costmapper.py | 2 +- dimos/mapping/voxels.py | 2 +- dimos/msgs/geometry_msgs/PoseStamped.py | 2 +- dimos/msgs/geometry_msgs/Transform.py | 3 +-- dimos/msgs/nav_msgs/OccupancyGrid.py | 2 +- dimos/msgs/nav_msgs/Path.py | 3 +-- dimos/msgs/sensor_msgs/CameraInfo.py | 1 + dimos/msgs/sensor_msgs/PointCloud2.py | 2 +- dimos/msgs/sensor_msgs/image_impls/AbstractImage.py | 1 + dimos/navigation/replanning_a_star/module.py | 2 +- dimos/robot/unitree/connection/go2.py | 2 +- dimos/utils/metrics.py | 2 +- 15 files changed, 15 insertions(+), 17 deletions(-) diff --git a/dimos/core/blueprints.py b/dimos/core/blueprints.py index 1fa51629bf..fda0489d5d 100644 --- a/dimos/core/blueprints.py +++ b/dimos/core/blueprints.py @@ -23,7 +23,6 @@ from types import MappingProxyType from typing import Any, Literal, get_args, get_origin, get_type_hints -import rerun as rr import rerun.blueprint as rrb from dimos.core.global_config import GlobalConfig @@ -33,6 +32,7 @@ from dimos.core.transport import LCMTransport, pLCMTransport from dimos.utils.generic import short_id from dimos.utils.logging_config import setup_logger +import rerun as rr logger = setup_logger() diff --git a/dimos/dashboard/rerun_init.py b/dimos/dashboard/rerun_init.py index 4ccec8209d..344649624e 100644 --- a/dimos/dashboard/rerun_init.py +++ b/dimos/dashboard/rerun_init.py @@ -47,10 +47,9 @@ import atexit import threading -import rerun as rr - from dimos.core.global_config import GlobalConfig from dimos.utils.logging_config import setup_logger +import rerun as rr logger = setup_logger() diff --git a/dimos/dashboard/tf_rerun_module.py b/dimos/dashboard/tf_rerun_module.py index c862778cad..a9d3471fe7 100644 --- a/dimos/dashboard/tf_rerun_module.py +++ b/dimos/dashboard/tf_rerun_module.py @@ -31,14 +31,13 @@ def my_robot(): from typing import Any -import rerun as rr - from dimos.core import Module, rpc from dimos.core.global_config import GlobalConfig from dimos.dashboard.rerun_init import connect_rerun from dimos.msgs.tf2_msgs import TFMessage from dimos.protocol.pubsub.lcmpubsub import LCM, Topic from dimos.utils.logging_config import setup_logger +import rerun as rr logger = setup_logger() diff --git a/dimos/mapping/costmapper.py b/dimos/mapping/costmapper.py index ee7512baba..34fd3d5d7e 100644 --- a/dimos/mapping/costmapper.py +++ b/dimos/mapping/costmapper.py @@ -18,7 +18,6 @@ import time from reactivex import operators as ops -import rerun as rr import rerun.blueprint as rrb from dimos.core import In, Module, Out, rpc @@ -33,6 +32,7 @@ from dimos.msgs.nav_msgs import OccupancyGrid from dimos.msgs.sensor_msgs import PointCloud2 from dimos.utils.logging_config import setup_logger +import rerun as rr logger = setup_logger() diff --git a/dimos/mapping/voxels.py b/dimos/mapping/voxels.py index a36dc9bc17..649b384ac5 100644 --- a/dimos/mapping/voxels.py +++ b/dimos/mapping/voxels.py @@ -23,7 +23,6 @@ from reactivex import interval, operators as ops from reactivex.disposable import Disposable from reactivex.subject import Subject -import rerun as rr import rerun.blueprint as rrb from dimos.core import In, Module, Out, rpc @@ -35,6 +34,7 @@ from dimos.utils.decorators import simple_mcache from dimos.utils.logging_config import setup_logger from dimos.utils.reactive import backpressure +import rerun as rr logger = setup_logger() diff --git a/dimos/msgs/geometry_msgs/PoseStamped.py b/dimos/msgs/geometry_msgs/PoseStamped.py index 406c5d7ac7..ee28717f63 100644 --- a/dimos/msgs/geometry_msgs/PoseStamped.py +++ b/dimos/msgs/geometry_msgs/PoseStamped.py @@ -27,13 +27,13 @@ except ImportError: ROSPoseStamped = None # type: ignore[assignment, misc] from plum import dispatch -import rerun as rr from dimos.msgs.geometry_msgs.Pose import Pose from dimos.msgs.geometry_msgs.Quaternion import Quaternion, QuaternionConvertable from dimos.msgs.geometry_msgs.Transform import Transform from dimos.msgs.geometry_msgs.Vector3 import Vector3, VectorConvertable from dimos.types.timestamped import Timestamped +import rerun as rr # Types that can be converted to/from Pose PoseConvertable: TypeAlias = ( diff --git a/dimos/msgs/geometry_msgs/Transform.py b/dimos/msgs/geometry_msgs/Transform.py index 3a52f5a8c0..f9cbce43df 100644 --- a/dimos/msgs/geometry_msgs/Transform.py +++ b/dimos/msgs/geometry_msgs/Transform.py @@ -34,12 +34,11 @@ ROSTransform = None # type: ignore[assignment, misc] ROSVector3 = None # type: ignore[assignment, misc] ROSQuaternion = None # type: ignore[assignment, misc] -import rerun as rr - from dimos.msgs.geometry_msgs.Quaternion import Quaternion from dimos.msgs.geometry_msgs.Vector3 import Vector3 from dimos.msgs.std_msgs import Header from dimos.types.timestamped import Timestamped +import rerun as rr class Transform(Timestamped): diff --git a/dimos/msgs/nav_msgs/OccupancyGrid.py b/dimos/msgs/nav_msgs/OccupancyGrid.py index 3876b44fab..35cfa1234e 100644 --- a/dimos/msgs/nav_msgs/OccupancyGrid.py +++ b/dimos/msgs/nav_msgs/OccupancyGrid.py @@ -27,10 +27,10 @@ import matplotlib.pyplot as plt import numpy as np from PIL import Image -import rerun as rr from dimos.msgs.geometry_msgs import Pose, Vector3, VectorLike from dimos.types.timestamped import Timestamped +import rerun as rr @lru_cache(maxsize=16) diff --git a/dimos/msgs/nav_msgs/Path.py b/dimos/msgs/nav_msgs/Path.py index e92eab17a4..7a8f01afd4 100644 --- a/dimos/msgs/nav_msgs/Path.py +++ b/dimos/msgs/nav_msgs/Path.py @@ -30,10 +30,9 @@ from nav_msgs.msg import Path as ROSPath # type: ignore[attr-defined] except ImportError: ROSPath = None # type: ignore[assignment, misc] -import rerun as rr - from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped from dimos.types.timestamped import Timestamped +import rerun as rr if TYPE_CHECKING: from collections.abc import Iterator diff --git a/dimos/msgs/sensor_msgs/CameraInfo.py b/dimos/msgs/sensor_msgs/CameraInfo.py index b6f85dbaca..60ad296eea 100644 --- a/dimos/msgs/sensor_msgs/CameraInfo.py +++ b/dimos/msgs/sensor_msgs/CameraInfo.py @@ -20,6 +20,7 @@ from dimos_lcm.sensor_msgs import CameraInfo as LCMCameraInfo from dimos_lcm.std_msgs.Header import Header import numpy as np + import rerun as rr # Import ROS types diff --git a/dimos/msgs/sensor_msgs/PointCloud2.py b/dimos/msgs/sensor_msgs/PointCloud2.py index 1f048d5eaf..9a54b77701 100644 --- a/dimos/msgs/sensor_msgs/PointCloud2.py +++ b/dimos/msgs/sensor_msgs/PointCloud2.py @@ -27,9 +27,9 @@ import numpy as np import open3d as o3d # type: ignore[import-untyped] import open3d.core as o3c # type: ignore[import-untyped] -import rerun as rr from dimos.msgs.geometry_msgs import Transform, Vector3 +import rerun as rr # Import ROS types try: diff --git a/dimos/msgs/sensor_msgs/image_impls/AbstractImage.py b/dimos/msgs/sensor_msgs/image_impls/AbstractImage.py index f5d92a3bc6..48217c030f 100644 --- a/dimos/msgs/sensor_msgs/image_impls/AbstractImage.py +++ b/dimos/msgs/sensor_msgs/image_impls/AbstractImage.py @@ -22,6 +22,7 @@ import cv2 import numpy as np + import rerun as rr try: diff --git a/dimos/navigation/replanning_a_star/module.py b/dimos/navigation/replanning_a_star/module.py index 6ba1ae0ba1..a15f1d3b65 100644 --- a/dimos/navigation/replanning_a_star/module.py +++ b/dimos/navigation/replanning_a_star/module.py @@ -16,7 +16,6 @@ from dimos_lcm.std_msgs import Bool, String from reactivex.disposable import Disposable -import rerun as rr from dimos.core import In, Module, Out, rpc from dimos.core.global_config import GlobalConfig @@ -26,6 +25,7 @@ from dimos.msgs.sensor_msgs import Image from dimos.navigation.base import NavigationInterface, NavigationState from dimos.navigation.replanning_a_star.global_planner import GlobalPlanner +import rerun as rr class ReplanningAStarPlanner(Module, NavigationInterface): diff --git a/dimos/robot/unitree/connection/go2.py b/dimos/robot/unitree/connection/go2.py index 34f81e2bbf..1414c42c38 100644 --- a/dimos/robot/unitree/connection/go2.py +++ b/dimos/robot/unitree/connection/go2.py @@ -20,7 +20,6 @@ from reactivex.disposable import Disposable from reactivex.observable import Observable -import rerun as rr import rerun.blueprint as rrb from dimos import spec @@ -41,6 +40,7 @@ from dimos.utils.decorators.decorators import simple_mcache from dimos.utils.logging_config import setup_logger from dimos.utils.testing import TimedSensorReplay, TimedSensorStorage +import rerun as rr logger = setup_logger(level=logging.INFO) diff --git a/dimos/utils/metrics.py b/dimos/utils/metrics.py index bf7bf45cdc..3bb63012e5 100644 --- a/dimos/utils/metrics.py +++ b/dimos/utils/metrics.py @@ -18,9 +18,9 @@ from typing import Any, TypeVar, cast from dimos_lcm.std_msgs import Float32 -import rerun as rr from dimos.core import LCMTransport, Transport +import rerun as rr F = TypeVar("F", bound=Callable[..., Any]) From eb8dbbec2e69882e08cda6aecb871654d197ea2a Mon Sep 17 00:00:00 2001 From: Jeff Hykin Date: Mon, 12 Jan 2026 18:41:28 -0800 Subject: [PATCH 5/8] remove temp --- rerun.py | 68 -------------------------------------------------------- 1 file changed, 68 deletions(-) delete mode 100644 rerun.py diff --git a/rerun.py b/rerun.py deleted file mode 100644 index 901d0fe7d8..0000000000 --- a/rerun.py +++ /dev/null @@ -1,68 +0,0 @@ -# Copyright 2026 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from dashboard import RerunConnect, RerunOptions, rerun_module - -import rerun as rr - - -# basic -class Mod1(Module): - color_image: Out[Image] = RerunOptions(entity="color_image", rate_limit=1 / 60) - depth_image: Out[Image] = RerunOptions(disable=True) - - def __init__(self, *args, **kwargs) -> None: - super().__init__(*args, **kwargs) - - ... - - -# full custom -class Mod2(Module): - color_image: Out[Image] = None - - def __init__(self, *args, **kwargs) -> None: - super().__init__(*args, **kwargs) - - @rpc - def start(self) -> None: - super().start() - - self.rc = RerunConnect(self) # forces rr.init to happen - self.color_cycle = 0 - - def callback_func(img: Image) -> None: - self.color_cycle += 1 - if self.color_cycle > 10: - self.color_cycle = 0 - - customized_image = img.hue_shift(offset=self.color_cycle * 0.1 * 256) - self.rc.log("cam1/color", customized_image.to_rerun()) - - ... - - -# LATER: enable custom rrb.blueprints (layout) -# LATER: get rid of RerunConnect (just use rr.log thanks to rr.init inside of dimos core) - -autoconnect( - Mod1.blueprint(), - Mod2.blueprint(), - # rerun only ope up if added here: - rerun_module( - open_rerun=True, - open_browser=False, - disabled=False, - ), -).build().loop() From 438320d65ecf8bc72cafe98ce04b7dc6a86701b4 Mon Sep 17 00:00:00 2001 From: jeff-hykin <17692058+jeff-hykin@users.noreply.github.com> Date: Tue, 13 Jan 2026 02:42:08 +0000 Subject: [PATCH 6/8] CI code cleanup --- dimos/core/blueprints.py | 2 +- dimos/dashboard/rerun_init.py | 3 ++- dimos/dashboard/tf_rerun_module.py | 3 ++- dimos/mapping/costmapper.py | 2 +- dimos/mapping/voxels.py | 2 +- dimos/msgs/geometry_msgs/PoseStamped.py | 2 +- dimos/msgs/geometry_msgs/Transform.py | 3 ++- dimos/msgs/nav_msgs/OccupancyGrid.py | 2 +- dimos/msgs/nav_msgs/Path.py | 3 ++- dimos/msgs/sensor_msgs/CameraInfo.py | 1 - dimos/msgs/sensor_msgs/PointCloud2.py | 2 +- dimos/msgs/sensor_msgs/image_impls/AbstractImage.py | 1 - dimos/navigation/replanning_a_star/module.py | 2 +- dimos/robot/unitree/connection/go2.py | 2 +- dimos/utils/metrics.py | 2 +- 15 files changed, 17 insertions(+), 15 deletions(-) diff --git a/dimos/core/blueprints.py b/dimos/core/blueprints.py index fda0489d5d..1fa51629bf 100644 --- a/dimos/core/blueprints.py +++ b/dimos/core/blueprints.py @@ -23,6 +23,7 @@ from types import MappingProxyType from typing import Any, Literal, get_args, get_origin, get_type_hints +import rerun as rr import rerun.blueprint as rrb from dimos.core.global_config import GlobalConfig @@ -32,7 +33,6 @@ from dimos.core.transport import LCMTransport, pLCMTransport from dimos.utils.generic import short_id from dimos.utils.logging_config import setup_logger -import rerun as rr logger = setup_logger() diff --git a/dimos/dashboard/rerun_init.py b/dimos/dashboard/rerun_init.py index 344649624e..4ccec8209d 100644 --- a/dimos/dashboard/rerun_init.py +++ b/dimos/dashboard/rerun_init.py @@ -47,9 +47,10 @@ import atexit import threading +import rerun as rr + from dimos.core.global_config import GlobalConfig from dimos.utils.logging_config import setup_logger -import rerun as rr logger = setup_logger() diff --git a/dimos/dashboard/tf_rerun_module.py b/dimos/dashboard/tf_rerun_module.py index a9d3471fe7..c862778cad 100644 --- a/dimos/dashboard/tf_rerun_module.py +++ b/dimos/dashboard/tf_rerun_module.py @@ -31,13 +31,14 @@ def my_robot(): from typing import Any +import rerun as rr + from dimos.core import Module, rpc from dimos.core.global_config import GlobalConfig from dimos.dashboard.rerun_init import connect_rerun from dimos.msgs.tf2_msgs import TFMessage from dimos.protocol.pubsub.lcmpubsub import LCM, Topic from dimos.utils.logging_config import setup_logger -import rerun as rr logger = setup_logger() diff --git a/dimos/mapping/costmapper.py b/dimos/mapping/costmapper.py index 34fd3d5d7e..ee7512baba 100644 --- a/dimos/mapping/costmapper.py +++ b/dimos/mapping/costmapper.py @@ -18,6 +18,7 @@ import time from reactivex import operators as ops +import rerun as rr import rerun.blueprint as rrb from dimos.core import In, Module, Out, rpc @@ -32,7 +33,6 @@ from dimos.msgs.nav_msgs import OccupancyGrid from dimos.msgs.sensor_msgs import PointCloud2 from dimos.utils.logging_config import setup_logger -import rerun as rr logger = setup_logger() diff --git a/dimos/mapping/voxels.py b/dimos/mapping/voxels.py index 649b384ac5..a36dc9bc17 100644 --- a/dimos/mapping/voxels.py +++ b/dimos/mapping/voxels.py @@ -23,6 +23,7 @@ from reactivex import interval, operators as ops from reactivex.disposable import Disposable from reactivex.subject import Subject +import rerun as rr import rerun.blueprint as rrb from dimos.core import In, Module, Out, rpc @@ -34,7 +35,6 @@ from dimos.utils.decorators import simple_mcache from dimos.utils.logging_config import setup_logger from dimos.utils.reactive import backpressure -import rerun as rr logger = setup_logger() diff --git a/dimos/msgs/geometry_msgs/PoseStamped.py b/dimos/msgs/geometry_msgs/PoseStamped.py index ee28717f63..406c5d7ac7 100644 --- a/dimos/msgs/geometry_msgs/PoseStamped.py +++ b/dimos/msgs/geometry_msgs/PoseStamped.py @@ -27,13 +27,13 @@ except ImportError: ROSPoseStamped = None # type: ignore[assignment, misc] from plum import dispatch +import rerun as rr from dimos.msgs.geometry_msgs.Pose import Pose from dimos.msgs.geometry_msgs.Quaternion import Quaternion, QuaternionConvertable from dimos.msgs.geometry_msgs.Transform import Transform from dimos.msgs.geometry_msgs.Vector3 import Vector3, VectorConvertable from dimos.types.timestamped import Timestamped -import rerun as rr # Types that can be converted to/from Pose PoseConvertable: TypeAlias = ( diff --git a/dimos/msgs/geometry_msgs/Transform.py b/dimos/msgs/geometry_msgs/Transform.py index f9cbce43df..3a52f5a8c0 100644 --- a/dimos/msgs/geometry_msgs/Transform.py +++ b/dimos/msgs/geometry_msgs/Transform.py @@ -34,11 +34,12 @@ ROSTransform = None # type: ignore[assignment, misc] ROSVector3 = None # type: ignore[assignment, misc] ROSQuaternion = None # type: ignore[assignment, misc] +import rerun as rr + from dimos.msgs.geometry_msgs.Quaternion import Quaternion from dimos.msgs.geometry_msgs.Vector3 import Vector3 from dimos.msgs.std_msgs import Header from dimos.types.timestamped import Timestamped -import rerun as rr class Transform(Timestamped): diff --git a/dimos/msgs/nav_msgs/OccupancyGrid.py b/dimos/msgs/nav_msgs/OccupancyGrid.py index 35cfa1234e..3876b44fab 100644 --- a/dimos/msgs/nav_msgs/OccupancyGrid.py +++ b/dimos/msgs/nav_msgs/OccupancyGrid.py @@ -27,10 +27,10 @@ import matplotlib.pyplot as plt import numpy as np from PIL import Image +import rerun as rr from dimos.msgs.geometry_msgs import Pose, Vector3, VectorLike from dimos.types.timestamped import Timestamped -import rerun as rr @lru_cache(maxsize=16) diff --git a/dimos/msgs/nav_msgs/Path.py b/dimos/msgs/nav_msgs/Path.py index 7a8f01afd4..e92eab17a4 100644 --- a/dimos/msgs/nav_msgs/Path.py +++ b/dimos/msgs/nav_msgs/Path.py @@ -30,9 +30,10 @@ from nav_msgs.msg import Path as ROSPath # type: ignore[attr-defined] except ImportError: ROSPath = None # type: ignore[assignment, misc] +import rerun as rr + from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped from dimos.types.timestamped import Timestamped -import rerun as rr if TYPE_CHECKING: from collections.abc import Iterator diff --git a/dimos/msgs/sensor_msgs/CameraInfo.py b/dimos/msgs/sensor_msgs/CameraInfo.py index 60ad296eea..b6f85dbaca 100644 --- a/dimos/msgs/sensor_msgs/CameraInfo.py +++ b/dimos/msgs/sensor_msgs/CameraInfo.py @@ -20,7 +20,6 @@ from dimos_lcm.sensor_msgs import CameraInfo as LCMCameraInfo from dimos_lcm.std_msgs.Header import Header import numpy as np - import rerun as rr # Import ROS types diff --git a/dimos/msgs/sensor_msgs/PointCloud2.py b/dimos/msgs/sensor_msgs/PointCloud2.py index 9a54b77701..1f048d5eaf 100644 --- a/dimos/msgs/sensor_msgs/PointCloud2.py +++ b/dimos/msgs/sensor_msgs/PointCloud2.py @@ -27,9 +27,9 @@ import numpy as np import open3d as o3d # type: ignore[import-untyped] import open3d.core as o3c # type: ignore[import-untyped] +import rerun as rr from dimos.msgs.geometry_msgs import Transform, Vector3 -import rerun as rr # Import ROS types try: diff --git a/dimos/msgs/sensor_msgs/image_impls/AbstractImage.py b/dimos/msgs/sensor_msgs/image_impls/AbstractImage.py index 48217c030f..f5d92a3bc6 100644 --- a/dimos/msgs/sensor_msgs/image_impls/AbstractImage.py +++ b/dimos/msgs/sensor_msgs/image_impls/AbstractImage.py @@ -22,7 +22,6 @@ import cv2 import numpy as np - import rerun as rr try: diff --git a/dimos/navigation/replanning_a_star/module.py b/dimos/navigation/replanning_a_star/module.py index a15f1d3b65..6ba1ae0ba1 100644 --- a/dimos/navigation/replanning_a_star/module.py +++ b/dimos/navigation/replanning_a_star/module.py @@ -16,6 +16,7 @@ from dimos_lcm.std_msgs import Bool, String from reactivex.disposable import Disposable +import rerun as rr from dimos.core import In, Module, Out, rpc from dimos.core.global_config import GlobalConfig @@ -25,7 +26,6 @@ from dimos.msgs.sensor_msgs import Image from dimos.navigation.base import NavigationInterface, NavigationState from dimos.navigation.replanning_a_star.global_planner import GlobalPlanner -import rerun as rr class ReplanningAStarPlanner(Module, NavigationInterface): diff --git a/dimos/robot/unitree/connection/go2.py b/dimos/robot/unitree/connection/go2.py index 1414c42c38..34f81e2bbf 100644 --- a/dimos/robot/unitree/connection/go2.py +++ b/dimos/robot/unitree/connection/go2.py @@ -20,6 +20,7 @@ from reactivex.disposable import Disposable from reactivex.observable import Observable +import rerun as rr import rerun.blueprint as rrb from dimos import spec @@ -40,7 +41,6 @@ from dimos.utils.decorators.decorators import simple_mcache from dimos.utils.logging_config import setup_logger from dimos.utils.testing import TimedSensorReplay, TimedSensorStorage -import rerun as rr logger = setup_logger(level=logging.INFO) diff --git a/dimos/utils/metrics.py b/dimos/utils/metrics.py index 3bb63012e5..bf7bf45cdc 100644 --- a/dimos/utils/metrics.py +++ b/dimos/utils/metrics.py @@ -18,9 +18,9 @@ from typing import Any, TypeVar, cast from dimos_lcm.std_msgs import Float32 +import rerun as rr from dimos.core import LCMTransport, Transport -import rerun as rr F = TypeVar("F", bound=Callable[..., Any]) From 920b6d6da1d6080e96190f98feec80896475da66 Mon Sep 17 00:00:00 2001 From: Jeff Hykin Date: Mon, 12 Jan 2026 18:43:48 -0800 Subject: [PATCH 7/8] revert weird CI thing --- dimos/msgs/sensor_msgs/CameraInfo.py | 1 - dimos/msgs/sensor_msgs/PointCloud2.py | 1 - 2 files changed, 2 deletions(-) diff --git a/dimos/msgs/sensor_msgs/CameraInfo.py b/dimos/msgs/sensor_msgs/CameraInfo.py index 45ec501064..855276b4e6 100644 --- a/dimos/msgs/sensor_msgs/CameraInfo.py +++ b/dimos/msgs/sensor_msgs/CameraInfo.py @@ -20,7 +20,6 @@ from dimos_lcm.sensor_msgs import CameraInfo as LCMCameraInfo from dimos_lcm.std_msgs.Header import Header import numpy as np -import rerun as rr # Import ROS types try: diff --git a/dimos/msgs/sensor_msgs/PointCloud2.py b/dimos/msgs/sensor_msgs/PointCloud2.py index fc90f048b8..772ddad7ab 100644 --- a/dimos/msgs/sensor_msgs/PointCloud2.py +++ b/dimos/msgs/sensor_msgs/PointCloud2.py @@ -26,7 +26,6 @@ import numpy as np import open3d as o3d # type: ignore[import-untyped] import open3d.core as o3c # type: ignore[import-untyped] -import rerun as rr from dimos.msgs.geometry_msgs import Transform, Vector3 From 8ab5c1c683a412a885c6f392c01b2b50b7ed4479 Mon Sep 17 00:00:00 2001 From: Jeff Hykin Date: Mon, 12 Jan 2026 21:14:52 -0800 Subject: [PATCH 8/8] - --- pyproject.toml | 5 ++--- uv.lock | 12 +++++++++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 745c1efe12..398adeca20 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -117,8 +117,6 @@ misc = [ "onnx", "einops==0.8.1", - # Teleop - "pygame>=2.6.1", # Hardware SDKs "xarm-python-sdk>=1.17.0", ] @@ -259,6 +257,7 @@ sim = [ # Simulation "mujoco>=3.3.4", "playground>=0.0.5", + "pygame>=2.6.1", ] # NOTE: jetson-jp6-cuda126 extra is disabled due to 404 errors from wheel URLs @@ -276,7 +275,7 @@ drone = [ ] base = [ - "dimos[agents,web,perception,visualization]", + "dimos[agents,web,perception,visualization,sim]", ] [tool.ruff] diff --git a/uv.lock b/uv.lock index fed1cbad42..5adc2cc5d3 100644 --- a/uv.lock +++ b/uv.lock @@ -1515,10 +1515,13 @@ base = [ { name = "lap" }, { name = "mcp" }, { name = "moondream" }, + { name = "mujoco" }, { name = "ollama" }, { name = "openai" }, { name = "openai-whisper" }, { name = "pillow" }, + { name = "playground" }, + { name = "pygame" }, { name = "rerun-sdk" }, { name = "sounddevice" }, { name = "soundfile" }, @@ -1613,7 +1616,6 @@ misc = [ { name = "onnx" }, { name = "open-clip-torch" }, { name = "opencv-contrib-python" }, - { name = "pygame" }, { name = "python-multipart" }, { name = "scikit-learn", version = "1.7.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "scikit-learn", version = "1.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, @@ -1638,6 +1640,7 @@ perception = [ sim = [ { name = "mujoco" }, { name = "playground" }, + { name = "pygame" }, ] unitree = [ { name = "anthropic" }, @@ -1655,10 +1658,13 @@ unitree = [ { name = "lap" }, { name = "mcp" }, { name = "moondream" }, + { name = "mujoco" }, { name = "ollama" }, { name = "openai" }, { name = "openai-whisper" }, { name = "pillow" }, + { name = "playground" }, + { name = "pygame" }, { name = "rerun-sdk" }, { name = "sounddevice" }, { name = "soundfile" }, @@ -1697,7 +1703,7 @@ requires-dist = [ { name = "dask", extras = ["complete"], specifier = "==2025.5.1" }, { name = "dataclasses", marker = "extra == 'cuda'" }, { name = "detectron2", marker = "extra == 'cuda'", git = "https://github.com/facebookresearch/detectron2.git?tag=v0.6" }, - { name = "dimos", extras = ["agents", "web", "perception", "visualization"], marker = "extra == 'base'" }, + { name = "dimos", extras = ["agents", "web", "perception", "visualization", "sim"], marker = "extra == 'base'" }, { name = "dimos", extras = ["base"], marker = "extra == 'unitree'" }, { name = "dimos-lcm" }, { name = "einops", marker = "extra == 'misc'", specifier = "==0.8.1" }, @@ -1757,7 +1763,7 @@ requires-dist = [ { name = "pre-commit", marker = "extra == 'dev'", specifier = "==4.2.0" }, { name = "pydantic" }, { name = "pydantic-settings", specifier = ">=2.11.0,<3" }, - { name = "pygame", marker = "extra == 'misc'", specifier = ">=2.6.1" }, + { name = "pygame", marker = "extra == 'sim'", specifier = ">=2.6.1" }, { name = "pymavlink", marker = "extra == 'drone'" }, { name = "pyquaternion", marker = "extra == 'manipulation'", specifier = ">=0.9.9" }, { name = "pyrender", marker = "extra == 'manipulation'", specifier = ">=0.1.45" },