Files
lerobot/lerobot_robot_ax_arm
CarolinePascal f07391948a Add EE keyboard teleop/sim for AX arm with robust IK
- teleoperate_ee_keyboard.py: velocity IK (dual-quaternion resolved-rate
  ported from realtime_servoing, plus a position-Jacobian solver) integrated
  to position commands; local/global frame toggle where global uses the
  position Jacobian with damped least-squares; constant Cartesian-speed
  scaling with a joint-step cap; ramped homing to the reference pose.
- simulate_ee_keyboard.py: hardware-free 3D sim reusing the same IK.
- urdf_mapping.py: widen shoulder_pan (+/-90) and elbow_flex (0-180) limits.
- ax_arm.py: guard send_action against non-.pos / non-string keys.
2026-07-21 13:41:35 +02:00
..

lerobot_robot_ax_arm

A third-party LeRobot robot: a 4-DoF arm driven by Dynamixel AX-series servos (e.g. AX-12A) over Protocol 1.0.

Motor ID Joint Normalization
1 shoulder_pan [-100, 100]
2 shoulder_lift [-100, 100]
3 elbow_flex [-100, 100]
4 gripper [0, 100]

Protocol 1.0 notes

AX-series motors differ from the X-series (Protocol 2.0) used elsewhere in LeRobot:

  • No Sync Read — positions are read sequentially (get_observation / calibration). Sync Write is still used for Goal_Position.
  • No Operating_Mode / PID registersconfigure() only lowers the return delay time.
  • No homing offset register — calibration records the range of motion only (homing_offset = 0) and is stored via the CW/CCW angle limits.

Install

pip install -e .

This is discovered automatically by LeRobot thanks to the lerobot_robot_ package prefix.

Usage

lerobot-record \
  --robot.type=ax_arm \
  --robot.port=/dev/tty.usbserial-AL02L1E0 \
  # ... other arguments

Or from Python:

from lerobot_robot_ax_arm import AXArm, AXArmConfig

robot = AXArm(AXArmConfig(port="/dev/tty.usbserial-AL02L1E0"))
robot.connect()
obs = robot.get_observation()
robot.disconnect()