MCPcopy Index your code
hub / github.com/MINT-SJTU/Evo-RL

github.com/MINT-SJTU/Evo-RL @main

Chat with this repo
repository ↗ · DeepWiki ↗ · + Follow
6,371 symbols 28,327 edges 520 files 2,891 documented · 45% updated 8d ago★ 6817 open issues
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Evo-RL

project website lerobot version wechat post wechat group join us paper coming soon hugging face model coming soon RW-RL dataset on Hugging Face license

SJTU & Evo-Tech

Architecture Overview

Evo-RL Pipeline Overview

🎯 Evo-RL Focus

  • Open real-world RL on two platforms: we build and release full real-world RL pipelines on SO101 and AgileX (PiPER/PiPER-X).
  • Open code, models, and datasets for reproducibility: we continuously release runnable offline RL assets so more people can reproduce results and apply them to real-world tasks.
  • Open algorithm and community co-evolution: we reproduce existing real-world RL methods, propose new methods, and keep publishing data/benchmarks to grow a collaborative open-source community.

🚀 News

  • [2026-06-30] Added a detailed Hugging Face dataset card for the RW-RL Dataset, including visual examples, release statistics, file layout, modalities, and download instructions.
  • [2026-03-07] Added AgileX (PiPER/PiPER-X) support for real-world RL.
  • [2026-02-26] First SO101 real-world RL baseline and reproducible CLI workflow are released.

🧭 Table of Contents

Getting Started Training Pipeline Project Info
⚡ Quick Start 4) Value Function Training Model & Dataset
1) Installation 5) Value Inference Community Channels
2) Hardware Setup 6) Policy Training Affiliations
3) Data Collection 7) Closed-loop Rollout and Next Round Citation / License

Value Visual Results

Success Case

Value Overlay Success Episode 0405

Failure Case

Value Overlay Failure Episode 0697

Policy Rollout Visual Results

Policy Rollout Result 1 Policy Rollout Result 2

Human-in-the-Loop Visual Results

Human-in-the-Loop Result 1 Human-in-the-Loop Result 2

⚡ Quick Start

LeRobot-aligned foundation: we use LeRobot as the base of this codebase because its inference and data-collection logic are highly aligned with real-world RL workflows.

1) Installation

git clone https://github.com/MINT-SJTU/Evo-RL.git
cd Evo-RL
conda create -y -n evo-rl python=3.10
conda activate evo-rl
pip install -e .

For setup details and platform-specific dependencies, follow the official LeRobot configuration guide.

2) Hardware Setup

SO Series (SO100/SO101)

For SO-series setup, please follow the official tutorial in detail and complete all installation and configuration steps there before continuing. The examples below use SO101 as the reference configuration.

Device path recommendation

Recommended path strategy:

  • Robot serial: use /dev/serial/by-id/ (stable across reboots).
  • Cameras: prefer /dev/v4l/by-id/; if IDs are not unique, use /dev/v4l/by-path/.
  • In examples below: robot ports use by-id, camera paths use by-path.

You can inspect available stable paths with:

ls -l /dev/serial/by-id/
ls -l /dev/v4l/by-id/
ls -l /dev/v4l/by-path/

For single-arm users, no major changes are required. After setup, run the command below to verify your system is ready for the next stage:

lerobot-teleoperate \
  --robot.type=so101_follower \
  --robot.port=/dev/serial/by-id/<SO101_FOLLOWER_PORT> \
  --robot.id=my_so101_follower \
  --teleop.type=so101_leader \
  --teleop.port=/dev/serial/by-id/<SO101_LEADER_PORT> \
  --teleop.id=my_so101_leader

For dual-arm users, we recommend mirroring the mechanical parts corresponding to servos 4/5/6 on the left leader and left follower arms, which usually provides a more natural bimanual operation feel.

Before running the dual-arm command, make sure calibration files exist under ~/.cache/huggingface/lerobot/calibration/ like:

calibration/
├── robots
│   └── so_follower
│       ├── bi_so101_follower_left.json
│       └── bi_so101_follower_right.json
└── teleoperators
    └── so_leader
        ├── bi_so101_leader_left.json
        └── bi_so101_leader_right.json

This layout is slightly different from single-arm setup.

Then run this command to verify dual-arm setup:

