4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Gemini 4 Argonでロボットアームを動かしてみた

4
Posted at

はじめに

2026年10月13日、Googleから新たなAIモデル「Gemini 4 Argon」が発表されました。

Geminiといえば、テキストチャットやコード生成、マルチモーダルな画像・動画理解など、さまざまな用途で活用されています。

今回のGemini 4 Argonについて情報を調べていたところ、活用領域の一つとして**Robotics(ロボティクス)**が紹介されていることを知りました。

Googleの公式ブログ「Gemini 4 Argon for Robotics」では、四足歩行ロボットがゴミ箱のペダルを踏んで空き缶を捨てたり、ロボットアームがカメラ画像を確認しながら物体を操作したりするデモが公開されています。

単に画像を認識して説明するだけでなく、周囲の物理的な状況を理解し、ロボットの具体的な動作につなげるという使い方です。

Geminiを使ってこんなことまでできるのかと思い、実際に試してみることにしました。

今回は、Gemini 4 Argonと物理シミュレータのMuJoCoを組み合わせ、ロボットアームによるPick & Place(物体を把持して指定の場所へ運ぶ操作)に挑戦します。

Gemini 4 Argon for Roboticsとは?

Googleの公式ブログでは、Gemini 4 Argonのロボティクス分野における活用例が複数紹介されています。

領域 主な活用例
Robot Control 周囲の状況を理解し、ロボットの行動を計画する
Real2Sim 現実世界の画像や動画から物理シミュレーション環境を構築する
Physical Understanding 物体の位置関係や接触、動作状態などを理解する
Research & Self-improvement シミュレーションを活用してロボットの動作を検証・改善する

中でも特に注目したのがRobot Controlです。

公式ブログでは、Argonがロボットのカメラ画像やセンサー情報を参照し、次に取るべき操作を高レベルで判断する例が紹介されています。

通常、ロボットを動かすには「操作対象の認識」「移動経路の計画」「各関節のモーター制御」といった複数のプロセスが必要です。この認識・判断プロセスにGeminiの視覚理解と推論能力を組み込むことで、自然言語による指示をロボットの自律的な動作へと変換できます。

今回はこの考え方に基づき、シンプルなPick & Placeタスクを実装してみました。

今回作ったもの

作業台の上に赤・青・黄色の3つのキューブを配置し、Gemini 4 Argonに「どのキューブを、どこへ移動すべきか」を判断させます。そしてその判断結果に基づき、ロボットアームを動かして対象のキューブを掴み、指定された場所へ移動させます。

実際に動作させた動画がこちらです。

今回使用した技術スタックは以下のとおりです。

技術 役割
Gemini 4 Argon カメラ画像の理解と操作対象の判断
Google Cloud Gemini APIの実行環境
MuJoCo ロボットの物理シミュレーション
Franka Panda キューブを操作するロボットアーム
Python ロボットアームの動作制御(軌道生成・IK)

MuJoCoとは?

MuJoCo(Multi-Joint dynamics with Contact)は、Google DeepMindが開発・公開している物理シミュレーションエンジンです。

ロボットの関節運動をはじめ、物体に働く重力、摩擦、衝突、接触といった物理現象を高精度に計算できます。

たとえばロボットアームでキューブを掴む場合も、単にキューブの座標値を書き換えるのではなく、「グリッパーの指先がキューブに接触し、摩擦力によって挟み込まれて持ち上がる」という一連の物理的挙動をシミュレートできます。

つまり、実機を用意せずとも、物理法則に即したリアルなロボット操作を検証できるのが大きな強みです。

今回はこのMuJoCoを活用し、Geminiが選択した物体を仮想ロボットアームが物理的に正しく掴んで運べるかを検証しました。

Franka Pandaとは?

Franka Pandaは、ロボティクス研究や産業用途で広く利用されているロボットアームです。

最大の特徴として、7自由度(7-DoF)を備えている点が挙げられます。平たく言えば、アームに7つの可動関節があるということです。人間が肩・肘・手首を連携させて腕を動かすのと同様に、ロボットもこれら7つの関節を連動させて手先(エンドエフェクタ)の位置や向きを柔軟に調整します。先端には2本の指で物体を挟み込むグリッパーが搭載されています。

