
こんにちは!ABEJA に新設されたエンボディドインテリジェンスグループ で PM をしている飯嶌です。 こちらはABEJAアドベントカレンダー2025の24日目の記事です。
昨今、Physical AI への注目が集まっています。しかし、実際に SO-101 などのアームロボットを用いて検証を行おうとすると、組み立ての工数や数万円単位の部材コストが発生し、ハードルが高いと感じられる方も多いのではないでしょうか。
今回は、toio を活用し、低コストかつ手軽に VLA の検証環境を構築できないか挑戦しましたので、その取り組みについてご紹介いたします。
Physical AI 検証における課題
ロボット学習のプロトタイピングにおいて、ハードウェアの用意は最初にして最大の障壁です。高価なロボットアームや複雑な制御システムは、学習コスト以前に導入コストが重くのしかかります。
そこで今回は、以下の特徴を持つ toio Core Cube に着目しました。toio はソニー・インタラクティブエンタテインメントが開発した、遊びながらプログラミング的思考や創造力を学べるロボットトイ/教育向け玩具です。
- 入手性: おもちゃとして市販されており、安価に入手可能
- 制御性: Bluetooth Low Energy (BLE) によるシンプルな制御
- 性能: 高精度なモーターと絶対位置検出機能を内蔵
これを用いて、ロボット学習における Hello World 的な立ち位置の環境構築を目指します。
検証環境と構成
今回は以下の構成を構築しました。

まずは買い物リストです。toio 本体以外は、すでに持っているものも多いかもしれません。下記の金額はあくまでも 2025 年 12 月時点のものですのでご注意ください。
| 項目 | 金額 (税込) | 備考 |
|---|---|---|
| toio コア キューブ | 7,128 円 / 個 | 今回の主役 |
| toio 充電器 | 5,478 円 | 本体の充電 |
| ゲームコントローラー | 2,000 円〜 | なんでもいいです。私は アクラス PS4/PS3/PC 用 シンプルコントローラーターボ Ver.2をヨドバシで購入しました。 |
| スマートフォン | - | 私は普段利用している iPhone 13 Pro をカメラとして利用しました。 |
| Colab Pro | 月額 1,179 円 | GPU 環境です。手元にない場合はこちらを利用しましょう。 |
本記事では、Python のパッケージ管理およびコマンド実行に
uvを使用することを前提としています。まだインストールをしていない方はこちらをご参照ください。
実装・検証
Step 1: 接続テスト - toio.py による制御
まずは Python 環境から BLE 経由で toio を制御できるか確認します。専用ライブラリである toio.py を使用しました。
mkdir toio-quick-start uv init uv add toio.py
import asyncio from toio import ToioCoreCube async def main(): print("接続を開始します...") async with ToioCoreCube() as cube: print("接続完了!回転します") # motor_control(左モーター速度, 右モーター速度) await cube.api.motor.motor_control(30, -30) await asyncio.sleep(2) # 停止 await cube.api.motor.motor_control(0, 0) print("停止しました") asyncio.run(main())
Step 2: テレオペレーションの実装
ここからが本題です。Hugging Face が開発するロボット学習フレームワーク LeRobot を導入し、データ収集の基盤を作ります。今回は有志によって作成されたプラグインを利用させていただきました。
参考リポジトリ:https://github.com/njima/lerobot-hardware-plugins
セットアップ
git clone https://github.com/njima/lerobot-hardware-plugins.git cd lerobot-hardware-plugins uv sync
テレオペレーションの実行
以下のコマンドで、PC に接続したコントローラーから toio を操作できるようになります。これが教師データを収集する Recording フェーズの前段階となります。
uv run lerobot-teleoperate \
-robot.type=toio_follower \
-teleop.type=toio_leader \
-fps=60
Step 3: 学習と推論 - pushT タスクへの挑戦
今回は pushT を物理環境で再現しました。pushT とは T 字型のブロックを所定の枠に押し込むタスクです。

1. データ収集 (Record)
50 エピソード、つまり 50 回分の操作データを収集しました。カメラ映像と操作ログを同期して記録します。
uv run lerobot-record \
--robot.type=toio_follower \
--robot.cameras='{ "top": { "type": "opencv", "index_or_path": 0, "width": 1280, "height": 720, "fps": 30 } }' \
--teleop.type=toio_leader \
--display_data=true \
--dataset.repo_id="your-username/repo id" \
--dataset.num_episodes=50
2. 学習 (Train)
収集したデータセットを用い、モデルの学習を行います。ローカルに GPU リソースがない場合、Google Colab 上での実行も有効です。
uv run lerobot-train \ --dataset.repo_id="your-username/repo id" \ --policy.type=smolvla \ --policy.repo_id="your-username/repo id" \ --policy.device=cuda \ --steps=5000 \ --batch_size=8 \ --num_workers=0 \
3. 自律走行 (Inference)
学習済みモデルであるポリシーをロードし、推論モードで実行します。
uv run lerobot-record \
--robot.type=toio_follower \
--robot.cameras='{ "top": { "type": "opencv", "index_or_path": 0, "width": 1280, "height": 720, "fps": 30 } }' \
--display_data=true \
--dataset.repo_id="your-username/repo id" \
--dataset.single_task="Push the T-shaped block onto the T-shaped target." \
--dataset.push_to_hub=false \
--dataset.num_episodes=1 \
--dataset.episode_time_s=60 \
--dataset.reset_time_s=5 \
--policy.path="your-username/repo id"
今回、学習が最後までうまく回らずにブロックを押し込むことができませんでした。(ちびちび動いたり、少しだけT字に触って満足して終わるなんてことがありました...)更に良質なデータを収集し学習回数を重ねることで、より精度を高めることができると考えています。
まとめ
今回は toio を用いて、VLA におけるデータ収集、学習、推論のサイクルを一通り検証しました。 VLA のはじめの一歩として、データを収集する際のもどかしさや難しさを実体験できたことは、非常に良い経験になりました。 また、最近では toio の ROS 2 対応を進めるリポジトリ、toio_ros2 なども登場しており、初手での学習教材としての有用さは更に増していくことかと思います。これからも Physical AI がより一層進展していく中で、まだ触れたことのない方はこの記事が参考になれば幸いです。
参考リンク
We Are Hiring!
ABEJAは、テクノロジーの社会実装に取り組んでいます。 技術はもちろん、技術をどのようにして社会やビジネスに組み込んでいくかを考えるのが好きな方は、下記採用ページからエントリーください! (新卒の方やインターンシップのエントリーもお待ちしております!)
特に下記ポジションの募集を強化しています!ぜひ御覧ください!
トランスフォーメーション領域:データサイエンティスト | 株式会社ABEJA
