
2026/01/26 20:00
**Show HN:ドローンを操縦できるのはLLMが一つだけ**
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
SnapBenchはRustベースのコントローラで、Zig/raylibで実装された手続き的に生成された3Dボクセルワールドを通じて仮想ドローンを操縦します。ドローンは8つの移動コマンドと「識別」「スクリーンショット」を受け取り、OpenRouter Vision‑Language Model(VLM)を用いて4種類の生物(猫、犬、豚、羊)のいずれかを探知します。ドローンが各ターゲットから5ユニット半径内に3匹の生物を識別できた場合、その走行は成功とみなされます。
7つのLLMがベンチマーク対象でした。Gemini Flashは常にドローンを飛ばし、手取り足取りせずに生物を識別しました。一方、Claude Opusは識別時に地表レベルまで降下しなかったため失敗しました。ほとんどの走行では50イテレーション上限前に1匹しか捕捉できませんでしたが、シード72で実施した単一走行では、生成された位置が近接していたため2匹を発見しました。最も安価なモデル―Gemini Flash―はClaude Opus 4.5やGemini 3 Proなどの高価格モデルよりも優れた性能を示し、空間推論能力がモデルサイズと線形に比例するわけではないことを示唆しています。
検出品質は色対比によって変動しました。ピンク豚やグレー羊などの高コントラスト生物は地形に溶け込む低コントラストものよりも見つけやすかったです。DJI Telloドローンで行った実際のテストでは失敗(ドローンが単純に上昇した)の結果、しかし新しいGemini FlashパイロットはBetaFPVまたはTelloを用いた実機ベンチマークに有望な兆候を示しています。
現在のベンチマークは非公式で、1つの汎用プロンプトと基本的なフィードバックループ(位置情報、スクリーンショット、直近コマンド)および50イテレーション制限から構成されています。将来的な改善点としては、モデル固有のプロンプト、より豊富な空間コンテキスト、50を超える拡張イテレーション、多エージェント競争、大規模テレーンへの適用などが計画されています。このセットアップにはZig ≥ 0.15.2、Rust stable(2024版)、Python ≥ 3.11、uv、およびOpenRouter APIキーが必要です。リポジトリは
kxzk/snapbenchです。本文
SnapBench
============
**Pokémon Snap(1999)**に触発され、SnapBench は 3‑D 世界をドローンでパイロットし、生物を探して識別します。
アーキテクチャ
%%{init: {'theme': 'base', 'themeVariables': { 'background': '#ffffff', 'primaryColor': '#ffffff'}}}%% flowchart LR subgraph Controller["**Controller** (Rust)"] C[Orchestration] end subgraph VLM["**VLM** (OpenRouter)"] V[Vision‑Language Model] end subgraph Simulation["**Simulation** (Zig/raylib)"] S[Game State] end C -->|"screenshot + prompt"| V C <-->|"cmds + state<br>**UDP:9999**"| S style Controller fill:#8B5A2B,stroke:#5C3A1A,color:#fff style VLM fill:#87CEEB,stroke:#5BA3C6,color:#1a1a1a style Simulation fill:#4A7C23,stroke:#2D5A10,color:#fff style C fill:#B8864A,stroke:#8B5A2B,color:#fff style V fill:#B5E0F7,stroke:#87CEEB,color:#1a1a1a style S fill:#6BA33A,stroke:#4A7C23,color:#fff
- Controller(Rust)はドローンをオーケストレーションします。
- VLM(OpenRouter)はスクリーンショットとプロンプトを受け取り、コマンド列を返します。
- Simulation(Zig/raylib)はゲーム状態を保持し、UDP :9999 経由でコマンドを受信します。
概要
シミュレーションは地形を手続き的に生成し、猫・犬・豚・羊などの生物をスポーンさせます。
ドローンの物理挙動と衝突判定を扱い、8 つの移動コマンドに加えて identify と screenshot を受け付けます。
Rust コントローラはシミュレーションからフレームを取得し、位置情報や状態データでプロンプトを拡張した後、VLM のレスポンスを実行可能なコマンド列に解析します。
目的: 3 つの生物を見つけて正しく識別すること。
識別はドローンがターゲットから 5 単位以内に入ったときに成功します。
デモ
demo_3x.mov
「全員捕まえてみせる」?
7 つのフロンティア LLM に単純なタスクを与えました:3‑D ボクセル世界でドローンを操縦し、3 体の生物を探す。
実行できたのは 1 つだけでした。
これは厳密なベンチマークでしょうか?
いいえ。
しかし同じプロンプト・シード・反復制限で公平に比較できます。
なぜ Claude は下を見られない?
核心は知能ではなく高度制御でした。生物は地面にいるため、識別には降下が必要です。
| モデル | 行動 |
|---|---|
| Gemini Flash | 高度を積極的に調整し、対象レベルまで降下して識別 |
| GPT‑5.2‑chat | 水平に近づくものの下げない |
| Claude Opus | 160 回以上試みるも失敗。誤った角度で接近 |
| その他 | ランダムに歩き回るか詰まる |
二体発見の異常
Run 13(シード 72)だけがモデル全員で 2 体を見つけた実行です。
Gemini Flash は一度目を見て戻り、二度目を発見しました。
ほとんどの実行では Flash が一体を速く見つけるも、残りを探す時間が足りずに反復制限で終了します。世界は大きいので 50 反復は短いです。
大きさ=良さ
Claude Opus 4.5(最も高価)と Gemini 3 Pro を期待したのに、最低価格モデルが 10 倍以上高価なモデルを上回りました。
可能性として:
- 空間推論はモデルサイズでスケールしない――少なくとも今はそう。
- Flash は別途訓練されており、ロボティクスやエンボディドシナリオが多いかもしれない。
- 小さなモデルは指示を文字通りに解釈する傾向があります:「下げろ」→降下。
色彩理論?
経験上、灰色の羊やピンクの豚などコントラストが高い生物は見つけやすく、茶っぽいものは地形と混ざりやすかった。将来のバージョンでは可視性を正規化するか、挑戦として残すか検討中です。
先行研究
DJI Tello 実機ドローンで LLM を操縦させる実験も行いました。
結果:直立上昇し天井に衝突、ダンスを続けて Haiku 4.5 が捕まえるまで。Tello は現在破損中。BetaFPV を注文済みで再度 Tello を試す予定です。
未整備点
- シミュレーションは副プロジェクト的に完成度が低いベンチマークスイートではありません。
- 全モデル共通のブランケットプロンプトを使用しているため、モデル別調整が有効です。
- フィードバックループは基本的(位置・スクリーンショット・直近コマンド)で、より創造的入力により改善可能。
- 反復制限 (50) は遅いが最終的には成功するモデルを抑える恐れがあります。
自分で挑戦
必要なもの
| ツール | バージョン | インストール |
|---|---|---|
| Zig | ≥ 0.15.2 | https://ziglang.org/download |
| Rust | stable (2024 edition) | https://rust-lang.org/tools/install |
| Python | ≥ 3.11 | https://python.org |
| uv | 最新版 | https://docs.astral.sh/uv |
また OpenRouter API キー が必要です。
設定
gh repo clone kxzk/snapbench cd snapbench export OPENROUTER_API_KEY="sk-or-..."
シミュレーションを手動で起動
# ターミナル 1: シミュレーション開始(オプションシード) zig build run -Doptimize=ReleaseFast -- 42 # または make sim
# ターミナル 2: ドローンコントローラ起動 cargo run --release --manifest-path llm_drone/Cargo.toml -- --model google/gemini-3-flash-preview # または make drone
ベンチマークスイートを実行
# bench/models.toml に定義された全モデルを走らせる uv run bench/bench_runner.py # または make bench
結果は
data/run_<id>.csv に保存されます。
今後の展望
- モデル別プロンプト:各モデルの強みを活かすよう指示を調整。
- リッチなフィードバック:距離計測値、コンパス、ミニマップなど追加情報を渡す。
- マルチエージェント実行:各モデルにドローンを与えて競わせる。
- 反復延長:遅いモデルが十分な時間で推論できるようにする。
- 実機ベンチマーク:Gemini Flash と BetaFPV を対決させる。
- ポケモン資産:低ポリゴン Pokémon モデル(Poly Pizza)を使用しインスピレーションを深める。
- 世界改善:大規模な地形、より良いビジュアル、パフォーマンス最適化。
参考文献
- ドローン:NateGazzard CC‑BY via Poly Pizza。
- Cube World Kit:Quaternius via Poly Pizza。
Poly Pizza に寄付し、プラットフォームを支援しました。