Робот, который понимает с полуслова — миф или уже реальность?
Reachy Mini от Pollen Robotics — штука крутая. Сервоприводы, камера, манипулятор, полный фарш. Но пока ты пишешь reachy.motion.set_angle(neck, 30), твой коллега уже заставил робота принести ему печеньку одной фразой. Разница — в MCP.
Model Context Protocol (тот самый USB-порт для ИИ) превращает робота в агентскую систему. Ты не программируешь движения — ты описываешь задачу. Нейросеть на борту (или рядом) выбирает нужный MCP-инструмент и дёргает его. В 2026 году это не эксперимент, а штатная фича прошивки Reachy Mini 2.4.
В отличие от классических ROS-пайплайнов, MCP не требует писать ноды для каждого жеста. Всё, что нужно — подключить MCP-сервер с инструментами управления роботом, и любой LLM-агент сможет ими воспользоваться.
Что добавляют MCP Tools в Reachy Mini
Коробочный Reachy Mini управляется через Python SDK или пульт. MCP-слой добавляет сверху абстракцию: ты не думаешь о градусах и углах, ты думаешь о намерениях. Мы реализовали три типа инструментов:
- Движение и навигация —
move_to(x, y, theta),look_at(object_name),follow_person(). - Манипуляции —
grasp(object_id),release(),place_on(surface). - Профили поведения —
set_profile('explorer'),set_profile('guide'),set_profile('idle').
Профили — это предустановленные наборы параметров (скорость, жёсткость, зона внимания). Например, в профиле guide робот двигается плавно, реагирует на голос, обводит рукой объекты. В explorer — быстрее, постоянно сканирует пространство, игнорирует голос, пока не окликнешь громко.
Как это выглядит на деле: сквозной пример
Допустим, у тебя стоит локальный LLM-агент (собранный по нашему руководству без облака). К нему подключён MCP-сервер Reachy Mini через стандартный транспорт (SSE или stdio).
Пользователь говорит: «Принеси мне синюю кружку со стола».
Агент:
- Распознаёт речь (Gemma 4 + Whisper, если локально, или облачный API).
- Парсит намерение: найти синий объект, подойти к столу, взять, вернуться.
- Вызывает цепочку инструментов:
look_for_color('blue')→locate_object('cup')→navigate_to(table)→grasp(object_id)→return_to(user). - Каждый шаг — вызов MCP Tool с валидацией параметров. Если кружка не найдена — возвращает ошибку и запрашивает уточнение.
При этом смена профиля происходит автоматически: перед захватом агент переключает профиль на precision (снижает скорость, увеличивает жёсткость), а после — обратно на guide.
Техническая реализация: от слов к MCP-серверу
На борту Reachy Mini работает Python-процесс, который регистрирует инструменты через библиотеку mcp (версия 1.8.3 на июнь 2026). Выглядит это так:
from mcp import Server, Tool
from reachy_sdk import ReachySDK
reachy = ReachySDK('localhost')
server = Server('reachy-controller')
@server.tool(description='Плавно повернуть голову в указанную сторону')
def turn_head(direction: str, speed: float = 0.3):
angles = {'left': -30, 'right': 30, 'center': 0}
reachy.neck.roll.goal_position = angles.get(direction, 0)
return f'Head turned {direction}'
server.run()Инструменты могут быть синхронными или асинхронными. Для длительных операций (например, навигация с препятствиями) лучше использовать асинхронные колбэки и прогресс-бары.
Не советую делать один гигантский инструмент «выполни команду». LLM-агенты работают лучше с атомарными, чётко описанными действиями. Разбивайте логику на шаги — это упрощает отладку и повышает надёжность.
Профили: как не дать роботу сойти с ума
Без профилей каждый вызов инструмента использует дефолтные параметры. На практике это бесит: медленный захват в одном сценарии и резкие дёргания в другом. Мы ввели три профиля, которые переключают не только моторы, но и режим CV-обработки (частоту кадров, зону интереса).
| Профиль | Скорость движений | Жёсткость серв | CV FPS | Пример команды |
|---|---|---|---|---|
| guide | 0.3x | low | 15 | «Покажи, где выход» |
| explorer | 0.8x | medium | 30 | «Осмотри комнату» |
| precision | 0.1x | high | 5 | «Возьми красный кубик» |
Профиль можно переключить отдельным инструментом, а можно внедрить его в описание других инструментов (через MCP-промпты). Агент сам решает, какой профиль нужен, исходя из контекста.
Сравнение с альтернативами
На рынке есть три способа управлять Reachy Mini (и подобными роботами) через ИИ:
- ROS + поведенческие деревья — классика, но требует написания Behaviour Tree XML. LLM туда не вставить без костылей. MCP проще: один сервер, один протокол.
- Самодельный Voice-to-Action пайплайн — часто люди пишут свой парсер команд (услышал «иди» — вызвал move). Это не масштабируется. MCP даёт готовый интерфейс, поддерживаемый всеми современными LLM-фреймворками (LangChain, Vercel AI SDK и т.д.).
- MCP для робота через OpenAI Function Calling — рабочий вариант, но требует постоянного интернета и платного API. Наш подход с локальным LLM (llama.cpp с MCP) полностью офлайн, что критично для промышленных задач.
Грабли, на которые мы наступили
Первая версия MCP-сервера для Reachy Mini была синхронной. LLM-агент ждал, пока робот доедет до точки, блокируя остальные вызовы. Пришлось переписать на asyncio и использовать send_progress() из MCP (добавлен в спецификацию 2025.2).
Вторая проблема — безопасность. Если LLM ошибётся и вызовет move_to() с невалидными координатами, робот может врезаться. Решение: валидация на сервере (ограничение рабочей области) и мягкие лимиты скорости в профиле по умолчанию.
Третья — латентность. Локальный LLM на Raspberry Pi 5 (который часто используют с Reachy) выдаёт токены медленно. MCP-сервер на самом Reachy работает быстро, но сетевой обмен с LLM (если он не на том же устройстве) добавляет задержку. Выход: запускать LLM на DGX Spark или другом NPU-ускорителе (собирали такого агента).
Кому это нужно (кроме гиков)
Интеграция MCP Tools в Reachy Mini полезна:
- Разработчикам прототипов — не нужно писать бэкенд для каждой команды. Один MCP-сервер покрывает 90% сценариев.
- Преподавателям робототехники — можно дать студентам задачу «научи робота реагировать на голос» без погружения в ROS.
- Интеграторам — MCP легко стыкуется с CRM, календарями, Webex.
- Ивент-компаниям — робот-экскурсовод переключает профили под разные экспонаты.
Любой, кто умеет писать Python на уровне «понимаю декораторы», осилит добавление нового инструмента. А если нужно больше — почти такой же подход работает для Spring-сервисов.
Совет напоследок
Не пытайтесь засунуть в MCP-инструмент всю логику управления роботом. Сделайте 5-10 атомарных инструментов, а агент пусть сам собирает из них цепочки. Для отладки цепочек используйте MCP Chat Studio v2 — это Postman для MCP, где можно пошагово проверить каждый вызов.
И да, через год такие штуки будут в каждом офисе. Начните сейчас, пока конкуренты пишут ROS-ноды.