Aller au contenu

IA & Robotique đŸ€– : Piloter l'Esieabot via le protocole MCP

Photo de l'esieabot

L’Esieabot est le robot pĂ©dagogique emblĂ©matique de l’ESIEA. BasĂ© sur un micro-ordinateur Raspberry Pi, il est le terrain d’expĂ©rimentation privilĂ©giĂ© pour l’apprentissage de l’électronique, du rĂ©seau et de la programmation systĂšme.

Traditionnellement, un robot se pilote via une tĂ©lĂ©commande ou un script prĂ©-enregistrĂ©. L’objectif de ce projet est de briser cette barriĂšre : permettre Ă  une Intelligence Artificielle (Claude) de “prendre possession” du robot pour exĂ©cuter des ordres complexes donnĂ©s en langage naturel.


Le Model Context Protocol (MCP) est une innovation majeure introduite par Anthropic.

GrĂące au MCP, l’IA ne se contente pas de “parler” du robot : elle peut interroger ses capteurs et actionner ses moteurs en comprenant d’elle-mĂȘme les capacitĂ©s du matĂ©riel.

GIF repris du site https://medium.com/@the_manoj_desai/model-context-protocol-mcp-clearly-explained-7b94e692001c

Pour ce projet, j’ai implĂ©mentĂ© une architecture dite “embarquĂ©e”. Le but Ă©tait de faire tourner le serveur MCP directement sur le Raspberry Pi du robot, plutĂŽt que d’avoir un serveur externe sur un PC qui communiquerait avec le robot via SSH ou une API.

┌─────────────────────────────────────────────────────────────────────────┐
│ ARCHITECTURE A — MCP SUR LE PI │
├──────────────────────────────────────────────────────────────────────────
│ │
│ Votre PC Raspberry Pi │
│ ┌───────────────┐ HTTP (port 8000) ┌──────────────────┐ │
│ │ Claude │ ◄─────────────────────â–ș │ Serveur MCP │ │
│ │ Desktop │ JSON-RPC 2.0 │ (server.py) │ │
│ │ (client MCP) │ │ │ │ │
│ └───────────────┘ │ â–Œ │ │
│ │ ┌────────────┐ │ │
│ │ │ pigpiod │ │ │
│ │ │ (GPIO) │ │ │
│ │ ├───────────── │ │
│ │ │ Moteurs │ │ │
│ │ │ Servos │ │ │
│ │ │ CamĂ©ra │ │ │
│ │ └────────────┘ │ │
│ └──────────────────┘ │
│ │
│ ✅ Tout est sur le robot, autonome │
│ │
└─────────────────────────────────────────────────────────────────────────┘

En plaçant le serveur MCP directement sur le Raspberry Pi du robot, celui-ci devient une entité intelligente indépendante sur le réseau. Je trouvais cette architecture plus fun !


Le code a Ă©tĂ© conçu pour ĂȘtre robuste et facile Ă  maintenir, en sĂ©parant strictement chaque fonction vitale du robot :

  1. Pilotage Moteur (motors.py) : Gestion des dĂ©placements (Avancer, tourner, s’arrĂȘter).
  2. Vision Artificielle (camera.py) : Capture de preuves visuelles et transmission à l’IA.
  3. Systùme Nerveux (server.py) : Le serveur MCP qui fait le pont entre le code Python et l’IA Claude.
  • RĂ©pertoiremcp-esieabot/
    • .gitignore
    • pyproject.toml ← Auto-dĂ©tection pigpio (stub / local / remote)
    • server.py ← Serveur MCP principal
    • RĂ©pertoirelivrable/ ← Contient les photos “livrable” pour notation
      • 

    • RĂ©pertoirerobot/
      • __init__.py ← Auto-dĂ©tection pigpio (stub / local / remote)
      • motors.py ← ContrĂŽle des moteurs
      • servos.py ← ContrĂŽle des servomoteurs
      • camera.py ← Capture photo (locale ou SSH)
      • stub.py ← Faux pigpio pour dev local (PC)
    • README.md

