🚁

ArduPilotドローンを操作するMCPサーバーを自作する

に公開

はじめに

MCP(Model Context Protocol)の学習を兼ねて、ArduPilotドローンを操作する MCPサーバーを自作してみました。
Claude DesktopやClineといったMCPクライアントのチャット欄から「離陸して、結果をLINEしといてー」といった自然文で指示を出します。MCPの各Tool(arm/takeoffなど)に分解・実行され、MAVLink経由でシミュレータを制御できること、他MCPサーバー(LINE)と連携できることを目指します。

▼ソースコードは以下に公開していますので、ぜひ触ってみてください:
https://github.com/hfujikawa77/ardupilot-mcp-server-sandbox

▼ 動画で見たい方はこちら
https://youtu.be/y1WE1cDC54Y?si=bVP-aloOnaIiaH0-


ArduPilotとは

ArduPilot はオープンソースのフライト制御ソフトウェアで、マルチコプターに限らず固定翼やローバー、水中機など多くの機体に対応しています。MAVLinkという通信プロトコルを通じて外部ソフトウェアと接続でき、Pythonでは pymavlink ライブラリを使って機体の制御や情報取得が可能です。


動作環境(シミュレータテスト可能)

  • ArduPilot (シミュレータ or 実機)
  • MAVLink 通信が tcp:127.0.0.1:5762 で受け付け可能であること
  • Python 3.10+

Mission Planner のシミュレータを使う場合

ArduPilotドローンのシミュレーションを簡単に試すには、Mission Planner の内蔵シミュレータを使うのが便利です。

  1. Mission Planner をインストール
  2. 起動後、上部メニューの シミュレーション ボタンをクリック
  3. 次の画面で Multirotor(マルチローター) を選択
  4. ダイアログの Stable ボタンをクリック
  5. ArduPilotシミュレータが起動し、tcp:127.0.0.1:5762 で待ち受けを開始します

機能概要

  • ArduPilotへの TCP 経由での MAVLink 通信
  • arm() / disarm() / takeoff() / change_mode() などの基本操作をMCPツール化
  • ClaudeやClineとの連携による 自然言語での指示実行
  • 操作結果をLINEに通知する拡張も容易(例:離陸完了を即時通知)

サーバーのPython実装例

基本的な構成は次の通りです:

from mcp.server.fastmcp import FastMCP
from pymavlink import mavutil
import time

mcp = FastMCP("ArduPilot Controller", debug=True)

def connect_to_ardupilot():
    return mavutil.mavlink_connection(
        "tcp:127.0.0.1:5762",
        source_system=1,
        source_component=90
    )

@mcp.tool()
def arm() -> str:
    conn = connect_to_ardupilot()
    try:
        conn.wait_heartbeat()
        conn.arducopter_arm()
        conn.motors_armed_wait()
        return "機体をアームしました"
    finally:
        conn.close()

その他 disarm(), takeoff(), change_mode() も同構造で実装することができます。


MCPサーバーの起動

python ardupilot_mcp_server.py

"MCPサーバーを起動します..." と表示されたら正常に起動しています。


Cline との連携手順

  1. OpenRouter にサインアップ&APIキー取得
  2. VS Code + Cline 拡張 を設定
  3. settings.json に MCPサーバーを追加
"cline.apiKey": "sk-xxxxx...",
"cline.apiBaseUrl": "https://openrouter.ai/api/v1",
"cline.defaultModel": "openrouter/claude-3-haiku",
"cline.mcpServers": {
  "ardupilot-controller": {
    "command": "python",
    "args": [
      "${workspaceFolder}/ardupilot_mcp_server.py"
    ],
    "env": {
      "PYTHONPATH": "${env:USERPROFILE}\.local\lib\python3.12\site-packages"
    }
  }
}
  1. Cline チャットに「10メートルまで離陸して」などを入力するだけ!

Claude Desktop からの連携

  1. Claude Desktop をインストール
  2. claude_desktop_config.json に MCPサーバーを登録
{
  "mcpServers": {
    "ardupilot-controller": {
      "command": "python",
      "args": ["C:/path/to/ardupilot_mcp_server.py"],
      "alwaysAllow": ["arm", "disarm", "takeoff", "change_mode"]
    }
  }
}
  1. Claude Desktop を再起動し、チャットから呼び出せるようになります

実行例 (Prompt)

  • 「ArduPilotをアームして」
  • 「10メートルまで離陸して」
  • 「GUIDEDモードにして」

Claude または Cline が、これらの指示を MCP ツールに変換して実行してくれます。


おわりに

MCPを使って「チャットからドローンを自然言語で操作する」という面白い体験が手軽に構築できました。今回は機体操作をしてみましたが、実際の運用では撮影した画像、位置情報、ログ、ミッションといった各種データの管理・解析のワークフローの自動化の用途が考えられます。

さらに、ClineのようなAIコーディングツール兼MCPクライアントを使うと、単なるチャット操作にとどまらず、問題発生時に自動でコード修正を試みるような高度な振る舞いまでできました。

Clineを無料で試すなら、OpenRouterで使える deepseek/deepseek-chat-v3-0324:free モデルが快適でした(10クレジット購入しておくと1000リクエスト/日まで無料で使えるのも魅力です)。

Discussion