LeRobot 文件
動作表示法
並獲得增強的文件體驗
開始使用
動作表示 (Action Representations)
本指南說明了在 LeRobot 中表示機器人動作的不同方式、它們之間的關聯,以及何時該使用哪種表示法。
關節空間 (Joint Space) 與末端執行器空間 (End-Effector Space)
在討論動作表示之前,先了解動作所處的兩種座標空間會很有幫助。
關節空間 (Joint Space)
關節空間動作直接指定每個馬達的目標位置。對於配有夾爪的 6-DOF 機械手臂,關節空間動作可能看起來像這樣
action = [shoulder_pan: 45.0, shoulder_lift: -20.0, elbow: -30.0, wrist_pitch: 10.0, wrist_roll: 0.0, wrist_yaw: 5.0, gripper: 0.8]關節空間是 LeRobot 中的預設設定。它很簡單,不需要運動學模型,且直接對應到馬達指令。大多數入門級配置 (SO-100, Koch) 都使用關節空間動作。
末端執行器 (EE) 空間
末端執行器空間動作在笛卡爾座標系中指定機器人工具尖端(夾爪)的所需位置與方位。
action = [x: 0.25, y: -0.10, z: 0.15, wx: 0.0, wy: 0.0, wz: 0.1, gripper: 0.8]對於像「拾取與放置」(pick-and-place) 這類任務,EE 空間更為直觀,因為它直接描述了夾爪應該去哪裡,但它需要一個運動學模型 (URDF) 來在 EE 位姿與關節角度之間進行轉換。
空間之間的轉換
LeRobot 提供了處理器步驟,利用正向與逆向運動學在關節空間與 EE 空間之間進行轉換。這些步驟建立在 `RobotKinematics` 之上,該類別會載入您機器人的 URDF 模型。
from lerobot.model.kinematics import RobotKinematics
from lerobot.robots.so_follower.robot_kinematic_processor import (
ForwardKinematicsJointsToEE,
InverseKinematicsEEToJoints,
)
kinematics = RobotKinematics(
urdf_path="./SO101/so101_new_calib.urdf",
target_frame_name="gripper_frame_link",
joint_names=["shoulder", "elbow", "wrist_pitch", "wrist_roll", "wrist_yaw"],
)
# Joints → EE (for observations: "where is my gripper?")
fk_step = ForwardKinematicsJointsToEE(kinematics=kinematics, motor_names=[...])
# EE → Joints (for actions: "move my gripper here")
ik_step = InverseKinematicsEEToJoints(kinematics=kinematics, motor_names=[...])請參閱 examples/so100_to_so100_EE/ 以取得關於在 SO-100 機械手臂上使用 EE 空間動作進行錄製、重播與評估的完整運作範例。
絕對、相對與增量動作
無論您是在關節空間還是 EE 空間工作,動作值都可以用三種不同的方式表示。術語採用 UMI (Chi 等人, 2024) 的定義。
絕對動作 (LeRobot 預設)
每個動作直接指定目標位置。
範例 (關節空間,包含 4 個動作的片段)
current_state = [45.0, -30.0, 10.0]
action_chunk = [
[46.0, -29.0, 11.0], # go to 46, -29, 11
[47.5, -27.0, 12.0], # go to 47.5, -27, 12
[49.0, -25.0, 13.5], # go to 49, -25, 13.5
[50.0, -24.0, 15.0], # go to 50, -24, 15
]每個數值都是機器人座標系中的目標位置。簡單直接,但需要一致的全域座標系。這是 LeRobot 中的預設值。
相對動作 (OpenPI / pi0 使用)
片段中的每個動作都是相對於預測瞬間當前狀態的偏移量。片段中的所有動作共享同一個參考點。
current_state = [45.0, -30.0, 10.0]
relative_chunk = [
[1.0, 1.0, 1.0], # +1 from current → target 46, -29, 11
[2.5, 3.0, 2.0], # +2.5 from current → target 47.5, -27, 12
[4.0, 5.0, 3.5], # +4 from current → target 49, -25, 13.5
[5.0, 6.0, 5.0], # +5 from current → target 50, -24, 15
]轉換很直觀:相對值 = 絕對值 - 當前狀態。若要還原為絕對值:絕對值 = 相對值 + 當前狀態。
為什麼使用相對動作? 模型學習預測以零為中心的偏移量,這更容易正規化並帶來更穩定的訓練。由於每個片段都參考相同的當前狀態,因此不會在片段之間累積錯誤。
增量動作 (順序差異)
每個動作都是相對於上一個動作(或第一步時相對於當前狀態)的偏移量。
current_state = [45.0, -30.0, 10.0]
delta_chunk = [
[1.0, 1.0, 1.0], # current → 46, -29, 11
[1.5, 2.0, 1.0], # previous action → 47.5, -27, 12
[1.5, 2.0, 1.5], # previous action → 49, -25, 13.5
[1.0, 1.0, 1.5], # previous action → 50, -24, 15
]這裡的每一步都是相對於前一步的。若要恢復絕對位置,您必須累加所有之前的增量,這意味著錯誤會隨著時間累積。UMI 基於此原因明確反對這種表示法。
視覺比較
下圖(根據 UMI, Chi 等人, 2024 中的圖表)說明了關鍵差異。使用相對軌跡時,片段中的每個動作都指向同一個原點(當前狀態),因此新的推論步驟會乾淨地重設參考點。使用增量時,每個動作都取決於上一個動作,因此錯誤會累積。絕對動作則需要一致的全域座標系。
在 LeRobot 中使用相對動作
LeRobot 提供了 `RelativeActionsProcessorStep`,用於在處理器管線中進行絕對與相對動作之間的轉換。這就是 pi0, pi0.5 與 pi0_fast 支援相對動作的方式。
注意: 所有 pi 模型 (pi0, pi0.5, pi0_fast) 都會在正規化之前應用相對轉換 (
相對 → 正規化),因此正規化器看到的總是增量(相對)值。這意味著在使用use_relative_actions=true進行訓練時,所有這些模型都需要相對動作統計數據。在 pi0_fast 中,`RelativeActionsProcessorStep` 僅修改動作 — 狀態觀察保持不變 — 因此 `NormalizerProcessorStep` 仍然在狀態標記器 (state tokenizer) 之前執行,且標記器如預期持續接收正規化後的狀態。
運作方式
在訓練(預處理)期間,動作會在模型看到之前從絕對轉為相對。
raw absolute action → RelativeActionsProcessorStep → normalize → model在推論(後處理)期間,模型預測會在傳送給機器人之前轉回絕對值。
model output → unnormalize → AbsoluteActionsProcessorStep → robot`AbsoluteActionsProcessorStep` 會從其成對的 `RelativeActionsProcessorStep` 讀取已快取的當前狀態,因此兩者必須連接起來(由策略工廠自動處理)。
為 pi 系列 (pi0, pi0.5, pi0_fast) 啟用相對動作
第 1 步:為您的資料集預先計算相對動作統計數據。
lerobot-edit-dataset \
--repo_id your_dataset \
--operation.type recompute_stats \
--operation.relative_action true \
--operation.chunk_size 50 \
--operation.relative_exclude_joints "['gripper']"第 2 步:在啟用相對動作的情況下進行訓練。
lerobot-train \
--dataset.repo_id=your_dataset \
--policy.type=pi0 \
--policy.use_relative_actions=true \
--policy.relative_exclude_joints='["gripper"]'`relative_exclude_joints` 參數指定了應保留在絕對空間中的關節。例如,夾爪指令通常是二元的(打開/關閉),並且不會從相對編碼中獲益。
將相對動作與 RTC 結合
RTC 以高頻率執行策略推論,並在動作預測出來時立即將其傳送給機器人,而不是等待完整的片段。相對動作與 RTC 完全相容:因為在相對模式下的每個片段都參考相同的當前狀態(在推論開始時擷取),所以即使機器人已經移動,片段中預測的每個動作仍然是一個有效的偏移量。無需特殊處理 — `RelativeActionsProcessorStep` 會在每次推論呼叫時快取一次狀態,而 `AbsoluteActionsProcessorStep` 則將其應用於串流輸出的每個動作。
將相對動作與 EE 空間結合
相對動作適用於關節空間與 EE 空間。例如,如果您的資料集儲存的是 EE 動作,相對編碼會將它們轉換為相對於當前 EE 位姿的偏移量。
current_ee_state = [x: 0.25, y: -0.10, z: 0.15, gripper: 0.8]
absolute_ee_chunk = [
[0.26, -0.09, 0.16, 0.8],
[0.28, -0.07, 0.18, 0.8],
]
relative_ee_chunk = [
[0.01, 0.01, 0.01, 0.0], # offset from current EE pose
[0.03, 0.03, 0.03, 0.0], # offset from current EE pose
]處理管線總結
以下是不同處理器的組成方式。每個箭頭代表一個處理器步驟,它們可以在 `RobotProcessorPipeline` 或 `PolicyProcessorPipeline` 中串聯。
┌─────────────────────────────────────────┐
Action Space │ Joint Space ←──IK──→ EE Space │
│ ForwardKinematicsJointsToEE │
│ InverseKinematicsEEToJoints │
└─────────────────────────────────────────┘
┌─────────────────────────────────────────┐
Representation │ Absolute ←────→ Relative │
│ RelativeActionsProcessorStep (pre) │
│ AbsoluteActionsProcessorStep (post) │
└─────────────────────────────────────────┘
┌─────────────────────────────────────────┐
Normalization │ Raw ←────→ Normalized │
│ NormalizerProcessorStep (pre) │
│ UnnormalizerProcessorStep (post) │
└─────────────────────────────────────────┘典型的訓練預處理管線可能是:原始絕對關節動作 → 相對 → 正規化。典型的推論後處理管線:反正規化 → 絕對 → (選擇性 IK 到關節)。
參考資料
- 通用操作介面 (UMI) - Chi 等人, 2024。定義了相對軌跡動作表示法,並將其與絕對動作和增量動作進行比較。
- 處理器簡介 - 處理器管線在 LeRobot 中是如何運作的。
examples/so100_to_so100_EE/- 使用 EE 空間動作進行錄製與評估的完整範例。