From 4feaef34366cb2bf44f676accb873bc0547b7050 Mon Sep 17 00:00:00 2001 From: Simon Alibert Date: Thu, 22 May 2025 16:02:55 +0200 Subject: [PATCH] Adapt feetech calibration --- lerobot/common/motors/dynamixel/dynamixel.py | 4 ++++ lerobot/common/motors/feetech/feetech.py | 20 ++++++++++++++++++++ lerobot/common/motors/motors_bus.py | 3 ++- tests/mocks/mock_motors_bus.py | 1 + 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/lerobot/common/motors/dynamixel/dynamixel.py b/lerobot/common/motors/dynamixel/dynamixel.py index 16c4b98a9..cbf478da0 100644 --- a/lerobot/common/motors/dynamixel/dynamixel.py +++ b/lerobot/common/motors/dynamixel/dynamixel.py @@ -169,6 +169,10 @@ class DynamixelMotorsBus(MotorsBus): for motor in self.motors: self.write("Return_Delay_Time", motor, 0) + @property + def is_calibrated(self) -> bool: + return self.calibration == self.read_calibration() + def read_calibration(self) -> dict[str, MotorCalibration]: offsets = self.sync_read("Homing_Offset", normalize=False) mins = self.sync_read("Min_Position_Limit", normalize=False) diff --git a/lerobot/common/motors/feetech/feetech.py b/lerobot/common/motors/feetech/feetech.py index be97cd7b1..12a8053ef 100644 --- a/lerobot/common/motors/feetech/feetech.py +++ b/lerobot/common/motors/feetech/feetech.py @@ -227,6 +227,26 @@ class FeetechMotorsBus(MotorsBus): self.write("Maximum_Acceleration", motor, 254) self.write("Acceleration", motor, 254) + @property + def is_calibrated(self) -> bool: + motors_calibration = self.read_calibration() + if set(motors_calibration) != set(self.calibration): + return False + + same_ranges = all( + self.calibration[motor].range_min == cal.range_min + and self.calibration[motor].range_max == cal.range_max + for motor, cal in motors_calibration.items() + ) + if self.protocol_version == 1: + return same_ranges + + same_offsets = all( + self.calibration[motor].homing_offset == cal.homing_offset + for motor, cal in motors_calibration.items() + ) + return same_ranges and same_offsets + def read_calibration(self) -> dict[str, MotorCalibration]: if self.protocol_version == 0: offsets = self.sync_read("Homing_Offset", normalize=False) diff --git a/lerobot/common/motors/motors_bus.py b/lerobot/common/motors/motors_bus.py index 58b1e49bc..3b665b160 100644 --- a/lerobot/common/motors/motors_bus.py +++ b/lerobot/common/motors/motors_bus.py @@ -625,9 +625,10 @@ class MotorsBus(abc.ABC): raise RuntimeError("Failed to write bus baud rate.") @property + @abc.abstractmethod def is_calibrated(self) -> bool: """bool: ``True`` if the cached calibration matches the motors.""" - return self.calibration == self.read_calibration() + pass @abc.abstractmethod def read_calibration(self) -> dict[str, MotorCalibration]: diff --git a/tests/mocks/mock_motors_bus.py b/tests/mocks/mock_motors_bus.py index 2a35dfb30..e322eae8a 100644 --- a/tests/mocks/mock_motors_bus.py +++ b/tests/mocks/mock_motors_bus.py @@ -125,6 +125,7 @@ class MockMotorsBus(MotorsBus): def _handshake(self): ... def _find_single_motor(self, motor, initial_baudrate): ... def configure_motors(self): ... + def is_calibrated(self): ... def read_calibration(self): ... def write_calibration(self, calibration_dict): ... def disable_torque(self, motors, num_retry): ...