LeRobot documentation
Panduan Alur Kerja Pelatihan Robot Nyata HIL-SERL
Panduan Alur Kerja Pelatihan Robot Nyata HIL-SERL
Pada tutorial ini, Anda akan mengikuti alur kerja lengkap Human-in-the-Loop Sample-Efficient Reinforcement Learning (HIL-SERL) menggunakan LeRobot. Anda akan menguasai pelatihan kebijakan dengan RL pada robot sungguhan hanya dalam beberapa jam.
HIL-SERL adalah algoritma pembelajaran penguatan yang efisien sampel, yang menggabungkan demonstrasi manusia dengan pembelajaran online dan intervensi manusia. Pendekatan ini dimulai dari seperangkat kecil demonstrasi manusia, menggunakannya untuk melatih pengklasifikasi reward, dan kemudian menerapkan arsitektur actor-learner di mana manusia dapat melakukan intervensi selama eksekusi kebijakan untuk memandu eksplorasi dan mengoreksi perilaku yang tidak aman. Dalam tutorial ini, Anda akan menggunakan gamepad untuk memberikan intervensi dan mengontrol robot selama proses pembelajaran.
Ini menggabungkan tiga komponen utama:
Demonstrasi offline & klasifikator reward: beberapa episode teleop manusia ditambah detektor keberhasilan berbasis visual memberikan titik awal yang telah dibentuk bagi kebijakan.
Loop aktor / pembelajar di robot dengan intervensi manusia: pembelajar Soft Actor Critic (SAC) terdistribusi memperbarui kebijakan sementara aktor menjelajahi robot fisik; manusia dapat ikut campur kapan saja untuk mengoreksi perilaku yang berbahaya atau tidak produktif.
Alat keselamatan & efisiensi: batas sendi/ujung-efektor (EE), prapemrosesan area kepentingan (ROI) yang dipotong, dan pemantauan Trackio menjaga agar data tetap berguna dan perangkat keras tetap aman.
Kombinasi elemen-elemen ini memungkinkan HIL-SERL mencapai tingkat keberhasilan tugas yang mendekati sempurna dan waktu siklus yang lebih cepat dibandingkan baseline yang hanya menggunakan imitasi.