lerobot-teleoperate \
  --robot.type=bi_so_follower \
  --robot.left_arm_config.port=/dev/serial/by-id/<LEFT_FOLLOWER_PORT> \
  --robot.right_arm_config.port=/dev/serial/by-id/<RIGHT_FOLLOWER_PORT> \
  --robot.id=bi_so101_follower \
  --teleop.type=bi_so_leader \
  --teleop.left_arm_config.port=/dev/serial/by-id/<LEFT_LEADER_PORT> \
  --teleop.right_arm_config.port=/dev/serial/by-id/<RIGHT_LEADER_PORT> \
  --teleop.id=bi_so101_leader

Camera configuration

Before data collection, validate camera mapping first.

Check whether each camera supports your target setting (for example, 640x480 @ 30):

v4l2-ctl -d /dev/v4l/by-path/<CAM_PATH> --list-formats-ext

Single-arm camera check (example):

lerobot-teleoperate \
  --robot.type=so101_follower \
  --robot.port=/dev/serial/by-id/<SO101_FOLLOWER_PORT> \
  --robot.id=my_so101_follower \
  --robot.cameras='{ front: {type: opencv, index_or_path: "/dev/v4l/by-path/<FRONT_CAM>", width: 640, height: 480, fps: 30}}' \
  --teleop.type=so101_leader \
  --teleop.port=/dev/serial/by-id/<SO101_LEADER_PORT> \
  --teleop.id=my_so101_leader \
  --display_data=true

Dual-arm camera check (example):

lerobot-teleoperate \
  --robot.type=bi_so_follower \
  --robot.left_arm_config.port=/dev/serial/by-id/<LEFT_FOLLOWER_PORT> \
  --robot.right_arm_config.port=/dev/serial/by-id/<RIGHT_FOLLOWER_PORT> \
  --robot.id=my_bi_so101_follower \
  --robot.left_arm_config.cameras='{ wrist: {type: opencv, index_or_path: "/dev/v4l/by-path/<LEFT_WRIST_CAM_PATH>", width: 640, height: 480, fps: 30}}' \
  --robot.right_arm_config.cameras='{ wrist: {type: opencv, index_or_path: "/dev/v4l/by-path/<RIGHT_WRIST_CAM_PATH>", width: 640, height: 480, fps: 30}, front: {type: opencv, index_or_path: "/dev/v4l/by-path/<FRONT_CAM_PATH>", width: 640, height: 480, fps: 30}}' \
  --teleop.type=bi_so_leader \
  --teleop.left_arm_config.port=/dev/serial/by-id/<LEFT_LEADER_PORT> \
  --teleop.right_arm_config.port=/dev/serial/by-id/<RIGHT_LEADER_PORT> \
  --teleop.id=my_bi_so101_leader \
  --display_data=true

For dual-arm camera mapping, it is fine to attach front under either the left-arm or right-arm camera config. If you use more camera views, place them under either the left or right arm camera config as well.

If needed, you can also use temporary device paths (for example /dev/ttyACM* and /dev/video*) during initial debugging.

AgileX (PiPER/PiPER-X)

PiPER arms in master/teaching mode cannot receive external control commands, so all arms must be configured to follower/motion-output mode (0xFC), and firmware must be version 1.8.5 or above.

For PiPER-series robots, make sure Git LFS assets are pulled before running teleoperation:

git lfs pull --include="src/lerobot/assets/piper_description/**,src/lerobot/assets/piper_x_description/**" --exclude="*"
git lfs checkout src/lerobot/assets/piper_description src/lerobot/assets/piper_x_description

For PiPER setup, PiPER uses CAN interfaces instead of serial ports. So first run lerobot-setup-can to confirm CAN interfaces are available:

lerobot-setup-can --mode=setup --interfaces=<LEFT_FOLLOWER_CAN_PORT>,<LEFT_LEADER_CAN_PORT>,<RIGHT_FOLLOWER_CAN_PORT>,<RIGHT_LEADER_CAN_PORT>

For single-arm users, run the command below to verify the system is ready:

lerobot-teleoperate \
  --robot.type=piperx_follower \
  --robot.port=<FOLLOWER_CAN_PORT> \
  --robot.id=my_piperx_follower \
  --robot.require_calibration=false \
  --teleop.type=piperx_leader \
  --teleop.port=<LEADER_CAN_PORT> \
  --teleop.id=my_piperx_leader \
  --teleop.require_calibration=false

For bimanual users, run this command to verify dual-arm teleoperation:

