This release is a pre-release and may not be stable for production use.
menlo-sdk
Python SDK for Menlo robots: Asimov 1.
You drive the robot with one Robot class and the robot's own verbs: stand, set_velocity, stop, damp, goto and trajectory.
Installation
pip install menlo-sdk
# or, with uv
uv add menlo-sdk
Quickstart
Stand the robot up, walk forward for 3 s, and stop. The robot must be on its feet, hanging from its gantry hook, with 2 m of clear floor ahead.
from menlo.asimov import ConnectionConfig, Mode, Robot, UdpConfig
config = ConnectionConfig(udp=UdpConfig(host="192.168.22.32")) # the robot's address
with Robot(config).connect("udp") as robot:
if robot.state.mode is Mode.DAMP:
robot.wait_ready("stand") # fresh state, no fault, battery and actuators ok
robot.stand()
robot.wait_for(Mode.STAND)
robot.wait_ready("move") # armed: STAND held upright for 0.5 s
robot.set_velocity(vx=0.3, duration=3.0, wait=True)
robot.stop() # zero velocity: the robot stays in MOVE and balances in place
To keep the address out of the code, set MENLO_UDP_HOST=192.168.22.32 and use Robot().connect().
The udp connection mode needs two Asimov Edge parameters, set in Asimov Manager: udp-control on, and udp-state-host set to your computer's address.
Examples
The examples are short scripts, one purpose each. Settings are constants at the top of each file. Every script that moves the robot checks it first, with require_ready() from check.py.
git clone https://github.com/menloresearch/menlo-sdk
cd menlo-sdk
export MENLO_UDP_HOST=192.168.22.32 # or save the robot with `menlo setup`
python examples/check.py # is the robot ready? sends nothing
python examples/stand.py # DAMP to STAND, then wait until armed
python examples/walk.py # walk forward for 3 s, then stop
python examples/damp.py # asks first; the robot must be supported
- check.py: readiness to stand, walk or run a trajectory.
- connect.py: the three connection modes side by side.
- read_state.py: a tour of the robot's state.
- stand.py, walk.py, damp.py: one verb each.
- keyboard.py: drive from the keyboard in short steps.
- move_joints.py: bend an elbow with
goto(). - camera_and_audio.py: a photo, a clip and a tone.
- record_and_replay.py: record state to a file and read it back.
- livekit_raw/: the robot's LiveKit room without the SDK.
- apps/: follow a ball, and tools for an agent.
The examples page walks through each one.
Safety
Read the safety page before you run a script on a robot.
- Nothing in the SDK is an emergency stop. Use the E-Stop in Asimov Manager, or cut power at the battery unit.
- Call
stand()only from DAMP. End a walk withstop(): the robot stays in MOVE and keeps balancing. - Keep the robot supported, hanging from its gantry hook or seated on a bench, for
damp()and for joint control (goto,trajectory). - The firmware caps velocity at 0.4 m/s forward and sideways and 0.8 rad/s turning.
robot.preflight(action)reports what stands in the way of a stand, a walk or a trajectory, and sends nothing.
Connection modes
connect(mode) selects how commands, state and media reach the robot. The API is the same in every mode.
| Mode | Carries | Needs |
|---|---|---|
"udp" |
control and state over UDP | the robot's address |
"hybrid" |
control and state over UDP, camera and audio over LiveKit | the robot's address, the Asimov Manager URL and an SDK credential |
"livekit" |
everything through the robot's LiveKit room | the Asimov Manager URL and an SDK credential |
The SDK credential comes from the Developer page of Asimov Manager. connect.py shows each mode.
Command line
The menlo command saves robots, shows readiness and runs the basic verbs. Robot() and the examples use the saved robot when no MENLO_* variable says otherwise.
menlo setup # save a robot: name, connection mode, live checks
menlo status --watch # READY, NOT READY or FAULTED; sends nothing
menlo stand # DAMP to STAND, then wait until armed; asks first
menlo walk --vx 0.3 --duration 3 # walk, then stop(); asks first
menlo stop # zero velocity, only in MOVE
menlo damp # every actuator limp; asks first
Every command and flag is on the command line page.
Documentation
- Python SDK on Asimov 1: install, run the examples, operate from the command line.
- Python SDK guide: connection modes, moving, joints, state, media, recording, safety and reference.
- docs/REFERENCE.md: every option, the protocol and the errors.
- docs/SKILL.md: a brief for agents writing scripts against this SDK.
- CHANGELOG.md
Requirements
- Python 3.12 or newer.
- An Asimov 1 robot. For hybrid and livekit, an SDK credential from Asimov Manager.
- Optional, only for the calls that use them:
PillowforFrame.to_jpeg(),numpyforFrame.to_numpy(),opencv-pythonforClip.save_mp4().
Contributing
Issues and pull requests are welcome at https://github.com/menloresearch/menlo-sdk. CONTRIBUTING.md describes the development setup and the checks a change must pass.
Security
Report a vulnerability privately to security@menlo.ai, not in a public issue. See SECURITY.md.
License
MIT. See LICENSE.
Metadata
Release files for menlo-sdk 0.1.0rc7
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| menlo_sdk-0.1.0rc7.tar.gz | 230.4 kB | With provenance | Details for menlo_sdk-0.1.0rc7.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| menlo_sdk-0.1.0rc7-py3-none-any.whl | Python 3 | none | any | Details for menlo_sdk-0.1.0rc7-py3-none-any.whl |
Total release size: 331.0 kB
Release files / menlo_sdk-0.1.0rc7.tar.gz
| Download URL | menlo_sdk-0.1.0rc7.tar.gz |
|---|---|
| Size | 230.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0bd5a72aac43884d6e292f2f09fa870f9c2b09f193a3a9423b13a826e5069933
|
|
BLAKE2b-256 checksum How to use checksums |
bb541f268fd14900406d2509fa4a2e83e0c930f1d490095c568e11c8e7e959f0
|
| 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 Sep 30, 2026.
Transparency logRelease files / menlo_sdk-0.1.0rc7-py3-none-any.whl
| Download URL | menlo_sdk-0.1.0rc7-py3-none-any.whl |
|---|---|
| Size | 100.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a54e1dd204587ef581325744dd7b1b62b416bb880ec5798f7d0205ecb7e946bd
|
|
BLAKE2b-256 checksum How to use checksums |
06ee113a564899c143683cd1e6f05a3acab770288af213c9799df8684f97f24d
|
| 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 Sep 30, 2026.
Transparency logSecurity for menlo-sdk 0.1.0rc7
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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for menlo_sdk-0.1.0rc7.tar.gz
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 Sep 30, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.