Обзор
WiseVision ROS 2 MCP Server — это реализация протокола MCP (Model Context Protocol) на Python для ROS 2. Сервер позволяет AI-инструментам (например, Claude Desktop или VS Code Copilot) взаимодействовать с узлами, топиками и сервисами ROS 2 через транспорт stdio. Проект ориентирован на максимально простую настройку.
Ключевые возможности:
- Автообнаружение типов — сервер автоматически получает список доступных топиков, сервисов и их типов сообщений (включая поля и вложенные структуры).
- Публикация/подписка на топики с произвольными типами сообщений.
- Вызов сервисов с поддержкой пользовательских типов (для нестандартных типов требуется предварительно source-нуть пакет).
- Автоматический QoS — сервер сам выбирает подходящие настройки качества обслуживания.
- Docker-образ для быстрого развёртывания.
Проект изначально создавался для внутренних нужд WiseVision, чтобы AI-агенты могли легко манипулировать данными ROS 2 без написания лишнего кода. Сейчас это open-source инструмент, полезный для разработчиков, исследователей и всех, кто хочет управлять роботами через AI-чат.
Быстрый старт
Установка
Подробное пошаговое руководство доступно в инструкции по установке. Там описана настройка для:
- Visual Studio Code Copilot
- Claude Desktop
- Warp
- Сборки локального Docker-образа
Самый простой способ — использовать готовый Docker-образ:
docker pull wisevision/ros2-mcp-server
Запуск через MCP Inspector (отладка)
Поскольку сервер работает через stdio, для отладки рекомендуется MCP Inspector. Запустите его через npx:
npx @modelcontextprotocol/inspector uv --directory /path/to/mcp_server_ros2 run mcp_ros_2_server
После запуска в браузере откроется интерфейс для тестирования всех инструментов.
Инструменты
Топики
| Инструмент |
Описание |
Входные параметры |
Выходные данные |
ros2_topic_list |
Возвращает список доступных топиков |
— |
topic_name, topic_type |
ros2_topic_subscribe |
Подписывается на топик и собирает сообщения за указанное время или до лимита сообщений |
topic_name (обяз.), duration (float, по умолч. 5 с), message_limit (int, по умолч. 1) |
messages, count, duration |
ros2_get_messages |
Извлекает исторические сообщения из топика (использует Data Black Box — аналог InfluxDB для ROS 2) |
topic_name, message_type, number_of_messages, time_start, time_end |
timestamps, messages |
ros2_get_message_fields |
Показывает поля и их типы для заданного типа сообщения |
message_type |
Поля + типы |
ros2_topic_publish |
Публикует сообщение в топик |
topic_name, message_type, data (словарь) |
status |
Сервисы
| Инструмент |
Описание |
Входные параметры |
Выходные данные |
ros2_service_list |
Возвращает список доступных сервисов |
— |
service_name, service_type, request_fields |
ros2_service_call |
Вызывает сервис ROS 2 |
service_name, service_type, fields (массив), force_call (bool, по умолч. false) |
result (строка), error (строка, если ошибка) |
Примечание: Для вызова сервиса с нестандартным (пользовательским) типом необходимо предварительно выполнить source пакета, в котором определён этот тип, перед запуском сервера.
Примеры использования
Получить список топиков
result = client.call_tool("ros2_topic_list", {})
print(result)
Опубликовать данные в топик
client.call_tool("ros2_topic_publish", {
"topic_name": "/cmd_vel",
"message_type": "geometry_msgs/msg/Twist",
"data": {
"linear": {"x": 0.5, "y": 0.0, "z": 0.0},
"angular": {"x": 0.0, "y": 0.0, "z": 0.1}
}
})
Вызвать сервис
client.call_tool("ros2_service_call", {
"service_name": "/set_goal",
"service_type": "nav2_msgs/srv/SetGoal",
"fields": [{"name": "goal", "value": {"x": 1.0, "y": 2.0}}]
})
Примечания
- Отладка: Из-за stdio-транспорта используйте MCP Inspector — он покажет URL для доступа в браузере.
- Вложенные поля: Сервер корректно обрабатывает сложные структуры сообщений (например,
geometry_msgs/Pose с вложенными Point и Quaternion).
- Обратная связь: Если проект вам помог, поставьте звезду на GitHub и поделитесь своим кейсом. Сообщество можно найти в Discord.
- Лицензия: Open-source, активно поддерживается разработчиками WiseVision.
Источники
Комментарии
Комментариев пока нет. Будьте первым.