※本記事は継続的に最新情報へアップデートしています。
組み立てが終わったSO-101は、まだ何も知らない。
SO-101にカメラをつなぎ、コマンドを叩き、アームを動かす——それだけでは、AIは育ちません。録り方を間違えれば、20回分の操作ログが「使いにくい教材」になります。カメラに手が映り込んでいれば、AIはアームではなく人間の手の動きを学ぶ。毎回同じ位置に置き続ければ、AIはその座標しか知らない機械になります。
「手本の質が、ロボットの知性を決める。」 Behavior Cloning(模倣学習)の本質はそこにあります。
本記事では、Ubuntu環境の構築からLeRobotのセットアップ、Hugging Face Hubへのログイン、実際の記録コマンドの実行まで、「質の高い手本」を録るための判断基準を軸に、初めての方でも迷わない順番で解説します。
✅ 先に結論
Ubuntu環境を整え、LeRobotの記録コマンドを正しく実行することで、SO-101の行動ログをHugging Face Hub上に保存できます。
- ポイント1:本記事ではUbuntu 22.04 LTSネイティブ環境を強く推奨。USB・カメラ・シリアル通信のトラブルを避ける近道になる
- ポイント2:カメラに「リーダーアームと人間の手」が映り込むと、AIが手の動きを学習してしまい、実機で動かない原因になりやすい
- ポイント3:キューブの位置を毎回意図的にズラして録ることが、汎用性のあるAIをつくるうえで最も重要な工夫になる
このシリーズについて
本記事はSO-101 Physical AI開発「詳細編」の第1回。BCデータ採取を完了させることが、第2回以降のシミュレーター学習へ進むための実践入口だ。
📚 SO-101 Physical AI開発シリーズ(詳細編)
- ▶ 第1回(本記事):Ubuntu環境構築 〜 Behavior Cloningデータ採取
- 第2回:SO-101のSim2Real準備|Isaac SimでURDF変換とゲイン調整
概要編は「SO-101で学ぶPhysical AI|模倣学習からSim2Realまで」をご覧ください。
まずは記事の内容を直感的にとらえよう。
ハードウェア完成後の2つの主要作業
現在のフェーズは「現実世界での観察」から「仮想世界の設計」への移行期。実機でデータを録り、シミュレーターへ渡す2段構えが基本構造だ。
SO-101の組み立てとサーボモーターのキャリブレーションが終了し、実世界を動かすための「ハードウェアの土台」が整いました。ここからやるべき作業は大きく2つです。
作業1:Behavior Cloning(BC)データの収集
まず現実世界でロボットを動かし、AIの手本となる行動ログを記録します。人間が「リーダーアーム」を動かし、それに追従して動く「フォロワーアーム」に特定のタスク(例:キューブを掴んで箱に入れる)を行わせます。この操作時のカメラ映像・関節状態(角度や速度)・グリッパーの開閉・動作タイミングなどを時系列データとして保存します。本記事ではこの作業を詳しく解説します。
作業2:Sim2Real環境への「三つの情報」の翻訳
行動ログが取れたら、それを材料にしてシミュレーター(NVIDIA Isaac Simなど)上に「学習可能な仮想世界」を設計します。必要な情報は以下の三つです。
- 身体情報:SO-101の関節・リンク・可動域・カメラ配置などを仮想空間に再現する
- タスク定義:オブジェクトの初期位置・目標位置・作業台・制限時間などの舞台を設定する
- 成功基準(Ground Truth):「箱に入ったら成功」「机から落ちたら失敗」といった報酬関数(審判)を定義する
この三つの詳細な実装手順は第2回で解説します。まずは本記事でBCデータの採取を完了させましょう。
失敗しないためのUbuntu環境セットアップ
SO-101の実機接続では、USB通信・GPU・シリアル・カメラまわりで詰まりやすい。最初からUbuntu 22.04 LTSネイティブ環境で進めることが、結果的に最短経路になりやすい。
SO-101とNVIDIA Isaac Simを連携させる場合、USBデバイスのパススルーや通信遅延、GPU(CUDA)の挙動トラブルを避けるため、本記事ではUbuntu 22.04 LTS環境(ネイティブ)を強く推奨します。 Windows環境やWSL2でも工夫の余地はありますが、実機接続でのトラブルを減らしたいのであれば、最初からネイティブUbuntuで進める方が現実的です。
手順1:OSとGPUドライバーの準備
NVIDIAのシミュレーション環境や学習を回すため、適切なGPUドライバーとCUDA環境を導入します。なお、本記事の範囲である行動ログの採取自体は、必ずしも高性能GPUを必要としません。ただし、後工程のIsaac Sim / Isaac Labでの学習を見据えて、GPU環境を整えておくことを前提にしています。
# NVIDIA公式推奨ドライバーのインストール sudo ubuntu-drivers install sudo reboot # CUDAのパスを通す(~/.bashrcの末尾に追加) echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrc
手順2:USB・シリアル通信の権限付与(最重要)
アームやカメラを接続した際、一般ユーザー権限のままではアクセス拒否エラー(Permission denied)になります。事前に通信グループへユーザーを追加してください。
# シリアル通信(dialout)権限の付与 sudo usermod -aG dialout $USER # ビデオカメラ(video)権限の付与 sudo usermod -aG video $USER
⚠️ 注意:この設定を反映させるため、コマンド実行後は必ず一度PCを再起動(またはログアウト&再ログイン)してください。
手順3:Python仮想環境の構築とLeRobotの導入
Miniconda等を用いて独立したPython環境を作成し、LeRobotと必要な依存パッケージをインストールします。2026年6月時点のLeRobot公式インストール手順では、Python 3.12環境の作成が案内されています。 3.10系のまま進めると、依存関係の解決やインストール時にエラーになる可能性があります。
# Python 3.12環境の作成とアクティベート conda create -y -n lerobot python=3.12 conda activate lerobot # LeRobotリポジトリのクローンとインストール git clone https://github.com/huggingface/lerobot.git cd lerobot pip install -e "." # SO-101で使うFeetech系サーボへの対応 pip install -e ".[feetech]" # カメラバックエンドを追加・拡張する場合(任意) # extra名称はLeRobotのバージョンにより変わる可能性があるため、最新の公式ドキュメントを確認してください pip install -e ".[opencv,intel]"
行動ログ(データセット)の採取手順
環境が整ったら4ステップで行動ログを採取する。「カメラの画角」と「毎回ズラす配置」の2点が、AIの品質を決定的に左右する。
ステップ1:物理接続とカメラの配置
リーダーアームとフォロワーアームをそれぞれPCのUSBポートに接続します。ターミナルを開き、以下のコマンドでポートが認識されているか確認してください。
# シリアルポートの認識確認 ls -l /dev/ttyACM* # または ls -l /dev/ttyUSB*
通常、/dev/ttyACM0 と /dev/ttyACM1 のように2つ認識されます。どちらがリーダーでどちらがフォロワーかは、のちのテストで判別します。
次に、USBカメラを作業スペースに向けて設置します。ここで最も重要な判断となるのがカメラの画角です。
⚠️ これを見落とすと、せっかく録ったデータが学習に使いにくくなる
自動駆動に切り替えた瞬間、アームが全く動かない。こうした症状の原因として多いのが、カメラに人間の手や影が映り込んでいたケースです。AIは「映っているもの」を忠実に学びます。手が映れば、アームではなく手の動きを覚えてしまう。自動駆動時には手がないため、AIは何を見ればよいのか分からなくなります。カメラには「フォロワーアーム」と「操作対象(キューブ等)」だけが映るよう固定してください。リーダーアームと人間の手は、カメラの視野から完全に外します。
ステップ2:Hugging Face Hubへのログインとカメラ確認
採取したデータをクラウドで管理するため、あらかじめ書き込み権限(Write)付きで作成したトークンを使ってログインします。
export HF_TOKEN="ご自身のトークン"
hf auth login --token $HF_TOKEN --add-to-git-credential
# Hugging Faceのユーザー名を取得
HF_USER=$(NO_COLOR=1 hf auth whoami | awk -F': *' 'NR==1 {print $2}')
echo $HF_USER
# カメラのインデックス番号と画角の確認
lerobot-find-cameras opencv
コマンドを実行すると ~/lerobot/outputs/captured_images にテスト撮影された画像が保存されます。アームが綺麗に収まっているか、カメラのインデックス番号(0や1など)が何番になっているかをメモしておいてください。
ステップ3:記録コマンドの実行
以下のコマンド(LeRobot標準のレコードスクリプト)をカスタマイズして実行します。ポート番号やカメラのインデックスはご自身の環境に合わせて書き換えてください。
※ LeRobotのバージョンやインストール方法によって、公式ドキュメントでは lerobot-record 形式と python -m lerobot.record 形式の両方が使われています。本記事では、2026年6月時点の公式 Imitation Learning 手順で示されている lerobot-record 形式を前提に解説します。
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_follower_arm \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_leader_arm \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" \
--display_data=true \
--dataset.repo_id=${HF_USER}/so101-cube-task \
--dataset.single_task="Grab the cube and put it in the box" \
--dataset.num_episodes=20 \
--dataset.episode_time_s=30
💡 引数(パラメーター)の解説:ここだけ書き換えればOK!
--robot.port/--teleop.port:ステップ1で確認したポート(ACM0やACM1)を指定します。動かしてみて「リーダーとフォロワーの挙動が逆」だったら、この2つの記述を入れ替えてください。index_or_path: 0:ステップ2で確認したカメラのインデックス番号を入れます。--dataset.num_episodes=20:何回分の成功データを取るか(エピソード数)です。最初はテスト用に2程度にして動作確認し、本番は20〜50程度を目標にします。--dataset.episode_time_s=30:1回の操作(掴んで箱に入れるまで)の制限時間(秒)です。余裕を持った時間を設定します。
ステップ4:実際の記録ワークフロー(人間の操作手順)
コマンドを実行すると画面に案内(プロンプト)が表示されます。ここからは「人間がロボットに手本を見せる」時間です。
- 開始前の初期配置:フォロワーアームの前にタスクの対象物(キューブ等)を置きます
- エピソードの開始:画面に
Press Enter to start recording...と表示されたらEnterキーを押して録画スタート - 人間による実演(テレオペ):リーダーアームを優しく掴み、「キューブを掴む ➔ 箱に入れる」という一連の動作をスムーズに行います
- エピソードの終了:タスク成功後、制限時間を待つか、画面に表示されるキー(EscapeやEnterなど)を押して記録を終了します
- ★ここが最重要:配置を「ランダムに」変えて繰り返す:次のエピソード開始前に、キューブの初期位置や箱の位置を毎回数センチずつわざとズラして配置してください
💡 なぜ毎回ズラすのか?
毎回全く同じ場所からスタートすると、AIは「その絶対座標に手を伸ばすこと」しか学べず、少しでもズレると対応できない機械になります。あなたは今、二種類のAIをつくる分岐点に立っています。「一箇所しか知らないロボット」か、「どこにあっても掴めるロボット」か。 違いは、キューブをズラすかズラさないか。それだけです。
見た目は同じSO-101でも、この分岐で将来の追加データ収集コストや運用時の手戻りが大きく変わっていきます。
保存とアップロード:指定した回数(例:20回)を繰り返し終えると、記録が自動でストップします。データは自動的に「LeRobotDataset形式」としてローカルに保存され、Hugging Face Hubのリポジトリへ自動でアップロード(プッシュ)されます。
BCデータ採取後の次ステップ:Sim2Realへ渡す三つの情報
行動ログはシミュレーターに「そのまま流し込む」ものではない。身体・タスク・成功基準の三つに変換して初めて、仮想世界での学習が始まる。
無事に行動ログが採取できたら、まずは「LeRobot Dataset Visualizer」などで、アームの関節角度グラフとカメラ映像が完全に同期して記録されているかチェックしましょう。
問題がなければ、次はこのデータをインプット(翻訳の材料)として、シミュレーター(NVIDIA Isaac Sim / Isaac Lab)の仮想空間へ「翻訳」する作業に入ります。翻訳に必要な情報は以下の三つです。
- 身体情報:SO-101のロボット仕様書(URDF)をIsaac Sim語ファイル(USD)に変換し、物理特性(重さ・関節ゲイン)を実機に合わせる
- タスク定義:仮想空間にキューブ・箱・作業台を配置し、BCデータのキューブ位置範囲をもとに初期位置をランダム化する
- 成功基準(報酬関数):「箱に入ったら大ボーナス」「近づくほど小加点」という段階的な採点ルールを定義する
この三つの詳細な実装手順は、シリーズ第2回で解説しています。
まとめ
環境・接続・録り方の3点で「質の高いBCデータ」が決まる。ここをおろそかにすると、どれだけシミュレーターで学習しても実機に戻せない。
Sim2Real(シミュレーションから現実への移行)を進める上で、最も陥りやすい失敗パターンをまとめました。
| 失敗パターン | 原因 | 正しいアプローチ |
|---|---|---|
| 自動駆動時にアームが全く動かない | カメラに人間の手や影が映り込んでいた | フォロワーアームと対象物だけが映る画角に固定する |
| 同じ位置にしか動かせない | 毎回同じ配置で録った | エピソードごとにキューブ・箱の位置を数センチずつズラす |
| Permission deniedでアームに接続できない | dialout/videoグループ未追加、または再起動未実施 | usermod実行後に必ずPCを再起動する |
| BCログをそのままシミュレーターに流し込もうとする | シミュレーターを「再生機」と誤解している | 身体・タスク・成功基準に変換して仮想世界として再定義する |
| ※ Arpable Tech Team 作成(2026年6月) | ||
このように、データ採取時のわずかな確認の怠りが、後工程であるシミュレーター学習での原因不明のエラーへと直結します。だからこそ、採取直後のデータチェックと、先述した三つの基本(環境・画角・ランダム配置)を徹底することが、開発全体のスピードを決定づけるのです。
Behavior Cloningデータの品質は、最終的なロボットの自律動作の精度を直接決定します。
SO-101で録る一つひとつの操作ログは、単なる作業記録ではありません。 それは、あなたの動きをAIの記憶に変える行為です。
「手本の質が、ロボットの知性を決める」——記事の冒頭でそう書きました。小さなチームが、自分たちの動作をAIへの教育に変える。その最初の一歩が、今ここで録ったデータです。
ぜひ手元のSO-101で、AIに「手本を見せる」第一歩を体験してみてください。あなたが動かした一回のアームが、ロボットの最初の記憶になります。
専門用語まとめ
- Behavior Cloning(BC)/模倣学習
- 人間がリーダーアームを操作して見せた「お手本」の映像と関節状態をペアデータとして記録し、AIに「このカメラ映像なら、こう動く」という変換パターンを学習させる手法です。強化学習と異なり、報酬設計や大量の試行錯誤が不要なため、小規模チームでも現実的に導入しやすい一方、お手本の質と量がそのままAIの性能に直結します。本シリーズでは、このBCデータを起点に、Sim2Real学習で条件の多様化と汎化性能の向上を図っていきます。
- テレオペレーション(Teleoperation)
- 人間が「リーダーアーム」を操作し、その動きをリアルタイムで「フォロワーアーム」に伝える遠隔操作のことです。SO-101ではリーダーとフォロワーが1対1で同期します。Behavior Cloningのデータはこのテレオペ操作中に録画・記録されます。
- エピソード(Episode)
- 「キューブを掴んで箱に入れる」という1回のタスク完結単位のことです。
lerobot-recordコマンドでは--dataset.num_episodesで採取する回数を指定します。1エピソードは開始から終了(成功またはタイムアウト)までの時系列データ一式を指します。
- LeRobotDataset形式
- Hugging FaceのLeRobotが定めるロボット学習用データセットの標準フォーマットです。カメラ映像・関節角度・グリッパー状態・タイムスタンプが同期された状態でParquet形式に保存されます。
lerobot-recordコマンドは自動的にこの形式で保存・アップロードします。
- Hugging Face Hub
- 機械学習モデル・データセット・デモアプリを無料でホスティングできるクラウドプラットフォームです。LeRobotで採取した行動ログはここへ自動アップロードされ、チームでの共有や他ユーザーのデータ参照が可能になります。アップロードには書き込み権限付きのアクセストークンが必要です。
参考文献 / 出典
一次情報
- Hugging Face LeRobot – 公式GitHubリポジトリ
- LeRobot Documentation – Hugging Face(lerobot-record コマンド公式マニュアル)
- LeRobot Installation – Hugging Face(Python 3.12環境の公式インストール手順)
- LeRobot SO-101 – Hugging Face(SO-101とFeetech SDKの公式手順)
- NVIDIA Isaac Sim 公式ドキュメント
- NVIDIA Isaac Lab 公式ドキュメント
二次情報
次に読むならこの3本
補足Q&A
Q1. 何エピソード録れば十分ですか?
A1. 動作確認は2〜5エピソード、本番学習には20〜50エピソードが目安です。
エピソード数が少ないほどAIが過学習(特定の動きしかできない状態)になりやすくなります。キューブの位置を毎回ズラして録ることが前提であれば、20エピソードでも汎用性のあるデータになります。まずは2エピソードで動作確認し、問題がなければ本番収録に移るのが効率的です。
Q2. カメラは何台必要ですか?
A2. 最低1台で動作しますが、2台(正面+側面または俯瞰)が推奨です。
1台だと奥行き方向の情報が欠落しやすく、グリッパーとキューブの位置関係をAIが誤認しやすくなります。例えば、「正面:フォロワーアーム全体」「俯瞰:グリッパーとキューブ周辺」の二つを組み合わせると、位置関係の認識精度が安定しやすくなります。lerobot-recordコマンドの--robot.camerasオプションで複数カメラを同時指定できます。追加するカメラにはそれぞれ別のインデックス番号(index_or_path: 1など)を割り当ててください。
Q3. 失敗したエピソード(キューブを落とした等)は含めていいですか?
A3. Behavior Cloningでは原則「成功データのみ」を使います。
BCはお手本の動きをそのまま模倣するため、失敗データを混ぜると「失敗する動き」も学習してしまいます。2026年6月時点のlerobot-recordでは、1エピソードが終わった後に保存するかどうかを対話的に確認するプロンプトが表示されます。失敗したエピソードはその時点で破棄してください。
Q4. Behavior Cloningと強化学習は、どう使い分ければよいですか?
A4. 優劣ではなく、使う場面が違います。
Behavior Cloningは、人間のお手本を短時間で学ばせたい場面に向きます。一方、強化学習はシミュレーション内で大量に試行錯誤させ、汎化性能を高めたい場面に向きます。本シリーズでは、まずBehavior Cloningで実機の基本動作データを作り、その後Sim2Realで多様な条件に対応できるよう拡張していきます。
更新履歴
- 2026年6月13日:FAQ、用語集、GPU環境の補足、カメラバックエンド注記、まとめの締めを公開前チェックに合わせて微調整。
- 2026年6月13日:LeRobot公式インストール手順に合わせてPython 3.12環境へ更新。SO-101向けFeetech SDK、Hugging Face Hub、記録コマンドの注記を整理。
- 2026年6月13日:GSC改善方針に合わせ、冒頭リード、カメラ画角、ランダム配置、BCデータ品質、FAQ、まとめの読後導線を更新。
- 2026年5月26日:初版公開