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.

Status: the unit tests pass with LeRobot 0.6.1. This version is not yet tested with a real KER and real OpenArm arms.

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 and 2.1.0 frame formats, in the unit tests only
Python 3.12

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.0

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.0
File Size Uploaded
lerobot_teleoperator_openarm_ker-0.1.0.tar.gz 13.5 kB Details

Built distribution (wheel)

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

Total release size: 28.2 kB

Release files / lerobot_teleoperator_openarm_ker-0.1.0.tar.gz

Download URL lerobot_teleoperator_openarm_ker-0.1.0.tar.gz
Size 13.5 kB
Tags Source
SHA-256 checksum
How to use checksums
8cc555abfb06c1c0eb9bf8ee4b52e4a92fe49e6977eb2a1f19bf096e818aa269
BLAKE2b-256 checksum
How to use checksums
911c4dfd57fcb2fd6c1a9c666461a4511773ffc6ae90e479cb564f5e60afd22f
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.0-py3-none-any.whl

Download URL lerobot_teleoperator_openarm_ker-0.1.0-py3-none-any.whl
Size 14.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
02861135d616ee65afeca26b590f3a6a00a3e88be7d26f221576eba5068c73c1
BLAKE2b-256 checksum
How to use checksums
c7c66ba8ceb0e001ed25f19b89c3dea0d7e7cdc48e91c85981a984ead492e7c4
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

0.1.1

2 release files

This release

0.1.0 This release

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