データ収集

OpenArm はデータネイティブ プラットフォームとして設計されています。 このガイドでは、カメラの配線から LeRobot 形式でのエピソードの録画まで、すべての段階で品質チェックを行います。

録音する前に

録音用のハードウェア接続

データ収集には、基本的なアーム制御よりも多くのハードウェアが必要です。 このセクションでは、LeRobot を起動する前に、何をどこに接続するかについて説明します。

📷

リストカメラ

USB Web カメラまたは Intel RealSense D435i をエンドエフェクター フランジに取り付けます。 USB 3.0 経由で接続すると 30 fps 以上が可能です。 確認する: ls /dev/video*

📖

オーバーヘッド/ワークスペースカメラ

グローバルビューのためにワークスペースの上にあるカメラを修正しました。 テーブルの上約 60 cm に、下に 30 度の角度で取り付けます。 2 番目の USB 3.0 ポート。

🔌

CANバス(アームコントロール)

セットアップからすでに接続されています。 確認する: ip link show can0。 LeRobot を起動する前に、CAN インターフェイスが起動している必要があります。

👤

テロップデバイス

3D SpaceMouse、リーダー アームとしての 2 番目の OpenArm、またはゲームパッド。 2 台の OpenArms を備えたリーダーとフォロワーが最高品質のデモンストレーションを行います。

カメラ同期に関する注意: LeRobot は、ホスト PC レベルですべてのストリームにタイムスタンプを付けます。 マルチカメラ セットアップの場合は、USB 3.0 ハブ (USB 2.0 ハブではない) を使用して、カメラ フレームとジョイント状態の読み取り間の遅延スキューを最小限に抑えます。 目標: ストリーム間のスキューが 5 ミリ秒未満。

録音ワークフロー

ステップバイステップの記録ワークフロー

記録セッションごとに次の手順に従います。 各ステップは最後のステップに基づいて構築されます。ステップを飛ばさないでください。

1

セッション前の安全チェック

作業スペース (半径 1 m) を空け、アームがホームポジションに自由に到達することを確認し、記録前に非常停止をテストします。 見る 安全ページ.

2

CAN インターフェースと ROS2 を起動します。

sudo ip link set up can0
source /opt/ros/humble/setup.bash
source ~/openarm_ws/install/setup.bash
ros2 launch openarm_ros2 openarm.launch.py use_fake_hardware:=false can_interface:=can0
3

腕をホームに戻す

各セッションの前に、原点復帰ルーチンを実行して基準位置を設定します。 アームは、エンドエフェクターに負荷がかからない状態でホームポジションに到達する必要があります。

python3 -m openarm_can.scripts.home --interface can0
4

カメラフィードを確認する

LeRobot を起動する前に、すべてのカメラがストリーミングしていることを確認してください。 LeRobot がカメラを検出しないと、カメラが見つからないとデータセットが自動的に破損します。

# Quick camera check (press Q to exit)
python3 -c "
import cv2
for i in range(4):
    cap = cv2.VideoCapture(i)
    if cap.isOpened():
        print(f'Camera {i}: OK')
    cap.release()
"
5

タスクシーンを設定する

オブジェクトを一貫した開始位置に配置します。 一貫したシーンの初期化は、ポリシーの一般化にとって重要です。 開始時の構成を写真に撮るか、マークを付けます。

6

LeRobot の記録を開始する

source ~/.venvs/openarm/bin/activate
python -m lerobot.scripts.control_robot \
  --robot.type=openarm \
  --control.type=record \
  --control.fps=30 \
  --control.repo_id=your-username/openarm-pick-place-v1 \
  --control.num_episodes=50 \
  --control.single_task="Pick up the red cube and place it in the bin" \
  --control.warmup_time_s=5 \
  --control.reset_time_s=10

LeRobot は各エピソードの前にプロンプ​​トを表示します。 録画を開始する前に、warmup_time_s を使用してテロップの位置を準備します。

7

エピソードを確認して再生する

録画後、データセットを完成させる前に、疑わしいエピソードを再生します。 低品質のエピソードはすぐに削除してください。

python -m lerobot.scripts.visualize_dataset \
  --repo_id=your-username/openarm-pick-place-v1 \
  --episode_index=0
8

HuggingFace ハブにプッシュする

huggingface-cli login
python -m lerobot.scripts.push_dataset_to_hub \
  --repo_id=your-username/openarm-pick-place-v1
データセットの形式

LeRobot データセット形式

LeRobot は、表形式データには Parquet ファイルを、画像ストリームには MP4/PNG ファイルを使用して、データセットを HuggingFace データセット形式で保存します。 各エピソードは、タイムスタンプが付けられた一連の観察とアクションです。

ディレクトリ構造

your-username/openarm-pick-place-v1/
├── meta/
│   ├── info.json          # Dataset metadata, fps, shapes
│   ├── episodes.jsonl     # Per-episode metadata (task, length, outcome)
│   └── stats.json         # Min/max/mean/std for all fields
├── data/
│   └── chunk-000/
│       ├── episode_000000.parquet
│       ├── episode_000001.parquet
│       └── ...
└── videos/
    └── chunk-000/
        ├── observation.images.wrist_cam/
        │   ├── episode_000000.mp4
        │   └── ...
        └── observation.images.overhead_cam/
            └── ...