Un point d’honneur a Ă©tĂ© mis sur la sĂ©curitĂ© physique. En robotique, un bug logiciel peut entraĂźner un dommage matĂ©riel. J’ai utilisĂ© le mĂ©canisme de lifespan pour garantir qu’en cas de dĂ©connexion ou d’erreur, les moteurs se coupent instantanĂ©ment (Fail-Safe).


5. L’IA au cƓur du robot : Comment Claude comprend-il le MCP ?

Section intitulĂ©e « 5. L’IA au cƓur du robot : Comment Claude comprend-il le MCP ? »

Le catalogue d’outils : La clĂ© de l’intelligence physique

Section intitulĂ©e « Le catalogue d’outils : La clĂ© de l’intelligence physique »

L’IA utilise le dĂ©corateur @mcp.tool() pour dĂ©couvrir le “catalogue” des fonctions du robot. Elle ne voit pas du code, mais une description structurĂ©e (JSON-RPC) qui lui indique : “Voici comment faire avancer le robot et quels paramĂštres utiliser.” Voici quelques outils disponible sur l’esieabot :

Quelques outils disponible sur le robot

Rien de mieux qu’un exemple pour bien comprendre le fonctionnement d’une technologie.

@mcp.tool()
def identify(verbose: bool = False) -> str:
"""Retourne les informations d'identification du robot."""
import socket
import platform
info = f"esieabot — {socket.gethostname()}"
if verbose:
info += f"\n OS: {platform.platform()}"
if platform.system() == "Linux":
import subprocess
uptime = subprocess.check_output(["uptime", "-p"]).decode().strip()
ip = subprocess.check_output(["hostname", "-I"]).decode().strip().split()[0]
info += f"\n IP: {ip}"
info += f"\n Uptime: {uptime}"
else:
info += f"\n IP: {socket.gethostbyname(socket.gethostname())}"
info += "\n Uptime: N/A (Windows)"
return info

L’outil identify illustre parfaitement la philosophie du protocole MCP :

  1. Exposition dynamique : GrĂące au dĂ©corateur @mcp.tool(), la fonction est automatiquement enregistrĂ©e dans le catalogue de capacitĂ©s du robot. Claude “dĂ©couvre” alors l’existence de cette commande et sa documentation sans aucune configuration manuelle.
  2. GranularitĂ© des donnĂ©es : L’utilisation du paramĂštre verbose permet Ă  l’IA de choisir le niveau de dĂ©tail souhaitĂ©. En mode standard, elle obtient le nom du robot ; en mode dĂ©taillĂ©, elle rĂ©cupĂšre des informations critiques pour l’administration systĂšme (IP, OS, Uptime).
  3. Abstraction matĂ©rielle : Le code reste simple, mais sa portĂ©e est immense : il transforme des donnĂ©es systĂšme brutes en une rĂ©ponse structurĂ©e que l’IA peut interprĂ©ter pour diagnostiquer l’état du rĂ©seau ou de la machine.

C’est cette simplicitĂ© de mise en Ɠuvre qui fait du MCP un standard redoutable pour l’IoT et la robotique.

Notre robot est Ă©quipĂ© d’une camĂ©ra compatible CSI, offrant une rĂ©solution de 8MP. Pour capturer une photo, j’utilise la bibliothĂšque libcamera-still en subprocess qui interagit directement avec le matĂ©riel de la camĂ©ra.

