diff --git a/.github/workflows/code-cleanup.yml b/.github/workflows/code-cleanup.yml index d9526207a6..48f6ea281e 100644 --- a/.github/workflows/code-cleanup.yml +++ b/.github/workflows/code-cleanup.yml @@ -19,6 +19,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-python@v3 + - uses: astral-sh/setup-uv@v4 - name: Run pre-commit id: pre-commit-first uses: pre-commit/action@v3.0.1 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 40b1877835..96f888be3c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -63,6 +63,13 @@ repos: - repo: local hooks: + - id: uv-lock-check + name: Check uv.lock is up-to-date + entry: uv lock --check + language: system + files: ^pyproject\.toml$ + pass_filenames: false + - id: lfs_check name: LFS data always_run: true diff --git a/dimos/hardware/manipulators/base/components/motion.py b/dimos/hardware/manipulators/base/components/motion.py index a1e31ddca2..90c653d049 100644 --- a/dimos/hardware/manipulators/base/components/motion.py +++ b/dimos/hardware/manipulators/base/components/motion.py @@ -17,7 +17,7 @@ import logging from queue import Queue import time -from typing import Any, Optional +from typing import Any from ..driver import Command from ..sdk_interface import BaseManipulatorSDK @@ -186,7 +186,7 @@ def move_joint_velocity( # Check velocity limits if self.capabilities.max_joint_velocity: - valid, error = validate_velocity_limits( + valid, _error = validate_velocity_limits( velocities, self.capabilities.max_joint_velocity, self.velocity_scale ) if not valid: diff --git a/dimos/hardware/manipulators/base/components/servo.py b/dimos/hardware/manipulators/base/components/servo.py index b7ba6a58fd..b278ab6d4a 100644 --- a/dimos/hardware/manipulators/base/components/servo.py +++ b/dimos/hardware/manipulators/base/components/servo.py @@ -16,7 +16,7 @@ import logging import time -from typing import Any, Optional +from typing import Any from ..sdk_interface import BaseManipulatorSDK from ..spec import ManipulatorCapabilities diff --git a/dimos/hardware/manipulators/base/components/status.py b/dimos/hardware/manipulators/base/components/status.py index cfcdd0553d..d041befcb7 100644 --- a/dimos/hardware/manipulators/base/components/status.py +++ b/dimos/hardware/manipulators/base/components/status.py @@ -15,12 +15,12 @@ """Standard status monitoring component for manipulator drivers.""" from collections import deque -from dataclasses import dataclass, field +from dataclasses import dataclass import logging import time -from typing import Any, Optional +from typing import Any -from ..sdk_interface import BaseManipulatorSDK, ManipulatorInfo +from ..sdk_interface import BaseManipulatorSDK from ..spec import ManipulatorCapabilities from ..utils import SharedState from . import component_api diff --git a/dimos/hardware/manipulators/base/driver.py b/dimos/hardware/manipulators/base/driver.py index cc5aae1f06..8c6d7dbee2 100644 --- a/dimos/hardware/manipulators/base/driver.py +++ b/dimos/hardware/manipulators/base/driver.py @@ -14,19 +14,18 @@ """Base manipulator driver with threading and component management.""" -from abc import ABC from dataclasses import dataclass import logging from queue import Empty, Queue from threading import Event, Thread import time -from typing import Any, Optional +from typing import Any from dimos.core import In, Module, Out, rpc from dimos.msgs.geometry_msgs import WrenchStamped from dimos.msgs.sensor_msgs import JointCommand, JointState, RobotState -from .sdk_interface import BaseManipulatorSDK, ManipulatorInfo +from .sdk_interface import BaseManipulatorSDK from .spec import ManipulatorCapabilities from .utils import SharedState diff --git a/dimos/hardware/manipulators/base/spec.py b/dimos/hardware/manipulators/base/spec.py index 14e03512ac..9c4dc762f3 100644 --- a/dimos/hardware/manipulators/base/spec.py +++ b/dimos/hardware/manipulators/base/spec.py @@ -13,11 +13,10 @@ # limitations under the License. from dataclasses import dataclass -from typing import Any, Optional, Protocol +from typing import Any, Protocol from dimos.core import In, Out -from dimos.msgs.geometry_msgs import PoseStamped, Twist, WrenchStamped -from dimos.msgs.nav_msgs import Path +from dimos.msgs.geometry_msgs import WrenchStamped from dimos.msgs.sensor_msgs import JointCommand, JointState diff --git a/dimos/hardware/manipulators/base/utils/converters.py b/dimos/hardware/manipulators/base/utils/converters.py index c94181a60d..916acb7e8c 100644 --- a/dimos/hardware/manipulators/base/utils/converters.py +++ b/dimos/hardware/manipulators/base/utils/converters.py @@ -15,10 +15,9 @@ """Unit conversion utilities for manipulator drivers.""" import math -from typing import Union -def degrees_to_radians(degrees: Union[float, list[float]]) -> Union[float, list[float]]: +def degrees_to_radians(degrees: float | list[float]) -> float | list[float]: """Convert degrees to radians. Args: @@ -32,7 +31,7 @@ def degrees_to_radians(degrees: Union[float, list[float]]) -> Union[float, list[ return math.radians(degrees) -def radians_to_degrees(radians: Union[float, list[float]]) -> Union[float, list[float]]: +def radians_to_degrees(radians: float | list[float]) -> float | list[float]: """Convert radians to degrees. Args: @@ -46,7 +45,7 @@ def radians_to_degrees(radians: Union[float, list[float]]) -> Union[float, list[ return math.degrees(radians) -def mm_to_meters(mm: Union[float, list[float]]) -> Union[float, list[float]]: +def mm_to_meters(mm: float | list[float]) -> float | list[float]: """Convert millimeters to meters. Args: @@ -60,7 +59,7 @@ def mm_to_meters(mm: Union[float, list[float]]) -> Union[float, list[float]]: return mm / 1000.0 -def meters_to_mm(meters: Union[float, list[float]]) -> Union[float, list[float]]: +def meters_to_mm(meters: float | list[float]) -> float | list[float]: """Convert meters to millimeters. Args: @@ -74,7 +73,7 @@ def meters_to_mm(meters: Union[float, list[float]]) -> Union[float, list[float]] return meters * 1000.0 -def rpm_to_rad_per_sec(rpm: Union[float, list[float]]) -> Union[float, list[float]]: +def rpm_to_rad_per_sec(rpm: float | list[float]) -> float | list[float]: """Convert RPM to rad/s. Args: @@ -89,7 +88,7 @@ def rpm_to_rad_per_sec(rpm: Union[float, list[float]]) -> Union[float, list[floa return rpm * factor -def rad_per_sec_to_rpm(rad_per_sec: Union[float, list[float]]) -> Union[float, list[float]]: +def rad_per_sec_to_rpm(rad_per_sec: float | list[float]) -> float | list[float]: """Convert rad/s to RPM. Args: diff --git a/dimos/hardware/manipulators/base/utils/shared_state.py b/dimos/hardware/manipulators/base/utils/shared_state.py index 1b65834ddf..195462c238 100644 --- a/dimos/hardware/manipulators/base/utils/shared_state.py +++ b/dimos/hardware/manipulators/base/utils/shared_state.py @@ -17,7 +17,7 @@ from dataclasses import dataclass, field from threading import Lock import time -from typing import Any, Optional +from typing import Any @dataclass diff --git a/dimos/hardware/manipulators/base/utils/validators.py b/dimos/hardware/manipulators/base/utils/validators.py index fabbb7f34a..1382f8b65b 100644 --- a/dimos/hardware/manipulators/base/utils/validators.py +++ b/dimos/hardware/manipulators/base/utils/validators.py @@ -14,7 +14,7 @@ """Validation utilities for manipulator drivers.""" -from typing import Any, Optional, cast +from typing import cast def validate_joint_limits( diff --git a/dimos/hardware/manipulators/piper/components/state_queries.py b/dimos/hardware/manipulators/piper/components/state_queries.py index 784b062324..c758e66c4f 100644 --- a/dimos/hardware/manipulators/piper/components/state_queries.py +++ b/dimos/hardware/manipulators/piper/components/state_queries.py @@ -25,7 +25,7 @@ """ import threading -from typing import Any, Optional +from typing import Any from dimos.core import rpc from dimos.msgs.sensor_msgs import JointState, RobotState diff --git a/dimos/hardware/manipulators/piper/piper_driver.py b/dimos/hardware/manipulators/piper/piper_driver.py index 262730bb07..1c3ebed880 100644 --- a/dimos/hardware/manipulators/piper/piper_driver.py +++ b/dimos/hardware/manipulators/piper/piper_driver.py @@ -16,7 +16,7 @@ import logging import time -from typing import Any, Optional +from typing import Any from dimos.hardware.manipulators.base import ( BaseManipulatorDriver, diff --git a/dimos/hardware/manipulators/piper/piper_wrapper.py b/dimos/hardware/manipulators/piper/piper_wrapper.py index 755dd7dae9..48b1ee100f 100644 --- a/dimos/hardware/manipulators/piper/piper_wrapper.py +++ b/dimos/hardware/manipulators/piper/piper_wrapper.py @@ -16,7 +16,7 @@ import logging import time -from typing import Any, Optional +from typing import Any from ..base.sdk_interface import BaseManipulatorSDK, ManipulatorInfo diff --git a/dimos/hardware/manipulators/xarm/components/state_queries.py b/dimos/hardware/manipulators/xarm/components/state_queries.py index d5a7ed80c2..91f8e540aa 100644 --- a/dimos/hardware/manipulators/xarm/components/state_queries.py +++ b/dimos/hardware/manipulators/xarm/components/state_queries.py @@ -23,7 +23,7 @@ """ import threading -from typing import TYPE_CHECKING, Any, Optional +from typing import TYPE_CHECKING, Any from dimos.core import rpc from dimos.msgs.sensor_msgs import JointState, RobotState diff --git a/dimos/hardware/manipulators/xarm/spec.py b/dimos/hardware/manipulators/xarm/spec.py index 8b64607532..aa9f780ce3 100644 --- a/dimos/hardware/manipulators/xarm/spec.py +++ b/dimos/hardware/manipulators/xarm/spec.py @@ -16,9 +16,8 @@ from typing import Protocol from dimos.core import In, Out -from dimos.msgs.geometry_msgs import PoseStamped, Twist, WrenchStamped -from dimos.msgs.nav_msgs import Path -from dimos.msgs.sensor_msgs import JointCommand, JointState, RobotState as RobotStateMsg +from dimos.msgs.geometry_msgs import WrenchStamped +from dimos.msgs.sensor_msgs import JointCommand, JointState @dataclass diff --git a/dimos/hardware/manipulators/xarm/xarm_wrapper.py b/dimos/hardware/manipulators/xarm/xarm_wrapper.py index d89e5b0174..de4a83716c 100644 --- a/dimos/hardware/manipulators/xarm/xarm_wrapper.py +++ b/dimos/hardware/manipulators/xarm/xarm_wrapper.py @@ -16,7 +16,7 @@ import logging import math -from typing import Any, Optional +from typing import Any from ..base.sdk_interface import BaseManipulatorSDK, ManipulatorInfo diff --git a/dimos/hardware/sensors/camera/module.py b/dimos/hardware/sensors/camera/module.py index 145c21bcf9..a14e4c449d 100644 --- a/dimos/hardware/sensors/camera/module.py +++ b/dimos/hardware/sensors/camera/module.py @@ -16,7 +16,6 @@ from dataclasses import dataclass, field import queue import time -from typing import Any, Generic, Literal, Optional, Protocol, TypeVar from dimos_lcm.sensor_msgs import CameraInfo import reactivex as rx @@ -28,7 +27,7 @@ from dimos.agents import Output, Reducer, Stream, skill # type: ignore[attr-defined] from dimos.core import Module, ModuleConfig, Out, rpc from dimos.hardware.sensors.camera.spec import CameraHardware -from dimos.hardware.sensors.camera.webcam import Webcam, WebcamConfig +from dimos.hardware.sensors.camera.webcam import Webcam from dimos.msgs.geometry_msgs import Quaternion, Transform, Vector3 from dimos.msgs.sensor_msgs import Image from dimos.msgs.sensor_msgs.Image import Image, sharpness_barrier diff --git a/dimos/manipulation/control/servo_control/cartesian_motion_controller.py b/dimos/manipulation/control/servo_control/cartesian_motion_controller.py index 407cbd8a6c..e8c2bd793a 100644 --- a/dimos/manipulation/control/servo_control/cartesian_motion_controller.py +++ b/dimos/manipulation/control/servo_control/cartesian_motion_controller.py @@ -30,7 +30,7 @@ import math import threading import time -from typing import Any, Optional +from typing import Any from dimos.core import In, Module, Out, rpc from dimos.core.module import ModuleConfig diff --git a/dimos/manipulation/control/servo_control/example_cartesian_control.py b/dimos/manipulation/control/servo_control/example_cartesian_control.py index 249ec8aa78..9a0987ce60 100644 --- a/dimos/manipulation/control/servo_control/example_cartesian_control.py +++ b/dimos/manipulation/control/servo_control/example_cartesian_control.py @@ -31,7 +31,6 @@ """ import signal -import sys import time from dimos import core diff --git a/dimos/manipulation/control/trajectory_controller/example_trajectory_control.py b/dimos/manipulation/control/trajectory_controller/example_trajectory_control.py index 20c1322922..b272875c5f 100644 --- a/dimos/manipulation/control/trajectory_controller/example_trajectory_control.py +++ b/dimos/manipulation/control/trajectory_controller/example_trajectory_control.py @@ -29,14 +29,13 @@ """ import signal -import sys import time from dimos import core from dimos.hardware.manipulators.xarm import XArmDriver from dimos.manipulation.control import JointTrajectoryController from dimos.msgs.sensor_msgs import JointCommand, JointState, RobotState -from dimos.msgs.trajectory_msgs import JointTrajectory, TrajectoryPoint, TrajectoryState +from dimos.msgs.trajectory_msgs import JointTrajectory, TrajectoryState # Global flag for graceful shutdown shutdown_requested = False diff --git a/dimos/manipulation/control/trajectory_controller/joint_trajectory_controller.py b/dimos/manipulation/control/trajectory_controller/joint_trajectory_controller.py index 09478ae559..d5585cf4d6 100644 --- a/dimos/manipulation/control/trajectory_controller/joint_trajectory_controller.py +++ b/dimos/manipulation/control/trajectory_controller/joint_trajectory_controller.py @@ -330,7 +330,7 @@ def _execution_loop(self) -> None: ) else: # Sample trajectory - q_ref, qd_ref = self._trajectory.sample(t) + q_ref, _qd_ref = self._trajectory.sample(t) # Create and publish command (outside lock would be better but simpler here) cmd = JointCommand(positions=q_ref, timestamp=time.time()) diff --git a/dimos/protocol/skill/coordinator.py b/dimos/protocol/skill/coordinator.py index aa1877a328..40affc2e5a 100644 --- a/dimos/protocol/skill/coordinator.py +++ b/dimos/protocol/skill/coordinator.py @@ -17,7 +17,6 @@ from dataclasses import dataclass from enum import Enum import json -import threading import time from typing import Any, Literal @@ -28,7 +27,7 @@ from rich.text import Text from dimos.core import rpc -from dimos.core.module import Module, ModuleConfig, get_loop +from dimos.core.module import Module, ModuleConfig from dimos.protocol.skill.comms import LCMSkillComms, SkillCommsSpec from dimos.protocol.skill.skill import SkillConfig, SkillContainer # type: ignore[attr-defined] from dimos.protocol.skill.type import MsgType, Output, Reducer, Return, SkillMsg, Stream diff --git a/dimos/simulation/mujoco/input_controller.py b/dimos/simulation/mujoco/input_controller.py index 1db97b9c32..497205ce55 100644 --- a/dimos/simulation/mujoco/input_controller.py +++ b/dimos/simulation/mujoco/input_controller.py @@ -18,8 +18,6 @@ from numpy.typing import NDArray -from dimos.hardware.end_effectors.end_effector import EndEffector - class InputController(Protocol): """A protocol for input devices to control the robot.""" diff --git a/uv.lock b/uv.lock index 0bf380ba7d..11a5612bfb 100644 --- a/uv.lock +++ b/uv.lock @@ -1520,6 +1520,7 @@ dependencies = [ { name = "unitree-webrtc-connect" }, { name = "uvicorn" }, { name = "wasmtime" }, + { name = "xarm-python-sdk" }, { name = "yapf" }, ] @@ -1741,6 +1742,7 @@ requires-dist = [ { name = "unitree-webrtc-connect", git = "https://github.com/leshy/unitree_webrtc_connect.git?rev=2cbb6ce657383c788f4a48d9d87ecf4b9b7dba1d" }, { name = "uvicorn", specifier = ">=0.34.0" }, { name = "wasmtime" }, + { name = "xarm-python-sdk", specifier = ">=1.17.0" }, { name = "xformers", marker = "extra == 'cuda'", specifier = ">=0.0.20" }, { name = "yapf", specifier = "==0.40.2" }, ] @@ -9423,6 +9425,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl", hash = "sha256:61eea322cdf56e8cc904bd3ad7573359a242ba65688716b0710a5eb12beab584", size = 24405, upload-time = "2025-11-20T18:18:00.454Z" }, ] +[[package]] +name = "xarm-python-sdk" +version = "1.17.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/27/dd/073cf64fa9e74cfb97c9ded97750ed4652ada1b4921cd0e7d895ff242f7c/xarm_python_sdk-1.17.3.tar.gz", hash = "sha256:e61b988bc3be684c15f8e686958c00e619e14725130ee94148074b8ef5bd9ec3", size = 215842, upload-time = "2025-12-02T03:09:49.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/0a/85b3df0fa6ddd4f1a9d23cd63948aa145797631c9e20d165ada8e13a058c/xarm_python_sdk-1.17.3-py3-none-any.whl", hash = "sha256:3dee2f9819d54f0ba476ea51ff63f2d1eb248e0658da1b1dcab8c519008955bb", size = 186790, upload-time = "2025-12-02T03:09:47.606Z" }, +] + [[package]] name = "xformers" version = "0.0.33.post2"