エピソードデータスキーマ

各エピソードのフィールド Parquet ファイル
観察・状態 float32[8] ラジアン単位のジョイント位置 (8 DOF)
観測速度 float32[8] 関節速度 (rad/s)
観察・努力 float32[8] 関節トルク (Nm)
観察画像* ビデオパス MP4ビデオファイル内のフレームへの参照
アクション float32[8] テロップ デバイスからのターゲット関節位置
タイムスタンプ float64 Unix タイムスタンプ (秒単位)
フレームインデックス int64 エピソード内のフレーム番号
エピソードインデックス int64 データセット内のエピソード番号
次へ。完了 ブール エピソードの最後のフレームでは True
タスクインデックス int64 タスク説明ルックアップテーブルへのインデックス付け

データとしての失敗エピソード

OpenArm は、成功だけでなく、失敗した試行も安全に記録するように設計されています。 失敗の軌跡 (滑り、掴み間違い、衝突、回復の試み) は、堅牢なポリシーの一般化にとって重要な第一級のデータです。 失敗エピソードを自動的に削除しないでください。 代わりに、それらに注釈を付けます。 success エピソード メタデータのフィールドを設定し、トレーニング フレームワークにそれらを使用するかどうかを決定させます。

品質保証

収集されたデータの品質チェックリスト

各記録セッションの後、ハブにプッシュする前に、このチェックリストを実行してください。 低品質のデータは、エピソード数の少なさよりも政策のパフォーマンスに悪影響を及ぼします。

  • 1
    エピソードの長さが一定である 同じタスクのすべてのエピソードは、長さの中央値の ±30% 以内である必要があります。 異常値は通常、オペレーターが一時停止したか、把握を怠ったか、または記録が中断されたことを示します。
  • 2
    カメラフレームの欠落はありません すべてのエピソードに、ストリームごとに予想されるフレーム数があることを確認します。 走る lerobot.scripts.visualize_dataset 3 ~ 5 つのエピソードでビデオの品質を確認します。
  • 3
    ジョイントの位置は安全な範囲内です 確認する observation.state 関節の制限を超えることはありません スペック。 高速スパイクは CAN ドロップアウトまたは制御グリッチを示します。これらのエピソードは削除してください。
  • 4
    タスクシーンがエピソード間でリセットされました 各エピソードは、同じ初期位置にあるオブジェクトから開始する必要があります。 リセットをスキップした場合、ポリシーは一貫性のない初期条件から学習し、一般化が不十分になります。
  • 5
    カメラの取材が完了しました 手首のカメラには、エンドエフェクターと操作されるオブジェクトが常に表示される必要があります。 オーバーヘッド カメラにはワークスペース全体が表示されるはずです。 エピソードの途中でオブジェクトがフレームから外れた場合は、マウントを再調整します。
  • 6
    デモンストレーションのスタイルは一貫している すべてのオペレーターは同じアプローチパスと把握スタイルを使用する必要があります。 混合戦略は政策トレーニングを混乱させます。 タスク バージョンごとに 1 人のオペレーターを使用するか、オペレーターごとにエピソードにラベルを付けます。
  • 7
    データセットの統計は合理的であるように見えます チェック meta/stats.json 録音後。 アクションの平均がゼロに近く (関節制限に引っかかっていない)、アクションの std がエピソード間の変動を示すのに十分な大きさであることを確認します。
  • 8
    成功率は文書化されています 収集中に人間の成功率を記録します。 接触が多いタスクの成功率は 60 ~ 70% が一般的です。 成功率が低い場合は、タスクが難しすぎることを示している可能性があります。 これが高いほど、タスクが簡単すぎて有用なトレーニング信号を提供できないことを意味する可能性があります。
次のステップ

データセットからポリシーをトレーニングする

データセットが品質チェックリストに合格したら、LeRobot を使用して ACT または拡散ポリシーを直接トレーニングできます。

ACTを訓練する

python -m lerobot.scripts.train \
  --policy.type=act \
  --dataset.repo_id=your-username/openarm-pick-place-v1 \
  --policy.chunk_size=100 \
  --training.num_epochs=5000 \
  --output_dir=outputs/act-pick-place

鉄道普及政策

python -m lerobot.scripts.train \
  --policy.type=diffusion \
  --dataset.repo_id=your-username/openarm-pick-place-v1 \
  --training.num_epochs=8000 \
  --output_dir=outputs/diffusion-pick-place

さらに深く進んでください: 全文を読む データ収集パイプラインの概要 Robotics Library では、エピソード構造、データセットのバージョン管理、シムとリアルのアライメント、およびマルチタスク データセットの構成を徹底的に処理します。

データセットの準備はできていますか? トレーニングを開始します。

データセットを HuggingFace にプッシュし、ACT または拡散ポリシーのトレーニングを開始します。