Key points
- What OpenARM is: A fully open-source, 7-DOF-per-arm dual-arm robot with quasi-direct-drive (QDD) joints, designed for physical AI and embodied intelligence research. Hardware CAD, firmware, control code, and simulation tools are all public.
- Defining features: Full backdrivability (you can push the arm by hand and it yields) and bilateral force feedback (the follower arm returns contact forces to the operator's leader arm), enabling safe hand-guided teaching and tactile teleoperation.
- Three-piece ecosystem:
- OpenArm 2.0 – the arm itself: 633 mm reach, 4.1 kg rated / 6.0 kg peak payload, QDD backdrivable joints with mechanical limits per axis, parallel gripper with integrated hand-eye camera, MISUMI aluminum frame.
- OpenArm Cell – a standardized reproducible evaluation chamber (uniform background, lighting, cameras, arm placement) for fair, automated model comparison.
- OpenArm KER – Kinematic Equivalent Replica, a motor-less leader arm matching the real arm's kinematics for low-fatigue teaching.
- Core concepts explained: 7 DOF, QDD quasi-direct-drive, CAN-FD bus (1 Mbps, 1 kHz control loop), ROS2 (ros2_control + MoveIt2), unilateral vs bilateral teleoperation, and LeRobot (Hugging Face's imitation-learning framework, which officially uses OpenARM as a data-collection device).
- Prerequisites: Ubuntu 22.04 or 24.04, ROS2 Humble/Iron/Jazzy, a USB-CAN adapter, Python 3.10+ in a venv, colcon + ament build tools. The Damiao variant specifically requires Ubuntu 24.04, a candleLight-firmware USB-CAN, and a pure Python venv workflow.
- Seven-step quickstart (enactic mainline): 1. Install ROS2 and base dependencies (
- Advanced paths:
- Sim2Real: train PPO and other RL policies in parallel on GPU inside
openarm_isaac_lab, then transfer to the real arm. - Imitation learning: record human demonstrations via bilateral teleop as LeRobot datasets and train policy networks.
- Reproducible evaluation: place the arm in the OpenArm Cell so model A vs model B comparisons are automatable and rerunnable.
- Two code branches to pick by hardware:
- enactic/openarm mainline – ROS2 + CAN-FD + Damiao DM-series motors (J8009P/J4340P/J4310); follow the seven steps above.
- anvil-robotics/openarm (Damiao variant) – Ubuntu 24.04, pure Python venv, requires candleLight-firmware USB-CAN; setup uses
scripts/setup_can.shto assign persistent CAN names, thenpip install -e .and runspython -m openarm.damiao.gravityfor gravity-compensation demos andpython -m openarm.damiao.monitor -tfor leader–follower teleoperation. A separate Dynamixel (6-DOF) community guide covers single-arm RViz + keyboard teleop viadisplay.launch.pyandkeyboard_teleop. - Safety: backdrivability means the arm can pinch or jerk unexpectedly. Bolt it securely to a stable bench away from foot traffic and flammables, know the e-stop location, wear PPE (safety glasses, fitted sleeves), keep payloads below 4.1 kg after subtracting gripper weight, and re-assess joint limits for large or unusual end-effectors.
- Resources:
- Home: https://openarm.dev
- Docs: https://docs.openarm.dev
- Code: https://github.com/enactic/openarm
- Simulation:
openarm_isaac_lab - Dataset:
openarm_dataset - Dataflow:
dora-openarm - Community: Discord https://discord.gg/GmYa262ETH and GitHub Issues/Discussions
- Procurement: DIY kits or assembled units; free manufacturing and derivative-development license granted to Chinese mainland manufacturers.
python3-colcon-common-extensions, can-utils).
2. Create ~/ros2_ws/src and clone seven repos: openarm_description, openarm_can, openarm_ros2, openarm_teleop, and optionally openarm_isaac_lab and openarm_mujoco.
3. colcon build and source the install.
4. Bring up SocketCAN: sudo ip link set can0 up type can bitrate 1000000.
5. Visualize in RViz with display_openarm.launch.py (single or bimanual, arm_type:=v10).
6. Launch bringup in fake-hardware mode and publish a JointState to move to the home position; start with small, slow motions to avoid self-collision.
7. Run unilateral keyboard teleop (teleop_unilateral.launch.py) or bilateral force-feedback teleop (teleop_bilateral.launch.py); for real hardware pass can_interface:=can0.
*Specifications and commands compiled from openarm.dev, docs.openarm.dev, the enactic and anvil-robotics repositories, and community onboarding materials. The project iterates quickly; always defer to the documentation matching your specific hardware revision.*