Skip to content
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.

CIpythonlicensedepsstatus

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 contractCartesianTrajectory / CartesianDelta / JointTrajectory + GripperCommand, with absolute or relative-to-trajectory-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.
  • See what it WILL doflexiv-control viz mirrors the robot live in any browser on the LAN and previews each trajectory's intended motion (the true per-tick command path, time-colored, with gripper events, a workspace box, an animated ghost, and an optional Approve/Reject gate) before it executes — for safety and debugging. See docs/visualization.md.
  • 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 ".[viz]"# + live browser visualization (viser)
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:

fromflexiv_controlimportRobot, RobotConfig, CartesianTrajectoryrobot=Robot(RobotConfig(backend="fake")) # or "mujoco" / "flexiv_rdk"robot.connect()
robot.start_cartesian_impedance()
trajectory=CartesianTrajectory.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_trajectory(trajectory)
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
\ | | /
└──► CartesianTrajectory / CartesianDelta / JointTrajectory ◄──┘
│
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.

PathPurpose
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

FileShows
examples/01_fake_hello.pyconnect, read state, run a trajectory on fake
examples/02_cartesian_trajectory.pythe action contract and ExecutionResult
examples/03_rl_gym_env.pyGymnasium env + HIL-SERL intervention
examples/04_mpc_loop.pya high-rate closed loop
examples/05_spacemouse_teleop.pyteleop (scripted, or --device)
examples/06_lerobot_record.pyrecording in the LeRobot format
examples/07_receding_horizon.pyreceding-horizon execution + the VLA/MPC policy-server seam

Documentation

DocWhat
architecture.mdthe stack, the two RT tiers, components, boundaries
action_contract.mdthe contract objects, conventions, trajectory constructors
safety.mdprofiles, the filter, the shipped profiles, tuning
flexiv_setup.mdbringing up a real Rizon, licenses, first-run checklist
versions.mdRDK version sensitivity and the # VERIFY: markers
visualization.mdlive browser mirror + intended-motion preview ([viz])
integration_planner.md · _mpc · _rl · _teleopper-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. 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 flexiv_rdk real-hardware backend is now HARDWARE-VALIDATED on a Rizon4s (serial Rizon4s-062626, RDK-Professional, flexivrdk 1.7) for the NRT pick-place path: enable → F/T-sensor zero → NRT_CARTESIAN_MOTION_FORCE (cartesian impedance) → NRT joint trajectories → GN01 gripper → go_home_safe all run end-to-end (see CHANGELOG 0.1.5/0.1.4). Four RDK-1.7 API mismatches found there are fixed: gripper Enable(name), the Mode enum (1.7 has no RT_*), ZeroFTSensor-on-connect (force-mode prerequisite), and SendJointPosition's five list args. The C++ / ROS 2 paths remain unvalidated. RDK is version-matched to firmware — see docs/versions.md before use on a different setup.

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

About

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

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages