はじめに
こんにちは.LeRobotの6軸アームが流行して結構な時間が経ちましたね.僕の周りでもかなりの人がアームをお迎えしている様子を見かけます.2025年7月上旬現在,リポジトリが公開された直後とは各種コマンドやパラメータの構成が大きく刷新されました.
まとめ/紹介記事の多くはこの公開直後に書かれたもので,最新の各種操作を解説している日本語記事が(あまり)見当たらなかったので,本項では環境構築〜SmolVLAの転移学習までのコマンドを備忘録として残します.
環境構築
lerobotのインストール
最新情報および詳細は公式READMEを参照ください.以下,コマンドの抜粋と転記です.
リポジトリのクローンと依存関係のインストール
git clone https://github.com/huggingface/lerobot.git
cd lerobot
conda create -y -n lerobot python=3.10
conda activate lerobot
conda install ffmpeg=7.1.1 -c conda-forge
pip install -e .
僕の手元(M3 MacBook ProおよびUbuntu 24.04 with RTX4060)ではffmpegをバージョン指定のコマンドでインストールする必要がありました.
SO-101関連パッケージのインストール
前節の続きとして以下を実行します.
pip install -e ".[feetech]"
SmolVLAのインストール
前節の続きとして以下を実行します.
pip install -e ".[smolvla]"
SO-101のキャリブレーション
以下のコマンドでキャリブレーションを行えます.ただし,--robot.port
はお手元の環境の値に読み替えてください.また--robot.id
は適当な値に変更可能なはずです.
フォロワーアーム
python -m lerobot.calibrate \
--robot.type=so101_follower \
--robot.port=/dev/tty.usbmodem5A460824801 \
--robot.id=my_so101_follower
詳細なキャリブレーション手順およびパラメータ等は以下を参照してください.
https://huggingface.co/docs/lerobot/so101#calibration-video
リーダーアーム
python -m lerobot.calibrate \
--teleop.type=so101_leader \
--teleop.port=/dev/tty.usbmodem5A460814251 \
--teleop.id=my_so101_leader
詳細はフォロワーと同じページを参照してください.
動作確認(遠隔操縦)
キャリブレーションが完了したら,以下のコマンドを実行して遠隔操縦(teleoperation, テレオペ)を試してみます.portなどは適宜読み替えてください.
python -m lerobot.teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/tty.usbmodem5A460824801 \
--robot.id=my_so101_follower \
--teleop.type=so101_leader \
--teleop.port=/dev/tty.usbmodem5A460814251 \
--teleop.id=my_so101_leader
以下のようなログが出て,フォロワーアームがリーダーアームの動きに追従すればOKです.
(lerobot) yutaro.kimura@N01361158 lerobot % python -m lerobot.teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/tty.usbmodem5A460824801 \
--robot.id=my_so101_follower \
--teleop.type=so101_leader \
--teleop.port=/dev/tty.usbmodem5A460814251 \
--teleop.id=my_so101_leader
---------------------------
NAME | NORM
shoulder_pan.pos | -2.23
shoulder_lift.pos | -98.93
elbow_flex.pos | 98.47
wrist_flex.pos | 75.96
wrist_roll.pos | 54.49
gripper.pos | 4.34
time: 16.67ms (60 Hz)
データセットの記録
各種モデルを転移学習する際に利用する自前データセットの記録方法です.portやidは適宜読み替えてください.{HF_USER}
の箇所は,HuggingFace CLIをインストール済み & 各種環境変数を設定済みの想定で書かれています.まだの方は適宜インストールしてください.
python -m lerobot.record \
--robot.type=so101_follower \
--robot.port=/dev/tty.usbmodem5A460824801 \
--robot.id=my_so101_follower \
--robot.cameras="{ wrist: {type: opencv, index_or_path: 0, width: 1280, height: 720, fps: 30}}" \
--teleop.type=so101_leader \
--teleop.port=/dev/tty.usbmodem5A460814251 \
--teleop.id=my_so101_leader \
--display_data=true \
--dataset.repo_id=${HF_USER}/so101_pp_blue_box \
--dataset.num_episodes=2 \
--dataset.single_task="Pick and place the blue box" \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=5 \
--dataset.push_to_hub=true
詳細は以下を参照してください.
公式サンプル: https://huggingface.co/docs/lerobot/getting_started_real_world_robot#record-a-dataset
また,同じデータセットへ継ぎ足し記録したいときは --resume=true
を用います.新規作成データセットでresumeを入れているとエラーになるので,継ぎ足しのときだけ使います.
python -m lerobot.record \
--robot.type=so101_follower \
--robot.port=/dev/tty.usbmodem5A460824801 \
--robot.id=my_so101_follower \
--robot.cameras="{ wrist: {type: opencv, index_or_path: 0, width: 1280, height: 720, fps: 30}}" \
--teleop.type=so101_leader \
--teleop.port=/dev/tty.usbmodem5A460814251 \
--teleop.id=my_so101_leader \
--display_data=true \
--dataset.repo_id=${HF_USER}/so101_pp_blue_box \
--dataset.num_episodes=2 \
--dataset.single_task="Pick and place the blue box" \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=5 \
--dataset.push_to_hub=true \
--resume=true
SmolVLAの転移学習
上の${HF_USER}/so101_pp_blue_box
にアップロードしたデータセットを使ってSmolVLAを転移学習する場合は以下のようにします.各パラメータの調整に関しては公式情報や別記事を参照ください.
python src/lerobot/scripts/train.py \
--policy.path=lerobot/smolvla_base \
--dataset.repo_id=${HF_USER}/so101_pp_blue_box \
--policy.repo_id=${HF_USER}/so101_pp_blue_box_policy \
--batch_size=64 \
--steps=200000
実機デプロイ
上で学習した ${HF_USER}/so101_pp_blue_box_policy
のポリシーを利用する場合は次のようにします(まだ手元で学習済み重みが期待通りに動いてくれていないので,このコマンドが間違っている可能性もあります...).
python -m lerobot.record \
--robot.type=so101_follower \
--robot.port=/dev/tty.usbmodem5A460824801 \
--robot.id=my_so101_follower \
--robot.cameras="{ writ: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" \
--dataset.single_task="Pick and place the blue box" \
--dataset.repo_id=${HF_USER}/eval_so101_pp_blue_box_test \
--policy.path=${HF_USER}/so101_pp_blue_box_policy \
--dataset.num_episodes=10
おわりに
いかがでしたか?どなたかの参考になれば嬉しいです.
それでは.
主な参考サイト
- LeRobot公式GitHub: https://github.com/huggingface/lerobot
- SO-101公式HuggingFace: https://huggingface.co/docs/lerobot/so101