import subprocess
from pathlib import Path
from datetime import datetime
class CameraController:
def __init__(self, capture_dir: str = "/tmp/esieabot_captures"):
self.capture_dir = Path(capture_dir)
self.capture_dir.mkdir(parents=True, exist_ok=True)
def capture(self) -> dict:
"""Prend une photo et renvoie le chemin du fichier."""
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"capture_{timestamp}.jpg"
filepath = self.capture_dir / filename
try:
subprocess.run([
"libcamera-still",
"-o", str(filepath),
"--width", "640",
"--height", "480",
"-t", "500",
"--nopreview",
"--hflip",
"--vflip"
], check=True, capture_output=True, timeout=15)
if not filepath.exists():
return {"status": "error", "message": "Le fichier n'a pas été créé."}
return {
"status": "success",
"path": str(filepath.absolute())
}
except Exception as e:
return {"status": "error", "message": str(e)}

Claude, dĂ©veloppĂ© par Anthropic, est une IA de nouvelle gĂ©nĂ©ration conçue pour ĂȘtre plus sĂ»re et plus contrĂŽlable que les modĂšles prĂ©cĂ©dents. GrĂące au protocole MCP, Claude peut interagir avec le robot de maniĂšre intelligente, en comprenant les capacitĂ©s du matĂ©riel et en adaptant ses commandes en fonction du contexte. Voici comment installer le client MCP sur votre machine pour communiquer avec le robot :

  1. Naviguer jusqu’au fichier claude_desktop_config.json dans le rĂ©pertoire \AppData\Local\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude sur Windows
  2. Ajouter la configuration suivante pour le client MCP :
"mcpServers": {
"esieabot": {
"command": "npx",
"args": [
"mcp-remote",
"http://192.168.1.105:8000/mcp",
"--allow-http"
]
}
}
  1. Redémarrer Claude Desktop pour que les changements prennent effet.

7. Le déploiement sur le Raspberry Pi 0 : Un défi de taille (mémoire)

Section intitulée « 7. Le déploiement sur le Raspberry Pi 0 : Un défi de taille (mémoire) »

Le dĂ©ploiement du serveur MCP sur le Raspberry Pi 0 a Ă©tĂ© l’étape la plus complexe du projet. Avec seulement 512 Mo de RAM, le Pi 0 est un matĂ©riel trĂšs limitĂ©, et les bibliothĂšques modernes utilisĂ©es par le SDK MCP sont gourmandes en ressources.

Mis Ă  part cela, l’installation a Ă©tĂ© relativement fluide, et le serveur MCP a pu ĂȘtre lancĂ© sans encombre sur le Pi 0, dĂ©montrant ainsi la viabilitĂ© de l’architecture choisie.

Voici une vidĂ©o de dĂ©monstration du robot en action, exĂ©cutant des commandes donnĂ©es par l’IA Claude via le protocole MCP :

Ce projet a Ă©tĂ© un vĂ©ritable exercice d’ingĂ©nierie sous contrainte. Sur un matĂ©riel aussi modeste que le Raspberry Pi 0, chaque outil (tool) ajoutĂ© consomme des ressources critiques.

J’ai dĂ» mener une rĂ©flexion approfondie sur le choix des outils Ă  implĂ©menter :

  • Optimisation du catalogue : PlutĂŽt que de multiplier les fonctions lourdes, j’ai privilĂ©giĂ© des outils “atomiques” et lĂ©gers pour ne pas saturer le processeur lors de l’analyse de Claude.
  • RĂ©duction de la latence : Chaque import Python a Ă©tĂ© scrutĂ© pour garantir que le robot rĂ©ponde en temps rĂ©el. Un catalogue trop chargĂ© aurait rendu l’interaction avec l’IA saccadĂ©e ou instable.

Conclusion : Ce projet dĂ©montre que l’IA physique est possible, mĂȘme sur du matĂ©riel “low-cost”, Ă  condition de faire des choix d’architecture cohĂ©rents. En cybersĂ©curitĂ©, cette capacitĂ© Ă  optimiser des systĂšmes contraints est une force pour dĂ©ployer des solutions de terrain agiles et autonomes. Ressources du projet :

  • Lien vers le code source (GitLab)
  • Cours de SĂ©bastien LARINIER & Antoine LEBLANC (un grand merci Ă  eux pour leur enseignement inspirant et ce projet passionnant !)