Skip to main content

lerobot_teleoperator_openarm_ker

CI PyPI

A LeRobot teleoperator for the OpenArm KER leader arm by Enactic. KER drives the LeRobot bi_openarm_follower, or one openarm_follower.

Install

pip install lerobot_teleoperator_openarm_ker

LeRobot finds the plugin by its package name. You do not have to import it.

KER uses a USB vendor class, not a serial port. Its library, openarm_ker, needs libusb:

  • Ubuntu: install libusb-1.0-0, then give your user access to KER:

    echo 'SUBSYSTEM=="usb", ATTRS{idVendor}=="303a", ATTRS{idProduct}=="4002", MODE="0666"' \
      | sudo tee /etc/udev/rules.d/99-openarm-ker.rules
    sudo udevadm control --reload-rules && sudo udevadm trigger
    
  • macOS: brew install libusb.

  • Windows: not tested.

Connect KER directly to a USB port of the computer. Behind a hub or a dock, KER can stay in its boot mode (firmware issue 7). Only one program can use KER at a time.

Use

Read Before the first session first.

Both arms:

lerobot-teleoperate \
  --robot.type=bi_openarm_follower \
  --robot.id=my_openarm \
  --robot.left_arm_config.port=can0 \
  --robot.left_arm_config.side=left \
  --robot.left_arm_config.max_relative_target=5 \
  --robot.right_arm_config.port=can1 \
  --robot.right_arm_config.side=right \
  --robot.right_arm_config.max_relative_target=5 \
  --teleop.type=openarm_ker

One arm:

lerobot-teleoperate \
  --robot.type=openarm_follower \
  --robot.id=my_follower \
  --robot.port=can0 \
  --robot.side=right \
  --robot.max_relative_target=5 \
  --teleop.type=openarm_ker \
  --teleop.arms=right

lerobot-record takes the same --robot and --teleop arguments.

Behaviour

  • Joints. The KER firmware applies the zero and the joint offsets. The plugin sends each joint angle to the follower in degrees with no change.
  • Grippers. A linear map converts each trigger to a gripper position. A released trigger gives -65° (open), and a fully pulled trigger gives 0° (closed). These are the gripper limits of openarm_follower. The trigger ranges (0° to -60° on the right, 0° to 60° on the left) come from Enactic's dora-openarm-ker. To change the map, give the released and the pulled value, for example --teleop.left_gripper_deg="[65, 0]". The options are right_trigger_deg, left_trigger_deg, right_gripper_deg and left_gripper_deg.
  • Calibration. None. KER keeps its zero in the device. The plugin never sends a zero command, because that command overwrites the calibration in the device. To zero KER, follow the KER calibration workflow.
  • Encoders. connect() stops with an error if an encoder of a used arm did not answer when KER started.
  • Stream stops. KER stops its stream in two cases. The first is its jump detection: a joint angle stays 30° or more away from its last good value for 20 frames. The second is a reconnect of the USB link. The plugin then holds the last pose and logs a warning. To continue, tap START on the KER screen. The follower then moves to the KER pose at once, unless max_relative_target limits the step.

Before the first session

  1. Check the follower zero. KER and the follower must use the same zero: the arm hangs straight down and the gripper is closed. lerobot-calibrate asks for this pose. If no calibration file exists for --robot.id, openarm_follower sets the motor zeros again when it connects.
  2. Check the mapping with no motion. Run python -m lerobot_teleoperator_openarm_ker and hold KER in the zero pose. Every joint must read about 0°. Then compare each joint and each gripper with the follower in the same pose, with the follower torque off. Check the direction of the left gripper in particular.
  3. Set max_relative_target. It limits each step of the follower. At the default 60 fps of lerobot-teleoperate, a value of 5 limits each joint to 300° per second.

Compatibility

Component Version
LeRobot 0.6.1
openarm_ker 0.3.0
KER firmware 2.0.0 on hardware. The 2.1.0 frame format in the unit tests.
Python 3.12

On hardware, KER firmware 2.0.0 streamed 39,979 frames through openarm_ker 0.3.0 at 500 Hz, with no lost frames, no checksum errors and no reconnects. The runs were on Linux (x86_64) and macOS (arm64). All 16 channels responded. The same channel layout drove two OpenArm 2.0 arms through Enactic's dora teleop.

Development

uv sync
uv run pytest
uv run ruff check . && uv run ruff format --check .
uv run mypy

Licence

Apache-2.0. See LICENSE.

KER, openarm_ker and the KER firmware are by Enactic, Inc., under Apache-2.0. This project is not affiliated with Enactic or Hugging Face.

Metadata

Release files for lerobot-teleoperator-openarm-ker 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for lerobot-teleoperator-openarm-ker 0.1.1
File Size Uploaded
lerobot_teleoperator_openarm_ker-0.1.1.tar.gz 13.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for lerobot-teleoperator-openarm-ker 0.1.1
File Interpreter ABI Platform
lerobot_teleoperator_openarm_ker-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 28.4 kB

Release files / lerobot_teleoperator_openarm_ker-0.1.1.tar.gz

Download URL lerobot_teleoperator_openarm_ker-0.1.1.tar.gz
Size 13.6 kB
Tags Source
SHA-256 checksum
How to use checksums
bfbad1a8cc07b5e7b5d36e21faca4e1204e6f4a20dadad55397b3dc8b848bd9f
BLAKE2b-256 checksum
How to use checksums
9ad12c9830f5d04fbf6be7b52827dce885e14cc0bc747b8761508c0c91a936a8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 9, 2026.

Transparency log

Release files / lerobot_teleoperator_openarm_ker-0.1.1-py3-none-any.whl

Download URL lerobot_teleoperator_openarm_ker-0.1.1-py3-none-any.whl
Size 14.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d18f270fe4f26b8d5702ed87e21a40d3787d63d72add0a758f534d454c1a5f73
BLAKE2b-256 checksum
How to use checksums
4f4d821698e862e65b9f6c4ed6bfa5b7ad385ac9eab1a37c922219915c064b64
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 9, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page