今回はMuJoCo Menagerieで公開されているFranka Pandaのモデル(シミュレーションモデル)を使用しました。

システム構成

今回の設計における最大のポイントは、Gemini 4 Argonにロボットの全制御を任せるのではなく、高レベルの認知判断と低レベルの動作制御で役割を分担させた点にあります。

image.png

Geminiが担当するのは、「何を、どこへ移動するか」という大局的・高レベルな判断(タスクプランニング)です。

一方で、対象物へ到達するために各関節をどのように回転させるかといった具体的な動作軌道の計算は、Pythonコントローラ側(逆運動学など)で行います。

このように責務を明確に分離することで、Geminiのマルチモーダル推論能力を、既存の堅牢なロボット制御技術と無理なく統合できます。

実装の詳細

全体の実装は複数のPythonファイルに分割していますが、ここではArgonとロボット制御の連携部分を中心に解説します。

1. MuJoCoからカメラ画像を取得する

まず、MuJoCo上の仮想カメラから作業環境の画像を取得します。今回は2つの視点を用意しました。

  • Top-down:作業台を真上から見下ろした俯瞰画像
  • Overview:ロボットアームと作業台を斜めから捉えた全体画像

run_multi.py の該当コードは以下のとおりです。

first_topdown = output / "00_topdown.png"
first_overview = output / "00_overview.png"

lab.render_png(first_topdown, "topdown")
lab.render_png(first_overview, "overview")

decision, raw = chosen_policy.decide(
    args.task_id,
    instruction,
    first_topdown,
    first_overview
)

取得した2枚のカメラ画像と自然言語の指示をGeminiへ渡します。

ここで重要なのは、「正解となるキューブの3次元座標」や「色の並び順」といったメタ情報はGeminiに一切渡していないという点です。操作対象の特定は、すべてカメラ画像の視覚理解に委ねています。

2. Gemini 4 Argonへのプロンプト設計

今回の実装で最も試行錯誤したのがプロンプトの設計です。

単に「キューブを移動してください」と指示するのではなく、画像の参照方法、判断すべき項目、出力フォーマットの制約まで厳密に定義しました。

以下は、実際に使用した英語プロンプトの日本語訳です(実験の実行時は英語版をAPIへ送信しています)。

# 実際の英語プロンプトを日本語に翻訳した掲載用コード

prompt_ja = f"""
あなたはMuJoCoシミュレータ上のFranka Pandaを操作する、
視覚情報に基づく高レベルの動作計画AIです。

【ユーザーからの指示】
{instruction}

【環境】
MuJoCoのカメラ画像2枚を確認してください。

画像1:作業台を真上から見た俯瞰画像
画像2:作業台を斜めから見た全体画像

作業台には赤・青・黄の3つの立方体があります。

立方体の初期位置より奥の列には、
緑色または青緑色の円形の配置先が2つあります。

左右の判断は、
画像1の画面上の左右を基準としてください。

【あなたの役割】
ユーザーの指示とカメラ画像をもとに、
次の2つを判断してください。

1. どの立方体を操作するべきか
2. どちらの配置先に移動するべきか

立方体と配置先を選択した後、
ロボットコントローラがシミュレータ内の座標を使って
実際の操作を実行します。

【制約】
あなたには次の情報を提供していません。

- 立方体の正確な座標
- 立方体の色と配置順序の対応
- 正解となる操作対象
- 正解ラベルを重ねた画像

カメラ画像から操作対象を判断してください。

モーター、関節、座標、プログラムコード、
実機のハードウェアを直接制御しないでください。

【出力形式】
JSONのみを返してください。

{{
  "action": "pick_place",
  "target": "red_cube|blue_cube|yellow_cube",
  "destination": "left_zone|right_zone",
  "reason": "判断理由を短い1文で記載"
}}

画像から安全に判断できない場合は、
以下のJSONを返してください。

{{
  "action": "stop",
  "target": "none",
  "destination": "none",
  "reason": "判断できない理由"
}}
"""

image.png

