Remove more code
This commit is contained in:
@@ -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
|
|
||||||
@@ -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.")
|
|
||||||
@@ -19,8 +19,7 @@ import traceback
|
|||||||
import pytest
|
import pytest
|
||||||
from serial import SerialException
|
from serial import SerialException
|
||||||
|
|
||||||
from lerobot import available_cameras
|
from tests.utils import DEVICE
|
||||||
from tests.utils import DEVICE, make_camera
|
|
||||||
|
|
||||||
# Import fixture modules as plugins
|
# Import fixture modules as plugins
|
||||||
pytest_plugins = [
|
pytest_plugins = [
|
||||||
@@ -63,11 +62,6 @@ def _check_component_availability(component_type, available_components, make_com
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
|
||||||
def is_camera_available(camera_type):
|
|
||||||
return _check_component_availability(camera_type, available_cameras, make_camera)
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def patch_builtins_input(monkeypatch):
|
def patch_builtins_input(monkeypatch):
|
||||||
def print_text(text=None):
|
def print_text(text=None):
|
||||||
|
|||||||
@@ -21,9 +21,6 @@ import pytest
|
|||||||
import torch
|
import torch
|
||||||
|
|
||||||
from lerobot import available_cameras, available_motors, available_robots
|
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
|
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"
|
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 wrapper
|
||||||
|
|
||||||
return decorator
|
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.")
|
|
||||||
|
|||||||
Reference in New Issue
Block a user