From 21cd2940a91ca19aeab9dac4883d20b6608dd5e7 Mon Sep 17 00:00:00 2001 From: Simon Alibert Date: Wed, 26 Feb 2025 16:22:07 +0100 Subject: [PATCH] Reorganize files --- .../{robot_devices => }/cameras/configs.py | 0 .../cameras/intelrealsense.py | 4 ++-- .../{robot_devices => }/cameras/opencv.py | 4 ++-- .../{robot_devices => }/cameras/utils.py | 10 ++++---- lerobot/common/datasets/lerobot_dataset.py | 2 +- lerobot/common/datasets/utils.py | 2 +- .../v2/batch_convert_dataset_v1_to_v2.py | 2 +- .../datasets/v2/convert_dataset_v1_to_v2.py | 4 ++-- .../{robot_devices => }/motors/configs.py | 0 .../{robot_devices => }/motors/dynamixel.py | 4 ++-- .../dynamixel_calibration.py | 4 ++-- .../{robot_devices => }/motors/feetech.py | 4 ++-- .../robots => motors}/feetech_calibration.py | 4 ++-- .../{robot_devices => }/motors/utils.py | 10 ++++---- .../{robot_devices => }/robots/configs.py | 4 ++-- .../robots => robots/lekiwi}/lekiwi_remote.py | 8 +++---- .../{robot_devices => }/robots/manipulator.py | 20 ++++++++-------- .../robots/mobile_manipulator.py | 14 +++++------ lerobot/common/robots/robot_abstraction.py | 0 .../stretch3/stretch3_robot.py} | 2 +- .../{robot_devices => }/robots/utils.py | 8 +++---- .../{robot_devices => utils}/control_utils.py | 4 ++-- .../utils.py => utils/robot_utils.py} | 0 .../control_configs.py => configs/control.py} | 2 +- lerobot/scripts/configure_motor.py | 8 +++---- lerobot/scripts/control_robot.py | 24 +++++++++---------- lerobot/scripts/control_sim_robot.py | 6 ++--- tests/conftest.py | 2 +- tests/test_cameras.py | 6 ++--- tests/test_control_robot.py | 2 +- tests/test_datasets.py | 2 +- tests/test_motors.py | 2 +- tests/test_robots.py | 4 ++-- tests/utils.py | 8 +++---- 34 files changed, 90 insertions(+), 90 deletions(-) rename lerobot/common/{robot_devices => }/cameras/configs.py (100%) rename lerobot/common/{robot_devices => }/cameras/intelrealsense.py (99%) rename lerobot/common/{robot_devices => }/cameras/opencv.py (99%) rename lerobot/common/{robot_devices => }/cameras/utils.py (74%) rename lerobot/common/{robot_devices => }/motors/configs.py (100%) rename lerobot/common/{robot_devices => }/motors/dynamixel.py (99%) rename lerobot/common/{robot_devices/robots => motors}/dynamixel_calibration.py (98%) rename lerobot/common/{robot_devices => }/motors/feetech.py (99%) rename lerobot/common/{robot_devices/robots => motors}/feetech_calibration.py (99%) rename lerobot/common/{robot_devices => }/motors/utils.py (75%) rename lerobot/common/{robot_devices => }/robots/configs.py (99%) rename lerobot/common/{robot_devices/robots => robots/lekiwi}/lekiwi_remote.py (95%) rename lerobot/common/{robot_devices => }/robots/manipulator.py (96%) rename lerobot/common/{robot_devices => }/robots/mobile_manipulator.py (97%) create mode 100644 lerobot/common/robots/robot_abstraction.py rename lerobot/common/{robot_devices/robots/stretch.py => robots/stretch3/stretch3_robot.py} (99%) rename lerobot/common/{robot_devices => }/robots/utils.py (86%) rename lerobot/common/{robot_devices => utils}/control_utils.py (98%) rename lerobot/common/{robot_devices/utils.py => utils/robot_utils.py} (100%) rename lerobot/{common/robot_devices/control_configs.py => configs/control.py} (98%) diff --git a/lerobot/common/robot_devices/cameras/configs.py b/lerobot/common/cameras/configs.py similarity index 100% rename from lerobot/common/robot_devices/cameras/configs.py rename to lerobot/common/cameras/configs.py diff --git a/lerobot/common/robot_devices/cameras/intelrealsense.py b/lerobot/common/cameras/intelrealsense.py similarity index 99% rename from lerobot/common/robot_devices/cameras/intelrealsense.py rename to lerobot/common/cameras/intelrealsense.py index 7e65dba9..c3372fc5 100644 --- a/lerobot/common/robot_devices/cameras/intelrealsense.py +++ b/lerobot/common/cameras/intelrealsense.py @@ -17,8 +17,8 @@ from threading import Thread import numpy as np from PIL import Image -from lerobot.common.robot_devices.cameras.configs import IntelRealSenseCameraConfig -from lerobot.common.robot_devices.utils import ( +from lerobot.common.cameras.configs import IntelRealSenseCameraConfig +from lerobot.common.utils.robot_utils import ( RobotDeviceAlreadyConnectedError, RobotDeviceNotConnectedError, busy_wait, diff --git a/lerobot/common/robot_devices/cameras/opencv.py b/lerobot/common/cameras/opencv.py similarity index 99% rename from lerobot/common/robot_devices/cameras/opencv.py rename to lerobot/common/cameras/opencv.py index 93c791fa..60aae5e5 100644 --- a/lerobot/common/robot_devices/cameras/opencv.py +++ b/lerobot/common/cameras/opencv.py @@ -15,8 +15,8 @@ from threading import Thread import numpy as np from PIL import Image -from lerobot.common.robot_devices.cameras.configs import OpenCVCameraConfig -from lerobot.common.robot_devices.utils import ( +from lerobot.common.cameras.configs import OpenCVCameraConfig +from lerobot.common.utils.robot_utils import ( RobotDeviceAlreadyConnectedError, RobotDeviceNotConnectedError, busy_wait, diff --git a/lerobot/common/robot_devices/cameras/utils.py b/lerobot/common/cameras/utils.py similarity index 74% rename from lerobot/common/robot_devices/cameras/utils.py rename to lerobot/common/cameras/utils.py index 88288ea3..7394acce 100644 --- a/lerobot/common/robot_devices/cameras/utils.py +++ b/lerobot/common/cameras/utils.py @@ -2,7 +2,7 @@ from typing import Protocol import numpy as np -from lerobot.common.robot_devices.cameras.configs import ( +from lerobot.common.cameras.configs import ( CameraConfig, IntelRealSenseCameraConfig, OpenCVCameraConfig, @@ -22,12 +22,12 @@ def make_cameras_from_configs(camera_configs: dict[str, CameraConfig]) -> list[C for key, cfg in camera_configs.items(): if cfg.type == "opencv": - from lerobot.common.robot_devices.cameras.opencv import OpenCVCamera + from lerobot.common.cameras.opencv import OpenCVCamera cameras[key] = OpenCVCamera(cfg) elif cfg.type == "intelrealsense": - from lerobot.common.robot_devices.cameras.intelrealsense import IntelRealSenseCamera + from lerobot.common.cameras.intelrealsense import IntelRealSenseCamera cameras[key] = IntelRealSenseCamera(cfg) else: @@ -38,13 +38,13 @@ def make_cameras_from_configs(camera_configs: dict[str, CameraConfig]) -> list[C def make_camera(camera_type, **kwargs) -> Camera: if camera_type == "opencv": - from lerobot.common.robot_devices.cameras.opencv import OpenCVCamera + from lerobot.common.cameras.opencv import OpenCVCamera config = OpenCVCameraConfig(**kwargs) return OpenCVCamera(config) elif camera_type == "intelrealsense": - from lerobot.common.robot_devices.cameras.intelrealsense import IntelRealSenseCamera + from lerobot.common.cameras.intelrealsense import IntelRealSenseCamera config = IntelRealSenseCameraConfig(**kwargs) return IntelRealSenseCamera(config) diff --git a/lerobot/common/datasets/lerobot_dataset.py b/lerobot/common/datasets/lerobot_dataset.py index f1eb11a0..e643fb3c 100644 --- a/lerobot/common/datasets/lerobot_dataset.py +++ b/lerobot/common/datasets/lerobot_dataset.py @@ -69,7 +69,7 @@ from lerobot.common.datasets.video_utils import ( encode_video_frames, get_video_info, ) -from lerobot.common.robot_devices.robots.utils import Robot +from lerobot.common.robots.utils import Robot CODEBASE_VERSION = "v2.1" diff --git a/lerobot/common/datasets/utils.py b/lerobot/common/datasets/utils.py index 2d90798f..07a3c188 100644 --- a/lerobot/common/datasets/utils.py +++ b/lerobot/common/datasets/utils.py @@ -39,7 +39,7 @@ from lerobot.common.datasets.backward_compatibility import ( BackwardCompatibilityError, ForwardCompatibilityError, ) -from lerobot.common.robot_devices.robots.utils import Robot +from lerobot.common.robots.utils import Robot from lerobot.common.utils.utils import is_valid_numpy_dtype_string from lerobot.configs.types import DictLike, FeatureType, PolicyFeature diff --git a/lerobot/common/datasets/v2/batch_convert_dataset_v1_to_v2.py b/lerobot/common/datasets/v2/batch_convert_dataset_v1_to_v2.py index 4cd93a2d..d12c9186 100644 --- a/lerobot/common/datasets/v2/batch_convert_dataset_v1_to_v2.py +++ b/lerobot/common/datasets/v2/batch_convert_dataset_v1_to_v2.py @@ -27,7 +27,7 @@ from textwrap import dedent from lerobot import available_datasets from lerobot.common.datasets.v2.convert_dataset_v1_to_v2 import convert_dataset -from lerobot.common.robot_devices.robots.configs import AlohaRobotConfig +from lerobot.common.robots.configs import AlohaRobotConfig LOCAL_DIR = Path("data/") diff --git a/lerobot/common/datasets/v2/convert_dataset_v1_to_v2.py b/lerobot/common/datasets/v2/convert_dataset_v1_to_v2.py index 99864e3b..d0fcee2e 100644 --- a/lerobot/common/datasets/v2/convert_dataset_v1_to_v2.py +++ b/lerobot/common/datasets/v2/convert_dataset_v1_to_v2.py @@ -141,8 +141,8 @@ from lerobot.common.datasets.video_utils import ( get_image_pixel_channels, get_video_info, ) -from lerobot.common.robot_devices.robots.configs import RobotConfig -from lerobot.common.robot_devices.robots.utils import make_robot_config +from lerobot.common.robots.configs import RobotConfig +from lerobot.common.robots.utils import make_robot_config V16 = "v1.6" V20 = "v2.0" diff --git a/lerobot/common/robot_devices/motors/configs.py b/lerobot/common/motors/configs.py similarity index 100% rename from lerobot/common/robot_devices/motors/configs.py rename to lerobot/common/motors/configs.py diff --git a/lerobot/common/robot_devices/motors/dynamixel.py b/lerobot/common/motors/dynamixel.py similarity index 99% rename from lerobot/common/robot_devices/motors/dynamixel.py rename to lerobot/common/motors/dynamixel.py index 54836d8e..f5a3710d 100644 --- a/lerobot/common/robot_devices/motors/dynamixel.py +++ b/lerobot/common/motors/dynamixel.py @@ -8,8 +8,8 @@ from copy import deepcopy import numpy as np import tqdm -from lerobot.common.robot_devices.motors.configs import DynamixelMotorsBusConfig -from lerobot.common.robot_devices.utils import RobotDeviceAlreadyConnectedError, RobotDeviceNotConnectedError +from lerobot.common.motors.configs import DynamixelMotorsBusConfig +from lerobot.common.utils.robot_utils import RobotDeviceAlreadyConnectedError, RobotDeviceNotConnectedError from lerobot.common.utils.utils import capture_timestamp_utc PROTOCOL_VERSION = 2.0 diff --git a/lerobot/common/robot_devices/robots/dynamixel_calibration.py b/lerobot/common/motors/dynamixel_calibration.py similarity index 98% rename from lerobot/common/robot_devices/robots/dynamixel_calibration.py rename to lerobot/common/motors/dynamixel_calibration.py index 5c4932d2..e7c08bd0 100644 --- a/lerobot/common/robot_devices/robots/dynamixel_calibration.py +++ b/lerobot/common/motors/dynamixel_calibration.py @@ -3,12 +3,12 @@ import numpy as np -from lerobot.common.robot_devices.motors.dynamixel import ( +from lerobot.common.motors.dynamixel import ( CalibrationMode, TorqueMode, convert_degrees_to_steps, ) -from lerobot.common.robot_devices.motors.utils import MotorsBus +from lerobot.common.motors.utils import MotorsBus URL_TEMPLATE = ( "https://raw.githubusercontent.com/huggingface/lerobot/main/media/{robot}/{arm}_{position}.webp" diff --git a/lerobot/common/robot_devices/motors/feetech.py b/lerobot/common/motors/feetech.py similarity index 99% rename from lerobot/common/robot_devices/motors/feetech.py rename to lerobot/common/motors/feetech.py index a59db7df..e532bf71 100644 --- a/lerobot/common/robot_devices/motors/feetech.py +++ b/lerobot/common/motors/feetech.py @@ -8,8 +8,8 @@ from copy import deepcopy import numpy as np import tqdm -from lerobot.common.robot_devices.motors.configs import FeetechMotorsBusConfig -from lerobot.common.robot_devices.utils import RobotDeviceAlreadyConnectedError, RobotDeviceNotConnectedError +from lerobot.common.motors.configs import FeetechMotorsBusConfig +from lerobot.common.utils.robot_utils import RobotDeviceAlreadyConnectedError, RobotDeviceNotConnectedError from lerobot.common.utils.utils import capture_timestamp_utc PROTOCOL_VERSION = 0 diff --git a/lerobot/common/robot_devices/robots/feetech_calibration.py b/lerobot/common/motors/feetech_calibration.py similarity index 99% rename from lerobot/common/robot_devices/robots/feetech_calibration.py rename to lerobot/common/motors/feetech_calibration.py index b015951a..5d046281 100644 --- a/lerobot/common/robot_devices/robots/feetech_calibration.py +++ b/lerobot/common/motors/feetech_calibration.py @@ -5,12 +5,12 @@ import time import numpy as np -from lerobot.common.robot_devices.motors.feetech import ( +from lerobot.common.motors.feetech import ( CalibrationMode, TorqueMode, convert_degrees_to_steps, ) -from lerobot.common.robot_devices.motors.utils import MotorsBus +from lerobot.common.motors.utils import MotorsBus URL_TEMPLATE = ( "https://raw.githubusercontent.com/huggingface/lerobot/main/media/{robot}/{arm}_{position}.webp" diff --git a/lerobot/common/robot_devices/motors/utils.py b/lerobot/common/motors/utils.py similarity index 75% rename from lerobot/common/robot_devices/motors/utils.py rename to lerobot/common/motors/utils.py index fc64f050..8d146034 100644 --- a/lerobot/common/robot_devices/motors/utils.py +++ b/lerobot/common/motors/utils.py @@ -1,6 +1,6 @@ from typing import Protocol -from lerobot.common.robot_devices.motors.configs import ( +from lerobot.common.motors.configs import ( DynamixelMotorsBusConfig, FeetechMotorsBusConfig, MotorsBusConfig, @@ -21,12 +21,12 @@ def make_motors_buses_from_configs(motors_bus_configs: dict[str, MotorsBusConfig for key, cfg in motors_bus_configs.items(): if cfg.type == "dynamixel": - from lerobot.common.robot_devices.motors.dynamixel import DynamixelMotorsBus + from lerobot.common.motors.dynamixel import DynamixelMotorsBus motors_buses[key] = DynamixelMotorsBus(cfg) elif cfg.type == "feetech": - from lerobot.common.robot_devices.motors.feetech import FeetechMotorsBus + from lerobot.common.motors.feetech import FeetechMotorsBus motors_buses[key] = FeetechMotorsBus(cfg) @@ -38,13 +38,13 @@ def make_motors_buses_from_configs(motors_bus_configs: dict[str, MotorsBusConfig def make_motors_bus(motor_type: str, **kwargs) -> MotorsBus: if motor_type == "dynamixel": - from lerobot.common.robot_devices.motors.dynamixel import DynamixelMotorsBus + from lerobot.common.motors.dynamixel import DynamixelMotorsBus config = DynamixelMotorsBusConfig(**kwargs) return DynamixelMotorsBus(config) elif motor_type == "feetech": - from lerobot.common.robot_devices.motors.feetech import FeetechMotorsBus + from lerobot.common.motors.feetech import FeetechMotorsBus config = FeetechMotorsBusConfig(**kwargs) return FeetechMotorsBus(config) diff --git a/lerobot/common/robot_devices/robots/configs.py b/lerobot/common/robots/configs.py similarity index 99% rename from lerobot/common/robot_devices/robots/configs.py rename to lerobot/common/robots/configs.py index 88cb4e6f..7c02e5b3 100644 --- a/lerobot/common/robot_devices/robots/configs.py +++ b/lerobot/common/robots/configs.py @@ -4,12 +4,12 @@ from typing import Sequence import draccus -from lerobot.common.robot_devices.cameras.configs import ( +from lerobot.common.cameras.configs import ( CameraConfig, IntelRealSenseCameraConfig, OpenCVCameraConfig, ) -from lerobot.common.robot_devices.motors.configs import ( +from lerobot.common.motors.configs import ( DynamixelMotorsBusConfig, FeetechMotorsBusConfig, MotorsBusConfig, diff --git a/lerobot/common/robot_devices/robots/lekiwi_remote.py b/lerobot/common/robots/lekiwi/lekiwi_remote.py similarity index 95% rename from lerobot/common/robot_devices/robots/lekiwi_remote.py rename to lerobot/common/robots/lekiwi/lekiwi_remote.py index fd9491fa..ad720725 100644 --- a/lerobot/common/robot_devices/robots/lekiwi_remote.py +++ b/lerobot/common/robots/lekiwi/lekiwi_remote.py @@ -7,7 +7,7 @@ from pathlib import Path import cv2 import zmq -from lerobot.common.robot_devices.robots.mobile_manipulator import LeKiwi +from lerobot.common.robots.mobile_manipulator import LeKiwi def setup_zmq_sockets(config): @@ -47,7 +47,7 @@ def calibrate_follower_arm(motors_bus, calib_dir_str): calib_dir.mkdir(parents=True, exist_ok=True) calib_file = calib_dir / "main_follower.json" try: - from lerobot.common.robot_devices.robots.feetech_calibration import run_arm_manual_calibration + from lerobot.common.motors.feetech_calibration import run_arm_manual_calibration except ImportError: print("[WARNING] Calibration function not available. Skipping calibration.") return @@ -79,8 +79,8 @@ def run_lekiwi(robot_config): - Processes incoming commands (arm and wheel commands) and sends back sensor and camera data. """ # Import helper functions and classes - from lerobot.common.robot_devices.cameras.utils import make_cameras_from_configs - from lerobot.common.robot_devices.motors.feetech import FeetechMotorsBus, TorqueMode + from lerobot.common.cameras.utils import make_cameras_from_configs + from lerobot.common.motors.feetech import FeetechMotorsBus, TorqueMode # Initialize cameras from the robot configuration. cameras = make_cameras_from_configs(robot_config.cameras) diff --git a/lerobot/common/robot_devices/robots/manipulator.py b/lerobot/common/robots/manipulator.py similarity index 96% rename from lerobot/common/robot_devices/robots/manipulator.py rename to lerobot/common/robots/manipulator.py index 9c82d069..d55c49c7 100644 --- a/lerobot/common/robot_devices/robots/manipulator.py +++ b/lerobot/common/robots/manipulator.py @@ -13,11 +13,11 @@ from pathlib import Path import numpy as np import torch -from lerobot.common.robot_devices.cameras.utils import make_cameras_from_configs -from lerobot.common.robot_devices.motors.utils import MotorsBus, make_motors_buses_from_configs -from lerobot.common.robot_devices.robots.configs import ManipulatorRobotConfig -from lerobot.common.robot_devices.robots.utils import get_arm_id -from lerobot.common.robot_devices.utils import RobotDeviceAlreadyConnectedError, RobotDeviceNotConnectedError +from lerobot.common.cameras.utils import make_cameras_from_configs +from lerobot.common.motors.utils import MotorsBus, make_motors_buses_from_configs +from lerobot.common.robots.configs import ManipulatorRobotConfig +from lerobot.common.robots.utils import get_arm_id +from lerobot.common.utils.robot_utils import RobotDeviceAlreadyConnectedError, RobotDeviceNotConnectedError def ensure_safe_goal_position( @@ -228,9 +228,9 @@ class ManipulatorRobot: self.leader_arms[name].connect() if self.robot_type in ["koch", "koch_bimanual", "aloha"]: - from lerobot.common.robot_devices.motors.dynamixel import TorqueMode + from lerobot.common.motors.dynamixel import TorqueMode elif self.robot_type in ["so100", "moss", "lekiwi"]: - from lerobot.common.robot_devices.motors.feetech import TorqueMode + from lerobot.common.motors.feetech import TorqueMode # We assume that at connection time, arms are in a rest position, and torque can # be safely disabled to run calibration and/or set robot preset configurations. @@ -295,12 +295,12 @@ class ManipulatorRobot: print(f"Missing calibration file '{arm_calib_path}'") if self.robot_type in ["koch", "koch_bimanual", "aloha"]: - from lerobot.common.robot_devices.robots.dynamixel_calibration import run_arm_calibration + from lerobot.common.motors.dynamixel_calibration import run_arm_calibration calibration = run_arm_calibration(arm, self.robot_type, name, arm_type) elif self.robot_type in ["so100", "moss", "lekiwi"]: - from lerobot.common.robot_devices.robots.feetech_calibration import ( + from lerobot.common.motors.feetech_calibration import ( run_arm_manual_calibration, ) @@ -322,7 +322,7 @@ class ManipulatorRobot: def set_koch_robot_preset(self): def set_operating_mode_(arm): - from lerobot.common.robot_devices.motors.dynamixel import TorqueMode + from lerobot.common.motors.dynamixel import TorqueMode if (arm.read("Torque_Enable") != TorqueMode.DISABLED.value).any(): raise ValueError("To run set robot preset, the torque must be disabled on all motors.") diff --git a/lerobot/common/robot_devices/robots/mobile_manipulator.py b/lerobot/common/robots/mobile_manipulator.py similarity index 97% rename from lerobot/common/robot_devices/robots/mobile_manipulator.py rename to lerobot/common/robots/mobile_manipulator.py index b20c61f7..3450b97d 100644 --- a/lerobot/common/robot_devices/robots/mobile_manipulator.py +++ b/lerobot/common/robots/mobile_manipulator.py @@ -9,13 +9,13 @@ import numpy as np import torch import zmq -from lerobot.common.robot_devices.cameras.utils import make_cameras_from_configs -from lerobot.common.robot_devices.motors.feetech import TorqueMode -from lerobot.common.robot_devices.motors.utils import MotorsBus, make_motors_buses_from_configs -from lerobot.common.robot_devices.robots.configs import LeKiwiRobotConfig -from lerobot.common.robot_devices.robots.feetech_calibration import run_arm_manual_calibration -from lerobot.common.robot_devices.robots.utils import get_arm_id -from lerobot.common.robot_devices.utils import RobotDeviceNotConnectedError +from lerobot.common.cameras.utils import make_cameras_from_configs +from lerobot.common.motors.feetech import TorqueMode +from lerobot.common.motors.feetech_calibration import run_arm_manual_calibration +from lerobot.common.motors.utils import MotorsBus, make_motors_buses_from_configs +from lerobot.common.robots.configs import LeKiwiRobotConfig +from lerobot.common.robots.utils import get_arm_id +from lerobot.common.utils.robot_utils import RobotDeviceNotConnectedError PYNPUT_AVAILABLE = True try: diff --git a/lerobot/common/robots/robot_abstraction.py b/lerobot/common/robots/robot_abstraction.py new file mode 100644 index 00000000..e69de29b diff --git a/lerobot/common/robot_devices/robots/stretch.py b/lerobot/common/robots/stretch3/stretch3_robot.py similarity index 99% rename from lerobot/common/robot_devices/robots/stretch.py rename to lerobot/common/robots/stretch3/stretch3_robot.py index b63bf941..12a18035 100644 --- a/lerobot/common/robot_devices/robots/stretch.py +++ b/lerobot/common/robots/stretch3/stretch3_robot.py @@ -22,7 +22,7 @@ from stretch_body.gamepad_teleop import GamePadTeleop from stretch_body.robot import Robot as StretchAPI from stretch_body.robot_params import RobotParams -from lerobot.common.robot_devices.robots.configs import StretchRobotConfig +from lerobot.common.robots.configs import StretchRobotConfig class StretchRobot(StretchAPI): diff --git a/lerobot/common/robot_devices/robots/utils.py b/lerobot/common/robots/utils.py similarity index 86% rename from lerobot/common/robot_devices/robots/utils.py rename to lerobot/common/robots/utils.py index 47e2519b..8a30c496 100644 --- a/lerobot/common/robot_devices/robots/utils.py +++ b/lerobot/common/robots/utils.py @@ -1,6 +1,6 @@ from typing import Protocol -from lerobot.common.robot_devices.robots.configs import ( +from lerobot.common.robots.configs import ( AlohaRobotConfig, KochBimanualRobotConfig, KochRobotConfig, @@ -54,15 +54,15 @@ def make_robot_config(robot_type: str, **kwargs) -> RobotConfig: def make_robot_from_config(config: RobotConfig): if isinstance(config, ManipulatorRobotConfig): - from lerobot.common.robot_devices.robots.manipulator import ManipulatorRobot + from lerobot.common.robots.manipulator import ManipulatorRobot return ManipulatorRobot(config) elif isinstance(config, LeKiwiRobotConfig): - from lerobot.common.robot_devices.robots.mobile_manipulator import MobileManipulator + from lerobot.common.robots.mobile_manipulator import MobileManipulator return MobileManipulator(config) else: - from lerobot.common.robot_devices.robots.stretch import StretchRobot + from lerobot.common.robots.stretch3.stretch3_robot import StretchRobot return StretchRobot(config) diff --git a/lerobot/common/robot_devices/control_utils.py b/lerobot/common/utils/control_utils.py similarity index 98% rename from lerobot/common/robot_devices/control_utils.py rename to lerobot/common/utils/control_utils.py index 6c97d0cb..8ff47b47 100644 --- a/lerobot/common/robot_devices/control_utils.py +++ b/lerobot/common/utils/control_utils.py @@ -19,8 +19,8 @@ from termcolor import colored from lerobot.common.datasets.image_writer import safe_stop_image_writer from lerobot.common.datasets.lerobot_dataset import LeRobotDataset from lerobot.common.datasets.utils import get_features_from_robot -from lerobot.common.robot_devices.robots.utils import Robot -from lerobot.common.robot_devices.utils import busy_wait +from lerobot.common.robots.utils import Robot +from lerobot.common.utils.robot_utils import busy_wait from lerobot.common.utils.utils import get_safe_torch_device, has_method diff --git a/lerobot/common/robot_devices/utils.py b/lerobot/common/utils/robot_utils.py similarity index 100% rename from lerobot/common/robot_devices/utils.py rename to lerobot/common/utils/robot_utils.py diff --git a/lerobot/common/robot_devices/control_configs.py b/lerobot/configs/control.py similarity index 98% rename from lerobot/common/robot_devices/control_configs.py rename to lerobot/configs/control.py index c3e920b1..2c6620be 100644 --- a/lerobot/common/robot_devices/control_configs.py +++ b/lerobot/configs/control.py @@ -4,7 +4,7 @@ from pathlib import Path import draccus -from lerobot.common.robot_devices.robots.configs import RobotConfig +from lerobot.common.robots.configs import RobotConfig from lerobot.common.utils.utils import auto_select_torch_device, is_amp_available, is_torch_device_available from lerobot.configs import parser from lerobot.configs.policies import PreTrainedConfig diff --git a/lerobot/scripts/configure_motor.py b/lerobot/scripts/configure_motor.py index f7e07070..b6f58410 100644 --- a/lerobot/scripts/configure_motor.py +++ b/lerobot/scripts/configure_motor.py @@ -18,8 +18,8 @@ import time def get_motor_bus_cls(brand: str) -> tuple: if brand == "feetech": - from lerobot.common.robot_devices.motors.configs import FeetechMotorsBusConfig - from lerobot.common.robot_devices.motors.feetech import ( + from lerobot.common.motors.configs import FeetechMotorsBusConfig + from lerobot.common.motors.feetech import ( MODEL_BAUDRATE_TABLE, SCS_SERIES_BAUDRATE_TABLE, FeetechMotorsBus, @@ -28,8 +28,8 @@ def get_motor_bus_cls(brand: str) -> tuple: return FeetechMotorsBusConfig, FeetechMotorsBus, MODEL_BAUDRATE_TABLE, SCS_SERIES_BAUDRATE_TABLE elif brand == "dynamixel": - from lerobot.common.robot_devices.motors.configs import DynamixelMotorsBusConfig - from lerobot.common.robot_devices.motors.dynamixel import ( + from lerobot.common.motors.configs import DynamixelMotorsBusConfig + from lerobot.common.motors.dynamixel import ( MODEL_BAUDRATE_TABLE, X_SERIES_BAUDRATE_TABLE, DynamixelMotorsBus, diff --git a/lerobot/scripts/control_robot.py b/lerobot/scripts/control_robot.py index 32f3b181..d4284e19 100644 --- a/lerobot/scripts/control_robot.py +++ b/lerobot/scripts/control_robot.py @@ -129,15 +129,8 @@ from pprint import pformat # from safetensors.torch import load_file, save_file from lerobot.common.datasets.lerobot_dataset import LeRobotDataset from lerobot.common.policies.factory import make_policy -from lerobot.common.robot_devices.control_configs import ( - CalibrateControlConfig, - ControlPipelineConfig, - RecordControlConfig, - RemoteRobotConfig, - ReplayControlConfig, - TeleoperateControlConfig, -) -from lerobot.common.robot_devices.control_utils import ( +from lerobot.common.robots.utils import Robot, make_robot_from_config +from lerobot.common.utils.control_utils import ( control_loop, init_keyboard_listener, log_control_info, @@ -148,10 +141,17 @@ from lerobot.common.robot_devices.control_utils import ( stop_recording, warmup_record, ) -from lerobot.common.robot_devices.robots.utils import Robot, make_robot_from_config -from lerobot.common.robot_devices.utils import busy_wait, safe_disconnect +from lerobot.common.utils.robot_utils import busy_wait, safe_disconnect from lerobot.common.utils.utils import has_method, init_logging, log_say from lerobot.configs import parser +from lerobot.configs.control import ( + CalibrateControlConfig, + ControlPipelineConfig, + RecordControlConfig, + RemoteRobotConfig, + ReplayControlConfig, + TeleoperateControlConfig, +) ######################################################################################## # Control modes @@ -368,7 +368,7 @@ def control_robot(cfg: ControlPipelineConfig): elif isinstance(cfg.control, ReplayControlConfig): replay(robot, cfg.control) elif isinstance(cfg.control, RemoteRobotConfig): - from lerobot.common.robot_devices.robots.lekiwi_remote import run_lekiwi + from lerobot.common.robots.lekiwi.lekiwi_remote import run_lekiwi run_lekiwi(cfg.robot) diff --git a/lerobot/scripts/control_sim_robot.py b/lerobot/scripts/control_sim_robot.py index 8d69bf31..7441d91e 100644 --- a/lerobot/scripts/control_sim_robot.py +++ b/lerobot/scripts/control_sim_robot.py @@ -80,7 +80,8 @@ import numpy as np import torch from lerobot.common.datasets.lerobot_dataset import LeRobotDataset -from lerobot.common.robot_devices.control_utils import ( +from lerobot.common.robots.utils import Robot, make_robot +from lerobot.common.utils.control_utils import ( init_keyboard_listener, init_policy, is_headless, @@ -90,8 +91,7 @@ from lerobot.common.robot_devices.control_utils import ( sanity_check_dataset_robot_compatibility, stop_recording, ) -from lerobot.common.robot_devices.robots.utils import Robot, make_robot -from lerobot.common.robot_devices.utils import busy_wait +from lerobot.common.utils.robot_utils import busy_wait from lerobot.common.utils.utils import init_hydra_config, init_logging, log_say raise NotImplementedError("This script is currently deactivated") diff --git a/tests/conftest.py b/tests/conftest.py index dc746142..d8d5a17c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -20,7 +20,7 @@ import pytest from serial import SerialException from lerobot import available_cameras, available_motors, available_robots -from lerobot.common.robot_devices.robots.utils import make_robot +from lerobot.common.robots.utils import make_robot from tests.utils import DEVICE, make_camera, make_motors_bus # Import fixture modules as plugins diff --git a/tests/test_cameras.py b/tests/test_cameras.py index 7c043c25..68f47b59 100644 --- a/tests/test_cameras.py +++ b/tests/test_cameras.py @@ -24,7 +24,7 @@ pytest -sx 'tests/test_cameras.py::test_camera[intelrealsense-True]' import numpy as np import pytest -from lerobot.common.robot_devices.utils import RobotDeviceAlreadyConnectedError, RobotDeviceNotConnectedError +from lerobot.common.utils.robot_utils import RobotDeviceAlreadyConnectedError, RobotDeviceNotConnectedError from tests.utils import TEST_CAMERA_TYPES, make_camera, require_camera # Maximum absolute difference between two consecutive images recored by a camera. @@ -185,9 +185,9 @@ def test_camera(request, camera_type, mock): def test_save_images_from_cameras(tmp_path, request, camera_type, mock): # TODO(rcadene): refactor if camera_type == "opencv": - from lerobot.common.robot_devices.cameras.opencv import save_images_from_cameras + from lerobot.common.cameras.opencv import save_images_from_cameras elif camera_type == "intelrealsense": - from lerobot.common.robot_devices.cameras.intelrealsense import save_images_from_cameras + from lerobot.common.cameras.intelrealsense import save_images_from_cameras # Small `record_time_s` to speedup unit tests save_images_from_cameras(tmp_path, record_time_s=0.02, mock=mock) diff --git a/tests/test_control_robot.py b/tests/test_control_robot.py index 12b68641..94dcc686 100644 --- a/tests/test_control_robot.py +++ b/tests/test_control_robot.py @@ -30,7 +30,7 @@ import pytest from lerobot.common.policies.act.configuration_act import ACTConfig from lerobot.common.policies.factory import make_policy -from lerobot.common.robot_devices.control_configs import ( +from lerobot.configs.control import ( CalibrateControlConfig, RecordControlConfig, ReplayControlConfig, diff --git a/tests/test_datasets.py b/tests/test_datasets.py index 61b68aa8..bd8444ba 100644 --- a/tests/test_datasets.py +++ b/tests/test_datasets.py @@ -41,7 +41,7 @@ from lerobot.common.datasets.utils import ( ) from lerobot.common.envs.factory import make_env_config from lerobot.common.policies.factory import make_policy_config -from lerobot.common.robot_devices.robots.utils import make_robot +from lerobot.common.robots.utils import make_robot from lerobot.configs.default import DatasetConfig from lerobot.configs.train import TrainPipelineConfig from tests.fixtures.constants import DUMMY_CHW, DUMMY_HWC, DUMMY_REPO_ID diff --git a/tests/test_motors.py b/tests/test_motors.py index 2f668926..1342d985 100644 --- a/tests/test_motors.py +++ b/tests/test_motors.py @@ -30,7 +30,7 @@ import time import numpy as np import pytest -from lerobot.common.robot_devices.utils import RobotDeviceAlreadyConnectedError, RobotDeviceNotConnectedError +from lerobot.common.utils.robot_utils import RobotDeviceAlreadyConnectedError, RobotDeviceNotConnectedError from lerobot.scripts.find_motors_bus_port import find_port from tests.utils import TEST_MOTOR_TYPES, make_motors_bus, require_motor diff --git a/tests/test_robots.py b/tests/test_robots.py index 6c300b71..4e60cff1 100644 --- a/tests/test_robots.py +++ b/tests/test_robots.py @@ -26,8 +26,8 @@ pytest -sx 'tests/test_robots.py::test_robot[aloha-True]' import pytest import torch -from lerobot.common.robot_devices.robots.utils import make_robot -from lerobot.common.robot_devices.utils import RobotDeviceAlreadyConnectedError, RobotDeviceNotConnectedError +from lerobot.common.robots.utils import make_robot +from lerobot.common.utils.robot_utils import RobotDeviceAlreadyConnectedError, RobotDeviceNotConnectedError from tests.utils import TEST_ROBOT_TYPES, mock_calibration_dir, require_robot diff --git a/tests/utils.py b/tests/utils.py index c49b5b9f..9ffa9ad2 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -23,10 +23,10 @@ import pytest import torch from lerobot import available_cameras, available_motors, available_robots -from lerobot.common.robot_devices.cameras.utils import Camera -from lerobot.common.robot_devices.cameras.utils import make_camera as make_camera_device -from lerobot.common.robot_devices.motors.utils import MotorsBus -from lerobot.common.robot_devices.motors.utils import make_motors_bus as make_motors_bus_device +from lerobot.common.cameras.utils import Camera +from lerobot.common.cameras.utils import make_camera as make_camera_device +from lerobot.common.motors.utils 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"