Alur kerja HIL-SERL, Luo et al. 2024
Panduan ini menyediakan instruksi langkah demi langkah untuk melatih kebijakan robot menggunakan implementasi HilSerl dari LeRobot untuk melatih pada robot nyata.
Apa yang saya butuhkan?
- Gamepad (disarankan) atau keyboard untuk mengontrol robot
- GPU Nvidia
- Robot sungguhan dengan lengan pengikut dan pemimpin (opsional jika Anda menggunakan keyboard atau gamepad)
- File URDF untuk robot untuk paket kinematika (periksa
lerobot/model/kinematics.py)
Tugas apa saja yang bisa saya latih?
HIL-SERL dapat digunakan untuk melatih berbagai tugas manipulasi. Beberapa rekomendasi:
- Mulai dengan tugas sederhana untuk memahami cara kerja sistem.
- Dorong kubus ke area tujuan
- Ambil dan angkat kubus dengan gripper
- Hindari tugas dengan horizon yang sangat panjang. Fokus pada tugas yang dapat diselesaikan dalam 5-10 detik.
- Setelah Anda memahami cara kerja sistem, Anda dapat mencoba tugas yang lebih kompleks dan horizon yang lebih panjang.
- Ambil dan letakkan kubus
- Tugas bimanual untuk mengambil objek dengan dua lengan
- Tugas hand-over untuk memindahkan objek dari satu lengan ke lengan lainnya
- Gila!
Install LeRobot dengan HIL-SERL
Untuk menginstal LeRobot dengan HIL-SERL, Anda perlu menginstal ekstra hilserl.
pip install -e ".[hilserl]"Alur Kerja Pelatihan Robot Nyata
Memahami Konfigurasi
Proses pelatihan dimulai dengan konfigurasi yang tepat untuk lingkungan HILSERl. Kelas konfigurasi utama adalah GymManipulatorConfig di lerobot/rl/gym_manipulator.py, yang berisi HILSerlRobotEnvConfig bersarang (didefinisikan di lerobot/envs/configs.py) dan DatasetConfig. Konfigurasi ini diorganisasikan ke dalam sub-konfigurasi bersarang yang fokus:
class GymManipulatorConfig:
env: HILSerlRobotEnvConfig # Environment configuration (nested)
dataset: DatasetConfig # Dataset recording/replay configuration (nested)
mode: str | None = None # "record", "replay", or None (for training)
device: str = "cpu" # Compute device
class HILSerlRobotEnvConfig(EnvConfig):
robot: RobotConfig | None = None # Main robot agent (defined in `lerobot/robots`)
teleop: TeleoperatorConfig | None = None # Teleoperator agent, e.g., gamepad or leader arm
processor: HILSerlProcessorConfig # Processing pipeline configuration (nested)
name: str = "real_robot" # Environment name
task: str | None = None # Task identifier
fps: int = 30 # Control frequency
# Nested processor configuration
class HILSerlProcessorConfig:
control_mode: str = "gamepad" # Control mode
observation: ObservationConfig | None = None # Observation processing settings
image_preprocessing: ImagePreprocessingConfig | None = None # Image crop/resize settings
gripper: GripperConfig | None = None # Gripper control and penalty settings
reset: ResetConfig | None = None # Environment reset and timing settings
inverse_kinematics: InverseKinematicsConfig | None = None # IK processing settings
reward_classifier: RewardClassifierConfig | None = None # Reward classifier settings
max_gripper_pos: float | None = 100.0 # Maximum gripper position
# Sub-configuration classes
class ObservationConfig:
add_joint_velocity_to_observation: bool = False # Add joint velocities to state
add_current_to_observation: bool = False # Add motor currents to state
add_ee_pose_to_observation: bool = False # Add end-effector pose to state
display_cameras: bool = False # Display camera feeds during execution
class ImagePreprocessingConfig:
crop_params_dict: dict[str, tuple[int, int, int, int]] | None = None # Image cropping parameters
resize_size: tuple[int, int] | None = None # Target image size
class GripperConfig:
use_gripper: bool = True # Enable gripper control
gripper_penalty: float = 0.0 # Penalty for inappropriate gripper usage
class ResetConfig:
fixed_reset_joint_positions: list[float] | None = None # Joint positions for reset
reset_time_s: float = 5.0 # Time to wait during reset
control_time_s: float = 20.0 # Maximum episode duration
terminate_on_success: bool = True # Whether to terminate episodes on success detection
class InverseKinematicsConfig:
urdf_path: str | None = None # Path to robot URDF file
target_frame_name: str | None = None # End-effector frame name
end_effector_bounds: dict[str, list[float]] | None = None # EE workspace bounds
end_effector_step_sizes: dict[str, float] | None = None # EE step sizes per axis
class RewardClassifierConfig:
pretrained_path: str | None = None # Path to pretrained reward classifier
success_threshold: float = 0.5 # Success detection threshold
success_reward: float = 1.0 # Reward value for successful episodes
# Dataset configuration
class DatasetConfig:
repo_id: str # LeRobot dataset repository ID
task: str # Task identifier
root: str | None = None # Local dataset root directory
num_episodes_to_record: int = 5 # Number of episodes for recording
replay_episode: int | None = None # Episode index for replay
push_to_hub: bool = False # Whether to push datasets to HubArsitektur Pipeline Processor
HIL-SERL menggunakan arsitektur pipeline prosesor modular yang memproses observasi dan aksi robot melalui serangkaian langkah yang dapat dikomposisikan. Pipeline ini dibagi menjadi dua komponen utama:
Pipeline Pemroses Lingkungan
Pemroses lingkungan (env_processor) menangani observasi yang masuk dan status lingkungan:
- VanillaObservationProcessorStep: Mengubah observasi robot mentah menjadi format standar
- JointVelocityProcessorStep (opsional): Menambahkan informasi kecepatan sendi ke observasi
- MotorCurrentProcessorStep (opsional): Menambahkan pembacaan arus motor ke observasi
- ForwardKinematicsJointsToEE (opsional): Menghitung pose end-effector dari posisi sendi
- ImageCropResizeProcessorStep (opsional): Memotong dan mengubah ukuran gambar kamera
- TimeLimitProcessorStep (opsional): Menegakkan batas waktu episode
- GripperPenaltyProcessorStep (opsional): Menerapkan penalti untuk penggunaan gripper yang tidak tepat
- RewardClassifierProcessorStep (opsional): Deteksi reward otomatis menggunakan model visi
- AddBatchDimensionProcessorStep: Mengonversi data ke format batch untuk pemrosesan jaringan saraf
- DeviceProcessorStep: Memindahkan data ke perangkat komputasi yang ditentukan (CPU/GPU)
Pipeline Pemroses Aksi
Prosesor aksi (action_processor) menangani aksi keluar dan intervensi manusia:
- AddTeleopActionAsComplimentaryDataStep: Mengambil aksi teleoperator untuk pencatatan
- AddTeleopEventsAsInfoStep: Mencatat peristiwa intervensi dan sinyal kontrol episode
- InterventionActionProcessorStep: Menangani intervensi manusia dan pengakhiran episode
- Inverse Kinematics Pipeline (ketika diaktifkan:
- MapDeltaActionToRobotActionStep: Mengonversi aksi delta ke format aksi robot
- EEReferenceAndDelta: Menghitung gerakan referensi dan delta ujung-efektor
- EEBoundsAndSafety: Menegakkan batas keamanan ruang kerja
- InverseKinematicsEEToJoints: Mengonversi aksi ujung-efektor menjadi target sendi
- GripperVelocityToJoint: Menangani perintah kontrol gripper
Contoh Konfigurasi
Pemrosesan Pengamatan Dasar:
{
"env": {
"processor": {
"observation": {
"add_joint_velocity_to_observation": true,
"add_current_to_observation": false,
"display_cameras": false
}
}
}
}Pemrosesan Gambar:
{
"env": {
"processor": {
"image_preprocessing": {
"crop_params_dict": {
"observation.images.front": [180, 250, 120, 150],
"observation.images.side": [180, 207, 180, 200]
},
"resize_size": [128, 128]
}
}
}
}Pengaturan Kinematika Invers:
{
"env": {
"processor": {
"inverse_kinematics": {
"urdf_path": "path/to/robot.urdf",
"target_frame_name": "end_effector",
"end_effector_bounds": {
"min": [0.16, -0.08, 0.03],
"max": [0.24, 0.2, 0.1]
},
"end_effector_step_sizes": {
"x": 0.02,
"y": 0.02,
"z": 0.02
}
}
}
}
}Pemrosesan Observasi Lanjutan
Framework HIL-SERL mendukung fitur pemrosesan observasi tambahan yang dapat meningkatkan pembelajaran kebijakan:
Pemrosesan Kecepatan Gabungan
Aktifkan estimasi kecepatan bersama untuk memberikan informasi gerak kepada kebijakan:
{
"env": {
"processor": {
"observation": {
"add_joint_velocity_to_observation": true
}
}
}
}Pemroses ini:
- Mengestimasi kecepatan sendi menggunakan perbedaan terbatas antara pembacaan posisi sendi yang berurutan
- Menambahkan informasi kecepatan ke vektor keadaan observasi
- Berguna untuk kebijakan yang membutuhkan kesadaran gerak untuk tugas dinamis
Pemrosesan Arus Motor
Pantau arus motor untuk mendeteksi gaya kontak dan kondisi beban:
{
"env": {
"processor": {
"observation": {
"add_current_to_observation": true
}
}
}
}Pemroses ini:
- Membaca nilai arus motor dari sistem kontrol robot
- Menambahkan pengukuran saat ini ke vektor keadaan observasi
- Membantu mendeteksi peristiwa kontak, berat objek, dan resistansi mekanis
- Berguna untuk tugas manipulasi yang kaya kontak
Pemrosesan Observasi Gabungan
Anda dapat mengaktifkan beberapa fitur pemrosesan observasi secara bersamaan:
{
"env": {
"processor": {
"observation": {
"add_joint_velocity_to_observation": true,
"add_current_to_observation": true,
"display_cameras": false
}
}
}
}Catatan: Mengaktifkan fitur observasi tambahan meningkatkan dimensi ruang keadaan, yang mungkin memerlukan penyesuaian arsitektur jaringan kebijakan Anda dan pengumpulan data pelatihan yang lebih banyak.
Menemukan Batas Ruang Kerja Robot
Sebelum mengumpulkan demonstrasi, Anda perlu menentukan batas operasional yang tepat untuk robot Anda.
Hal ini membantu menyederhanakan masalah pembelajaran pada robot nyata dalam dua cara: 1) dengan membatasi ruang operasional robot ke wilayah tertentu yang menyelesaikan tugas dan menghindari eksplorasi yang tidak perlu atau tidak aman, dan 2) dengan memungkinkan pelatihan di ruang end-effector alih-alih ruang sendi. Secara empiris, pembelajaran di ruang sendi untuk reinforcement learning dalam manipulasi sering kali merupakan masalah yang lebih sulit - beberapa tugas hampir mustahil dipelajari di ruang sendi tetapi menjadi dapat dipelajari ketika ruang aksi ditransformasikan ke koordinat end-effector.
Menggunakan lerobot-find-joint-limits
Skrip ini membantu Anda menemukan batas operasional yang aman untuk end-effector robot Anda. Mengingat Anda memiliki lengan pengikut (follower) dan pemimpin (leader), Anda dapat menggunakan skrip ini untuk menemukan batas untuk lengan pengikut yang akan diterapkan selama pelatihan. Membatasi ruang aksi akan mengurangi eksplorasi yang redundan dari agen dan menjamin keselamatan.
lerobot-find-joint-limits \ --robot.type=so100_follower \ --robot.port=/dev/tty.usbmodem58760431541 \ --robot.id=black \ --teleop.type=so100_leader \ --teleop.port=/dev/tty.usbmodem58760431551 \ --teleop.id=blue \ --urdf_path=SO-ARM100/Simulation/SO101/so101_new_calib.urdf \ --target_frame_name=gripper
--urdf_path wajib diisi: parameter ini menunjuk ke file URDF robot Anda, yang digunakan oleh skrip untuk menghitung posisi end-effector. Untuk SO-100/SO-101, clone repo SO-ARM100 dengan git clone https://github.com/TheRobotStudio/SO-ARM100.git; file URDF kemudian berada di SO-ARM100/Simulation/SO101/so101_new_calib.urdf.
Alur kerja
Jalankan skrip dan gerakkan robot melalui ruang yang menyelesaikan tugas
Skrip akan merekam posisi ujung efektor minimum dan maksimum serta sudut sendi, lalu mencetaknya ke konsol, misalnya:
# End Effector Bounds (x, y, z): max_ee = [0.2417, 0.2012, 0.1027] min_ee = [0.1663, -0.0823, 0.0336] # Joint Position Limits (radians): max_pos = [...] min_pos = [...]Gunakan nilai-nilai ini dalam konfigurasi lingkungan Anda di bawah
env.processor.inverse_kinematics.end_effector_bounds(lihatInverseKinematicsConfigdilerobot/envs/configs.py)
Konfigurasi Contoh
{
"env": {
"processor": {
"inverse_kinematics": {
"end_effector_bounds": {
"max": [0.24, 0.2, 0.1],
"min": [0.16, -0.08, 0.03]
}
}
}
}
}Mengumpulkan Demonstrasi
Dengan batas yang telah didefinisikan, Anda dapat dengan aman mengumpulkan demonstrasi untuk pelatihan. Pelatihan RL dengan algoritma off-policy memungkinkan kita untuk menggunakan dataset offline yang dikumpulkan guna meningkatkan efisiensi proses pembelajaran.
Mengatur Mode Rekam
File konfigurasi contoh untuk panduan ini ada di dataset lerobot/config_examples di Hub. Unduh konfigurasi lingkungan dan pelatihan ke direktori kerja Anda:
hf download lerobot/config_examples rl/env_config.json rl/train_config.json --repo-type dataset --local-dir .
Ini menyimpannya ke rl/env_config.json dan rl/train_config.json, jalur yang digunakan dalam perintah di bawah. Edit rl/env_config.json untuk merekam demonstrasi:
- Setel
modeke"record"di level akar - Tentukan
repo_idyang unik untuk dataset Anda di bagiandataset(misalnya, “username/task_name”) - Set
num_episodes_to_recorddi bagiandatasetke jumlah demonstrasi yang ingin Anda kumpulkan - Set
env.processor.image_preprocessing.crop_params_dictke{}pada awalnya (kami akan menentukan crops nanti) - Konfigurasikan
env.robot,env.teleop, dan pengaturan perangkat keras lainnya di bagianenv
Bagian konfigurasi contoh:
{
"env": {
"type": "gym_manipulator",
"name": "real_robot",
"fps": 10,
"processor": {
"control_mode": "gamepad",
"observation": {
"display_cameras": false
},
"image_preprocessing": {
"crop_params_dict": {},
"resize_size": [128, 128]
},
"gripper": {
"use_gripper": true,
"gripper_penalty": 0.0
},
"reset": {
"reset_time_s": 5.0,
"control_time_s": 20.0
}
},
"robot": {
// ... robot configuration ...
},
"teleop": {
// ... teleoperator configuration ...
}
},
"dataset": {
"repo_id": "username/pick_lift_cube",
"root": null,
"task": "pick_and_lift",
"num_episodes_to_record": 15,
"replay_episode": 0,
"push_to_hub": true
},
"mode": "record",
"device": "cpu"
}Menggunakan Perangkat Teleoperasi
Bersama dengan robot Anda, Anda akan memerlukan perangkat teleoperasi untuk mengendalikannya guna mengumpulkan dataset tugas Anda dan melakukan intervensi selama pelatihan online. Kami mendukung penggunaan gamepad atau keyboard atau lengan pemimpin dari robot.
HIL-Serl mempelajari aksi dalam ruang ujung-efektor robot. Oleh karena itu, teleoperasi akan mengontrol perpindahan x,y,z dari ujung-efektor.
Transformasi end-effector diterapkan oleh pipeline prosesor (InverseKinematicsRLStep, EEBoundsAndSafety, EEReferenceAndDelta, GripperVelocityToJoint) yang dikonfigurasi di bawah env.processor.inverse_kinematics (InverseKinematicsConfig) dan env.processor.gripper / env.processor.max_gripper_pos. Nilai default yang terkait dengan ruang end-effector adalah:
class InverseKinematicsConfig:
"""Configuration for inverse kinematics processing."""
urdf_path: str | None = None
target_frame_name: str | None = None
# bounds for the end-effector in x,y,z direction
end_effector_bounds: dict[str, list[float]] | None = None
# maximum step size for the end-effector in x,y,z direction
end_effector_step_sizes: dict[str, float] | None = None
class HILSerlProcessorConfig:
...
# maximum gripper position that the gripper will be open at
max_gripper_pos: float | None = 100.0Teleoperator mendefinisikan perangkat teleoperasi. Anda dapat memeriksa daftar teleoperator yang tersedia di lerobot/teleoperators.
Mengatur Gamepad
Gamepad menyediakan cara yang sangat nyaman untuk mengontrol robot dan status episode.
Untuk mengatur gamepad, Anda perlu mengatur control_mode menjadi "gamepad" dan mendefinisikan bagian teleop dalam file konfigurasi.
{
"env": {
"teleop": {
"type": "gamepad",
"use_gripper": true
},
"processor": {
"control_mode": "gamepad",
"gripper": {
"use_gripper": true
}
}
}
}
Pemetaan tombol gamepad untuk pengendalian robot dan manajemen episode
Mengatur leader SO101
Lengan pemimpin SO101 memiliki roda gigi yang dikurangi sehingga memungkinkan lengan tersebut bergerak dan melacak lengan pengikut selama eksplorasi. Oleh karena itu, proses pengambilalihan jauh lebih mulus dibandingkan SO100 yang tanpa roda gigi.
Untuk mengatur leader SO101, Anda perlu mengatur control_mode menjadi "leader" dan mendefinisikan bagian teleop dalam file konfigurasi.
{
"env": {
"teleop": {
"type": "so101_leader",
"port": "/dev/tty.usbmodem585A0077921",
"use_degrees": true
},
"processor": {
"control_mode": "leader",
"gripper": {
"use_gripper": true
}
}
}
}Untuk menandai keberhasilan/gagalnya episode, Anda perlu menggunakan keyboard untuk menekan s untuk keberhasilan, esc untuk kegagalan.
Selama pelatihan online, tekan space untuk mengambil alih kebijakan dan space lagi untuk mengembalikan kendali kepada kebijakan.
Video: SO101 leader teleoperation
Contoh teleoperasi pemimpin SO101, pemimpin melacak pengikut, tekan `space` untuk campur tangan
Merekam Demonstrasi
Mulai proses perekaman dengan konfigurasi lingkungan yang Anda edit di atas:
python -m lerobot.rl.gym_manipulator --config_path rl/env_config.json
Selama perekaman:
- Robot akan direset ke posisi awal yang didefinisikan dalam file konfigurasi
env.processor.reset.fixed_reset_joint_positions - Selesaikan tugas dengan sukses
- Episode berakhir dengan reward sebesar 1 saat Anda menekan tombol “success”
- Jika batas waktu tercapai, atau tombol gagal ditekan, episode berakhir dengan reward 0
- Anda dapat merekam ulang episode dengan menekan tombol “rerecord”
- Proses ini secara otomatis berlanjut ke episode berikutnya
- Setelah semua episode direkam, dataset didorong ke Hugging Face Hub (opsional) dan disimpan secara lokal
Memproses Dataset
Setelah mengumpulkan demonstrasi, proseslah data tersebut untuk menentukan crop kamera yang optimal. Pembelajaran penguatan sangat sensitif terhadap gangguan latar belakang, sehingga penting untuk memotong gambar ke area ruang kerja yang relevan.
Algoritma RL visual belajar langsung dari input piksel, sehingga rentan terhadap informasi visual yang tidak relevan. Elemen latar belakang seperti pencahayaan yang berubah, bayangan, orang yang bergerak, atau objek di luar area kerja dapat membingungkan proses pembelajaran. Pemilihan ROI yang baik harus:
- Sertakan hanya ruang kerja esensial tempat tugas dilakukan
- Ambil end-effector robot dan semua objek yang terlibat dalam tugas
- Hilangkan elemen latar belakang yang tidak perlu dan gangguan
Catatan: Jika Anda sudah mengetahui parameter crop, Anda dapat melewati langkah ini dan langsung mengatur crop_params_dict di file konfigurasi saat perekaman.
Menentukan Parameter Crop
Gunakan skrip crop_dataset_roi.py untuk memilih area kepentingan secara interaktif pada gambar kamera Anda:
python -m lerobot.rl.crop_dataset_roi --repo-id username/pick_lift_cube
- Untuk setiap tampilan kamera, skrip akan menampilkan bingkai pertama
- Gambarkan persegi panjang di sekitar area workspace yang relevan
- Tekan ‘c’ untuk mengonfirmasi pilihan
- Ulangi untuk semua tampilan kamera
- Skrip ini mengoutputkan parameter pemotongan dan membuat dataset baru yang sudah dipotong
Contoh keluaran:
Selected Rectangular Regions of Interest (top, left, height, width):
observation.images.side: [180, 207, 180, 200]
observation.images.front: [180, 250, 120, 150]
Alat pemotongan interaktif untuk memilih area yang diminati
Memperbarui Konfigurasi
Tambahkan parameter crop ini ke konfigurasi pelatihan Anda:
{
"env": {
"processor": {
"image_preprocessing": {
"crop_params_dict": {
"observation.images.side": [180, 207, 180, 200],
"observation.images.front": [180, 250, 120, 150]
},
"resize_size": [128, 128]
}
}
}
}Resolusi gambar yang direkomendasikan
Sebagian besar kebijakan berbasis visi telah divalidasi pada input persegi berukuran 128×128 (default) atau 64×64 piksel. Oleh karena itu, kami menyarankan untuk mengatur parameter resize_size menjadi [128, 128] – atau [64, 64] jika Anda perlu menghemat memori dan bandwidth GPU. Resolusi lain dimungkinkan tetapi belum diuji secara luas.
Melatih Pengklasifikasi Reward
Klasifikator reward memainkan peran penting dalam alur kerja HIL-SERL dengan mengotomatisasi penugasan reward dan mendeteksi keberhasilan episode secara otomatis. Alih-alih mendefinisikan fungsi reward secara manual atau mengandalkan umpan balik manusia untuk setiap langkah waktu, klasifikator reward belajar memprediksi keberhasilan/gagal dari pengamatan visual. Hal ini memungkinkan algoritma RL untuk belajar secara efisien dengan menyediakan sinyal reward yang konsisten dan otomatis berdasarkan masukan kamera robot.
Panduan ini menjelaskan cara melatih pengklasifikasi reward untuk implementasi reinforcement learning dengan human-in-the-loop di LeRobot. Pengklasifikasi reward belajar memprediksi nilai reward berdasarkan state, yang dapat digunakan dalam setup RL untuk melatih policy.
Catatan: Melatih pengklasifikasi reward bersifat opsional. Anda dapat memulai putaran pertama eksperimen RL dengan meng anotasi keberhasilan secara manual menggunakan perangkat gamepad atau keyboard Anda.
Implementasi reward classifier di lerobot/rewards/classifier/modeling_classifier.py menggunakan model visi pretrained untuk memproses gambar. Model ini dapat menghasilkan satu nilai untuk reward biner guna memprediksi kasus sukses/gagal, atau beberapa nilai untuk pengaturan multi-kelas.
Mengumpulkan Dataset untuk klasifikator reward
Sebelum pelatihan, Anda perlu mengumpulkan dataset dengan contoh berlabel. Mengatur mode: "record" di konfigurasi Anda dan menjalankan gym_manipulator.py mengaktifkan proses pengumpulan dataset observasi, aksi, dan reward.
Untuk mengumpulkan dataset, Anda perlu memodifikasi beberapa parameter dalam konfigurasi lingkungan berdasarkan HILSerlRobotEnvConfig.
python -m lerobot.rl.gym_manipulator --config_path rl/env_config.json
Parameter Utama untuk Pengumpulan Data
- mode: atur menjadi
"record"untuk mengumpulkan dataset (di level root) - dataset.repo_id:
"hf_username/dataset_name", nama dataset dan repo di hub - dataset.num_episodes_to_record: Jumlah episode yang akan direkam
- env.processor.reset.terminate_on_success: Apakah episode akan diakhiri secara otomatis ketika keberhasilan terdeteksi (default:
true) - env.fps: Jumlah frame per detik untuk direkam
- dataset.push_to_hub: Apakah dataset akan didorong ke hub
Parameter env.processor.reset.terminate_on_success memungkinkan Anda untuk mengontrol perilaku terminasi episode. Ketika diatur ke false, episode akan terus berjalan bahkan setelah keberhasilan terdeteksi, sehingga Anda dapat mengumpulkan lebih banyak contoh positif dengan label reward=1. Hal ini sangat penting untuk melatih klasifikator reward karena menyediakan lebih banyak contoh keadaan sukses dalam dataset Anda. Ketika diatur ke true (default), episode akan berakhir segera setelah keberhasilan terdeteksi.
Penting: Untuk pelatihan reward classifier, atur terminate_on_success: false untuk mengumpulkan contoh positif yang cukup. Untuk pelatihan HIL-SERL reguler, biarkan sebagai true untuk mengaktifkan terminasi episode otomatis ketika tugas berhasil diselesaikan.
Bagian konfigurasi contoh untuk pengumpulan data:
{
"env": {
"type": "gym_manipulator",
"name": "real_robot",
"fps": 10,
"processor": {
"reset": {
"reset_time_s": 5.0,
"control_time_s": 20.0,
"terminate_on_success": false
},
"gripper": {
"use_gripper": true
}
},
"robot": {
// ... robot configuration ...
},
"teleop": {
// ... teleoperator configuration ...
}
},
"dataset": {
"repo_id": "hf_username/dataset_name",
"root": "data/your_dataset",
"task": "reward_classifier_task",
"num_episodes_to_record": 20,
"replay_episode": null,
"push_to_hub": true
},
"mode": "record",
"device": "cpu"
}Konfigurasi Klasifikator Reward
Klasifikator reward dikonfigurasi menggunakan lerobot/rewards/classifier/configuration_classifier.py. Berikut adalah parameter utamanya:
- model_name: Arsitektur model dasar (misalnya, kami terutama menggunakan
"helper2424/resnet10") - model_type:
"cnn"atau"transformer" - num_cameras: Jumlah input kamera
- num_classes: Jumlah kelas output (biasanya 2 untuk keberhasilan/kegagalan biner)
- hidden_dim: Ukuran representasi tersembunyi
- dropout_rate: Parameter regularisasi
- learning_rate: Laju pembelajaran untuk optimizer
Contoh konfigurasi untuk melatih reward classifier. Simpan sebagai reward_classifier_train_config.json:
{
"dataset": {
"repo_id": "hf_username/dataset_name",
"root": null
},
"reward_model": {
"type": "reward_classifier",
"model_name": "helper2424/resnet10",
"model_type": "cnn",
"num_cameras": 2,
"num_classes": 2,
"hidden_dim": 256,
"dropout_rate": 0.1,
"learning_rate": 1e-4,
"device": "cuda",
"input_features": {
"observation.images.front": {
"type": "VISUAL",
"shape": [3, 128, 128]
},
"observation.images.side": {
"type": "VISUAL",
"shape": [3, 128, 128]
}
},
"push_to_hub": true,
"repo_id": "hf_username/model_repo"
},
"batch_size": 16,
"num_workers": 4,
"steps": 5000,
"log_freq": 10,
"env_eval_freq": 1000,
"save_freq": 1000,
"save_checkpoint": true,
"seed": 2,
"resume": false,
"optimizer": {
"grad_clip_norm": 10.0
},
"trackio": {
"enable": true,
"project": "reward-classifier"
},
"job_name": "reward-classifier"
}Melatih Klasifikator
Untuk melatih klasifikator, gunakan skrip train.py dengan konfigurasi Anda:
lerobot-train --config_path reward_classifier_train_config.json
Men-deploy dan Menguji Model
Untuk menggunakan klasifikator reward yang telah Anda latih, konfigurasikan HILSerlRobotEnvConfig untuk menggunakan model Anda:
config = GymManipulatorConfig(
env=HILSerlRobotEnvConfig(
processor=HILSerlProcessorConfig(
reward_classifier=RewardClassifierConfig(
pretrained_path="path_to_your_pretrained_trained_model"
)
),
# Other environment parameters
),
dataset=DatasetConfig(...),
mode=None # For training
)atau setel argumen dalam file konfigurasi json.
{
"env": {
"processor": {
"reward_classifier": {
"pretrained_path": "path_to_your_pretrained_model",
"success_threshold": 0.7,
"success_reward": 1.0
},
"reset": {
"terminate_on_success": true
}
}
}
}Jalankan gym_manipulator.py untuk menguji model.
python -m lerobot.rl.gym_manipulator --config_path rl/env_config.json
Klasifikator hadiah akan secara otomatis memberikan hadiah berdasarkan masukan visual dari kamera robot.
Alur Kerja Contoh untuk melatih klasifikator reward
Buat file konfigurasi: Buat file konfigurasi json yang diperlukan untuk reward classifier dan lingkungan:
reward_classifier_train_config.jsondari contoh di atas, danrl/env_config.jsonyang telah diunduh.Kumpulkan dataset:
python -m lerobot.rl.gym_manipulator --config_path rl/env_config.json
Latih klasifikator:
lerobot-train --config_path reward_classifier_train_config.json
Uji klasifikator:
python -m lerobot.rl.gym_manipulator --config_path rl/env_config.json
Pelatihan dengan Actor-Learner
Sistem LeRobot menggunakan arsitektur actor-learner terdistribusi untuk pelatihan. Arsitektur ini memisahkan interaksi robot dari proses pembelajaran, sehingga keduanya dapat berjalan secara bersamaan tanpa saling memblokir. Server actor menangani observasi dan aksi robot, lalu mengirimkan data interaksi ke server learner. Server learner melakukan penurunan gradien dan secara berkala memperbarui bobot kebijakan actor. Anda perlu memulai dua proses: learner dan actor.
Penyiapan Konfigurasi
Edit file konfigurasi pelatihan yang Anda unduh sebelumnya, rl/train_config.json (contoh tersedia di sini). Konfigurasi pelatihan ini didasarkan pada kelas utama TrainRLServerPipelineConfig di lerobot/rl/train_rl.py.
- Konfigurasikan pengaturan kebijakan (
type="gaussian_actor",device, dll.) - Konfigurasikan pengaturan algoritma di bawah blok
algorithmtingkat atas (type="sac", learning rate, discount, dll., yang didefinisikan dilerobot/rl/algorithms/sac/configuration_sac.py). - Set
datasetke dataset yang sudah dipotong - Konfigurasi pengaturan lingkungan dengan parameter crop
- Periksa parameter lain yang terkait dengan Gaussian Actor di configuration_gaussian_actor.py.
- Verifikasi bahwa konfigurasi
policybenar denganinput_featuresdanoutput_featuresyang tepat untuk tugas Anda.
Memulai Learner
Pertama, mulai proses server learner:
python -m lerobot.rl.learner --config_path rl/train_config.json
Pembelajar:
- Menginisialisasi jaringan kebijakan
- Menyiapkan buffer replay
- Membuka server
gRPCuntuk berkomunikasi dengan aktor - Memproses transisi dan memperbarui kebijakan
Memulai Actor
Di terminal terpisah, jalankan proses actor dengan konfigurasi yang sama:
python -m lerobot.rl.actor --config_path rl/train_config.json
Aktor:
- Menghubungkan ke learner melalui
gRPC - Menginisialisasi lingkungan
- Jalankan rollout dari kebijakan untuk mengumpulkan pengalaman
- Mengirim transisi ke learner
- Menerima parameter kebijakan yang diperbarui
Alur Pelatihan
Pelatihan berjalan secara otomatis:
- Actor mengeksekusi kebijakan di lingkungan
- Transisi dikumpulkan dan dikirim ke learner
- Learner memperbarui kebijakan berdasarkan transisi-transisi ini
- Parameter kebijakan yang diperbarui dikirim kembali ke aktor
- Proses berlanjut hingga batas langkah yang ditentukan tercapai
Manusia dalam Loop
- Kunci untuk belajar secara efisien adalah adanya intervensi manusia untuk memberikan umpan balik korektif dan menyelesaikan tugas guna membantu pembelajaran kebijakan dan eksplorasi.
- Untuk melakukan intervensi manusia, Anda dapat menekan tombol trigger kanan atas pada gamepad (atau tombol
spacepada keyboard). Hal ini akan menjeda aksi kebijakan dan memungkinkan Anda mengambil alih kendali. - Eksperimen yang berhasil adalah eksperimen di mana manusia harus melakukan intervensi di awal, namun kemudian mengurangi jumlah intervensi seiring dengan meningkatnya kinerja kebijakan. Anda dapat memantau tingkat intervensi di dasbor Trackio (
trackio show --project <project>).

