Skip to main content

A unified, real-time execution & safety layer for Flexiv Rizon arms: one action contract for teleop, MPC, RL, and real2sim2real.

Project description

flexiv_control

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.

CI python license deps status

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 contractCartesianChunk / CartesianDelta / JointChunk + GripperCommand, with absolute or relative-to-chunk-start poses, a predict-vs-execute horizon, and a quantified ExecutionResult.
  • Safety is first-class — named, version-controlled SafetyProfiles and a microsecond per-tick SafetyFilter (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 fake backend 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.

Built for the Flexiv Rizon · community-maintained · not affiliated with Flexiv Robotics

Project details


Download files

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

Source Distribution

flexiv_control-0.1.0.tar.gz (87.4 kB view details)

Uploaded Source

Built Distribution

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

flexiv_control-0.1.0-py3-none-any.whl (88.5 kB view details)

Uploaded Python 3

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

Hashes for flexiv_control-0.1.0.tar.gz
Algorithm Hash digest
SHA256 66bad0c73ec551ef2cd99c113f79b74402bb5ad7ded0951bdbecb711eba876eb
MD5 18c3f4cdea971a538fbfc56203350b73
BLAKE2b-256 29afe6b9a24f415d64fc4212a2d729aa629609ef975fe38e8ee48a7a7e6ab279

See more details on using hashes here.

Provenance

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

Publisher: release.yml on ZihaoLu001/flexiv_control

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

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

Hashes for flexiv_control-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 df76ce2916e0cf6155735378162a57df8259ba9bc7919928dda6f34834f461c5
MD5 3037896f03e79447ed22dc233723988d
BLAKE2b-256 c7863c79d5cc77e1373d05fc2fa11e29369d16e29d0b58177414564243672309

See more details on using hashes here.

Provenance

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

Publisher: release.yml on ZihaoLu001/flexiv_control

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

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page