🪟

Hugging Face LeRobot SO-101をWindowsで動かす実践ガイド

に公開

はじめに

LeRobotはHugging Faceが開発する、オープンソースの実機ロボット学習フレームワークです。模倣学習を中心に強化学習にも対応しており、ハードウェア・データセット・モデル・ツールを一体で提供します。SO-101はそのリーダー/フォロワー構成のロボットアームで、テレオペレーションによるデータ収集から、学習済みポリシーの実機検証まで行うことができます。

公式ドキュメントはLinuxやmacOSを前提としており、Windowsでのセットアップ手順は明記されておらずサポートもされていません。ただし、2025年10月末にリリースされたv0.4.0ではWindowsでの躓きポイントがほとんど解消され、問題なく動作します。

本記事では、SO-101をWindows環境で動かす事に焦点を当て、購入から組み立て時の注意点、さらにv0.4.0でサポートされたNVIDIA Isaac GR00T N1.5のファインチューニングまでを紹介します。

https://huggingface.co/blog/lerobot-release-v040

WSL2を使用せず、Windowsネイティブで進めます。usbipd-winを使ってWSL2にUSBパススルーする方法も試しましたが、USB/IP由来のレイテンシやジッタの影響でキャリブレーション段階から切断が頻発し、実用的ではありませんでした。

※以前のv0.3系を扱うとファイルエンコーディングやパーミッションに関する躓きポイントがあり、少なからず改変が必要でした。

環境構築

本記事の検証マシンのスペックは以下のとおりです。

  • CPU:Ryzen 9 9950X3D
  • メモリ:DDR5-6000 64GB
  • GPU:RTX 4080 VRAM 16GB

ツールのセットアップ

シェルは PowerShell を使用し、Pythonパッケージ管理には uv を使用します。LeRobot内部で使用される動画処理のために FFmpeg も導入します。

# uv
powershell -ExecutionPolicy Bypass -c "irm https://astral.sh/uv/install.ps1 | iex"

# ffmpeg
# FFmpegのメンテナーである *Gyan* 氏が配布しており、`winget` から容易にインストール可能です。
winget install --id=Gyan.FFmpeg -e

依存解決

以下の pyproject.toml を作成し、uv sync を実行します。

[project]
name = "sandbox-so101-win"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
    "lerobot",
    "lerobot[feetech]",
    "opencv-python>=4.12.0.88",
    "torch>=2.7.*, <2.8.0",
]

[tool.uv.sources]
torch = { index = "torch-cu128" }
lerobot = { git = "https://github.com/huggingface/lerobot", branch = "main" }

[[tool.uv.index]]
name = "torch-cu128"
url = "https://download.pytorch.org/whl/cu128"
explicit = true

lerobot は PyPI にも公開されていますが、ここでは公式のGitHubリポジトリを指定しています。開発が活発で更新も頻繁なため、最新の修正を素早く取り込む目的です。Forkして改変したリポジトリを指定するのもよいでしょう。また、インストール時にGIT LFSに関するエラーが出た場合は、$env:UV_GIT_LFS=1 を設定し、uv cache clean でキャッシュを削除してから再度 uv sync を実行してください。

opencv-python は lerobot の依存に opencv-python-headless が含まれているので本来不要ですが、uv経由のインストールだとsite-packages/に cv2が適切に配置されないため、インポートエラーが発生します。そのため、ここではワークアラウンドとして明示追加しています。この問題はWindows関係なくuvだと発生する模様です。※uv pip install opencv-python-headlessだとcv2は適切に入ります

torch はCUDA 12.8対応の公式ホイールインデックス(torch-cu128)を指定しています。CPUのみ、または異なるCUDAバージョンを使用する場合は、該当インデックスを調整するか [[tool.uv.index]] セクションを削除してください。

各種機材の購入

アーム本体

2025年9月中旬に秋月電子で、Proキットと3Dプリントパーツセットを購入しました。モーターのファームウェアはすでに v3.10 に更新済みだったため、追加のアップデート作業は不要でした。
https://akizukidenshi.com/catalog/g/g131228
https://akizukidenshi.com/catalog/g/g131222

リストカメラ、リストカメラ固定マウント

3Dプリントパーツセットには、フォロワーアームに取り付けるリストカメラ用のマウントが含まれていません。以下のSTLデータを利用し、DMMのプリント代行サービスに「タフレジン(素地)」で依頼しました。費用は約2,100円で、発注から17日後に到着しました。

https://github.com/TheRobotStudio/SO-ARM100/tree/main/Optional/SO101_Wrist_Cam_Hex-Nut_Mount_32x32_UVC_Module

