diff --git a/lerobot/common/motors/dynamixel/dynamixel.py b/lerobot/common/motors/dynamixel/dynamixel.py index 8f780de0..1e223bfa 100644 --- a/lerobot/common/motors/dynamixel/dynamixel.py +++ b/lerobot/common/motors/dynamixel/dynamixel.py @@ -202,41 +202,9 @@ def convert_to_bytes(value, n_bytes: int): class DynamixelMotorsBus(MotorsBus): """ - The DynamixelMotorsBus class allows to efficiently read and write to the attached motors. It relies on - the python dynamixel sdk to communicate with the motors. For more info, see the [Dynamixel SDK Documentation](https://emanual.robotis.com/docs/en/software/dynamixel/dynamixel_sdk/sample_code/python_read_write_protocol_2_0/#python-read-write-protocol-20). - - A DynamixelMotorsBus instance requires a port (e.g. `DynamixelMotorsBus(port="/dev/tty.usbmodem575E0031751"`)). - To find the port, you can run our utility script: - ```bash - python lerobot/scripts/find_motors_bus_port.py - >>> Finding all available ports for the MotorBus. - >>> ['/dev/tty.usbmodem575E0032081', '/dev/tty.usbmodem575E0031751'] - >>> Remove the usb cable from your DynamixelMotorsBus and press Enter when done. - >>> The port of this DynamixelMotorsBus is /dev/tty.usbmodem575E0031751. - >>> Reconnect the usb cable. - ``` - - Example of usage for 1 motor connected to the bus: - ```python - motor_name = "gripper" - motor_index = 6 - motor_model = "xl330-m288" - - motors_bus = DynamixelMotorsBus( - port="/dev/tty.usbmodem575E0031751", - motors={motor_name: (motor_index, motor_model)}, - ) - motors_bus.connect() - - position = motors_bus.read("Present_Position") - - # move from a few motor steps as an example - few_steps = 30 - motors_bus.write("Goal_Position", position + few_steps) - - # when done, consider disconnecting - motors_bus.disconnect() - ``` + The Dynamixel implementation for a MotorsBus. It relies on the python dynamixel sdk to communicate with + the motors. For more info, see the Dynamixel SDK Documentation: + https://emanual.robotis.com/docs/en/software/dynamixel/dynamixel_sdk/sample_code/python_read_write_protocol_2_0/#python-read-write-protocol-20). """ model_ctrl_table = deepcopy(MODEL_CONTROL_TABLE) diff --git a/lerobot/common/motors/feetech/feetech.py b/lerobot/common/motors/feetech/feetech.py index 3b4d4e84..1179a4e5 100644 --- a/lerobot/common/motors/feetech/feetech.py +++ b/lerobot/common/motors/feetech/feetech.py @@ -215,41 +215,8 @@ def convert_to_bytes(value, n_bytes: int): class FeetechMotorsBus(MotorsBus): """ - The FeetechMotorsBus class allows to efficiently read and write to the attached motors. It relies on - the python feetech sdk to communicate with the motors. For more info, see the [feetech SDK Documentation](https://emanual.robotis.com/docs/en/software/feetech/feetech_sdk/sample_code/python_read_write_protocol_2_0/#python-read-write-protocol-20). - - A FeetechMotorsBus instance requires a port (e.g. `FeetechMotorsBus(port="/dev/tty.usbmodem575E0031751"`)). - To find the port, you can run our utility script: - ```bash - python lerobot/scripts/find_motors_bus_port.py - >>> Finding all available ports for the MotorsBus. - >>> ['/dev/tty.usbmodem575E0032081', '/dev/tty.usbmodem575E0031751'] - >>> Remove the usb cable from your FeetechMotorsBus and press Enter when done. - >>> The port of this FeetechMotorsBus is /dev/tty.usbmodem575E0031751. - >>> Reconnect the usb cable. - ``` - - Example of usage for 1 motor connected to the bus: - ```python - motor_name = "gripper" - motor_index = 6 - motor_model = "sts3215" - - motors_bus = FeetechMotorsBus( - port="/dev/tty.usbmodem575E0031751", - motors={motor_name: (motor_index, motor_model)}, - ) - motors_bus.connect() - - position = motors_bus.read("Present_Position") - - # move from a few motor steps as an example - few_steps = 30 - motors_bus.write("Goal_Position", position + few_steps) - - # when done, consider disconnecting - motors_bus.disconnect() - ``` + The FeetechMotorsBus class allows to efficiently read and write to the attached motors. It relies on the + python feetech sdk to communicate with the motors, which is itself based on the dynamixel sdk. """ model_ctrl_table = deepcopy(MODEL_CONTROL_TABLE) diff --git a/lerobot/common/motors/motors_bus.py b/lerobot/common/motors/motors_bus.py index e2fdcb73..26ae3836 100644 --- a/lerobot/common/motors/motors_bus.py +++ b/lerobot/common/motors/motors_bus.py @@ -154,7 +154,46 @@ class PacketHandler(Protocol): class MotorsBus(abc.ABC): - """The main LeRobot class for implementing motors buses.""" + """The main LeRobot class for implementing motors buses. + + There are currently two implementations of this abstract class: + - DynamixelMotorsBus + - FeetechMotorsBus + + Note: This class may evolve in the future should we add support for other manufacturers SDKs. + + A MotorsBus allows to efficiently read and write to the attached motors. + It represents a several motors daisy-chained together and connected through a serial port. + + A MotorsBus subclass instance requires a port (e.g. `FeetechMotorsBus(port="/dev/tty.usbmodem575E0031751"`)). + To find the port, you can run our utility script: + ```bash + python lerobot/scripts/find_motors_bus_port.py + >>> Finding all available ports for the MotorsBus. + >>> ['/dev/tty.usbmodem575E0032081', '/dev/tty.usbmodem575E0031751'] + >>> Remove the usb cable from your MotorsBus and press Enter when done. + >>> The port of this MotorsBus is /dev/tty.usbmodem575E0031751. + >>> Reconnect the usb cable. + ``` + + Example of usage for 1 Feetech sts3215 motor connected to the bus: + ```python + motors_bus = FeetechMotorsBus( + port="/dev/tty.usbmodem575E0031751", + motors={"gripper": (6, "sts3215")}, + ) + motors_bus.connect() + + position = motors_bus.read("Present_Position") + + # Move from a few motor steps as an example + few_steps = 30 + motors_bus.write("Goal_Position", position + few_steps) + + # When done, properly disconnect the port using + motors_bus.disconnect() + ``` + """ model_ctrl_table: dict[str, dict] model_resolution_table: dict[str, int]