この記事は
自然言語でロボットを動かしたい
ポイントはROS2 と MCP の組合せ
ゴールイメージ🐢
日本語で「右に進め」と言ったら、ロボット(亀)が右に進んでくれる。それがゴール。
ROS2 + TURTLESIM + MCP: MCP application with Claude
検証環境
上記動画のとおり、実物のロボットは使いません。
手元のノートパソコンで検証します。もちろん無料で全部できます。
- Windows 11 Home
- Docker Desktop |会社で使う人はライセンス注意
- WSL2
- LM Studio
- Qwen3 4B
- アドバイザーとしてのGemini無料版
本当はGithub CopilotのMCP機能を使いたかったのだけれども、12/24まで使えない😐
お急ぎの方は
「ここでなんと、公式のexampleに気が付く」の章からお読みください
序盤は寄り道をしています
使うものを精査する
だいたいのことはAIに投げれば答えがでる
人間がやるべきことは、中身を精査すること。ということで使うものの準備。
Dockerイメージ
由緒正しきオープンソースなロボットの団体が提供しているDockerイメージを使用する
URLの短さは、由緒の正しさ
ROSのWikiを流し読みするに、HumbleがUbuntu22.04時代のものであり、今はJazzyに継承されていったようである
どうやらJazzyのほうが新しいようだが、GeminiがHumbleを使えというのでHumbleを使う
docker pull osrf/ros:humble-desktop-full
export HOST_GATEWAY="172.17.80.1"
docker run -it --rm --name ros2_turtle -e ROS_DOMAIN_ID=42 -e ROS_STATIC_PEERS=$HOST_GATEWAY -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix osrf/ros:humble-desktop-full ros2 run turtlesim turtlesim_node
HOST_GATEWAY="172.17.80.1"って何?
WSL環境のネットワーク
サブネットマスクが20bitなのでアドレス範囲は「172.17.80.0 〜 172.17.95.255」
イーサネット アダプター vEthernet (WSL (Hyper-V firewall)):
IPv4 アドレス . . . . . . . . . . . .: 172.17.80.1
サブネット マスク . . . . . . . . . .: 255.255.240.0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:15:5d:bd:b1:d7 brd ff:ff:ff:ff:ff:ff
inet 172.17.82.122/20 brd 172.17.95.255 scope global eth0
Docker環境のネットワーク
docker0は16bitのサブネット
# 起動中のROS2コンテナに入る
docker exec -it ros2_turtle bash
# 必要なツールをインストールして実行
apt update
apt install -y iproute2 net-tools
ip a
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
WSL環境とDocker環境がどちらも172.17から始まるので
サブネットマスク長まで意識していないと
「なんで同じセグメントなのに疎通取れないのか?」となってしまう。
ここでなんと、公式のexampleに気が付く
dockerでturtlesimを動かす例題が載っていた
こちらのフォルダをローカルに落として先に進む
git clone https://github.com/robotmcp/ros-mcp-server.git
# Ubuntuのhomeディレクトリにコピーする
robocopy ros-mcp-server\examples\5_docker_turtlesim \\wsl.localhost\Ubuntu\home\5_docker_turtlesim /E
README.mdに従って進める
WindowsでUbuntuの黒い窓を開いて進める
# docker-compose.yml があるディレクトリまで移動
docker compose build --no-cache turtlesim
docker compose up
# 権限エラーではじかれるので、以下実行
chmod +x ./docker/scripts/launch_turtlesim.sh
# まだ何かおこられるので改行コードを直す
sudo apt update && sudo apt install -y dos2unix
dos2unix docker/scripts/launch_turtlesim.sh
docker compose up -d
# カメが表示されたら成功
# コンテナに入ってカメを動かす
docker exec -it ros2-turtlesim bash
source /opt/ros/humble/setup.bash
ros2 run turtlesim turtle_teleop_key
これはキーボードの十字キーで操作しているだけ
次章以降は、自然言語でカメを動かす
コンテナネットワーク
今回はWindowsマシンの LM Studio から命令を出すので
ホストマシンとコンテナネットワークとの橋渡しが必要
services:
turtlesim:
# **【変更点 1: ポートマッピングの追加】**
ports:
- "9090:9090"
# **【変更点 2: network_mode: host の削除】**
# network_mode: host
これでWindowsの LM Studio から 127.0.0.1:9090にアクセスできる
Windowsマシンからコンテナ内のサーバに接続確認
試しに pwoershell からアクセスしてみればエラーが出る
エラーが出るが、これは正常な動作。websocketプロトコル以外でアクセスしたエラーなのでOK
Invoke-WebRequest -Uri http://127.0.0.1:9090
# Invoke-WebRequest : Can "Upgrade" only to "WebSocket".
docker compose した画面のほうでも、アクセスを受けたログが出ているはず
ros2-turtlesim | [rosbridge_websocket-1] WARNING:tornado.access:400 GET / (172.18.0.1) 12.04ms
MCPサーバを構築
Guthubの手順に従ってMCPサーバ構築
GithubではClaudeの例で書かれているが、今回はLM Studioを使う
curl -LsSf https://astral.sh/uv/install.sh | sh
# uv のインストール先を PATH に追加
export PATH="/root/.local/bin:$PATH"
uvx ros-mcp --help
# helpっぽい内容が表示されたらOK
LM Studioで mcp.json を編集する
7行目のUbuntuは自分の環境(powershell wsl -lで調べる)にあわせて編集する
カメに移動命令
LM Studioのチャット画面にて「forward turtle」と唱えると
3つの tools が動いて、カメが右に動いた
動いたけれども、貧弱なマシンでは qwen モデルでさえとても時間がかかる
カメをこれだけ動かすのに5分くらいは待たされる
おわりに
LM StudioのMCP機能を使って
docker に作った turtlesim を動かした
メリークリスマス🎅