このプロンプトで工夫したポイントは以下の3点です。

  1. 空間的な基準(左右関係)の明確化
    「最も左にあるキューブ」といった指示に対応するため、斜め視点(パースがつく)ではなく、トップダウン(真上からの俯瞰)視点の画面左右を基準とするよう明示しました。
  2. 返却アクションの厳密な制限
    アクションは pick_place または stop のみに限定し、対象や配置先も定義済みのリストから選ばせるようにしました。これにより、Argonが低レベルのモーター指令などを勝手に生成するのを防ぎ、安全にコントローラへ橋渡しできます。
  3. 安全停止(stop)のフォールバックを用意
    視覚情報から確実に判断できない状況では、当て推量で動作させず stop を返すよう義務付けました。さらにPython側でも受け取ったJSONをバリデーションし、未知の識別子が含まれる場合は例外を送出して停止させています。

3. Gemini APIの呼び出し

プロンプトとカメラ画像をGemini 4 Argonへ送信します。ここではGoogle Gen AI SDKのInteractions APIを使用しました。

src/multi_policy.py の主要な処理は以下のとおりです。

from google import genai
import base64

client = genai.Client(
    enterprise=True,
    project=project,
    location="global"
)

def image_part(filename):
    return {
        "type": "image",
        "data": base64.b64encode(
            filename.read_bytes()
        ).decode("ascii"),
        "mime_type": "image/png"
    }

response = client.interactions.create(
    model="gemini-4-argon",
    input=[
        {"type": "text", "text": prompt},
        image_part(first_topdown),
        image_part(first_overview)
    ]
)

raw = response.output_text or ""

※ 上記は主要部分の抜粋です。実際の検証では英語版プロンプトを渡しています。

認証にはApplication Default Credentials(ADC)を利用し、interactions.create() 経由でテキストプロンプトとBase64エンコードした2枚のカメラ画像をまとめて送信しています。

4. 判断結果から物理動作への変換

Argonから返却されたJSONはPython側で検証したあと、MuJoCoの制御シーケンスへと変換されます。

if obj.get("action") != "pick_place":
    raise ValueError("Action not allowed")

target = obj.get("target")
destination = obj.get("destination")

if target not in COLORS or destination not in ZONES:
    raise ValueError(
        f"Unrecognized cube/zone: {target}/{destination}"
    )

検証をパスした正常なアクションに基づき、run_multi.py からアームを動作させます。

lab.select_cube(decision.target)

pick_result = lab.pick()

if pick_result["lifted"]:
    place_result = lab.place(
        ZONES[decision.destination]
    )

select_cube() で対象キューブを決定後、シミュレータ環境からその3次元座標を取得し、逆運動学(IK: Inverse Kinematics) を用いて手先が目標位置に到達するような各関節の回転角を計算します。

そして pick() でアプローチ・把持・持ち上げを実行し、成功を確認した上で place() により指定ゾーンへと搬送・配置します。

まさに**「Argonが『何を・どこへ』を判断し、Pythonコントローラが『どう動かすか』を実行する」**という役割分担です。

実験:一番左のキューブを移動する

実際に以下の指示を与えて動作を検証しました。

「上から見た画像で最も左にあるキューブを、右側の緑色の丸い置き場へ移動してください。」

作業台には、左から「黄・赤・青」の順でキューブを配置し、奥に2つの緑色ターゲットゾーンを設けています。

したがって、正解のアクションは**「黄色のキューブを掴み、右側のゾーンへ配置する」**ことになります。

指示文の中に「黄色」という単語は含まれておらず、Argon自身が俯瞰画像からキューブの並び順(幾何学的な位置関係)を理解しなければ正解できません。

image.png
image.png

Argonの推論結果

実際にモデルから返却されたJSONレスポンスがこちらです。

{
  "action": "pick_place",
  "target": "yellow_cube",
  "destination": "right_zone",
  "reason": "The yellow cube is the leftmost cube in the top-down view, and the instruction asks to move it to the right landing zone."
}

指示通り、target に yellow_cube、destination に right_zone が的確に指定されています。判断理由(reason)を見ても、俯瞰視点における左右の空間認識が正しく行われていることが分かります。

MuJoCo上での動作シミュレーション

