LeRobot 文件
HIL-SERL 真實機器人訓練工作流程指南
並獲得增強的文件體驗
開始使用
HIL-SERL 真實機器人訓練工作流程指南
在本教學中,您將使用 LeRobot 完成完整的人機協作、樣本高效增強學習 (HIL-SERL) 工作流程。您只需幾個小時就能掌握如何在真實機器人上透過增強學習訓練一個策略。
HIL-SERL 是一種樣本高效的增強學習演算法,結合了人類演示、線上學習與人類干預。該方法從少量人類演示開始,用於訓練獎勵分類器,隨後採用「執行者-學習者」架構,讓人們能在策略執行期間進行干預,以引導探索並修正不安全的行為。在本教學中,您將使用遊戲手把來提供干預,並在學習過程中控制機器人。
它結合了三個關鍵要素:
離線演示與獎勵分類器: 少量的遙控操作示範加上基於視覺的成功檢測器,為策略提供了初步的引導。
具備人類干預的機器人執行者/學習者迴圈: 分散式的 Soft Actor Critic (SAC) 學習者會更新策略,而執行者則在實體機器人上進行探索;人類可以隨時介入,修正危險或無效的行為。
安全與效率工具: 關節/末端執行器 (EE) 邊界限制、感興趣區域 (ROI) 預處理以及 WandB 監控,確保資料可用性與硬體安全。
這些元素共同作用,讓 HIL-SERL 能達到近乎完美的任務成功率,並比僅使用模仿學習的基準方案具備更快的循環時間。

