LeRobot 文件

動作表示法

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

動作表示 (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 中的圖表)說明了關鍵差異。使用相對軌跡時,片段中的每個動作都指向同一個原點(當前狀態),因此新的推論步驟會乾淨地重設參考點。使用增量時,每個動作都取決於上一個動作,因此錯誤會累積。絕對動作則需要一致的全域座標系。

Relative Trajectory as Action Representation (UMI, Chi et al., 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 到關節)

參考資料

在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.