docs/source/omx.mdx
First, assemble the OMX hardware following the official assembly guide.
OMX Assembly Guide: https://ai.robotis.com/omx/assembly_guide_omx.html
OMX robots are shipped preconfigured from the factory. Motor IDs, communication parameters, and joint offsets are already set, so no additional motor setup or calibration is required before using LeRobot.
To install LeRobot, follow our Installation Guide
In addition to these instructions, you need to install the Dynamixel SDK:
pip install -e ".[dynamixel]"
To find the port for each bus servo adapter, run this script:
lerobot-find-port
This command runs and when prompted, disconnect the USB cable from either the leader or follower arm and press Enter. The output will show 'The port of this MotorsBus is [port]'. This identifies the port for the disconnected arm. Repeat for the other arm to identify both ports.
<hfoptions id="find_port"> <hfoption id="Mac">Example output on macOS:
Finding all available ports for the MotorBus.
['/dev/tty.usbmodem575E0032081', '/dev/tty.usbmodem575E0031751']
Remove the USB cable from your MotorsBus and press Enter when done.
[...Disconnect corresponding leader or follower arm and press Enter...]
The port of this MotorsBus is /dev/tty.usbmodem575E0032081
Reconnect the USB cable.
Where the found port is: /dev/tty.usbmodem575E0032081 corresponding to your leader or follower arm.
On Linux, we strongly recommend using udev rules to assign persistent and human-readable device names to the OMX leader and follower arms. This avoids issues where device names such as ttyACM0 and ttyACM1 change when the robot is unplugged, replugged, or when the system is rebooted.
You should have obtained the port numbers like ../../ttyACM? for the leader and follower using lerobot-find-port. You can match those results with the serial numbers using the ls -l /dev/serial/by-id/ command.
To create udev rules, you need the unique serial number for each OMX device. The easiest way is to list devices under:
ls -l /dev/serial/by-id/
You will see output similar to:
usb-ROBOTIS_OpenRB-150_228BDD7B503059384C2E3120FF0A2B19-if00 -> ../../ttyACM0
usb-ROBOTIS_OpenRB-150_67E1ED68503059384C2E3120FF092234-if00 -> ../../ttyACM1
In each line, the serial number is the long string after usb-ROBOTIS_OpenRB-150_ and before -if00.
Follower serial: 228BDD7B503059384C2E3120FF0A2B19
Leader serial: 67E1ED68503059384C2E3120FF092234
Create a new udev rule file:
sudo nano /etc/udev/rules.d/99-omx.rules
Paste the following lines, replacing the serial numbers with the values you found above:
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{serial}=="228BDD7B503059384C2E3120FF0A2B19", SYMLINK+="omx_follower"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{serial}=="67E1ED68503059384C2E3120FF092234", SYMLINK+="omx_leader"
Save the file and reload udev rules:
sudo udevadm control --reload-rules
sudo udevadm trigger
Now unplug and replug both devices once.
Check that the persistent device names exist:
ls -l /dev/omx_follower /dev/omx_leader
You should see them pointing to ttyACM* devices:
/dev/omx_follower -> ttyACM*
/dev/omx_leader -> ttyACM*
These names remain stable across reboots and reconnections.
</hfoption> </hfoptions>After identifying the correct ports, you can directly teleoperate the follower arm using the leader arm.
<hfoptions id="teleoperate"> <hfoption id="Mac">lerobot-teleoperate \
--robot.type=omx_follower \
--robot.port=<your_follower_port> \
--robot.id=omx_follower_arm \
--teleop.type=omx_leader \
--teleop.port=<your_leader_port> \
--teleop.id=omx_leader_arm
During teleoperation, motions of the leader arm are mirrored in real time by the follower arm. OMX is already preconfigured, teleoperation can begin immediately without any calibration steps.
You can also enable camera input during teleoperation by providing a camera configuration for the follower arm.
lerobot-teleoperate \
--robot.type=omx_follower \
--robot.port=<your_follower_port> \
--robot.id=omx_follower_arm \
--robot.cameras="{front: {type: opencv, index_or_path: '/dev/video0', width: 640, height: 480, fps: 30}}" \
--teleop.type=omx_leader \
--teleop.port=<your_leader_port> \
--teleop.id=omx_leader_arm \
--display_data=true
When the camera is enabled, the camera stream is displayed in real time and synchronized with the robot state. This setup is useful for visual monitoring and can be reused later for demonstration recording and imitation learning.
</hfoption> <hfoption id="Linux">lerobot-teleoperate \
--robot.type=omx_follower \
--robot.port=/dev/omx_follower \
--robot.id=omx_follower_arm \
--teleop.type=omx_leader \
--teleop.port=/dev/omx_leader \
--teleop.id=omx_leader_arm
During teleoperation, motions of the leader arm are mirrored in real time by the follower arm. OMX is already preconfigured, teleoperation can begin immediately without any calibration steps.
You can also enable camera input during teleoperation by providing a camera configuration for the follower arm.
lerobot-teleoperate \
--robot.type=omx_follower \
--robot.port=/dev/omx_follower \
--robot.id=omx_follower_arm \
--robot.cameras="{front: {type: opencv, index_or_path: '/dev/video0', width: 640, height: 480, fps: 30}}" \
--teleop.type=omx_leader \
--teleop.port=/dev/omx_leader \
--teleop.id=omx_leader_arm \
--display_data=true
When the camera is enabled, the camera stream is displayed in real time and synchronized with the robot state. This setup is useful for visual monitoring and can be reused later for demonstration recording and imitation learning.
</hfoption> </hfoptions>Congrats 🎉, your robot is all set to learn a task on its own.
If you have any questions or need help, please reach out on Discord.