HIL-SERL 工作流程,Luo et al. 2024
本指南提供使用 LeRobot 的 HilSerl 實作在真實機器人上訓練機器人策略的逐步說明。
我需要什麼?
- 一個遊戲手把(推薦)或鍵盤來控制機器人。
- 一張 Nvidia GPU。
- 一台具有隨動臂 (Follower) 和主導臂 (Leader) 的真實機器人(若使用鍵盤或遊戲手把則為選配)。
- 一個用於機器人運動學套件的 URDF 檔案(請檢查
lerobot/model/kinematics.py)。
我可以訓練什麼類型的任務?
可以使用 HIL-SERL 訓練各種操作任務。一些建議:
- 從簡單的任務開始,以了解系統運作方式。
- 將方塊推向目標區域。
- 使用夾爪拾取並舉起方塊。
- 避免過長的時間範圍任務。專注於能在 5-10 秒內完成的任務。
- 一旦您對系統運作有充分了解,就可以嘗試更複雜的任務與更長的時間範圍。
- 拾取並放置方塊 (Pick and place)。
- 使用雙臂拾取物體的雙手操作任務。
- 將物體從一隻手轉移到另一隻手的交接任務。
- 盡情發揮吧!
安裝具備 HIL-SERL 的 LeRobot
要安裝具備 HIL-SERL 的 LeRobot,您需要安裝 hilserl 額外套件。
pip install -e ".[hilserl]"真實機器人訓練工作流程
理解配置
訓練過程始於 HILSerl 環境的適當配置。主要的配置類別是 lerobot/rl/gym_manipulator.py 中的 GymManipulatorConfig,其中包含巢狀的 HILSerlRobotEnvConfig 和 DatasetConfig。配置被組織成專注的巢狀子配置。
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 = 10 # 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
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: Any | 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 Hub處理器管線架構
HIL-SERL 使用模組化的處理器管線架構,透過一系列可組合的步驟處理機器人的觀測數據與動作。管線分為兩個主要組件:
環境處理器管線
環境處理器 (env_processor) 處理傳入的觀測數據與環境狀態:
- VanillaObservationProcessorStep:將原始機器人觀測數據轉換為標準格式。
- JointVelocityProcessorStep (選配):將關節速度資訊加入觀測數據中。
- MotorCurrentProcessorStep (選配):將馬達電流讀數加入觀測數據中。
- ForwardKinematicsJointsToEE (選配):從關節位置計算末端執行器姿態。
- ImageCropResizeProcessorStep (選配):裁剪並調整相機影像大小。
- TimeLimitProcessorStep (選配):強制執行回合時間限制。
- GripperPenaltyProcessorStep (選配):針對不當使用夾爪的行為進行處罰。
- RewardClassifierProcessorStep (選配):使用視覺模型進行自動化獎勵檢測。
- AddBatchDimensionProcessorStep:將數據轉換為批次格式以進行神經網路處理。
- DeviceProcessorStep:將數據移動到指定的計算裝置 (CPU/GPU)。
動作處理器管線
動作處理器 (action_processor) 處理傳出的動作與人類干預:
- AddTeleopActionAsComplimentaryDataStep:擷取遙控操作器動作以進行記錄。
- AddTeleopEventsAsInfoStep:記錄干預事件與回合控制訊號。
- InterventionActionProcessorStep:處理人類干預與回合終止。
- 逆運動學管線(啟用時)
- MapDeltaActionToRobotActionStep:將增量動作轉換為機器人動作格式。
- EEReferenceAndDelta:計算末端執行器參考與增量位移。
- EEBoundsAndSafety:強制執行工作空間安全邊界。
- InverseKinematicsEEToJoints:將末端執行器動作轉換為關節目標。
- GripperVelocityToJoint:處理夾爪控制指令。
配置範例
基礎觀測處理:
{
"env": {
"processor": {
"observation": {
"add_joint_velocity_to_observation": true,
"add_current_to_observation": false,
"display_cameras": false
}
}
}
}影像處理:
{
"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]
}
}
}
}逆運動學設置:
{
"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
}
}
}
}
}進階觀測處理
HIL-SERL 框架支援額外的觀測處理功能,可改善策略學習:
關節速度處理
啟用關節速度估計,為策略提供運動資訊:
{
"env": {
"processor": {
"observation": {
"add_joint_velocity_to_observation": true
}
}
}
}此處理器:
- 使用連續關節位置讀數之間的有限差分來估計關節速度。
- 將速度資訊加入觀測狀態向量中。
- 對於需要運動意識來處理動態任務的策略非常有用。
馬達電流處理
監控馬達電流以檢測接觸力與負載狀況:
{
"env": {
"processor": {
"observation": {
"add_current_to_observation": true
}
}
}
}此處理器:
- 從機器人的控制系統讀取馬達電流值。
- 將電流測量值加入觀測狀態向量中。
- 有助於檢測接觸事件、物體重量與機械阻力。
- 對於接觸頻繁的操作任務非常有用。
組合觀測處理
您可以同時啟用多種觀測處理功能。
{
"env": {
"processor": {
"observation": {
"add_joint_velocity_to_observation": true,
"add_current_to_observation": true,
"display_cameras": false
}
}
}
}注意:啟用額外的觀測功能會增加狀態空間的維度,這可能需要調整您的策略網路架構,並可能需要收集更多的訓練資料。
尋找機器人工作空間邊界
在收集演示之前,您需要確定機器人的適當操作邊界。
這有助於從兩個方面簡化在真實機器人上學習的問題:1) 透過將機器人的操作空間限制在解決任務所需的特定區域,以避免不必要或不安全的探索;2) 允許在末端執行器空間而非關節空間進行訓練。經驗上,在關節空間進行增強學習通常更困難——有些任務在關節空間幾乎無法學習,但當動作空間轉換為末端執行器座標時,任務便變得可學。
使用 lerobot-find-joint-limits
此腳本可幫助您找到機器人末端執行器的安全操作邊界。由於您有隨動臂和主導臂,您可以使用該腳本找到將在訓練期間套用的隨動臂邊界。限制動作空間將減少代理人的冗餘探索並保證安全性。
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
工作流程
- 執行腳本並移動機器人,完成任務所需的空間。
- 腳本將記錄末端執行器的最小與最大位置以及關節角度,並將其列印到控制台,例如:
Max ee position [0.2417 0.2012 0.1027] Min ee position [0.1663 -0.0823 0.0336] Max joint positions [-20.0, -20.0, -20.0, -20.0, -20.0, -20.0] Min joint positions [50.0, 50.0, 50.0, 50.0, 50.0, 50.0] - 在您的遙控操作裝置配置 (TeleoperatorConfig) 的
end_effector_bounds欄位中使用這些值。
配置範例
"end_effector_bounds": {
"max": [0.24, 0.20, 0.10],
"min": [0.16, -0.08, 0.03]
}收集演示
定義邊界後,您可以安全地收集訓練所需的演示。使用離線演算法進行增強學習,讓我們能夠使用先前收集的離線資料集來提高學習效率。
設定錄製模式
建立一個用於錄製演示的設定檔(或編輯現有的,如 env_config.json)。
- 在根層級將
mode設定為"record"。 - 在
dataset區段中為您的資料集指定一個唯一的repo_id(例如 "username/task_name")。 - 在
dataset區段中將num_episodes_to_record設定為您想要收集的演示數量。 - 最初將
env.processor.image_preprocessing.crop_params_dict設定為{}(我們稍後再確定裁剪區域)。 - 在
env區段中配置env.robot、env.teleop和其他硬體設定。
配置區段範例
{
"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"
}使用遙控操作裝置
除了機器人之外,您還需要一個遙控操作裝置來控制它,以便收集任務資料集並在線上訓練期間進行干預。我們支援使用遊戲手把、鍵盤或機器人的主導臂。
HIL-Serl 在機器人的末端執行器空間中學習動作。因此,遙控操作將控制末端執行器的 x、y、z 位移。
為此,我們需要定義一個在末端執行器空間中採取動作的機器人版本。請檢查機器人類別 SO100FollowerEndEffector 及其配置 SO100FollowerEndEffectorConfig 以獲取與末端執行器空間相關的預設參數。
class SO100FollowerEndEffectorConfig(SO100FollowerConfig):
"""Configuration for the SO100FollowerEndEffector robot."""
# Default bounds for the end-effector position (in meters)
end_effector_bounds: dict[str, list[float]] = field( # bounds for the end-effector in x,y,z direction
default_factory=lambda: {
"min": [-1.0, -1.0, -1.0], # min x, y, z
"max": [1.0, 1.0, 1.0], # max x, y, z
}
)
max_gripper_pos: float = 50 # maximum gripper position that the gripper will be open at
end_effector_step_sizes: dict[str, float] = field( # maximum step size for the end-effector in x,y,z direction
default_factory=lambda: {
"x": 0.02,
"y": 0.02,
"z": 0.02,
}
)Teleoperator 定義了遙控操作裝置。您可以在 lerobot/teleoperators 中檢查可用遙控操作器的列表。
設定遊戲手把
遊戲手把提供了控制機器人和回合狀態的極為便利的方式。
要設定遊戲手把,您需要將 control_mode 設定為 "gamepad",並在設定檔中定義 teleop 區段。
{
"env": {
"teleop": {
"type": "gamepad",
"use_gripper": true
},
"processor": {
"control_mode": "gamepad",
"gripper": {
"use_gripper": true
}
}
}
}
用於機器人控制與回合管理的遊戲手把按鍵對映
設定 SO101 主導臂
SO101 主導臂具有減速齒輪,使其能在探索期間移動並追蹤隨動臂。因此,接管操作比無齒輪的 SO100 更平順。
要設定 SO101 主導臂,您需要將 control_mode 設定為 "leader",並在設定檔中定義 teleop 區段。
{
"env": {
"teleop": {
"type": "so101_leader",
"port": "/dev/tty.usbmodem585A0077921",
"use_degrees": true
},
"processor": {
"control_mode": "leader",
"gripper": {
"use_gripper": true
}
}
}
}為了標註回合的成功/失敗,您需要使用鍵盤按下 s 代表成功,esc 代表失敗。在線上訓練期間,按下 space 鍵接管策略,再次按下 space 鍵將控制權交還給策略。
影片:SO101 主導臂遙控操作
SO101 主導臂遙控操作範例,主導臂追蹤隨動臂,按下 `space` 鍵進行干預
記錄演示
開始記錄過程,設定檔範例可於此處找到。
python -m lerobot.rl.gym_manipulator --config_path src/lerobot/configs/env_config_so100.json
記錄期間:
- 機器人將重置為設定檔
env.processor.reset.fixed_reset_joint_positions中定義的初始位置。 - 成功完成任務。
- 當您按下「成功」按鈕時,回合結束並獲得 1 的獎勵。
- 若達到時間限制或按下「失敗」按鈕,回合結束時獎勵為 0。
- 您可以透過按下「重新記錄 (rerecord)」按鈕來重新錄製一個回合。
- 該過程會自動繼續進行下一個回合。
- 記錄所有回合後,資料集會推送到 Hugging Face Hub (選配) 並儲存在本地。
處理資料集
收集演示後,處理它們以確定最佳相機裁剪。增強學習對背景干擾很敏感,因此將影像裁剪至相關工作區域非常重要。
視覺增強學習演算法直接從像素輸入學習,使其容易受到無關視覺資訊的影響。光線變化、陰影、人員移動或工作空間外的物體等背景元素可能會擾亂學習過程。良好的 ROI 選擇應:
- 僅包含任務發生的核心工作空間。
- 捕捉機器人的末端執行器與任務涉及的所有物體。
- 排除不必要的背景元素與干擾。
注意:如果您已經知道裁剪參數,可以跳過此步驟,只需在錄製期間設定設定檔中的 crop_params_dict 即可。
確定裁剪參數
使用 crop_dataset_roi.py 腳本以互動方式選擇相機影像中的感興趣區域。
python -m lerobot.rl.crop_dataset_roi --repo-id username/pick_lift_cube
- 對於每個相機視角,腳本將顯示第一幀。
- 在相關工作空間區域周圍繪製一個矩形。
- 按下「c」鍵確認選擇。
- 對所有相機視角重複上述步驟。
- 腳本將輸出裁剪參數並建立一個新的裁剪後的資料集。
輸出範例
Selected Rectangular Regions of Interest (top, left, height, width):
observation.images.side: [180, 207, 180, 200]
observation.images.front: [180, 250, 120, 150]
用於選擇感興趣區域的互動式裁剪工具。
更新配置
將這些裁剪參數加入您的訓練配置中。
{
"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]
}
}
}
}推薦影像解析度
大多數基於視覺的策略已在 128×128(預設)或 64×64 像素的正方形輸入上進行了驗證。因此,我們建議將 resize_size 參數設定為 [128, 128] —— 若需要節省 GPU 記憶體與頻寬,則設定為 [64, 64]。其他解析度也是可行的,但尚未經過廣泛測試。
訓練獎勵分類器
獎勵分類器在 HIL-SERL 工作流程中扮演重要角色,透過自動化獎勵分配並自動檢測回合成功與否。獎勵分類器不是手動定義獎勵函數或依賴每一步的人類回饋,而是學習從視覺觀測中預測成功/失敗。這使得增強學習演算法能透過提供基於機器人相機輸入的一致且自動的獎勵訊號,從而有效地進行學習。
本指南說明如何為 LeRobot 的人機協作增強學習實作訓練獎勵分類器。獎勵分類器學習預測給定狀態下的獎勵值,該值可用於增強學習設置以訓練策略。
注意:訓練獎勵分類器是選配的。您可以透過遊戲手把或鍵盤裝置手動標註成功,來開始第一輪增強學習實驗。
modeling_classifier.py 中的獎勵分類器實作使用預訓練的視覺模型來處理影像。它可以輸出用於二元獎勵(預測成功/失敗案例)的單個值,或用於多類別設置的多個值。
為獎勵分類器收集資料集
在訓練之前,您需要收集包含標註範例的資料集。gym_manipulator.py 中的 record_dataset 函數實現了收集觀測、動作與獎勵資料集的過程。
要收集資料集,您需要根據 HILSerlRobotEnvConfig 修改環境配置中的某些參數。
python -m lerobot.rl.gym_manipulator --config_path src/lerobot/configs/reward_classifier_train_config.json
資料收集的關鍵參數
- mode:設定為
"record"以收集資料集(在根層級)。 - dataset.repo_id:
"hf_username/dataset_name",Hub 上的資料集與儲存庫名稱。 - dataset.num_episodes_to_record:要錄製的回合數。
- env.processor.reset.terminate_on_success:檢測到成功時是否自動終止回合(預設:
true)。 - env.fps:要錄製的每秒幀數。
- dataset.push_to_hub:是否將資料集推送到 Hub。
env.processor.reset.terminate_on_success 參數允許您控制回合終止行為。當設定為 false 時,即使檢測到成功,回合仍會繼續,使您能收集更多帶有獎勵=1 標籤的正向範例。這對於訓練獎勵分類器至關重要,因為它在資料集中提供了更多的成功狀態範例。當設定為 true(預設)時,回合會在檢測到成功後立即終止。
重要:對於獎勵分類器訓練,請設定 terminate_on_success: false 以收集足夠的正向範例。對於一般的 HIL-SERL 訓練,請保持為 true,以便在任務成功完成時啟用自動回合終止。
資料收集的配置區段範例
{
"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",
"dataset_root": "data/your_dataset",
"task": "reward_classifier_task",
"num_episodes_to_record": 20,
"replay_episode": null,
"push_to_hub": true
},
"mode": "record",
"device": "cpu"
}獎勵分類器配置
獎勵分類器使用 configuration_classifier.py 進行配置。關鍵參數如下:
- model_name:基礎模型架構(例如,我們主要使用
"helper2424/resnet10")。 - model_type:
"cnn"或"transformer"。 - num_cameras:相機輸入數量。
- num_classes:輸出類別數量(通常為 2,用於二元成功/失敗)。
- hidden_dim:隱藏層表示大小。
- dropout_rate:正則化參數。
- learning_rate:優化器的學習率。
訓練獎勵分類器的配置範例
{
"policy": {
"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",
"use_amp": true,
"input_features": {
"observation.images.front": {
"type": "VISUAL",
"shape": [3, 128, 128]
},
"observation.images.side": {
"type": "VISUAL",
"shape": [3, 128, 128]
}
}
}
}訓練分類器
若要訓練分類器,請使用帶有您的配置的 train.py 腳本。
lerobot-train --config_path path/to/reward_classifier_train_config.json
部署與測試模型
若要使用您訓練好的獎勵分類器,請將 HILSerlRobotEnvConfig 配置為使用您的模型,
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
)或在 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
}
}
}
}執行 gym_manipulator.py 以測試模型。
python -m lerobot.rl.gym_manipulator --config_path path/to/env_config.json
獎勵分類器將根據機器人相機的視覺輸入自動提供獎勵。
訓練獎勵分類器的工作流程範例
建立設定檔:為獎勵分類器與環境建立必要的 json 設定檔。請在此查看範例。
收集資料集。:
python -m lerobot.rl.gym_manipulator --config_path src/lerobot/configs/env_config.json
訓練分類器。:
lerobot-train --config_path src/lerobot/configs/reward_classifier_train_config.json
測試分類器。:
python -m lerobot.rl.gym_manipulator --config_path src/lerobot/configs/env_config.json
使用執行者-學習者 (Actor-Learner) 進行訓練
LeRobot 系統使用分散式的執行者-學習者架構進行訓練。此架構將機器人互動與學習過程分離,允許它們同時運作而不互相阻塞。執行者伺服器處理機器人的觀測與動作,並將互動資料發送到學習者伺服器。學習者伺服器執行梯度下降,並定期更新執行者的策略權重。您將需要啟動兩個行程:學習者與執行者。
配置設置
建立一個訓練設定檔(可在此處取得範例)。訓練配置基於 lerobot/configs/train.py 中的主 TrainRLServerPipelineConfig 類別。
- 配置策略設定 (
type="sac",device, 等)。 - 將
dataset設定為您裁剪後的資料集。 - 使用裁剪參數配置環境設定。
- 在 configuration_sac.py 中檢查與 SAC 相關的其他參數。
- 確認
policy配置正確,且包含您任務所需的正確input_features與output_features。
啟動學習者
首先,啟動學習者伺服器行程。
python -m lerobot.rl.learner --config_path src/lerobot/configs/train_config_hilserl_so100.json
學習者:
- 初始化策略網路。
- 準備重放緩衝區 (replay buffers)。
- 開啟一個
gRPC伺服器與執行者通訊。 - 處理轉移資料並更新策略。
啟動執行者
在另一個終端機中,使用相同的配置啟動執行者行程。
python -m lerobot.rl.actor --config_path src/lerobot/configs/train_config_hilserl_so100.json
執行者:
- 透過
gRPC連接到學習者。 - 初始化環境。
- 執行策略的滾動執行 (rollouts) 以收集經驗。
- 將轉移資料發送到學習者。
- 接收更新後的策略參數。
訓練流程
訓練將自動進行:
- 執行者在環境中執行策略。
- 收集轉移資料並發送到學習者。
- 學習者根據這些轉移資料更新策略。
- 更新後的策略參數發送回執行者。
- 該過程會一直持續到達到指定的步驟限制。
人機協作 (Human in the Loop)
- 高效學習的關鍵是透過人類干預來提供修正回饋,並完成任務以輔助策略學習與探索。
- 要進行人類干預,您可以按下遊戲手把右上方的觸發按鈕(或鍵盤上的
space鍵)。這將暫停策略動作,讓您接管控制權。 - 一個成功的實驗是指人類一開始必須進行干預,但隨著策略改善,干預量會減少。您可以在
wandb儀表板中監控干預率。

