Robot MCP Agent 协议
概念速览
- MCP (Model Context Protocol):Anthropic 提出的开放标准,让 LLM 安全访问外部工具 / 数据源
- 在机器人场景:把 ROS 2 话题 / 服务 / 参数变成 LLM 可调用的 tool
- 代表项目:Robot MCP Server、ROS-MCP
核心架构
┌─────────────┐ MCP ┌──────────────┐│ LLM Agent │ ◀──────────▶ │ MCP Server ││ (Claude, │ JSON-RPC │ (Python / ││ GPT, etc) │ │ TypeScript)│└─────────────┘ └──────┬───────┘ │ ROS 2 客户端 ▼ ┌──────────────┐ │ ROS 2 机器人 │ │ (节点 / 话题)│ └──────────────┘三大原语
| 原语 | 作用 | 机器人示例 |
|---|---|---|
| Tools | LLM 可调用的函数 | move_base, read_laser_scan, grasp_object |
| Resources | LLM 可读取的数据 | 地图、机器人状态、传感器历史 |
| Prompts | 预置提示模板 | 「巡检任务模板」「遥操作解释模板」 |
Python 示例 (基于 FastMCP)
from mcp.server.fastmcp import FastMCPimport rclpyfrom geometry_msgs.msg import Twist
mcp = FastMCP("ros2-robot")node = rclpy.node.Node("mcp_bridge")pub = node.create_publisher(Twist, "/cmd_vel", 10)
@mcp.tool()def move_base(linear: float, angular: float) -> str: """Move the robot base with linear (m/s) and angular (rad/s) velocity.""" msg = Twist() msg.linear.x = linear msg.angular.z = angular pub.publish(msg) return f"Base velocity set: linear={linear}, angular={angular}"
@mcp.resource("robot://state")def robot_state() -> str: """Current robot state as JSON.""" return json.dumps(get_current_odometry())典型应用
- 自然语言机器人控制:「帮我把这个箱子搬到 5 米外」
- 故障诊断 Agent:通过 MCP 读取 ROS 2 诊断话题,自动分析异常
- 多机器人协同:单个 LLM Agent 同时调用多个 MCP Server 控制机器人编队
- 遥操作辅助:LLM 把高层意图翻译成 ROS 2 消息
安全模型
- 白名单 actions:MCP server 仅暴露白名单操作
- 确认门控:危险动作(断电、卸力)必须 confirm
- 速率限制:高频命令 token bucket 限流
- 审计日志:所有调用写入 ROS 2 bag
与 ROS 2 工具对比
| 工具 | 目标 | 优势 |
|---|---|---|
| MCP | LLM ↔ 外部世界 | 通用、跨语言 |
| ROS 2 Service | 节点 ↔ 节点 | 低延迟、强类型 |
| ROS 2 Action | 长时间任务 | 进度反馈、可取消 |
| gRPC | 跨语言 RPC | 高性能、强类型 |
📋 复现条件
| 类别 | 必备 | 可选 / 备注 |
|---|---|---|
| 硬件 | ROS 2 主机 (x86_64) · 8GB RAM | 树莓派 5 (嵌入式 demo) |
| 操作系统 | Ubuntu 22.04 / 24.04 · ROS 2 Humble / Jazzy | macOS 14 |
| 软件版本 | Python 3.10+ · mcp Python SDK 1.0+ · ROS 2 已装 | Claude / GPT-4 API key |
| 网络 | 主机 ↔ LLM API 千兆网 | 本地 LLM (Ollama) |
| 账号 | Anthropic / OpenAI API key | 本地 Ollama (无 key) |
| 时间 | 装 MCP SDK 5 min · 写 server 30 min · 写 client 30 min · 跑通 demo 1 h | 完整集成 1 天 |
| 难度 | ⭐⭐ 入门 | 概念简单 |
| 前置知识 | ROS 2 基础 · Python async | LLM tool-call 概念 |
⛔ 别这么做 (Anti-patterns)
经验证的坑 —— 跳过 = 至少浪费半天,严重的烧板 / 锁机。
| ❌ 错误做法 | 💥 后果 | ⚠️ 风险 | 范围 |
|---|---|---|---|
| 不要在 Ubuntu 22.04 上 apt 装 ROS 2 Iron / Rolling | apt 源是滚动版 = 兼容性没保证。ROS 2 永远装 LTS 版 (Humble / Jazzy)。 | 🟡 | ROS 2 |
不要直接 pip install 全局包做机器人项目 | 系统 Python 升级 = 依赖破。永远用 venv / uv venv / pixi。 | 🟡 | LeRobot / ACT / OpenVLA 训练 |
| 不要把机械臂 / 移动机器人直接接到 12V 铅酸电池 | 反接 / 短路 = 烧控制板。永远先串 5A 保险丝再接。 | 🔴 | SO-100 / Mobile ALOHA / 自制机器人 |
不要在没看 dmesg / lsusb 前插 USB 设备并假设会被识别 | 插上没反应 = 没供电 / 没权限 / 没驱动。先 lsusb -t,再 sudo chmod 666 /dev/ttyUSB0。 | 🟢 | USB 相机 / 串口 / 飞控 |
| 不要让 micro-ROS 节点在没看门狗的情况下跑在真机上 | 死循环 = 整机失控,永远给嵌入式节点加 heartbeat 看门狗。 | 🔴 | micro-ROS / 飞控固件 |
| 不要直接拿 GitHub main 分支跑 Mobile ALOHA / LeRobot 训练 | main = 正在开发,可能 dataset format 改了 = 跑不通。锁 git checkout v0.4.0 标签。 | 🟡 | Mobile ALOHA / LeRobot |
| 不要在 LeRobot 训练时把 4K 视频存进 dataset | 4K 1 小时 ≈ 50GB,30 小时 = 1.5TB IO 瓶颈。先 ffmpeg -vf scale=640:480 降采样。 | 🟢 | LeRobot / ACT 数据采集 |
| 不要用 ROS_DOMAIN_ID=0 跑多机协同 | 0 = 默认域 = 任何人都能收到你的话题。多机实验 = 改 ID (0-232) + Foxy+。 | 🟢 | ROS 2 DDS |
🚨 风险总览 (Risk Matrix)
| 风险等级 | 含义 | 例子 |
|---|---|---|
| 🟢 低 | 改错可回滚 / 几分钟恢复 | pip 全局装包、DHCP IP 写死 |
| 🟡 中 | 需要重新刷机 / 重装 / 1-2 小时恢复 | 装错 ROS 2 版本、没 OTA 升级看版本 |
| 🔴 高 | 不可逆 / 烧板 / 安全风险 | 电池反接、micro-ROS 没看门狗、刷机中途断电 |