Contoh yang menunjukkan bagaimana intervensi manusia membantu memandu pembelajaran kebijakan seiring waktu
- Gambar menunjukkan plot reward episodik terhadap langkah interaksi. Gambar menunjukkan efek intervensi manusia pada pembelajaran kebijakan.
- Kurva oranye adalah eksperimen tanpa intervensi manusia. Sementara itu, kurva merah muda dan biru adalah eksperimen dengan intervensi manusia.
- Kita dapat mengamati bahwa jumlah langkah di mana kebijakan mulai mencapai imbalan maksimum berkurang seperempat ketika intervensi manusia hadir.
Memantau dan Men-debug
Jika Anda telah mengatur trackio.enable menjadi true dalam konfigurasi Anda, Anda dapat memantau kemajuan pelatihan secara real-time melalui dasbor Trackio (trackio show --project <project>).
Panduan Intervensi Manusia
Proses pembelajaran sangat sensitif terhadap strategi intervensi. Diperlukan beberapa kali eksekusi untuk memahami cara melakukan intervensi secara efektif. Beberapa tips dan petunjuk:
- Izikan kebijakan untuk mengeksplorasi selama beberapa episode di awal pelatihan.
- Hindari intervensi dalam jangka waktu yang lama. Cobalah untuk melakukan intervensi dalam situasi tertentu untuk mengoreksi perilaku robot ketika ia menyimpang dari jalur yang benar.
- Setelah kebijakan mulai berhasil menyelesaikan tugas, meskipun belum sempurna, Anda dapat membatasi intervensi Anda menjadi tindakan cepat dan sederhana seperti perintah menggenggam yang sederhana.
Perilaku idealnya adalah tingkat intervensi Anda harus menurun secara bertahap selama pelatihan, seperti yang ditunjukkan pada gambar di bawah.