この推論結果を受け、コントローラが以下のステップで物理シミュレーションを実行しました。
image.png

  1. 黄色キューブの直上までアームを移動(アプローチ)

  2. グリッパーを降下

  3. 2本指グリッパーを閉じてキューブを把持

  4. キューブを上方へ持ち上げる(リフト)
    image.png

  5. 右側配置ゾーンの直上まで移動

  6. グリッパーを開いてキューブを着地・配置
    image.png

MuJoCo上では接触判定や静止摩擦係数が物理計算されているため、アームの指先が滑ればキューブは落下してしまいます。座標をテレポートさせるような処理ではなく、物理的な挟み込みによって安定して運搬できることが確認できました。

実行結果

実験の結果をまとめました。

評価項目 結果
正しいキューブの選択 成功(yellow_cube)
正しい配置先の選択 成功(right_zone)
グリッパーによる把持 成功
キューブの持ち上げ 成功
指定位置への配置 成功
最終配置のXY誤差 3.5mm

シミュレータの接触ログからも、持ち上げ中を通してグリッパー両指とキューブ側面との接触状態が維持されていることが確認できました。

最終的なXY平面上の配置誤差はわずか3.5mmに収まり、タスクは完全に成功しました(※この3.5mmという誤差はシミュレータ内の軌道追従・接触による物理誤差であり、Geminiの位置推定精度そのものを表すものではありません)。

冒頭の動画は、このシミュレーション結果(関節軌道データ)をBlenderに取り込み、リアルにレンダリングしたものです。

今回の実験から分かったこと

今回の試みを通じて、Gemini 4 Argonの高度な視覚理解能力を、ロボットの自律操作における「認知・判断レイヤー」として実用的に組み込めることが確認できました。

従来型のルールベース制御でも、対象の色や座標があらかじめ確定していればPick & Place自体は難しくありません。しかし、「一番左にあるもの」「赤い箱の隣にあるもの」といった相対的・曖昧な指示に対応するには、画像から空間配置や文脈を読み取る高度な解釈処理が不可欠です。

今回のアーキテクチャでは、その柔軟な判断をArgonに一任し、構造化されたJSONとしてコントローラに渡すことで、自然言語と物理動作のギャップを綺麗に埋めることができました。

もちろん、本実装は完全な自律制御ロボットの完成を意味するものではありません。
正確な3次元座標の取得や干渉チェック、関節軌道の生成、グリッパーのトルク制御などは、依然として従来のPythonコントローラ側が担っています。また、今回は1つのシナリオにおける検証にとどまるため、物体の形状が不揃いなケースや、照明条件が変化する状況でのロバスト性評価は今後の課題です。

それでも、「LLM/VLMを高レベルのタスクプランナーとして配置し、低レベルの制御器とハイブリッドで組み合わせる」という設計パターンの有効性を十分に実感できる結果となりました。

次のステップ:閉ループ制御(障害物回避・再計画)への拡張

公式ブログで示唆されているロボティクスの応用例には、さらに高度なアプローチが存在します。

特に今後挑戦したいのが、ロボットの動作結果をカメラでフィードバックしながら次の行動を決定する**「閉ループ制御(Closed-loop Control)」**です。

たとえば、運搬経路に突発的な障害物が現れた場合の回避ルート計画や、把持に失敗してキューブを取り落とした際に、即座に画像を再撮影して状況を認識し、リトライを試みるといった処理です。

image.png

このように「観測・推論・行動・評価」のサイクルを回すことで、動的に変化する環境にも柔軟に適応できるロボットシステムへと進化させることができるはずです。

まとめ

今回はGoogle Gemini 4 Argonを使ったロボット操作シュミレーションをやってみました。
Gemini 4 Argonと物理シミュレータMuJoCoを連携させたロボットアームのPick & Placeを検証しました。

自然言語の曖昧な指示とマルチビューカメラ画像から目的の物体を的確に見極め、
物理シミュレーション上のロボット動作へと落とし込むことができました。

Geminiのような生成AIは、単なるテキストチャットや情報検索の枠を超え、**「物理世界を理解し、実世界の行動を導くエージェント」**としてフィジカルAI領域で使われていくのだと実感できました。

今回はWindows PCで気軽に試せたのでみなさんもお試しいただければと思います。


参考資料


4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?