このマウントに適合する 32×32mm のUVCカメラモジュールを用意します。私は以下の製品を購入しました。3,000円未満で入手できコストパフォーマンスが高くおすすめです。

https://www.amazon.co.jp/dp/B0CNCSFQC1

カメラの固定に、M3ナット×2、M2ネジ×4、M3ネジ×2 を別途用意してください。

クランプ

アームをデスクに固定するためのクランプは、3Dプリントパーツセットに同梱されていますが、強度的にやや不安が残ります。安定性を高めるため、以下のクランプをAmazonで追加購入しました。2個セット1組の商品を2セット使用しています。

https://www.amazon.co.jp/dp/B00G8PR80G

アームの組み立て

組み立て手順は、公式ドキュメントや有志の動画が多数あるので、詳細な説明は省いて注意点に絞って紹介します。道具はプラスドライバーのほかに、結線用に先の丸いピンセットかラジオペンチがあると便利です。

https://huggingface.co/docs/lerobot/so101

  • モーターのファームウェア更新について
    モーターのファームウェア更新は、Giteeで配布されている .exe ファイルでのみ行えます。
    https://gitee.com/ftservo/fddebug

  • ポートの指定方法
    lerobot-find-port を実行すると、使用中のUSBポートが表示されます。
    WindowsではLinuxの /dev/tty* 形式ではなく、COM5COM6 といった形式で認識されます。
    コマンド指定時は --robot.port=COM5 のように記述してください。

  • モーターIDの割り当て
    公式ドキュメントでは組み立て後にモーターIDを割り当てますが、箱出しして片方のみ接続した状態でID割り当てをおすすめします。組み立て時もスムーズです。コネクタは左右どちらに挿しても動作に影響しません。

  • リストカメラ取り付け時の注意
    フォロワーアームのGripper(爪先)を組み立てる際、リストカメラを取り付ける場合に、内側にM3ナットを入れるのを忘れないでください。

データ収集

赤いペンを掴んで黒い箱に入れるというタスクを題材に、以下の環境でデータ収集を行いました。ペンと箱の位置や向きを少しずつ変えながら、合計 50 エピソードを記録しました。

https://x.com/komi_nation/status/1988918131058716748

コマンド例

# huggingface ログイン
uvx hf auth login
uvx hf auth whoami

$env:HF_USER = "ユーザー名"
$env:MY_DATASET_NAME = "データセット名"

# 撮影
lerobot-record `
  --robot.cameras="{ front: {type: opencv, index_or_path: 1, width: 640, height: 480, fps: 30}, top: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" `
  --robot.type=so101_follower `
  --robot.port=COM6 `
  --robot.id=my_awesome_follower_arm `
  --teleop.type=so101_leader `
  --teleop.port=COM7 `
  --teleop.id=my_awesome_leader_arm `
  --dataset.repo_id=${HF_USER}/${MY_DATASET_NAME} `
  --dataset.root=${MY_DATASET_NAME} `
  --display_data=true `
  --dataset.private=true `
  --dataset.single_task="Grab the red pen and put it in the black box." `
  --dataset.num_episodes=50 `
  --dataset.episode_time_s=20 `
  --dataset.reset_time_s=10 

リストカメラのみでは、ペンや箱、アームの相対位置を十分に把握できず、学習後のロールアウトでほぼ確実に失敗します。そのため、タスク全体を俯瞰できるカメラを追加するのが重要です。私はLogicool製のウェブカメラを追加で使用しています。

また、撮影時のカメラの揺れはできるだけ除去してください。多少のブレは環境ノイズとして汎化に寄与するかもと考えましたが、実際には揺れがある状態のデータだと実機成功率は大きく低下しました。海外の方の紹介動画でも、カメラ固定の剛性確保の重要性が強調されています。

https://www.youtube.com/watch?v=vC7E6ZmXBT8&t=63s

学習 (ACT)

まずは ACT を使用してファインチューニングを行います。

lerobot-train `
  --policy.type=act `
  --dataset.repo_id=$env:HF_USER/$env:MY_DATASET_NAME  `
  --dataset.root="./$env:MY_DATASET_NAME" `
  --output_dir=outputs/train/my_act `
  --job_name=my_act_training `
  --policy.device=cuda `
  --wandb.enable=false `
  --policy.repo_id=my-act-policy-v1 `
  --policy.private=true `
  --steps=20000 `
  --batch_size=16