Grafik laju intervensi selama proses pelatihan pada tugas mengambil dan mengangkat kubus
Hyperparameter utama untuk disetel
Beberapa nilai konfigurasi memiliki dampak yang tidak proporsional terhadap stabilitas dan kecepatan pelatihan:
temperature_init(algorithm.temperature_init) – suhu entropi awal dalam SAC. Nilai yang lebih tinggi mendorong eksplorasi lebih banyak; nilai yang lebih rendah membuat kebijakan lebih deterministik di awal. Titik awal yang baik adalah1e-2. Kami mengamati bahwa menyetelnya terlalu tinggi dapat membuat intervensi manusia tidak efektif dan memperlambat pembelajaran.policy_parameters_push_frequency(policy.actor_learner_config.policy_parameters_push_frequency) – interval dalam detik antara dua pendorongan bobot dari learner ke actor. Nilainya secara default adalah4 s. Turunkan menjadi 1-2 s untuk menyediakan bobot yang lebih segar (dengan biaya lalu lintas jaringan yang lebih besar); naikkan hanya jika koneksi Anda lambat, karena hal ini akan mengurangi efisiensi sampel.storage_device(policy.storage_device) – perangkat tempat learner menyimpan parameter kebijakan. Jika Anda memiliki memori GPU yang tersedia, atur ini ke"cuda"(bukan default"cpu"). Menyimpan bobot di GPU menghilangkan overhead transfer CPU→GPU dan dapat secara signifikan meningkatkan jumlah pembaruan learner per detik.
Selamat 🎉, Anda telah menyelesaikan tutorial ini!
Jika Anda memiliki pertanyaan atau membutuhkan bantuan, silakan hubungi kami di Discord.
Sitasi paper:
@article{luo2024precise,
title={Precise and Dexterous Robotic Manipulation via Human-in-the-Loop Reinforcement Learning},
author={Luo, Jianlan and Xu, Charles and Wu, Jeffrey and Levine, Sergey},
journal={arXiv preprint arXiv:2410.21845},
year={2024}
}