Gemini Robotics-ERで挑むVLA:言語指示によるロボットアームの物体仕分け
前回の記事では、Gemini Robotics-ERを用いて画像内の物体検知(Object Detection)を行い、ピクセル座標を正確に取得することに成功しました。今回はその一歩先、いよいよ VLA(Vision-Language-Action) の実装に挑戦します。
単に「どこに何があるか」を知るだけでなく、人間からの抽象的な言語指示を理解し、ロボットアームを物理的にどう動かすか(Action)までを一気通貫で制御するプロセスを解説します。
はじめに:VLAとは何か?
VLA(Vision-Language-Action model) とは、画像(Vision)と言語(Language)を入力とし、ロボットの具体的な動作(Action)を直接出力するAIモデルです。
従来のロボット制御では、「物体認識」「プランニング」「軌道計算」を別々のシステムで組み合わせていましたが、VLAはこれらを一つの巨大なニューラルネットワーク(End-to-End)で処理します。
- 「見て、考えて、動く」を統合: 曖昧な指示(例:「机の上を片付けて」)を理解し、具体的な関節の制御値に変換。
- 未知のタスクへの対応: 膨大な学習データにより、未経験の物体や道具に対してもゼロショットで対応可能。
なぜ今、ICTエンジニアの私が「フィジカルAI」に熱くなるのか
直近2年間、私は生成AIを活用した「業務自動化エージェント」の開発に注力していますが、この二つには強い共通点があると感じています。
| 要素 | 生成AIエージェント(ソフト) | VLA / フィジカルAI(ハード) |
|---|---|---|
| Data/Vision | DBやログから状況を把握 | カメラで周囲の環境を把握 |
| Language | 人間からの業務指示 | 人間からの動作指示 |
| Action | デジタル上の操作・回答 | ロボットアームの物理駆動 |
「人間をロボットに置き換えたらどうなるか?」という視点で見ると、VLAはまさに「実世界で動くAIエージェント」そのものです。
今回の実験内容:色の指示によるワークの仕分け
VLAによる「一気通貫」の処理プロセス
今回のシステムでは、人間からの曖昧な指示がロボットの物理的な動作へ変換されるまで、以下のプロセスを「一気通貫」で処理しています。
- 情報の集約(Vision & Language): Unity上のカメラが捉えた現在の「画像データ」と、InputFieldから入力された「自然言語の指示」をペアにして、Gemini Robotics-ERへ送信します。
- 推論と意味解釈(Reasoning): AI(Gemini)が画像内のオブジェクト(色、形状、位置)を認識し、指示内容(「〜以外は右へ」など)と照らし合わせて、「どの物体を」「どこへ」動かすべきかという論理的なタスクプランを生成します。
- アクション生成(Action/Output): 推論結果に基づき、ロボットが理解可能な正規化座標(0-1000の[y, x]形式)をJSONデータとして出力します。
- 物理実行(Execution): 受け取った座標値をUnity側の座標へ変換し、リアルタイムにIK(逆運動学)を解きながらロボットアームを駆動させます。
このように、従来の「認識プログラム」「判断ロジック」「動作制御」といった個別のフェーズを切り分けることなく、一つの言語指示から最終的な動作座標までをダイレクトに結びつけているのが、VLAの大きな特徴です。
Gemini Robotics-ERへ与える指示(プロンプト)
Unity上のシミュレーション環境で、以下の複雑な指示をロボットに実行させます。
- 指示内容: "Move the purple and yellow cubes into the left tray, and the rest into the right tray." (紫と黄色のキューブは左のトレイへ、残りは右のトレイへ移動させて)
- 使用モデル:Gemini Robotics-ER
Gemini APIを通じて、画像と指示を送信し、座標データを取得します。
プロンプト構成(C#): 指示を instruction 変数に埋め込み、JSON形式で座標を返すよう指定します。
string query = $"Analyze the image to identify objects and follow the user's instruction for moving them. The user instruction is: '{instruction}'. For each object to be moved, provide its current location ('from'), its new location ('to'), and its label. The response should be in JSON format: [{{'from': [y1, x1], 'to': [y2, x2], 'label': ''}}, ...]. The points are in [y, x] format normalized to 0-1000.";
返却されるJSON例:
[
{ "from": [485, 585], "to": [400, 200], "label": "purple cube" },
{ "from": [245, 415], "to": [400, 800], "label": "pink cube" }
]
実験結果と考察
以下の動画が今回の実験結果となります。
1. 成功率と「環境調整」の重要性
今回の実験では、複雑な指示に対しても高い成功率でワークを仕分けることができました。しかし、そこに至るまでにはシミュレーション環境の細かな調整が必要でした。
当初は、トレイの配置や色合い、あるいはコンタクトシャドー(Contact Shadow)の出方といったわずかな違いによって、物体検出の位置が極端にずれてしまうケースが多々ありました。
- コンタクトシャドーの影響: 影が不自然に濃すぎたり、接地面から浮いて見えたりすると、AIが物体の一部として誤認識し、座標がオフセットされる要因になります。
- 色調のリアリティ: Unityのマテリアル設定で発色を強くしすぎると(例:HSVのV=100など)、Gemini側で正しく位置を特定できない傾向がありました。
上記の実験動画は、これらを微調整し、検出位置が正確に出力されるように追い込んだものです。シミュレータとはいえ、AIモデルが学習したであろう実世界のデータ(フォトリアルな色調や自然なライティング)にいかに寄せるかが、VLAを実用化する上での鍵になると感じました。
2. Quota(利用制限)の壁
Gemini Robotics-ER(gemini-robotics-er-1.5-preview)の無料プランでは、制限が 20リクエスト/日 程度と非常にタイトです。
エラーメッセージを確認すると GenerateRequestsPerDayPerProjectPerModel-FreeTier の制限に達していることがわかります。
試行錯誤が必要な開発フェーズでは、API Keyの切り替えやプランの検討が必須となります。
軌道について
今回の実験動画では、ロボットの手先がターゲットに向かって真っ直ぐ(直線的に)移動していることにお気づきでしょうか。
これまでは、目標地点の関節角度をIK(逆運動学)で算出し、現在の角度から目標角度へ各関節を個別に補間させていました。しかし、この手法では手先の軌道が大きな曲線を描いてしまいます。
そこで今回は、 手先の移動経路そのものを線形補完(直線移動) するように制御を改良しました。
- 現在地から目標地点まで、手先が直線上をSmoothStepとLerpの組み合わせで移動。
- 移動中の各ステップでリアルタイムにIKを解き、関節角度を更新。
まとめ:ロボットを動かすことは、組織を動かすことより容易か?
2年間、業務自動化のためのAIエージェントを作ってきて痛感したのは、 「人間を動かす難しさ」 です。
指示を出す相手(人間)にスキルやマインドセットがなければ、AIがどれだけ高度な指示を出しても業務は回りません。結局は組織カルチャーや教育という非技術的な壁にぶつかります。
しかし、ロボットは違います。
適切なハードウェアとVLAがあれば、指示に無条件に従います。
「生成AIを導入しても組織が変わらない」と行き詰まっているなら、一度「フィジカルAI」に目を向けてみるのはどうでしょうか。人間をロボットに置き換えたシミュレーションを行うことで、本来あるべき高度な業務プロセスが可視化され、経営判断やリスキリングの必要性が浮き彫りになるはずです。
次のステップ
一旦、今回でこのシリーズは終了します。
次のステップとして、電子工作の世界に少し寄り道してみようと思います。電子工作向けのサーボモーターを回したり、多関節ロボットを制御したりと、現実空間での「動き」を追求してみるつもりです。
本記事で紹介した制作物
以下のGitHubプロジェクトで公開します。
