From fe43f935532f18144ea1be2c140ba170947ad855 Mon Sep 17 00:00:00 2001 From: Simon Alibert Date: Wed, 4 Jun 2025 11:39:19 +0200 Subject: [PATCH] Remove more code --- lerobot/common/motors/configs.py | 41 --------------------- lerobot/common/motors/utils.py | 56 ---------------------------- tests/conftest.py | 8 +--- tests/utils.py | 63 -------------------------------- 4 files changed, 1 insertion(+), 167 deletions(-) delete mode 100644 lerobot/common/motors/configs.py delete mode 100644 lerobot/common/motors/utils.py diff --git a/lerobot/common/motors/configs.py b/lerobot/common/motors/configs.py deleted file mode 100644 index 0bfbaf83..00000000 --- a/lerobot/common/motors/configs.py +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright 2024 The HuggingFace Inc. team. All rights reserved. -# -# 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. - -import abc -from dataclasses import dataclass - -import draccus - - -@dataclass -class MotorsBusConfig(draccus.ChoiceRegistry, abc.ABC): - @property - def type(self) -> str: - return self.get_choice_name(self.__class__) - - -@MotorsBusConfig.register_subclass("dynamixel") -@dataclass -class DynamixelMotorsBusConfig(MotorsBusConfig): - port: str - motors: dict[str, tuple[int, str]] - mock: bool = False - - -@MotorsBusConfig.register_subclass("feetech") -@dataclass -class FeetechMotorsBusConfig(MotorsBusConfig): - port: str - motors: dict[str, tuple[int, str]] - mock: bool = False diff --git a/lerobot/common/motors/utils.py b/lerobot/common/motors/utils.py deleted file mode 100644 index bfda5bcc..00000000 --- a/lerobot/common/motors/utils.py +++ /dev/null @@ -1,56 +0,0 @@ -# Copyright 2024 The HuggingFace Inc. team. All rights reserved. -# -# 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 .configs import MotorsBusConfig -from .motors_bus import MotorsBus - - -def make_motors_buses_from_configs(motors_bus_configs: dict[str, MotorsBusConfig]) -> list[MotorsBus]: - motors_buses = {} - - for key, cfg in motors_bus_configs.items(): - if cfg.type == "dynamixel": - from .dynamixel import DynamixelMotorsBus - - motors_buses[key] = DynamixelMotorsBus(cfg) - - elif cfg.type == "feetech": - from lerobot.common.motors.feetech.feetech import FeetechMotorsBus - - motors_buses[key] = FeetechMotorsBus(cfg) - - else: - raise ValueError(f"The motor type '{cfg.type}' is not valid.") - - return motors_buses - - -def make_motors_bus(motor_type: str, **kwargs) -> MotorsBus: - if motor_type == "dynamixel": - from .configs import DynamixelMotorsBusConfig - from .dynamixel import DynamixelMotorsBus - - config = DynamixelMotorsBusConfig(**kwargs) - return DynamixelMotorsBus(config) - - elif motor_type == "feetech": - from feetech import FeetechMotorsBus - - from .configs import FeetechMotorsBusConfig - - config = FeetechMotorsBusConfig(**kwargs) - return FeetechMotorsBus(config) - - else: - raise ValueError(f"The motor type '{motor_type}' is not valid.") diff --git a/tests/conftest.py b/tests/conftest.py index 23c5569b..69dd3049 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -19,8 +19,7 @@ import traceback import pytest from serial import SerialException -from lerobot import available_cameras -from tests.utils import DEVICE, make_camera +from tests.utils import DEVICE # Import fixture modules as plugins pytest_plugins = [ @@ -63,11 +62,6 @@ def _check_component_availability(component_type, available_components, make_com return False -@pytest.fixture -def is_camera_available(camera_type): - return _check_component_availability(camera_type, available_cameras, make_camera) - - @pytest.fixture def patch_builtins_input(monkeypatch): def print_text(text=None): diff --git a/tests/utils.py b/tests/utils.py index bf3de0ed..103b973f 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -21,9 +21,6 @@ import pytest import torch from lerobot import available_cameras, available_motors, available_robots -from lerobot.common.cameras import Camera -from lerobot.common.motors.motors_bus import MotorsBus -from lerobot.common.motors.utils import make_motors_bus as make_motors_bus_device from lerobot.common.utils.import_utils import is_package_available DEVICE = os.environ.get("LEROBOT_TEST_DEVICE", "cuda") if torch.cuda.is_available() else "cpu" @@ -185,63 +182,3 @@ def require_package(package_name): return wrapper return decorator - - -def require_camera(func): - @wraps(func) - def wrapper(*args, **kwargs): - # Access the pytest request context to get the is_camera_available fixture - request = kwargs.get("request") - camera_type = kwargs.get("camera_type") - mock = kwargs.get("mock") - - if request is None: - raise ValueError("The 'request' fixture must be an argument of the test function.") - if camera_type is None: - raise ValueError("The 'camera_type' must be an argument of the test function.") - if mock is None: - raise ValueError("The 'mock' variable must be an argument of the test function.") - - if not mock and not request.getfixturevalue("is_camera_available"): - pytest.skip(f"A {camera_type} camera is not available.") - - return func(*args, **kwargs) - - return wrapper - - -# TODO(rcadene, aliberts): remove this dark pattern that overrides -def make_camera(camera_type: str, **kwargs) -> Camera: - if camera_type == "opencv": - camera_index = kwargs.pop("camera_index", OPENCV_CAMERA_INDEX) - kwargs["camera_index"] = camera_index - from lerobot.common.cameras.opencv import OpenCVCamera, OpenCVCameraConfig - - config = OpenCVCameraConfig(**kwargs) - return OpenCVCamera(config) - - elif camera_type == "intelrealsense": - serial_number = kwargs.pop("serial_number", INTELREALSENSE_SERIAL_NUMBER) - kwargs["serial_number"] = serial_number - from lerobot.common.cameras.realsense import RealSenseCamera, RealSenseCameraConfig - - config = RealSenseCameraConfig(**kwargs) - return RealSenseCamera(config) - else: - raise ValueError(f"The camera type '{camera_type}' is not valid.") - - -# TODO(rcadene, aliberts): remove this dark pattern that overrides -def make_motors_bus(motor_type: str, **kwargs) -> MotorsBus: - if motor_type == "dynamixel": - port = kwargs.pop("port", DYNAMIXEL_PORT) - motors = kwargs.pop("motors", DYNAMIXEL_MOTORS) - return make_motors_bus_device(motor_type, port=port, motors=motors, **kwargs) - - elif motor_type == "feetech": - port = kwargs.pop("port", FEETECH_PORT) - motors = kwargs.pop("motors", FEETECH_MOTORS) - return make_motors_bus_device(motor_type, port=port, motors=motors, **kwargs) - - else: - raise ValueError(f"The motor type '{motor_type}' is not valid.")