Rename CalibrationMode -> MotorNormMode

This commit is contained in:
Simon Alibert
2025-03-25 17:42:18 +01:00
parent faa476f0d2
commit 1f1a01a798
12 changed files with 66 additions and 66 deletions

View File

@@ -1 +1 @@
from .motors_bus import CalibrationMode, Motor, MotorsBus
from .motors_bus import Motor, MotorNormMode, MotorsBus

View File

@@ -17,7 +17,7 @@
import numpy as np
from ..motors_bus import CalibrationMode, MotorsBus
from ..motors_bus import MotorNormMode, MotorsBus
from .dynamixel import TorqueMode
from .tables import MODEL_RESOLUTION
@@ -133,13 +133,13 @@ def run_arm_calibration(arm: MotorsBus, robot_type: str, arm_name: str, arm_type
print()
# Joints with rotational motions are expressed in degrees in nominal range of [-180, 180]
calib_mode = [CalibrationMode.DEGREE.name] * len(arm.names)
calib_mode = [MotorNormMode.DEGREE.name] * len(arm.names)
# TODO(rcadene): make type of joints (DEGREE or LINEAR) configurable from yaml?
if robot_type in ["aloha"] and "gripper" in arm.names:
# Joints with linear motions (like gripper of Aloha) are expressed in nominal range of [0, 100]
calib_idx = arm.names.index("gripper")
calib_mode[calib_idx] = CalibrationMode.LINEAR.name
calib_mode[calib_idx] = MotorNormMode.LINEAR.name
calib_data = {
"homing_offset": homing_offset.tolist(),

View File

@@ -76,7 +76,7 @@ def assert_same_address(model_ctrl_table: dict[str, dict], motor_models: list[st
)
class CalibrationMode(Enum):
class MotorNormMode(Enum):
DEGREE = 0
RANGE_0_100 = 1
RANGE_M100_100 = 2
@@ -87,7 +87,7 @@ class CalibrationMode(Enum):
class Motor:
id: int
model: str
calibration: CalibrationMode
norm_mode: MotorNormMode
class JointOutOfRangeError(Exception):

View File

@@ -22,7 +22,7 @@ from typing import Any
from lerobot.common.cameras.utils import make_cameras_from_configs
from lerobot.common.constants import OBS_IMAGES, OBS_STATE
from lerobot.common.errors import DeviceAlreadyConnectedError, DeviceNotConnectedError
from lerobot.common.motors import CalibrationMode, Motor
from lerobot.common.motors import Motor, MotorNormMode
from lerobot.common.motors.dynamixel import (
DynamixelMotorsBus,
OperatingMode,
@@ -53,12 +53,12 @@ class KochRobot(Robot):
self.arm = DynamixelMotorsBus(
port=self.config.port,
motors={
"shoulder_pan": Motor(1, "xl430-w250", CalibrationMode.RANGE_M100_100),
"shoulder_lift": Motor(2, "xl430-w250", CalibrationMode.RANGE_M100_100),
"elbow_flex": Motor(3, "xl330-m288", CalibrationMode.RANGE_M100_100),
"wrist_flex": Motor(4, "xl330-m288", CalibrationMode.RANGE_M100_100),
"wrist_roll": Motor(5, "xl330-m288", CalibrationMode.RANGE_M100_100),
"gripper": Motor(6, "xl330-m288", CalibrationMode.RANGE_0_100),
"shoulder_pan": Motor(1, "xl430-w250", MotorNormMode.RANGE_M100_100),
"shoulder_lift": Motor(2, "xl430-w250", MotorNormMode.RANGE_M100_100),
"elbow_flex": Motor(3, "xl330-m288", MotorNormMode.RANGE_M100_100),
"wrist_flex": Motor(4, "xl330-m288", MotorNormMode.RANGE_M100_100),
"wrist_roll": Motor(5, "xl330-m288", MotorNormMode.RANGE_M100_100),
"gripper": Motor(6, "xl330-m288", MotorNormMode.RANGE_0_100),
},
)
self.cameras = make_cameras_from_configs(config.cameras)

View File

@@ -23,7 +23,7 @@ import numpy as np
from lerobot.common.cameras.utils import make_cameras_from_configs
from lerobot.common.constants import OBS_IMAGES, OBS_STATE
from lerobot.common.errors import DeviceAlreadyConnectedError, DeviceNotConnectedError
from lerobot.common.motors import CalibrationMode, Motor
from lerobot.common.motors import Motor, MotorNormMode
from lerobot.common.motors.calibration import find_min_max, find_offset, set_calibration
from lerobot.common.motors.feetech import (
FeetechMotorsBus,
@@ -53,12 +53,12 @@ class SO100Robot(Robot):
self.arm = FeetechMotorsBus(
port=self.config.port,
motors={
"shoulder_pan": Motor(1, "sts3215", CalibrationMode.RANGE_M100_100),
"shoulder_lift": Motor(2, "sts3215", CalibrationMode.RANGE_M100_100),
"elbow_flex": Motor(3, "sts3215", CalibrationMode.RANGE_M100_100),
"wrist_flex": Motor(4, "sts3215", CalibrationMode.RANGE_M100_100),
"wrist_roll": Motor(5, "sts3215", CalibrationMode.RANGE_M100_100),
"gripper": Motor(6, "sts3215", CalibrationMode.RANGE_0_100),
"shoulder_pan": Motor(1, "sts3215", MotorNormMode.RANGE_M100_100),
"shoulder_lift": Motor(2, "sts3215", MotorNormMode.RANGE_M100_100),
"elbow_flex": Motor(3, "sts3215", MotorNormMode.RANGE_M100_100),
"wrist_flex": Motor(4, "sts3215", MotorNormMode.RANGE_M100_100),
"wrist_roll": Motor(5, "sts3215", MotorNormMode.RANGE_M100_100),
"gripper": Motor(6, "sts3215", MotorNormMode.RANGE_0_100),
},
)
self.cameras = make_cameras_from_configs(config.cameras)

View File

@@ -13,7 +13,7 @@ import numpy as np
from lerobot.common.cameras.utils import make_cameras_from_configs
from lerobot.common.constants import OBS_IMAGES, OBS_STATE
from lerobot.common.errors import DeviceAlreadyConnectedError, DeviceNotConnectedError
from lerobot.common.motors import CalibrationMode, Motor, TorqueMode
from lerobot.common.motors import Motor, MotorNormMode, TorqueMode
from lerobot.common.motors.dynamixel import (
DynamixelMotorsBus,
run_arm_calibration,
@@ -43,15 +43,15 @@ class ViperXRobot(Robot):
self.arm = DynamixelMotorsBus(
port=self.config.port,
motors={
"waist": Motor(1, "xm540-w270", CalibrationMode.RANGE_M100_100),
"shoulder": Motor(2, "xm540-w270", CalibrationMode.RANGE_M100_100),
"shoulder_shadow": Motor(3, "xm540-w270", CalibrationMode.RANGE_M100_100),
"elbow": Motor(4, "xm540-w270", CalibrationMode.RANGE_M100_100),
"elbow_shadow": Motor(5, "xm540-w270", CalibrationMode.RANGE_M100_100),
"forearm_roll": Motor(6, "xm540-w270", CalibrationMode.RANGE_M100_100),
"wrist_angle": Motor(7, "xm540-w270", CalibrationMode.RANGE_M100_100),
"wrist_rotate": Motor(8, "xm430-w350", CalibrationMode.RANGE_M100_100),
"gripper": Motor(9, "xm430-w350", CalibrationMode.RANGE_0_100),
"waist": Motor(1, "xm540-w270", MotorNormMode.RANGE_M100_100),
"shoulder": Motor(2, "xm540-w270", MotorNormMode.RANGE_M100_100),
"shoulder_shadow": Motor(3, "xm540-w270", MotorNormMode.RANGE_M100_100),
"elbow": Motor(4, "xm540-w270", MotorNormMode.RANGE_M100_100),
"elbow_shadow": Motor(5, "xm540-w270", MotorNormMode.RANGE_M100_100),
"forearm_roll": Motor(6, "xm540-w270", MotorNormMode.RANGE_M100_100),
"wrist_angle": Motor(7, "xm540-w270", MotorNormMode.RANGE_M100_100),
"wrist_rotate": Motor(8, "xm430-w350", MotorNormMode.RANGE_M100_100),
"gripper": Motor(9, "xm430-w350", MotorNormMode.RANGE_0_100),
},
)
self.cameras = make_cameras_from_configs(config.cameras)

View File

@@ -21,7 +21,7 @@ import time
import numpy as np
from lerobot.common.errors import DeviceAlreadyConnectedError, DeviceNotConnectedError
from lerobot.common.motors import CalibrationMode, Motor
from lerobot.common.motors import Motor, MotorNormMode
from lerobot.common.motors.dynamixel import (
DynamixelMotorsBus,
OperatingMode,
@@ -51,12 +51,12 @@ class KochTeleop(Teleoperator):
self.arm = DynamixelMotorsBus(
port=self.config.port,
motors={
"shoulder_pan": Motor(1, "xl330-m077", CalibrationMode.RANGE_M100_100),
"shoulder_lift": Motor(2, "xl330-m077", CalibrationMode.RANGE_M100_100),
"elbow_flex": Motor(3, "xl330-m077", CalibrationMode.RANGE_M100_100),
"wrist_flex": Motor(4, "xl330-m077", CalibrationMode.RANGE_M100_100),
"wrist_roll": Motor(5, "xl330-m077", CalibrationMode.RANGE_M100_100),
"gripper": Motor(6, "xl330-m077", CalibrationMode.RANGE_0_100),
"shoulder_pan": Motor(1, "xl330-m077", MotorNormMode.RANGE_M100_100),
"shoulder_lift": Motor(2, "xl330-m077", MotorNormMode.RANGE_M100_100),
"elbow_flex": Motor(3, "xl330-m077", MotorNormMode.RANGE_M100_100),
"wrist_flex": Motor(4, "xl330-m077", MotorNormMode.RANGE_M100_100),
"wrist_roll": Motor(5, "xl330-m077", MotorNormMode.RANGE_M100_100),
"gripper": Motor(6, "xl330-m077", MotorNormMode.RANGE_0_100),
},
)

View File

@@ -21,7 +21,7 @@ import time
import numpy as np
from lerobot.common.errors import DeviceAlreadyConnectedError, DeviceNotConnectedError
from lerobot.common.motors import CalibrationMode, Motor
from lerobot.common.motors import Motor, MotorNormMode
from lerobot.common.motors.calibration import find_min_max, find_offset, set_calibration
from lerobot.common.motors.feetech import (
FeetechMotorsBus,
@@ -48,12 +48,12 @@ class SO100Teleop(Teleoperator):
self.arm = FeetechMotorsBus(
port=self.config.port,
motors={
"shoulder_pan": Motor(1, "sts3215", CalibrationMode.RANGE_M100_100),
"shoulder_lift": Motor(2, "sts3215", CalibrationMode.RANGE_M100_100),
"elbow_flex": Motor(3, "sts3215", CalibrationMode.RANGE_M100_100),
"wrist_flex": Motor(4, "sts3215", CalibrationMode.RANGE_M100_100),
"wrist_roll": Motor(5, "sts3215", CalibrationMode.RANGE_M100_100),
"gripper": Motor(6, "sts3215", CalibrationMode.RANGE_0_100),
"shoulder_pan": Motor(1, "sts3215", MotorNormMode.RANGE_M100_100),
"shoulder_lift": Motor(2, "sts3215", MotorNormMode.RANGE_M100_100),
"elbow_flex": Motor(3, "sts3215", MotorNormMode.RANGE_M100_100),
"wrist_flex": Motor(4, "sts3215", MotorNormMode.RANGE_M100_100),
"wrist_roll": Motor(5, "sts3215", MotorNormMode.RANGE_M100_100),
"gripper": Motor(6, "sts3215", MotorNormMode.RANGE_0_100),
},
)

View File

@@ -21,7 +21,7 @@ import time
import numpy as np
from lerobot.common.errors import DeviceAlreadyConnectedError, DeviceNotConnectedError
from lerobot.common.motors import CalibrationMode, Motor, TorqueMode
from lerobot.common.motors import Motor, MotorNormMode, TorqueMode
from lerobot.common.motors.dynamixel import (
DynamixelMotorsBus,
run_arm_calibration,
@@ -47,15 +47,15 @@ class WidowXTeleop(Teleoperator):
self.arm = DynamixelMotorsBus(
port=self.config.port,
motors={
"waist": Motor(1, "xm430-w350", CalibrationMode.RANGE_M100_100),
"shoulder": Motor(2, "xm430-w350", CalibrationMode.RANGE_M100_100),
"shoulder_shadow": Motor(3, "xm430-w350", CalibrationMode.RANGE_M100_100),
"elbow": Motor(4, "xm430-w350", CalibrationMode.RANGE_M100_100),
"elbow_shadow": Motor(5, "xm430-w350", CalibrationMode.RANGE_M100_100),
"forearm_roll": Motor(6, "xm430-w350", CalibrationMode.RANGE_M100_100),
"wrist_angle": Motor(7, "xm430-w350", CalibrationMode.RANGE_M100_100),
"wrist_rotate": Motor(8, "xl430-w250", CalibrationMode.RANGE_M100_100),
"gripper": Motor(9, "xc430-w150", CalibrationMode.RANGE_0_100),
"waist": Motor(1, "xm430-w350", MotorNormMode.RANGE_M100_100),
"shoulder": Motor(2, "xm430-w350", MotorNormMode.RANGE_M100_100),
"shoulder_shadow": Motor(3, "xm430-w350", MotorNormMode.RANGE_M100_100),
"elbow": Motor(4, "xm430-w350", MotorNormMode.RANGE_M100_100),
"elbow_shadow": Motor(5, "xm430-w350", MotorNormMode.RANGE_M100_100),
"forearm_roll": Motor(6, "xm430-w350", MotorNormMode.RANGE_M100_100),
"wrist_angle": Motor(7, "xm430-w350", MotorNormMode.RANGE_M100_100),
"wrist_rotate": Motor(8, "xl430-w250", MotorNormMode.RANGE_M100_100),
"gripper": Motor(9, "xc430-w150", MotorNormMode.RANGE_0_100),
},
)

View File

@@ -5,7 +5,7 @@ from unittest.mock import Mock, call, patch
import pytest
import scservo_sdk as scs
from lerobot.common.motors import CalibrationMode, Motor
from lerobot.common.motors import Motor, MotorNormMode
from lerobot.common.motors.calibration import find_min_max, find_offset, set_min_max, set_offset
from lerobot.common.motors.feetech import FeetechMotorsBus
from tests.mocks.mock_feetech import MockMotors, MockPortHandler
@@ -31,9 +31,9 @@ def mock_motors() -> Generator[MockMotors, None, None]:
@pytest.fixture
def dummy_motors() -> dict[str, Motor]:
return {
"dummy_1": Motor(1, "sts3215", CalibrationMode.RANGE_M100_100),
"wrist_roll": Motor(2, "sts3215", CalibrationMode.RANGE_M100_100),
"dummy_3": Motor(3, "sts3215", CalibrationMode.RANGE_M100_100),
"dummy_1": Motor(1, "sts3215", MotorNormMode.RANGE_M100_100),
"wrist_roll": Motor(2, "sts3215", MotorNormMode.RANGE_M100_100),
"dummy_3": Motor(3, "sts3215", MotorNormMode.RANGE_M100_100),
}

View File

@@ -5,7 +5,7 @@ from unittest.mock import patch
import dynamixel_sdk as dxl
import pytest
from lerobot.common.motors import CalibrationMode, Motor
from lerobot.common.motors import Motor, MotorNormMode
from lerobot.common.motors.dynamixel import MODEL_NUMBER, DynamixelMotorsBus
from tests.mocks.mock_dynamixel import MockMotors, MockPortHandler
@@ -30,9 +30,9 @@ def mock_motors() -> Generator[MockMotors, None, None]:
@pytest.fixture
def dummy_motors() -> dict[str, Motor]:
return {
"dummy_1": Motor(1, "xl430-w250", CalibrationMode.RANGE_M100_100),
"dummy_2": Motor(2, "xm540-w270", CalibrationMode.RANGE_M100_100),
"dummy_3": Motor(3, "xl330-m077", CalibrationMode.RANGE_M100_100),
"dummy_1": Motor(1, "xl430-w250", MotorNormMode.RANGE_M100_100),
"dummy_2": Motor(2, "xm540-w270", MotorNormMode.RANGE_M100_100),
"dummy_3": Motor(3, "xl330-m077", MotorNormMode.RANGE_M100_100),
}

View File

@@ -5,7 +5,7 @@ from unittest.mock import patch
import pytest
import scservo_sdk as scs
from lerobot.common.motors import CalibrationMode, Motor
from lerobot.common.motors import Motor, MotorNormMode
from lerobot.common.motors.feetech import MODEL_NUMBER, FeetechMotorsBus
from tests.mocks.mock_feetech import MockMotors, MockPortHandler
@@ -30,9 +30,9 @@ def mock_motors() -> Generator[MockMotors, None, None]:
@pytest.fixture
def dummy_motors() -> dict[str, Motor]:
return {
"dummy_1": Motor(1, "sts3215", CalibrationMode.RANGE_M100_100),
"dummy_2": Motor(2, "sts3215", CalibrationMode.RANGE_M100_100),
"dummy_3": Motor(3, "sts3215", CalibrationMode.RANGE_M100_100),
"dummy_1": Motor(1, "sts3215", MotorNormMode.RANGE_M100_100),
"dummy_2": Motor(2, "sts3215", MotorNormMode.RANGE_M100_100),
"dummy_3": Motor(3, "sts3215", MotorNormMode.RANGE_M100_100),
}