メインコンテンツまでスキップ
ステージ 3 · 第 12 章 · 実践

12. カメラ設定と LeRobot データ収集

前面と側面カメラの接続と確認、画像とアクションの同期の理解、lerobot-record による最初の LeRobot データセットの録画と、録画中のキーボード操作を習得します。

⚡ コード不要 · 環境構築不要

セットアップをスキップして — reBot Arm と LeRobot を 1 つのアプリから実行

SenseCraft Robotics は、SO-ARM101、reBot Arm 102 + B601-RS および B601-DM 向けの Seeed のノーコードプラットフォームです。アームを接続し、キャリブレーションを行い、デモを収集し、ガイド付きインターフェースから学習と推論を実行できます — Python 環境もターミナルも不要です。

  • ✅ 6 ステップのガイド付きワークフロー
  • ✅ クラウド学習 — ローカル GPU 不要
  • ✅ Windows / macOS クライアント
  • ✅ SO-ARM101 · B601-RS · B601-DM
⚠️
実行前の安全確認

アーム作業領域 1 メートル以内の貴重品と無関係な人を片付けてください。本章の実行前に、アームが確実に固定され、電源とケーブルが正しく接続されていることを確認します。

12.1 単眼カメラ vs. 双眼カメラ構成​

レイアウト

12.1 単眼カメラ vs. 双眼カメラ構成

本コースのデータ収集とモデル訓練には 2 台のカメラ・2 視点が必要です。設置位置による代表的な構成は 2 つ:

レイアウト設置と用途適するシナリオ
グリッパ視点上面カメラを作業台前方上に設置し作業域をカバー。グリッパカメラをグリッパ近くに設置し把持の詳細を観察グリッパと物体の接触を見る精密作業
側面補助上面カメラを作業台前方上に設置。側面カメラを作業台前側に設置し、アーム高さとグリッパ動作を観察把持・搬送・配置系タスク
側面補助カメラレイアウト

本コースは側面補助レイアウト(前面カメラ + 側面カメラ)を使います。第 22 章のノーコードフローも同じ構成です。

12.2 カメラデバイス名の確認​

検出

12.2 カメラデバイス名の確認

カメラのインデックスは再起動や挿し直しで変わることがあります — 主に OS 依存の動作です。録画セッション前に毎回検出しましょう:

lerobot-find-cameras opencv

端末には次のような情報が出ます:

--- Detected Cameras ---
Camera #0:
Name: OpenCV Camera @ 0
Type: OpenCV
Id: 0
Backend api: AVFOUNDATION
Default stream profile:
Width: 1920
Height: 1080
Fps: 15.0
--------------------
(more cameras ...)

各カメラが撮影した画像は outputs/captured_images ディレクトリにあります — 開いてどのインデックスが前面でどちらが側面か確認してください。

ヒント

USB カメラをハブ経由で接続しないでください。直結、できれば USB 3.0 ポートに — 画像伝送帯域を確保できます。

12.3 テレオペレーションでカメラを確認​

プレビュー

12.3 テレオペレーションでカメラを確認

録画前に、カメラ表示を有効にしたテレオペレーションで、両視点がライブで正しくフレーミングされているか確認します:

lerobot-teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: "MJPG"}, side: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30, fourcc: "MJPG"}}" \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_awesome_leader_arm \
--display_data=true

index_or_path の値は lerobot-find-cameras opencv が出力したカメラ ID の末尾数字です。

ヒント

fourcc: "MJPG" は圧縮フレームを要求します。MJPG では 3 台 1920×1080 @ 30FPS に対応します。YUYV は非圧縮 — 利用可能な解像度と fps が下がり、アーム操作がカクつくことがあります。2 台のカメラを同じ USB ハブに接続しないでください。

12.4 オプション:深度カメラ(RealSense / Orbbec)​

オプション

12.4 オプション:深度カメラ(RealSense / Orbbec)

RealSense 深度カメラは RGB-D センシングを提供し、物体認識や近接操作に使えます。推奨は D405(短距離ステレオ深度、動作範囲 7〜50 cm、テーブルトップ操作に最適)と D435i(深度 + RGB + IMU)です。

1. カメラブランチに切り替え — 深度カメラ対応は DepthCameraSupport ブランチにあります:

git checkout DepthCameraSupport
git pull origin DepthCameraSupport
git branch --show-current # 期待値: DepthCameraSupport

2. RealSense エクストラを編集可能モードでインストール:

pip install -e ".[realsense]"

3. 権限付与と検出:

chmod a+rw /dev/bus/usb/*/*
lerobot-find-cameras realsense

4. 例: D435i のカラー + 深度ペアでテレオペレーション(serial_number_or_name は検出結果のシリアル番号):

lerobot-teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm \
--robot.cameras='{
d435i_color: {
type: realsense_d435i_color,
serial_number_or_name: "419522072950",
width: 640, height: 480, fps: 30,
color_mode: rgb, color_stream_format: rgb8,
rotation: 0, warmup_s: 1
},
d435i_depth: {
type: realsense_d435i_depth,
serial_number_or_name: "419522072950",
width: 640, height: 480, fps: 30,
max_depth_m: 2.0, depth_alpha: 0.2,
rotation: 0, warmup_s: 5
}
}' \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_awesome_leader_arm \
--display_data=true

パラメータの要点:depth_alpha は深度画像のスケール(0.2 から開始)。深度カメラ 3 台以上では fps を 15 に下げ推奨。安定性のため 640×480 を維持。

12.5 画像とアクションの同期​

同期

12.5 画像とアクションの同期

録画中、LeRobot はフレームごとに 1 つの制御ループを実行します:

  • 両カメラ(前面・側面)を読む;
  • リーダー関節を読む → アクション;
  • フォロワー関節を読む → 状態;
  • タイムスタンプを打ち 1 行追記。

カメラは自分のペースでフレームを出すため、ループはタイムスタンプで整列します(願望ではなく):データセットの各行は、最新のカメラ画像と同一瞬間の関節データを組み合わせます。だからこそ --dataset.fps はカメラが安定して供給できる範囲を超えてはいけません(640×480 MJPG で 30 fps が安全な選択です)。

12.6 最初のデータセットを録画​

録画

12.6 最初のデータセットを録画

第 11 章のタスク(A から B へのピック&プレース)をローカルに録画します:

lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: "MJPG"}, side: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30, fourcc: "MJPG"}}" \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_awesome_leader_arm \
--display_data=true \
--dataset.repo_id=seeedstudio123/test \
--dataset.num_episodes=5 \
--dataset.single_task="Grab the black cube" \
--dataset.push_to_hub=false \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=30

repo_id は自由に変更できます。push_to_hub=false ならデータセットは ~/.cache/huggingface/lerobot/seeedstudio123/test/ に保存されます。

録画パラメータ​

パラメータ説明デフォルト
--dataset.episode_time_s1 Episode の長さ(秒)60
--dataset.reset_time_sEpisode 後の環境リセット時間(秒)60
--dataset.num_episodes録画する総 Episode 数50

録画中のキーボード操作​

キー動作
→(右矢印)現 Episode を早期終了/リセット。次へ
←(左矢印)現 Episode をキャンセルし撮り直し
ESCセッション即時停止、動画をエンコードしデータセット保存
ヒント

ショートカットが応答しない場合、まず $DISPLAY が設定されているか確認、または pynput をダウングレード:pip install pynput==1.6.8

録画中は次のような統計行が流れます:

INFO ol_robot.py:219 dt:33.34 (30.0hz) dtRlead: 5.06 (197.5hz) dtWfoll: 0.25 (3963.7hz) dtRfoll: 6.22 (160.7hz) dtRlaptop: 32.57 (30.7hz) dtRphone: 33.84 (29.5hz)

dt が 33 ms 付近なら、ループは 30 Hz を維持しています — 健全なセッションです。

チェックポイントと再開​

  • 録画中はチェックポイントが自動作成されます;
  • 中断後に再開するには、同じコマンドに --resume=true を追加;
  • その場合 --dataset.num_episodes は今回録る本数であり総合計ではない — 15 録画済み・目標 50 なら 35 を設定;
  • ゼロからやり直すには、データセットディレクトリを手動で削除します。

Hugging Face Hub への録画(任意)​

HF 設定で書き込み権限トークンを作り、一度ログインします:

huggingface-cli login --token ${HUGGINGFACE_TOKEN} --add-to-git-credential
HF_USER=$(huggingface-cli whoami | head -n 1)

--dataset.repo_id=${HF_USER}/record-test と --dataset.push_to_hub=true にすればデータセットを公開できます。

12.7 良いデータを採るコツ​

品質

12.7 良いデータを採るコツ

  • タスク:第 11 章の十字マークの各点から物体をつかんで B 点へ置く;
  • 規模:50 Episode 以上(各点 10 Episode);
  • 一貫性:
    • カメラは固定;
    • 把持動作を同一に保つ;
    • 操作対象が両カメラ映像に映っていることを確認;
  • 段階的進行:まず確実な把持を完成させてから変化(新位置・手法・カメラ調整)を加える。複雑さを急激に上げない;
  • 環境:カメラの位置・角度・環境光を安定させ、不安定な背景や人が映り込むのを避ける — 採集環境と展開環境の差が大きいとポリシーは失敗しやすくなります。

💡 経験則:カメラ画像だけを見て自分でタスクを遂行できるはずです。あなたにできないなら、モデルにもできません。

開始前に --dataset.num_episodes を十分大きく設定し、必要以上に途中で止めない — データセット統計量(平均・分散)は採集完了後に計算され、訓練に必要です。

Loading Comments...