lerobot-teleoperate \
  --robot.type=bi_piperx_follower \
  --robot.id=my_bi_piperx_follower \
  --robot.left_arm_config.port=<LEFT_FOLLOWER_CAN_PORT> \
  --robot.right_arm_config.port=<RIGHT_FOLLOWER_CAN_PORT> \
  --robot.left_arm_config.require_calibration=false \
  --robot.right_arm_config.require_calibration=false \
  --teleop.type=bi_piperx_leader \
  --teleop.id=my_bi_piperx_leader \
  --teleop.left_arm_config.port=<LEFT_LEADER_CAN_PORT> \
  --teleop.right_arm_config.port=<RIGHT_LEADER_CAN_PORT> \
  --teleop.left_arm_config.require_calibration=false \
  --teleop.right_arm_config.require_calibration=false

For PiPER (non-X), replace bi_piperx_follower/bi_piperx_leader with bi_piper_follower/bi_piper_leader.

3) Data Collection

Collect rollout data with lerobot-human-inloop-record.

SO Series (SO100/SO101)

Bimanual template:

lerobot-human-inloop-record \
  --robot.type=bi_so_follower \
  --robot.left_arm_config.port=/dev/serial/by-id/<LEFT_FOLLOWER_PORT> \
  --robot.right_arm_config.port=/dev/serial/by-id/<RIGHT_FOLLOWER_PORT> \
  --robot.id=my_bi_so101_follower \
  --robot.left_arm_config.cameras='{ wrist: {type: opencv, index_or_path: "/dev/v4l/by-path/<LEFT_WRIST_CAM_PATH>", width: 640, height: 480, fps: 30, fourcc: "MJPG"}}' \
  --robot.right_arm_config.cameras='{ wrist: {type: opencv, index_or_path: "/dev/v4l/by-path/<RIGHT_WRIST_CAM_PATH>", width: 640, height: 480, fps: 30, fourcc: "MJPG"}, front: {type: intelrealsense, serial_number_or_name: "<REALSENSE_SN>", width: 640, height: 480, fps: 30, warmup_s: 2}}' \
  --teleop.type=bi_so_leader \
  --teleop.left_arm_config.port=/dev/serial/by-id/<LEFT_LEADER_PORT> \
  --teleop.right_arm_config.port=/dev/serial/by-id/<RIGHT_LEADER_PORT> \
  --teleop.id=my_bi_so101_leader \
  --dataset.repo_id=<HF_USERNAME_OR_ORG>/<DATASET_NAME> \
  --dataset.single_task="<YOUR_TASK_DESCRIPTION>" \
  --dataset.num_episodes=<NUM_EPISODES> \
  --dataset.episode_time_s=<EPISODE_SECONDS> \
  --dataset.reset_time_s=<RESET_SECONDS> \
  --dataset.push_to_hub=true \
  --display_data=true

Recommendation: use fourcc: "MJPG" for OpenCV and warmup_s for RealSense. In this example front uses RealSense, but you can switch it to OpenCV with the same structure.

AgileX (PiPER/PiPER-X)

Bimanual template (left/right, PiPER-X example):

```bash lerobot-human-inloop-record \ --robot.type=bi_piperx_follower \ --robot.id=my_bi_piperx_follower \ --robot.left_arm_config.port= \ --robot.right_arm_config.port= \ --robot.left_arm_config.require_calibration=false \ --robot.right_arm_config.require_calibration=false \ --teleop.type=bi_piperx_leader \ --teleop.id=my_bi_piperx_leader \ --teleop.left_arm_config.port= \ --teleop.right_arm_config.port= \ --teleop.left_arm_config.require_calibration=false \ --teleop.right_arm_config.require_calibration=false \ --dataset.repo_id=/ \ --dataset.single_task="" \ --dataset.num_episodes= \ --dataset.episode_time_s= \ --dataset.reset_time_s= \ --dataset.push_to_hub=true \ --display_data=tr

Core symbols most depended-on inside this repo

Shape

Method 3,022
Function 2,611
Class 702
Route 36

Languages

Python100%
TypeScript1%

Modules by API surface

tests/processor/test_pipeline.py181 symbols
src/lerobot/motors/motors_bus.py150 symbols
src/lerobot/policies/xvla/modeling_florence2.py125 symbols
src/lerobot/policies/wall_x/qwen_model/qwen2_5_vl_moe.py101 symbols
src/lerobot/datasets/lerobot_dataset.py91 symbols
tests/processor/test_tokenizer_processor.py87 symbols
src/lerobot/processor/pipeline.py82 symbols
tests/processor/test_normalize_processor.py78 symbols
tests/test_piper_teleop.py68 symbols
src/lerobot/policies/sac/modeling_sac.py66 symbols
src/lerobot/datasets/utils.py64 symbols
src/lerobot/policies/pi0/modeling_pi0.py57 symbols

For agents

$ claude mcp add Evo-RL \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page