mirror of
https://github.com/huggingface/lerobot.git
synced 2026-05-31 10:51:35 +00:00
83 lines
2.7 KiB
Python
83 lines
2.7 KiB
Python
"""
|
|
Usage example
|
|
|
|
```python
|
|
from lerobot.common.debugging.motors_bus import visualize_motors_bus
|
|
from lerobot.common.robots.so100 import SO100Robot, SO100RobotConfig
|
|
|
|
cfg = SO100RobotConfig(port="/dev/tty.usbmodem58760430541")
|
|
so100 = SO100Robot(cfg)
|
|
|
|
visualize_motors_bus(so100.arm)
|
|
```
|
|
"""
|
|
|
|
import time
|
|
|
|
from lerobot.common.motors import MotorsBus
|
|
from lerobot.common.motors.feetech.feetech_calibration import (
|
|
adjusted_to_homing_ticks,
|
|
adjusted_to_motor_ticks,
|
|
convert_degrees_to_ticks,
|
|
convert_ticks_to_degrees,
|
|
)
|
|
|
|
|
|
def visualize_motors_bus(motors_bus: MotorsBus):
|
|
"""
|
|
Reads each joint's (1) raw ticks, (2) homed ticks, (3) degrees, and (4) invert-adjusted ticks.
|
|
"""
|
|
if not motors_bus.is_connected:
|
|
motors_bus.connect()
|
|
|
|
# Disable torque on all motors so you can move them freely by hand
|
|
values_dict = {idx: 0 for idx in motors_bus.motor_ids}
|
|
motors_bus.write("Torque_Enable", values_dict)
|
|
print("Torque disabled on all joints.")
|
|
|
|
try:
|
|
print("\nPress Ctrl+C to quit.\n")
|
|
while True:
|
|
# Read *raw* positions (no calibration).
|
|
raw_positions = motors_bus.read("Present_Position")
|
|
|
|
# # Read *already-homed* positions
|
|
# homed_positions = motor_bus.read("Present_Position")
|
|
|
|
for name, raw_ticks in raw_positions.items():
|
|
idx = motors_bus.motors[name][0]
|
|
model = motors_bus.motors[name][1]
|
|
|
|
# homed_val = homed_positions[i] # degrees or % if linear
|
|
|
|
# Manually compute "adjusted ticks" from raw ticks
|
|
manual_adjusted = adjusted_to_homing_ticks(raw_ticks, model, motors_bus, idx)
|
|
# Convert to degrees
|
|
manual_degs = convert_ticks_to_degrees(manual_adjusted, model)
|
|
|
|
# Convert that deg back to ticks
|
|
manual_ticks = convert_degrees_to_ticks(manual_degs, model)
|
|
# Then invert them using offset & bus drive mode
|
|
inv_ticks = adjusted_to_motor_ticks(manual_ticks, model, motors_bus, idx)
|
|
|
|
print(
|
|
f"{name:15s} | "
|
|
f"RAW={raw_ticks:4d} | "
|
|
# f"HOMED_FROM_READ={homed_val:7.2f} | "
|
|
f"HOMED_TICKS={manual_adjusted:6d} | "
|
|
f"MANUAL_ADJ_DEG={manual_degs:7.2f} | "
|
|
f"MANUAL_ADJ_TICKS={manual_ticks:6d} | "
|
|
f"INV_TICKS={inv_ticks:4d} "
|
|
)
|
|
print("----------------------------------------------------")
|
|
time.sleep(0.25)
|
|
except KeyboardInterrupt:
|
|
pass
|
|
finally:
|
|
print("\nExiting. Disconnecting bus...")
|
|
motors_bus.disconnect()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
visualize_motors_bus()
|