lerobot_teleoperator_openarm_ker
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'sdora-openarm-ker. To change the map, give the released and the pulled value, for example--teleop.left_gripper_deg="[65, 0]". The options areright_trigger_deg,left_trigger_deg,right_gripper_degandleft_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_targetlimits the step.
Before the first session
- Check the follower zero. KER and the follower must use the same zero: the arm hangs straight down and the gripper is closed.
lerobot-calibrateasks for this pose. If no calibration file exists for--robot.id,openarm_followersets the motor zeros again when it connects. - Check the mapping with no motion. Run
python -m lerobot_teleoperator_openarm_kerand 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. - Set
max_relative_target. It limits each step of the follower. At the default 60 fps oflerobot-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)
| File | Size | Uploaded | |
|---|---|---|---|
| lerobot_teleoperator_openarm_ker-0.1.0.tar.gz | 13.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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 logRelease 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