はじめに
フィジカルAIを手軽に学習したい時、ロボットアームは有力な選択肢の一つです。今回はLeRobot SO-101 [参考1,2] というロボットアームの組立てから模倣学習までについて、既存の記事や生成AIのサポートを前提に情報を整理します(2026/8時点)。概要は以下の通りです。
| 項目 | 概要 | 対応する章 |
|---|---|---|
| ① 環境構築 | AIによる質の高い学習を目指し安定的な環境を構築します。 | |
| ② 操作データ作成 | 人がリーダーアームを操作すると、フォロワーアームは同じ動きをします(遠隔操作、テレオペレーション)。その様子をカメラで撮影し操作データとします。 | |
| ③ AIモデル構築 | 操作データを学習し、人の操作を再現させます(模倣学習)。 |
費用と作業時間
SO-101は、テーブル1つ分の作業スペースがあれば、手軽にロボットアームの組立てからAIの学習・推論までを体験できるキットです。必要な費用と作業時間の目安は以下の通りです。
費用と作業時間(目安)
| 項目 | 費用 | 作業時間(目安)1 | できること |
|---|---|---|---|
| ロボットアーム組立てのみ | 約6万円2 | 8時間 |
|
| 組立てからAIの学習・推論まで(本記事で扱う全工程) | 約7.5万円3 | 16時間 |
|
開発環境
- MacBook Pro (M1,2020,メモリ16G)
- ロボットアーム本体 (5.75万円)
- 周辺機器4 (0.87万円)
- 環境(box)作成 (0.63万円)
- Lerobotバージョン: 0.6.0
- Azure VM (0.1万円): Standard_NC8as_T4_v3
ロボットアームの組立て
基本的には参考リンク[参考8-10]を元に作業を進められます。作業効率化の観点で事前に知れれば良かったと個人的に感じた情報を以下に整理します。
-
ネジ穴について
市販の3Dプリントパーツの中には、ネジ穴が小さいため指定のネジが通らないことがありました。大きめのドライバーを使ってネジ穴を広げることで対応しました。

-
ケーブルについて
モーターにはケーブル接続のための穴が2つ空いていますが、左右で役割の違いはありません。モーターに繋いだケーブルをとりたい場合、小さなマイナスドライバーを隅に差し込んで傷つけないようにテコで徐々にとりだすと取り出せます。モーターが誤ってハマってしまった場合なども同様に対応しました。

