Positronic robotics project
Project description
Positronic — Python-native stack for real-life ML robotics
What is Positronic
Positronic is an end-to-end toolkit for building ML-driven robotics systems.
It covers the full lifecycle:
- bring new hardware online,
- capture and curate datasets,
- train and evaluate policies,
- deploy inference,
- monitor performance,
- and iterate when behaviour drifts.
Every subsystem is implemented in plain Python so teams can move between simulation, teleoperation, and production code without switching languages or tools.
Our goal is to make professional-grade ML robotics approachable. Newcomers get clear defaults, WebXR teleoperation, and a reproducible training story; experienced teams can extend the same stack with custom drivers, schedulers, and datasets to support complex manipulation setups and large fleets.
Positronic is under heavy development and in alpha stage. APIs, interfaces, and workflows may change significantly between releases.
Table of Contents
- Why Positronic
- Installation
- Core modules at a glance
- End-to-end workflow
- Tooling and further reading
- Development workflow
- How Positronic differs from LeRobot
- Roadmap
Why Positronic
- Immediate-mode runtime.
pimmwires sensors, controllers, inference, and GUIs without ROS launch files or bespoke DSLs. Loops stay testable and readable; see the Pimm README for details. - Dataset infrastructure. The Positronic dataset library layer captures multi-rate episodes, exposes lazy transforms, and feeds the web-based browser for triage and analysis (see the Dataset README).
- Hardware-ready out of the box. WebXR driver, MuJoCo integration, the DearPyGui UI, and the Drivers package live alongside training and inference scripts so you can go from prototype to lab deployment quickly.
- Future-facing roadmap. Native training on Positronic datasets, curation capabilities in the viewer server, out-of-the-box support for $\pi_0$, GR00T and other polcies, support for more robotic and controlling hardware are active areas of development. Everything in this README reflects the workflow we run today and the direction we are pushing toward.
Installation
Clone the repository and set up a local uv environment (recommended) or use Docker if you prefer containers.
Option 1: Local via uv (recommended)
Prerequisites: Python 3.11 and uv.
git clone git@github.com:Positronic-Robotics/positronic.git
cd positronic
uv venv -p 3.11 # optional but keeps the interpreter isolated
source .venv/bin/activate # activate the venv if you created one
uv sync --frozen --extra dev # install core + dev tooling
Install hardware extras only when you need physical robot drivers:
uv sync --frozen --extra hardware
All runtime commands in the sections below assume either an activated virtual environment or uv run --with-editable . -s ….
Option 2: Docker
git clone git@github.com:Positronic-Robotics/positronic.git
cd positronic
./docker/build.sh # build image (includes libfranka and uv.lock deps)
./docker/run.sh pytest # run commands inside the container
Core modules at a glance
pimm— immediate-mode runtime for building control systems. Handy references: README, Data collection example, Inference example.- Positronic dataset library — dataset writer/reader, transforms, and streaming agent.
- Positronic server — FastAPI + Rerun viewer for inspecting recordings.
- Training scripts — scripts for converting datasets and running LeRobot pipelines while native Positronic training is being finalised.
- Drivers package — hardware definitions, WebXR frontends, simulator loaders, and Config presets ready to override per project.
End-to-end workflow
The usual loop is: collect demonstrations → inspect and curate → (temporarily) convert to LeRobot → train → validate. The sections below link straight to the scripts that implement each step.
1. Prepare the environment
- Create or activate your Python environment as shown above.
- For simulation-only workflows no additional extras are required.
- Hardware users should also provision device-level dependencies (e.g., udev rules for cameras) as described in the relevant driver documentation under Drivers package.
2. Collect demonstrations
Use the Data collection script for both simulation and hardware captures.
Quick start in simulation
python -m positronic.data_collection sim \
--output_dir=~/datasets/stack_cubes_raw \
--webxr=.oculus \
--operator_position=OperatorPosition.BACK
This command loads the MuJoCo scene with loaders from the simulator config, starts the DearPyGui UI, and records into the Local dataset writer.
Driving physical robots
Choose the configuration that matches your setup — all presets are defined in Data collection script using configuronic:
python -m positronic.data_collection real --output_dir=~/datasets/franka_kitchen
python -m positronic.data_collection so101 --output_dir=~/datasets/so101_runs
python -m positronic.data_collection droid --output_dir=~/datasets/droid_runs
Override components inline (e.g. --webxr=.iphone, --sound=None, --operator_position=.FRONT) or add new configs under Hardware configs.
Teleoperate with a VR headset (Meta Quest / Oculus)
Both sim and real robots can be controlled by position tracking devices, such as VR Helmet (we use Oculus Quest 3, though any VR device will work) or even phone with WebXR-enabled browser.
Here's how to collect the data using VR Helmet:
- Launch a collector command with
--webxr=.oculus. - Find the host machine’s IP address (
ipconfig getifaddr en0on macOS,hostname -Ion Linux) and connect the headset to the same network. - In the headset open Oculus Browser, navigate to
https://<host-ip>:5005/, and accept the security warning once (Advanced → Continue). The certificate is generated by WebXR driver. - Click Enter AR in the page header and approve the permission dialog so the browser can read tracking data.
- If you started the collector with
--stream_video_to_webxr=<camera_name>, a floating panel shows the chosen camera feed.<camera_name>must match a key in thecamerasmapping passed to the collector. - Controller mappings (handled by Button mapping helper):
- Right B — start/stop recording (audio cues play if sound is enabled).
- Right A — toggle positional tracking to align the controller pose with the robot.
- Right stick press — abort the current episode and send
roboarm.command.Reset(). - Right trigger — analogue gripper control (captured as the
target_gripsignal).
Use an iPhone as a controller
- Launch data collection with
--webxr=.iphone(frontend defined in WebXR config). - On the phone open XR Browser (or any WebXR-capable browser) and visit
http://<host-ip>:5005/. - Tap Enter AR, grant camera/gyroscope access, and hold the phone upright; the reticle represents the virtual controller.
- The on-screen HUD from WebXR phone UI provides:
- Record for episode start/stop.
- Track to toggle positional tracking.
- Reset to abort the current run and resetting the robot.
- Gripper slider to control the width of your gripper.
Collection tips
- Watch the DearPyGui window to confirm cameras and robot state update reliably. Restart an episode instead of saving partial data when something goes wrong.
- Record a few calibration runs first, review them, then capture full demonstrations.
3. Review and curate datasets
Browse datasets with the Positronic Server app.
Inspect recordings before training:
python -m positronic.server.positronic_server \
--root=~/datasets/stack_cubes_raw \
--port=5001
The viewer loads LocalDataset in the background, generates .rrd files with the copies of each episode under ~/.cache/positronic/server/, and serves a Rerun viewer per episode.
The UI is read-only for now: mark low-quality runs while watching, then rename or remove the corresponding episode directories manually. Static metadata lives in each episode’s episode.json if you need to edit it outside the GUI.
We will support curation mode in the future releases.
4. Convert to LeRobot
Use the LeRobot conversion helper until native training lands.
Until training scripts consume Positronic datasets directly, convert curated runs into LeRobot format:
uv run --with-editable . -s positronic/training/to_lerobot.py convert \
--dataset.path=~/datasets/stack_cubes_raw \
--output_dir=~/datasets/lerobot/stack_cubes \
--task="pick up the green cube and place it on the red cube" \
--fps=30
The converter reads your data through positronic.cfg.dataset.transformed (see Dataset config module), applies the same observation/action transforms used at inference time, and writes a LeRobotDataset. Re-run the command whenever you tweak transforms or add new episodes. To extend an existing LeRobot dataset:
uv run --with-editable . -s positronic/training/to_lerobot.py append \
--dataset_dir=~/datasets/lerobot/stack_cubes \
--dataset.path=~/datasets/stack_cubes_new
Keep the original Positronic datasets — once native training lands you will no longer need this conversion step.
5. Train a policy
Run the LeRobot training driver with Positronic configs.
Train an ACT policy using LeRobot’s pipeline configured for Positronic observations and actions:
uv run --with-editable . -s positronic/training/lerobot_train.py \
--dataset_root=~/datasets/lerobot/stack_cubes \
--base_config=positronic/training/train_config.json
Checkpoints and logs are written under outputs/train/<timestamp>_<job_name>/. Adjust the training script to change architectures, backbones, or devices. When Positronic-first training is ready you will point the trainer at the raw dataset instead.
6. Validate policies
Replay checkpoints through the Inference script to test in MuJoCo or log hardware runs.
Run the trained policy in MuJoCo, record diagnostics, and optionally stream a GUI:
python -m positronic.run_inference sim_act \
--policy.checkpoint_path=~/datasets/lerobot/stack_cubes/checkpoints/last/pretrained_model \
--device=mps \
--simulation_time=60 \
--output_dir=~/datasets/inference_logs/stack_cubes_act \
--show_gui
The Inference script wires the MuJoCo scene, Observation encoders, and Action decoder. Passing --output_dir enables another DsWriterAgent so the run can be replayed in the dataset viewer.
Development workflow
Run tests and linters from the root directory:
uv run pytest --no-cov
uv run flake8
Use uv add / uv remove to modify dependencies and uv lock to refresh the lockfile. Contributions should include or update tests when code changes affect behaviour.
How Positronic differs from LeRobot
LeRobot packages imitation- and reinforcement-learning algorithms, public datasets, and affordable reference robots so anyone can train and share policies. Positronic builds on that progress but is aimed at teams running professional systems end to end:
- Runtime & middleware.
pimmwires sensors, arms, teleop clients, and inference loops on production hardware without ROS launch files or bespoke DSLs. - Data operations. Positronic dataset library is a powerful library for robotic datasets.
- Deployment & supervision. WebXR teleoperation (WebXR config), simulator loaders (MuJoCo transform helpers), an expanding set of hardware drivers (Drivers package), and inference loggers (Inference script) help you roll out policies, watch live telemetry, and capture diagnostics for regression analysis.
LeRobot is the learning engine; Positronic is the operations stack that keeps data flowing, policies running, and teams iterating on real robots.
Roadmap
Our plans evolve with your feedback. Highlights for the next milestones:
- Short term
- Policy presets for $\pi_0$ and GR00T. Bundle ready-to-use configs in policy config module so switching policies is a single flag.
- Automated evaluation harness. Extend Inference script and the MuJoCo loaders in MuJoCo transform helpers to score new checkpoints automatically on curated scenarios.
- Richer Positronic Server. Teach Positronic Server to open transformed datasets, surface static/meta fields, and offer annotation + filtering flows for rapid triage.
- PyTorch bridging layer. Provide a native adapter on top of Positronic dataset library so training scripts can stream tensors without an intermediate export.
- Direct LeRobot integration. Let LeRobot training driver read Positronic datasets directly, retiring the temporary LeRobot conversion helper conversion.
- Remote inference primitives. Add network-friendly transports to Inference script so policies can live on a different machine than the robot.
- Medium term
- SO101 leader support. Promote SO101 from follower mode to a first-class leader arm in Hardware configs.
- New operator inputs. Ship keyboard and gamepad controllers inside Drivers package for quick teleop on commodity hardware.
- Streaming datasets. Introduce a cloud-ready dataset backend building on Local dataset writer for long-running data collection jobs.
- Community hardware. Continue adding camera, gripper, and arm drivers requested by adopters.
- Long term
- Distributed scheduling. Layer cross-machine orchestration on
pimmso one supervisor can coordinate multiple collectors, trainers, and inference nodes. - Hybrid cloud workflows. Support ingestion of episodes straight into object storage while keeping local curation/debugging fast, plus optional cloud-hosted inference services.
- Remote inference in the cloud. Deploy heavy but capable ML models in the cloud to control and operate your local hardware.
- Distributed scheduling. Layer cross-machine orchestration on
Let us know what you need at hi@positronic.ro or open a feature request at Github.
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 positronic-0.1.0.tar.gz.
File metadata
- Download URL: positronic-0.1.0.tar.gz
- Upload date:
- Size: 19.5 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
24c946f0382ccb0b0737aa5aec9f2fc218b9e4ff5ac35c8922a1e11ffa13a9b3
|
|
| MD5 |
3dee62d2316cc16723136592935410db
|
|
| BLAKE2b-256 |
3605274120dc2d80330e3100c8911d3caa4ee0b23f7d11c0b428eccf8147beb3
|
File details
Details for the file positronic-0.1.0-py3-none-any.whl.
File metadata
- Download URL: positronic-0.1.0-py3-none-any.whl
- Upload date:
- Size: 19.7 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cf9c5cd9ed0cecca982016edbd98917f9a2c483e2f3af2b9248d98045f6e27eb
|
|
| MD5 |
3b6bf1530bda4714c28ca4da445a477d
|
|
| BLAKE2b-256 |
80ddbfeb7377cf873c5e67bb6a439b520ebf251af9b02af07c8631c18d3bd551
|