A unified, real-time execution & safety layer for Flexiv Rizon arms: one action contract for teleop, MPC, RL, and real2sim2real.
Project description
flexiv_control
A unified, real-time control & safety layer for the Flexiv Rizon.
One action contract for teleoperation, MPC, reinforcement learning, and real-to-sim-to-real manipulation.
Landing page · Quick start · Architecture · Action contract · Safety
Community project — NOT affiliated with, endorsed by, or supported by Flexiv Robotics.
flexiv_control is a thin, fast layer between a high-level decision maker — a
policy, an MPC planner, a teleoperator — and a Flexiv Rizon arm. It takes a
high-level action, turns it into a safe stream of setpoints at the control
rate, and reports back what actually happened.
Every consumer speaks the same action contract, and every backend — a real
Rizon via Flexiv RDK, a dependency-free fake backend, or a MuJoCo simulation —
consumes the same safety-filtered setpoint stream. That is what makes one
controller reusable across teleop, RL, MPC, and real2sim2real projects without
forks. The design (a thin client over a real-time-capable loop, one action
interface, sim + real behind a single backend switch) is the shape that Deoxys,
Polymetis, frankapy, SERL/HIL-SERL, and LeRobot converged on
(design rationale).
Features
- One action contract —
CartesianChunk/CartesianDelta/JointChunk+GripperCommand, with absolute or relative-to-chunk-start poses, a predict-vs-execute horizon, and a quantifiedExecutionResult. - Safety is first-class — named, version-controlled
SafetyProfiles and a microsecond per-tickSafetyFilter(workspace box, speed/jump caps, joint limits, contact-wrench stop, watchdog) that clips or rejects and reports. - Sim ↔ real behind one switch — a MuJoCo backend (Jacobian IK, gravity
compensation) with a faithful GN01 gripper, the
fakebackend for offline dev, and a real Rizon, all behind one config string. - Built for learning & control — a Gymnasium env, a HIL-SERL intervention
wrapper, a
RecedingHorizonRunner(the VLA / MPC policy-server seam), and a SpaceMouse teleoperator, all on the same contract. - Multi-user safe — an in-process lease and a host-wide lock so two processes can't fight over the arm.
- Optional, not required — a numpy-only cross-process server +
RemoteRobot, a C++ 1 kHz real-time daemon, and a ROS 2 overlay. The core needs only numpy.
Installation
git clone https://github.com/ZihaoLu001/flexiv_control.git
cd flexiv_control
pip install -e . # core: numpy only
Optional extras (RL, teleop, LeRobot, MuJoCo, real hardware, dev)
pip install -e ".[rl]" # + Gymnasium env
pip install -e ".[teleop]" # + SpaceMouse
pip install -e ".[lerobot]" # + LeRobot data/training
pip install -e ".[mujoco]" # + MuJoCo simulation backend
pip install -e ".[flexiv]" # + flexivrdk (real hardware; RDK v1.x)
pip install -e ".[dev]" # + pytest, ruff
See docs/flexiv_setup.md for real-robot bring-up and docs/versions.md for RDK/firmware version pinning.
Quick start
No hardware needed — the fake backend is dependency-free:
from flexiv_control import Robot, RobotConfig, CartesianChunk
robot = Robot(RobotConfig(backend="fake")) # or "mujoco" / "flexiv_rdk"
robot.connect()
robot.start_cartesian_impedance()
chunk = CartesianChunk.from_waypoint_array([[0.45, 0.0, 0.30, 1.0, 20],
[0.50, 0.0, 0.25, 0.0, 20]])
result = robot.execute_cartesian_chunk(chunk)
print(result.success, result.path_tracking_error)
robot.disconnect()
flexiv-control demo # offline FakeBackend demo, no hardware
python examples/01_fake_hello.py
Architecture
The action contract is the only thing crossing the boundary, so the network server, Gym env, and ROS overlay are all pure pass-through:
Language policy MPC planner RL trainer SpaceMouse
\ | | /
└──► CartesianChunk / CartesianDelta / JointChunk ◄──┘
│
Robot facade → SafetyFilter (per-tick) → Interpolator → backend → Rizon
The Rizon runs its hard real-time impedance loop inside the robot, so the host only streams setpoints. That gives two tiers — a Python default (100–500 Hz, RDK non-real-time modes) and an optional C++ 1 kHz daemon (RDK real-time modes) — sharing the same contract. The landing page and docs/architecture.md lay this out in full.
| Path | Purpose |
|---|---|
src/flexiv_control/ |
core: contract, safety, interpolation, robot facade, backends |
src/flexiv_control/sim/ |
MuJoCo Rizon + GN01 gripper model builder |
cpp/ · ros2/ |
optional Tier-B 1 kHz RT daemon · optional ROS 2 overlay |
configs/ · examples/ · tests/ |
shipped YAML profiles · runnable demos · pytest suite |
Examples
| File | Shows |
|---|---|
examples/01_fake_hello.py |
connect, read state, run a chunk on fake |
examples/02_cartesian_chunk.py |
the action contract and ExecutionResult |
examples/03_rl_gym_env.py |
Gymnasium env + HIL-SERL intervention |
examples/04_mpc_loop.py |
a high-rate closed loop |
examples/05_spacemouse_teleop.py |
teleop (scripted, or --device) |
examples/06_lerobot_record.py |
recording in the LeRobot format |
examples/07_receding_horizon.py |
receding-horizon execution + the VLA/MPC policy-server seam |
Documentation
| Doc | What |
|---|---|
| architecture.md | the stack, the two RT tiers, components, boundaries |
| action_contract.md | the contract objects, conventions, chunk constructors |
| safety.md | profiles, the filter, the shipped profiles, tuning |
| flexiv_setup.md | bringing up a real Rizon, licenses, first-run checklist |
| versions.md | RDK version sensitivity and the # VERIFY: markers |
| integration_planner.md · _mpc · _rl · _teleop | per-use-case integration guides |
Safety
Before any motion on real hardware: keep an E-stop within reach and validate your
SafetyProfile— especially the workspace box — on your own cell at low speed. See docs/safety.md.
Status
Alpha (0.1.0). The Python core, safety, action contract, server/client,
Gymnasium env, teleop, and the MuJoCo simulation (including the GN01 gripper)
are tested in CI (Python 3.8 / 3.10 / 3.12). The real-hardware (flexiv_rdk)
and the C++ / ROS 2 paths are hardware-unvalidated and carry # VERIFY:
markers to confirm against your installed versions before first use
(docs/versions.md).
Development
pip install -e ".[dev]"
ruff check src tests examples
pytest -q
Contributions welcome — see CONTRIBUTING.md.
Citation
If you use this in academic work, please cite it (see CITATION.cff).
License
Apache-2.0. The MuJoCo GN01 gripper model is derived from the official Flexiv ROS description (Apache-2.0); see NOTICE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file flexiv_control-0.1.0.tar.gz.
File metadata
- Download URL: flexiv_control-0.1.0.tar.gz
- Upload date:
- Size: 87.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
66bad0c73ec551ef2cd99c113f79b74402bb5ad7ded0951bdbecb711eba876eb
|
|
| MD5 |
18c3f4cdea971a538fbfc56203350b73
|
|
| BLAKE2b-256 |
29afe6b9a24f415d64fc4212a2d729aa629609ef975fe38e8ee48a7a7e6ab279
|
Provenance
The following attestation bundles were made for flexiv_control-0.1.0.tar.gz:
Publisher:
release.yml on ZihaoLu001/flexiv_control
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
flexiv_control-0.1.0.tar.gz -
Subject digest:
66bad0c73ec551ef2cd99c113f79b74402bb5ad7ded0951bdbecb711eba876eb - Sigstore transparency entry: 1756331208
- Sigstore integration time:
-
Permalink:
ZihaoLu001/flexiv_control@619a8102eeb6a368c8f20fc19653988c358d3682 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/ZihaoLu001
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@619a8102eeb6a368c8f20fc19653988c358d3682 -
Trigger Event:
release
-
Statement type:
File details
Details for the file flexiv_control-0.1.0-py3-none-any.whl.
File metadata
- Download URL: flexiv_control-0.1.0-py3-none-any.whl
- Upload date:
- Size: 88.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
df76ce2916e0cf6155735378162a57df8259ba9bc7919928dda6f34834f461c5
|
|
| MD5 |
3037896f03e79447ed22dc233723988d
|
|
| BLAKE2b-256 |
c7863c79d5cc77e1373d05fc2fa11e29369d16e29d0b58177414564243672309
|
Provenance
The following attestation bundles were made for flexiv_control-0.1.0-py3-none-any.whl:
Publisher:
release.yml on ZihaoLu001/flexiv_control
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
flexiv_control-0.1.0-py3-none-any.whl -
Subject digest:
df76ce2916e0cf6155735378162a57df8259ba9bc7919928dda6f34834f461c5 - Sigstore transparency entry: 1756331221
- Sigstore integration time:
-
Permalink:
ZihaoLu001/flexiv_control@619a8102eeb6a368c8f20fc19653988c358d3682 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/ZihaoLu001
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@619a8102eeb6a368c8f20fc19653988c358d3682 -
Trigger Event:
release
-
Statement type: