Skip to main content

lekit-robot

Small Python SDK for a running Lekit Robot Node. Discover a robot by name, read joint/pose feedback and RGB/depth images, and send absolute motion targets. The client does not install LeRobot, Torch, OpenCV, robot drivers, or camera drivers. Python 3.12+ is required.

Install

After publication:

pip install lekit-robot

From this repository before publication:

pip install ./packages/lekit_robot

Robot Node must already be running on the robot computer. Clients need network access to its Zenoh peer; the browser's HTTP port 8080 is not the SDK endpoint. LAN multicast discovery is the default. If discovery is blocked, configure both Node (lekit-robot --zenoh-router tcp/ROUTER_IP:7447) and client (connect(name="NERO Dual", router="tcp/ROUTER_IP:7447")) to use an existing Zenoh router. This package does not install the Robot Node command-line server.

Observe (does not acquire control)

from lekit_robot import connect

with connect(name="NERO Dual", timeout=5) as robot:
    obs = robot.get_observation(images=True, timeout=5)
    print(obs.robot.status, obs.robot.state)
    camera = obs.camera(name="head_view")
    if camera.color is not None:
        print(camera.color.shape)  # H x W x 3, RGB uint8
    print(robot.descriptor.joint_fields)

images=False omits images. robot.observations(images=False, timeout=5) yields latest-only snapshots. Camera samples have independent capture times; an observation is not a hardware-synchronized frame set. Check sample status and capture time. Depth is a uint16 array in the server's camera units, not automatically metres.

Control

Control requires enabled motors, allow_control=True, fresh feedback, normal mode, and no emergency stop. Close Teleop before acquiring external control. The context manager holds and renews an exclusive control lease and releases it on exit. Multiple clients may observe; only one controller may own the lease.

The following function sends a real motion command when called:

from lekit_robot import connect

def move_left_joint3(delta_rad):
    with connect(name="NERO Dual") as robot:
        with robot.control():
            obs = robot.get_observation(images=False)
            state = obs.robot.state
            if obs.robot.status != "connected" or not state or not state.get("left.feedback_fresh"):
                raise RuntimeError("Fresh left arm feedback is required")
            joints = [state[f"left.joint_{i}"] for i in range(1, 8)]
            joints[2] += delta_rad
            return robot.set_joints(joints, side="left")
Method Target
set_joints(values, side=None, timeout=None) Absolute joint values in advertised order, or a mapping with full field names
set_target(values, side=None, mode="point", timeout=None) Absolute flange/EEF pose in advertised order, or a full-key mapping
set_target(x=..., y=..., z=..., roll=..., pitch=..., yaw=..., side="left") One arm's complete pose
set_gripper(width, side="left", timeout=None) One gripper's absolute opening
set_gripper(values, timeout=None) All grippers, in advertised order or full-key mapping

For NERO Dual, left is can1 and right is can0. Joint/rotation units are radians; position and gripper width units are metres. Pose fields represent the flange in that arm's base frame. For other robots use the plugin-declared field semantics. side selects only that arm; the other arm receives no target. Without side, provide the complete advertised target (14 joint values or 12 pose values for NERO). A scalar gripper width requires side on a dual-arm robot. There is no implicit broadcast of one pose or gripper value to both arms.

NERO uses firmware-planned point targets. stream replaces targets through the same backend; it does not guarantee a hard realtime servo or a straight path. Unsupported modes, partial targets and out-of-range values are rejected.

A receipt acknowledges command submission, not arrival or successful IK. Continue observing measured state and alarms. ActionOutcomeUnknownError means a command may already have executed: do not retry it automatically. A control lease is ownership arbitration, not a hardware emergency stop or a stop-on-disconnect guarantee. Use the Robot Node emergency stop or physical stop as appropriate.

Compatibility

The wire protocol remains lekit/v1. New clients opt into the gripper manifest extension; old clients continue to receive the original manifest shape. An old Node can still supply observations and existing targets, but gripper commands need an updated Node; unsupported grippers raise UnsupportedCommandError locally. Per-arm commands also require the updated Node validation. Update client and Node together for complete NERO Dual support. Reconnect after replacing the Node or its robot configuration; the SDK never silently rebinds an existing control session.

Existing applications may keep from lekit.robot import connect when the main project is installed: those imports re-export this package's implementation.

Build and release

From packages/lekit_robot:

python -m pip install build twine
python -m build
python -m twine check dist/*
python -m twine upload --repository testpypi dist/*
# After testing the installed wheel in a clean environment:
python -m twine upload dist/*

Publishing needs a PyPI account and an API token or configured Trusted Publisher. Never store credentials in source files. Version 0.1.0 is the initial release; subsequent releases must use a new version number.

License: Apache-2.0, matching the repository's existing standalone package convention.

A build/test and manual publishing workflow is provided at .github/workflows/lekit-robot-release.yml. It installs the built wheel in an isolated environment before testing. Pushes and pull requests only build/test. After the workflow is committed to the default branch, configure a PyPI pending Trusted Publisher for a new project:

  • Project: lekit-robot
  • Owner: sorelferris
  • Repository: lekit
  • Workflow: lekit-robot-release.yml
  • Environment: pypi (or testpypi on TestPyPI)

Then run the workflow manually, selecting testpypi first, and pypi for the release. Configure the two registries separately. This avoids storing a long-lived PyPI token. See https://docs.pypi.org/trusted-publishers/creating-a-project-through-oidc/.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

lekit_robot-0.1.0.tar.gz (20.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

lekit_robot-0.1.0-py3-none-any.whl (20.0 kB view details)

Uploaded Python 3

File details

Details for the file lekit_robot-0.1.0.tar.gz.

File metadata

  • Download URL: lekit_robot-0.1.0.tar.gz
  • Upload date:
  • Size: 20.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for lekit_robot-0.1.0.tar.gz
Algorithm Hash digest
SHA256 30d16615de44545bc5d524a98057683a1aeed145edaaef1a945d29ef73d3b491
MD5 7258acd89a6815b101827bb79574723b
BLAKE2b-256 49e0b19b5315d3e7f25c532385745f791e734a3cc8f2ed4370ee6daf92c0a91d

See more details on using hashes here.

Provenance

The following attestation bundles were made for lekit_robot-0.1.0.tar.gz:

Publisher: lekit-robot-release.yml on sorelferris/lekit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file lekit_robot-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: lekit_robot-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 20.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for lekit_robot-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6e2f73544017d0ea5e2daf2784cbafa4e830858ee430f7e7657e3579f1169942
MD5 acda2133843b6c4827aa5e98faba9820
BLAKE2b-256 7e19aff27839230ae471361e31437306f881dde028d61626fce833f45069fb68

See more details on using hashes here.

Provenance

The following attestation bundles were made for lekit_robot-0.1.0-py3-none-any.whl:

Publisher: lekit-robot-release.yml on sorelferris/lekit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.1.1

2 files

This release

0.1.0 This release

2 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