-
ネジについて
モーターの箱の中に数種類のネジが入っています。先の尖った細いネジと先が平坦なネジ以外は組立てに使用しないです(別の小さい袋に入っているネジは基盤固定用です)。
環境(Box)作り
参考リンク[参考11]を元に作成しました。Boxを作ることで学習環境の安定性の向上と、学習データに個人情報が映り込むリスクの低下が期待できます。購入したボードからカッターを使って指定の大きさになるように切り出してガムテープで固定しました。リンク先で言及のあるオブジェクトを置くための黒マットは今回購入していませんが、高さ調節と床部分の緩衝材として必要と感じました。箱側面のカメラは当初スマホを使おうと考えていたのですが、取り回しが悪かったためウェブカメラを購入しました。複数の視点で状況をデータ化した方がAIの学習がうまくいきやすいため、カメラはウェブカメラとリストカメラの2台用いました。
初期設定
初期設定として、キャリブレーションとカメラ設定を行います。
キャリブレーション
初回はモーターのID設定と駆動範囲を決めるキャリブレーションを行います。リンク先[参考12]を元に進められます。
- ID設定について
上から(持ち手やハサミの部分から)順に設定します。ID設定前にケーブルを繋ぎ切ってしまうと一度外すことになります。
カメラ設定
リンク先[参考13]を参考に進めました。今回の検証において、2台のカメラ設定は同じでうまくいきました。
-
カメラの認識確認コマンド
lerobot_find_cameras.pyがどこにあるかは事前確認が必要でした。
python lerobot/src/lerobot/scripts/lerobot_find_cameras.py opencv
-
カメラの動作確認コマンド
2台カメラでは同期がカクついたため、解像度を640*480にしています。
lerobot-teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/tty.usbmodem*** \
--teleop.type=so101_leader \
--teleop.port=/dev/tty.usbmodem*** \
--robot.cameras='{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 1, width: 640, height: 480, fps: 30} }' \
--display_data=true
遠隔操作(テレオペレーション)
参考リンク[参考9]を元に以下のコードで実施しました。初期設定がうまくいっていない場合には、思っているように操作できないので、やり直す必要があります。
lerobot-teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/tty.usbmodem*** \
--teleop.type=so101_leader \
--teleop.port=/dev/tty.usbmodem***
データ作成
参考リンク[参考14]を元に以下のコードで実施しました。今回は消しゴムへのつまみ動作(Pinch Grasp、指定位置に動かすタスク)のデータを取得しました。
# TOKEN設定(hugging face hubのサイト上で発行されるトークンを設定)
export HUGGINGFACE_TOKEN="hf_***"
# hugging face hubにログイン
hf auth login --token "${HUGGINGFACE_TOKEN}" --add-to-git-credential
# ユーザー名設定
HF_USER="***"
# 現在のログイン状態確認
hf auth whoami
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/tty.usbmodem*** \
--robot.cameras='{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 1, width: 640, height: 480, fps: 30} }' \
--teleop.type=so101_leader \
--teleop.port=/dev/tty.usbmodem*** \
--display_data=true \
--dataset.repo_id=***/record-test \
--dataset.root=./record-test-v1 \
--dataset.single_task="Grab the eraser" \
--resume=true \
--dataset.num_episodes=30 \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=10
モデル作成(模倣学習)
ここでは、Action Chunking Transformer(ACT)[参考15] というAIモデルで学習させることを目標とします。Azure上で学習させる流れを以下に記載します。各ステップについては生成AIのサポートを受けながらその通り対応すれば問題なく進められます。モデルをhugging face hub上に保存することで、ローカルで推論する際にダウンロードしなくてもよくなります。パラメータについてはリンク先 [参考16] を参考にしました。
- GPU関連の初期設定:nvidia-smiコマンドが動作するまで
- ローカルと同じlerobotの環境構築
- hugging face へのログイン
- 訓練(以下のコード、数時間程度の計算時間)
RUN=act_record_test_smoke
lerobot-train \
--dataset.repo_id=***/record-test \
--policy.type=act \
--output_dir="outputs/train/${RUN}" \
--job_name="${RUN}" \
--policy.device=cuda \
--policy.repo_id="***/${RUN}" \
--policy.private=true \
--policy.push_to_hub=true \
--wandb.enable=false \
--steps=20000 \
--batch_size=8 \
--num_workers=4 \
--save_freq=2000 \
モデル推論(mac上)
以下のコマンドで推論させました。
lerobot-rollout \
--strategy.type=base \
--policy.path=***/act_record_test_v1 \
--policy.device=mps \
--robot.type=so101_follower \
--robot.port=/dev/tty.usbmodem*** \
--robot.cameras='{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 1, width: 640, height: 480, fps: 30} }' \
--display_data=true \
--task="Grab the eraser" \
--duration=30
Tips
期待通りに動作しない場合、以下のコードで学習データをロボットアームが再現してくれるので、それを参考にテスト環境を学習データに近づけて動作確認するとうまくいくことがあります。ただし、この方法でうまくいった場合、過学習の可能性があるので、データを多くするなどの対応が必要かもしれません。
lerobot-replay \
--robot.type=so101_follower \
--robot.port=/dev/tty.usbmodem/*** \
--dataset.repo_id=***/record-test \
--dataset.episode=0
感想
当初フィジカルAIというワードからAI開発のイメージも持ちつつ取り組んでいましたが、今回の記事の範囲では、AIモデルについて試行錯誤するというよりも安定的な環境作りや質の高いデータ作成の方がより中心的なタスクであると感じました。そして、今回の記事の内容はフィジカルAIの初歩の初歩かもしれませんが、それでもロボットを安定的かつ意図通りに動かそうとすると相当コストがかかる印象を受けました。従来のロボティクス技術ではカバーしきれない領域かつフィジカルAIが精度よく対応でき、かつコストに見合った価値がある領域が現状狭いとすると、ロボットに何をさせるかが重要です。
生成AIと同様にフィジカルAIも目覚ましい発展を遂げることが見込まれている領域ですので、引き続きウォッチしていきたいと思います。
改善点やご質問などあれば、コメントよろしくお願いいたします。
参考
- https://akizukidenshi.com/catalog/g/g131228/
- https://akizukidenshi.com/catalog/g/g131222/
- https://emeet.co.jp/products/webcam-c960
- https://www.inno-maker.com/product/u20cam-1080p/
- https://www.elecom.co.jp/products/U3H-T410SBK.html
- https://www.yodobashi.com/product-detail/100000001008716428/
- https://www.yodobashi.com/product-detail/100000001009050042/
- https://zenn.dev/oggata/books/41ce1497ddde6a/viewer/e86bae
- https://qiita.com/tatsuya1970/items/3f04c9c6d21744190f41
- https://note.com/npaka/n/n8424d322ebd4
- https://docs.nvidia.com/learning/physical-ai/sim-to-real-so-101/latest/05-building-workspace.html
- https://note.com/npaka/n/n88bb52573d90
- https://note.com/npaka/n/naf5f1cb6981a
- https://qiita.com/tatsuya1970/items/a1f16128853869127096
- https://arxiv.org/abs/2304.13705
- https://zenn.dev/oggata/books/41ce1497ddde6a/viewer/1aef43




