End-to-end simulation and training stack for the SO-101 arm: record demonstrations, clone behavior, and reinforce with GPU-parallel MuJoCo / MuJoCo Warp environments, built on LeRobot
Project description
SO101-Nexus: SO-101 robot learning, from demos to policies
Beta: APIs may change between releases. Feedback and bug reports are welcome.
SO101-Nexus is an end-to-end Python library for taking an SO-101 robot from demonstrations to a trained policy. It combines physical leader-arm teleoperation, LeRobot-compatible dataset recording, Gymnasium/MuJoCo manipulation environments, and training/evaluation hooks in one installable package.
For full documentation, visit so101-nexus.com/docs.
Demo Rollouts
Recorded MuJoCo teleoperation datasets are available on Hugging Face:
| Task | Dataset | Episode viewer |
|---|---|---|
| PickLift | johnsutor/MuJoCoPickLift | episode 0 |
| PickAndPlace | johnsutor/MuJoCoPickAndPlace | episode 0 |
Why
There are useful SO-101 tools, but few packages connect teleoperation, LeRobot datasets, environments, and training loops in one workflow, all using simulations. SO101-Nexus is built around the record -> clone -> reinforce path: collect demonstrations, replay and evaluate in matching SO-101 environments, bootstrap with imitation learning, then fine-tune with RL.
MuJoCo is the default backend. An optional MuJoCo Warp backend (so101-nexus[warp]) adds GPU-parallel, batched environments for large-scale RL.
What You Get
- Teleoperation recorder: drive a simulated follower with a physical SO-100 or SO-101 leader arm.
- LeRobot dataset output: save demonstrations with SO follower state/action units and wrist/overhead camera fields.
- Gymnasium environments: run SO-101 MuJoCo tasks for touch, look-at, move, pick-lift, and pick-and-place.
- Configurable curricula: swap objects, add distractors, randomize colors, tune rewards, and choose observation components.
- Training and evaluation hooks: start with the PPO baseline, LeRobot processors, and policy adapters for real-policy evaluation.
- GPU-parallel Warp backend (optional): batched
Warp*-v1vector environments for large-scale RL, installed withso101-nexus[warp].
Installation
pip install so101-nexus
From source
git clone https://github.com/johnsutor/so101-nexus.git
cd so101-nexus
uv sync
Start with the Workflow
Record demonstrations
uvx --from "so101-nexus[teleop]" so101-nexus teleop \
--leader-port /dev/ttyACM0
See the teleoperation docs for hardware setup, camera fields, environment customization, and Hub upload.
Run an environment
import gymnasium as gym
import so101_nexus.mujoco # noqa: F401
env = gym.make("MuJoCoPickLift-v1", render_mode="rgb_array")
obs, info = env.reset()
for _ in range(256):
action = env.action_space.sample()
obs, reward, terminated, truncated, info = env.step(action)
if terminated or truncated:
obs, info = env.reset()
env.close()
See the environment reference for all task IDs.
Run the GPU-parallel Warp backend
Install the optional extra and create a batched vector environment:
pip install "so101-nexus[warp]"
import gymnasium as gym
import so101_nexus.warp # noqa: F401
envs = gym.make_vec("WarpTouch-v1", num_envs=4096, device="cuda")
obs, info = envs.reset(seed=0)
obs, reward, terminated, truncated, info = envs.step(envs.action_space.sample())
envs.close()
Train a baseline
SO101-Nexus includes a CleanRL-style PPO baseline for Gymnasium environments. See Training with PPO for the command-line workflow and tuning notes.
Roadmap
- MuJoCo environments for the SO-101 arm
- SO-101 tasks: Touch, LookAt, Move, PickLift, PickAndPlace
- Physical leader-arm teleop recorder for LeRobot datasets
- MuJoCo Warp backend for GPU-parallel throughput
- Stronger training baselines and exemplars for every environment
- Integration with the LeRobot Hub
Development
git clone https://github.com/johnsutor/so101-nexus.git
cd so101-nexus
uv sync
make test # run all tests
make format # format code
make lint # lint code
License
This repository's source code is available under the Apache-2.0 License.
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
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 so101_nexus-0.4.4.tar.gz.
File metadata
- Download URL: so101_nexus-0.4.4.tar.gz
- Upload date:
- Size: 14.8 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2b388fe9a7a8d34a9d62a2dcf6bd78e32a5979aef779f3a5a44070df4a2e6e48
|
|
| MD5 |
8e99a0b688a0399bb9ff9e800264d801
|
|
| BLAKE2b-256 |
63f620db9a4bf1d9367865e73c89604ca49e512be10a8504ff8d1d0866ecd620
|
Provenance
The following attestation bundles were made for so101_nexus-0.4.4.tar.gz:
Publisher:
publish.yml on johnsutor/so101-nexus
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
so101_nexus-0.4.4.tar.gz -
Subject digest:
2b388fe9a7a8d34a9d62a2dcf6bd78e32a5979aef779f3a5a44070df4a2e6e48 - Sigstore transparency entry: 1985859582
- Sigstore integration time:
-
Permalink:
johnsutor/so101-nexus@81aadce9fb10815a7a82e3186e285cef6ca3575c -
Branch / Tag:
refs/tags/0.4.4 - Owner: https://github.com/johnsutor
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@81aadce9fb10815a7a82e3186e285cef6ca3575c -
Trigger Event:
release
-
Statement type:
File details
Details for the file so101_nexus-0.4.4-py3-none-any.whl.
File metadata
- Download URL: so101_nexus-0.4.4-py3-none-any.whl
- Upload date:
- Size: 12.9 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cc13ac59a4be17a3ffe5587d2e2140ca6f63432558c613c6bd4afda638e0a491
|
|
| MD5 |
0c799ee9184b44ec63b9f34e12ea35ee
|
|
| BLAKE2b-256 |
9fd6ddd91baf2d2d850f21619a8521f07620c2b51dd29f62744fa55e882da40f
|
Provenance
The following attestation bundles were made for so101_nexus-0.4.4-py3-none-any.whl:
Publisher:
publish.yml on johnsutor/so101-nexus
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
so101_nexus-0.4.4-py3-none-any.whl -
Subject digest:
cc13ac59a4be17a3ffe5587d2e2140ca6f63432558c613c6bd4afda638e0a491 - Sigstore transparency entry: 1985859813
- Sigstore integration time:
-
Permalink:
johnsutor/so101-nexus@81aadce9fb10815a7a82e3186e285cef6ca3575c -
Branch / Tag:
refs/tags/0.4.4 - Owner: https://github.com/johnsutor
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@81aadce9fb10815a7a82e3186e285cef6ca3575c -
Trigger Event:
release
-
Statement type: