アーム作業領域 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 D435i / D405
- Orbbec Gemini 2 / Gemini 336
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 を維持。
Orbbec Gemini 2 は同期 RGB と深度ストリームを提供する高性能 RGB-D カメラ。Gemini 336 は反射の強い・暗い室内で深度品質が向上しています。
1. カメラブランチへ切り替え:
git checkout DepthCameraSupport
git pull origin DepthCameraSupport
2. Orbbec エクストラをインストール:
pip install -e ".[orbbec]"
3. 権限と USBFS キャッシュ(デフォルトの 16MB は深度ストリームに不足):
chmod a+rw /dev/bus/usb/*/*
cat /sys/module/usbcore/parameters/usbfs_memory_mb # 確認
sudo sh -c 'echo 128> /sys/module/usbcore/parameters/usbfs_memory_mb' # 128MB へ引き上げ
4. カメラ検出とシリアル番号の控え:
lerobot-find-cameras orbbec
5. 例: 1 台の Orbbec カラー + 深度ペアでテレオペレーション:
lerobot-teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm \
--robot.cameras='{
orbbec_color: {
type: orbbec_color,
serial_number_or_name: "CP9JA530003A",
width: 640, height: 480, fps: 30,
color_mode: rgb, rotation: 0, warmup_s: 1
},
orbbec_depth: {
type: orbbec_depth,
serial_number_or_name: "CP9JA530003A",
width: 640, height: 400, fps: 30,
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
1 台の Orbbec は 3 つの連続する /dev/video 番号を占有します。通常の USB カメラと混在させる場合は、Orbbec を先に、通常カメラを後に挿して番号を後ろに寄せてください。フレームタイムアウト(Timed out waiting for frame ...)時はカメラを挿し直してください。
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_s | 1 Episode の長さ(秒) | 60 |
--dataset.reset_time_s | Episode 後の環境リセット時間(秒) | 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 を十分大きく設定し、必要以上に途中で止めない — データセット統計量(平均・分散)は採集完了後に計算され、訓練に必要です。