標準フォーマットが重要な理由

ロボット学習はこれまで、ラボごとに異なるデータ形式を使用してきたため、データセットの共有、異なるロボットからのデータの結合、システム間での事前トレーニングされたポリシーの使用が不可能になってきました。 LeRobot データセット形式は、サポートされているすべてのハードウェアで機能する単一のスキーマを定義することでこの問題を解決します。 SO-100 に記録されたデータセットは、アクション スペースの寸法が一致している限り、変換せずに OpenArm のポリシーをトレーニングするために使用できます。

記録する前に形式を理解しておけば、トレーニング中にデータの構造的な問題が発見されなくなります。 また、デバッグも非常に簡単になります。トレーニングが失敗した場合、最初に調べるのはデータセットです。

データセット構造: 寄木細工 + MP4

各 LeRobot データセットは、次の構造のディレクトリに存在します。

my_dataset/ §── メタ/ │ §── info.json # dataset metadata (robot type, fps, modalities) │ §──tasks.jsonl # task description per episode │ └── stats.safetensors # mean/std for normalization §── データ/ │ └── チャンク-000/ │ §──episode_000000.parquet # joint states + actions, one row per timestep │ §──episode_000001.寄木細工 │ ━─…… └── 動画/ └── チャンク-000/ §── 観察.画像.cam_high/ │ §──episode_000000.mp4 # camera feed, one file per episode │ ━─…… └──観察.画像.cam_wrist/ ━──

Parquet (数値時系列用) と MP4 (ビデオ用) の分割は意図的に行われています。 Parquet はジョイントの状態とアクションを効率的に圧縮し、エピソード インデックスによる高速ランダム アクセスをサポートします。 MP4 は、イメージ シーケンス用に設計されたビデオ コーデックを使用し、生のイメージをテンソルとして保存する場合に比べて 10 ~ 30 倍小さいファイルを生成します。

各エピソードの主要なフィールド

分野 説明
観察・状態[た、だ]各タイムステップでのジョイントの位置 (およびオプションで速度)。 D はジョイントの数です (例: SO-100 の場合は 7: 6 ジョイント + 1 グリッパー)。
アクション[た、だ]各タイムステップで指令されるターゲット関節位置。 Observation.state と同じ次元。
タイムスタンプ[た]デフォルトでは 50Hz でのエピソードの開始からの時間 (ステップあたり 0.02 秒)。
エピソードインデックススカラーデータセット内のこのエピソードの整数インデックス。 タイムステップをエピソードにグループ化するためにデータローダーによって使用されます。
フレームインデックス[た]エピソード内のフレーム番号 (0 ~ T-1)。 対応する MP4 のフレーム番号と一致します。
次へ。完了[た]ブール フラグ — エピソードの最後のタイムステップで True。 トレーニング中にエピソードの境界を知らせるために使用されます。
タスクインデックススカラーtask.jsonl にインデックスを付けます。 異なるエピソードが異なる指示に対応するマルチタスク データセットを有効にします。
カメラフィールド: カメラ画像は、Parquet ではなく、MP4 ファイルとして保存されます。 寄木細工には以下が含まれます observation.images.cam_high 生のピクセル データではなく、パス参照 (フレーム インデックス + エピソード インデックス) として。 LeRobot データローダーは、デコードと同期を透過的に処理します。

既存のデータセットをロードして視覚化する

をロードします lerobot-raw/aloha_sim_insertion_scripted HuggingFace Hub からのデータセットを取得し、3 つのエピソードを視覚化します。 このデータセットには、ペグを挿入する両手ロボットのスクリプトによるデモンストレーションが含まれています。これは、適切に構造化されたデータセットがどのようなものかを示す明確な例です。

ソース ~/lerobot-env/bin/activate # Visualize 3 episodes from a public dataset python -m lerobot.scripts.visualize_dataset \ --repo-id lerobot-raw/aloha_sim_insertion_scripted \ --エピソードインデックス 0 1 2 \ --output-dir ~/dataset-viz/ # Open the generated HTML in your browser # File path printed to terminal, e.g. ~/dataset-viz/index.html

ビジュアライザーは、同期された関節状態プロットとともに各エピソードのビデオ再生を含む HTML ページを生成します。 探す:

  • スムーズな関節軌道 — 鋭いスパイクは、録音アーティファクトまたはアームクラッシュを示します
  • 一貫したエピソードの長さ — エピソードの長さが大幅に異なる場合 (例: 50 フレームと 400 フレーム)、一部のデモンストレーションが部分的なモーションまたは中断されたモーションをキャプチャしたことを示すことがよくあります。
  • グリッパーの状態変化 — 最後のジョイント次元は、操作タスクの明確なバイナリ遷移 (開→閉→開) を示す必要があります。
# Inspect the dataset programmatically Lerobot.common.datasets.lerobot_dataset から LeRobotDataset をインポート データセット = LeRobotDataset("lerobot-raw/aloha_sim_insertion_scripted") print(f"エピソード: {dataset.num_episodes}") print(f"総フレーム数: {len(dataset)}") print(f"FPS: {dataset.fps}") print(f"機能: {list(dataset.features.keys())}") # Inspect a single frame フレーム = データセット[0] print(f"状態の形状: {frame['observation.state'].shape}") print(f"アクションの形状: {frame['action'].shape}")
オプション - 参照データセット

SVRC データセット コレクションを探索する

SVRC データセット ライブラリには、LeRobot 形式で厳選されたロボット学習データセットが含まれています。 自分のタスクやハードウェアを記録する前に、それらを参照して、さまざまなタスクやハードウェアがどのようなものかを理解してください。 データセットを参照する →

ユニット 2 が完了したら...

~の 3 つのエピソードを視覚化することに成功しました。 lerobot-raw/aloha_sim_insertion_scripted HTML 出力がブラウザで開きます。 Python でロードされた Parquet ファイル内の観察.state、action、および timestamp フィールドを識別できます。 Parquet と MP4 に保存されているものの違いが理解できました。 ユニット 3 で独自のデータセットを記録する準備ができました。