RTX 4080環境では、上記でおおよそ 1〜2時間程度で完了します。終了すると、outputs/train/my_act配下にチェックポイント一式が保存され、指定した policy.repo_id名でHugging Faceにアップロードされます。

学習 (GR00T N1.5)

次に、NVIDIA Isaac GR00T N1.5 を用いたファインチューニングです。このモデルを利用するには、追加で lerobot[groot]FlashAttention をインストールする必要があります。

uv add "lerobot[groot]"

問題となるのは、FlashAttentionをWindows上で動作させることです。公式のWindows向けwheelは提供されておらず、通常はソースからビルドする必要がありますが、ここでは有志の方が配布しているWindows用の事前ビルド済みwheelを利用させていただきます。

https://github.com/mjun0812/flash-attention-prebuild-wheels/

# ※自分の環境に合ったものをリリースページから選んでください。
# 例: Python 3.12 / torch 2.7 / CUDA 12.8 / flash-attn 2.8.2 を指定
uv add "https://github.com/mjun0812/flash-attention-prebuild-wheels/releases/download/v0.4.10/flash_attn-2.8.2+cu128torch2.7-cp312-cp312-win_amd64.whl"

これでGR00T N1.5のファインチューニングを実行できます。先ほど収集したデータセットをそのまま利用可能です。

lerobot-train `
  --policy.type=groot `
  --dataset.repo_id=$env:HF_USER/$env:MY_DATASET_NAME `
  --dataset.root="./$env:MY_DATASET_NAME" `
  --batch_size=8 `
  --steps=20000 `
  --output_dir=outputs/train/gr00t `
  --job_name=my_groot_training `
  --policy.device=cuda `
  --wandb.enable=false `
  --policy.private=true `
  --policy.repo_id=my-gr00t-policy-v1 `
  --save_freq=10 `
  --log_freq=2 

指定内容はACTとほぼ同様で、主な違いは --policy.type=groot としてGR00Tを選択している点です。RTX 4080(VRAM 16GB)クラスでは、上記コマンドをそのまま実行するとVRAM不足でRAM側にスワップされてしまいます。公式ブログではVRAMは25GB前後が推奨と紹介されており、--policy.tune_diffusion_model=falseの適用で多少は動きますが、基本的にはGoogle ColabやNVIDIA Brevなどの環境で学習を行うことを推奨します。

https://huggingface.co/blog/nvidia/nvidia-isaac-gr00t-in-lerobot

ロールアウト

ファインチューニング済みのGR00T N1.5を SO-101 上でロールアウトした様子です。実際に動かしてみて、ACTは色違いのペンだと難しかったのに対して、GR00T N1.5は色の違うペンでもある程度上手く運べていました。
https://x.com/komi_nation/status/1988916017188188543
https://x.com/komi_nation/status/1988916689874849817

コマンド例

lerobot-record `
  --robot.type=so101_follower `
  --robot.port=COM6 `
  --robot.id=my_awesome_follower_arm `
  --robot.cameras="{ front: {type: opencv, index_or_path: 1, width: 640, height: 480, fps: 30}, top: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" `
  --dataset.single_task="Grab the red pen and put it in the black box." `
  --dataset.episode_time_s=180 `
  --dataset.num_episodes=3 `
  --dataset.reset_time_s=10 `
  --display_data=true `
  --policy.repo_id=$env:HF_USER/my-gr00t-policy-v1 `
  --policy.path=$env:HF_USER/my-gr00t-policy-v1 `
  --dataset.push_to_hub=false `
  --policy.device=cuda `
  --dataset.repo_id=$env:HF_USER/eval_my-gr00t-policy-v1

まとめ

本記事では、LeRobot SO-101をWindowsネイティブで動かす事を軸に解説しました。改めて、公式ドキュメントがLinux/macOS前提である中、v0.4.0 以降であればWindowsでも利用できることをここで共有したいと思います。個人的には「ゲーミング PC だけ持っている」という人でも、遊び始められるのは良いポイントだと感じています。ハードウェアも国内のみで揃えやすくなり、以前に比べてハードルは確実に下がっている印象です。

最後に、性能を左右するのはやはりデータの質と設計だと強く感じられました。カメラの角度・配置、エピソード数、タスクのバリエーションといった設計要素が、そのままポリシーの汎化性能に反映され、撮影環境の剛性確保や視野の確保といった一見地味な要素への投資も、結果として成功率に大きく影響したと実感しています。

今後、NVIDIA Isaac LabでSO-101が利用できるようになるそうなので、3Dシミュレーションによって根気のいるデータ収集をどこまで仮想的に出来るようになるのか注目したいです。

Discussion