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
▼ 動画で見たい方はこちら
ArduPilotとは
ArduPilot はオープンソースのフライト制御ソフトウェアで、マルチコプターに限らず固定翼やローバー、水中機など多くの機体に対応しています。MAVLinkという通信プロトコルを通じて外部ソフトウェアと接続でき、Pythonでは pymavlink ライブラリを使って機体の制御や情報取得が可能です。
動作環境(シミュレータテスト可能)
- ArduPilot (シミュレータ or 実機)
- MAVLink 通信が
tcp:127.0.0.1:5762
で受け付け可能であること - Python 3.10+
Mission Planner のシミュレータを使う場合
ArduPilotドローンのシミュレーションを簡単に試すには、Mission Planner の内蔵シミュレータを使うのが便利です。
- Mission Planner をインストール
- 起動後、上部メニューの
シミュレーション
ボタンをクリック - 次の画面で
Multirotor(マルチローター)
を選択 - ダイアログの
Stable
ボタンをクリック - 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 との連携手順
- OpenRouter にサインアップ&APIキー取得
- VS Code + Cline 拡張 を設定
-
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"
}
}
}
- Cline チャットに「10メートルまで離陸して」などを入力するだけ!
Claude Desktop からの連携
- Claude Desktop をインストール
-
claude_desktop_config.json
に MCPサーバーを登録
{
"mcpServers": {
"ardupilot-controller": {
"command": "python",
"args": ["C:/path/to/ardupilot_mcp_server.py"],
"alwaysAllow": ["arm", "disarm", "takeoff", "change_mode"]
}
}
}
- Claude Desktop を再起動し、チャットから呼び出せるようになります
実行例 (Prompt)
- 「ArduPilotをアームして」
- 「10メートルまで離陸して」
- 「GUIDEDモードにして」
Claude または Cline が、これらの指示を MCP ツールに変換して実行してくれます。
おわりに
MCPを使って「チャットからドローンを自然言語で操作する」という面白い体験が手軽に構築できました。今回は機体操作をしてみましたが、実際の運用では撮影した画像、位置情報、ログ、ミッションといった各種データの管理・解析のワークフローの自動化の用途が考えられます。
さらに、ClineのようなAIコーディングツール兼MCPクライアントを使うと、単なるチャット操作にとどまらず、問題発生時に自動でコード修正を試みるような高度な振る舞いまでできました。
Clineを無料で試すなら、OpenRouterで使える deepseek/deepseek-chat-v3-0324:free
モデルが快適でした(10クレジット購入しておくと1000リクエスト/日まで無料で使えるのも魅力です)。
Discussion