展示人類干預如何隨時間推移協助引導策略學習的範例。
- 圖表顯示了回合獎勵相對於互動步驟的曲線。它展示了人類干預對策略學習的影響。
- 橘色曲線是沒有任何人類干預的實驗,而粉紅色與藍色曲線則是有人類干預的實驗。
- 我們可以觀察到,在有人類干預的情況下,策略開始達到最大獎勵的步驟數減少了四分之一。
監控與偵錯
若您在配置中將 wandb.enable 設定為 true,您可以透過 Weights & Biases 儀表板即時監控訓練進度。
人類干預指南
學習過程對干預策略非常敏感。需要幾次執行才能了解如何有效地進行干預。一些提示與建議:
- 在訓練開始時,允許策略進行幾次回合的探索。
- 避免長時間的干預。嘗試在機器人行為偏離軌道時,進行適時的干預以進行修正。
- 一旦策略開始達成任務(即使還不完美),您就可以將干預限制在簡單的快速動作上,例如簡單的抓取指令。
理想的行為是您的干預率應在訓練期間逐漸下降,如下圖所示。

拾取並舉起方塊任務訓練執行期間的干預率圖表
需要調整的關鍵超參數
某些配置值對訓練穩定性與速度有極大影響:
temperature_init(policy.temperature_init) – SAC 中的初始熵溫度。較高的值鼓勵更多探索;較低的值使策略在早期更具確定性。一個好的起點是1e-2。我們觀察到設定過高會導致人類干預無效,並減慢學習速度。policy_parameters_push_frequency(policy.actor_learner_config.policy_parameters_push_frequency) – 從學習者向執行者推送權重的間隔(以「秒」為單位)。預設值為4 s。降低至 1-2 s 可提供更新鮮的權重(代價是更多的網路流量);僅在您的連線速度較慢時才增加此值,因為這會降低樣本效率。storage_device(policy.storage_device) – 學習者存放策略參數的裝置。如果您有額外的 GPU 記憶體,請將此設定為"cuda"(而非預設的"cpu")。將權重保留在 GPU 上可消除 CPU→GPU 傳輸的開銷,並能顯著提高每秒學習者更新的次數。
恭喜 🎉,您已經完成了本教學!
如果您有任何問題或需要協助,請在 Discord 上聯繫我們。
論文引用
@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}
}