Robotique & IA — Projet Personnel

ORION V7

Robot IA conversationnel autonome sur Raspberry Pi 5 + Hailo 8L (13 TOPS), piloté par Gemini Multimodal Live en audio natif bidirectionnel. Il voit, écoute, parle, reconnaît les visages et se déplace — le mouvement étant déclenché à la voix par tool calling.

Opérationnel · V7.1 Gemini Live (audio natif) Voix Leda Firmware V4.0 Visage V4 Python · Flask · Arduino Montseret, Aude

ORION n'est pas un assistant — c'est une personnalité. Une robot féminine de 25 ans, supérieure et condescendante-mais-drôle : elle se sait plus intelligente que les humains, les trouve attachants mais limités, et les chambre avec une moquerie hautaine (jamais méchante gratuitement), en répliques courtes et cinglantes. Elle vit à Montseret avec Mathieu, son créateur.

Un robot autonome, piloté à la voix

Tout tourne sur le Pi 5 : vision Hailo, serveur Flask, écran portrait et session Gemini Multimodal Live (WebSocket audio natif). On parle à Orion, elle répond en voix native Leda et, quand on lui demande de bouger, Gemini appelle l'outil move_robot qui commande l'Arduino. La mémoire est locale (SQLite sur le Pi) — plus aucune dépendance à un PC serveur. Une télécommande mobile (/control) et une config WiFi intégrée (/wifi) rendent le robot pilotable depuis n'importe quel téléphone du réseau.

Kiosk salon

Chromium plein écran sur /face et /dashboard : visage SVG V4 avec glow réactif à la voix, jauges CPU / charge / RAM et waveform audio, le tout sur l'écran 10.1" portrait.

Contrôle vocal (tool calling)

« Avance », « tourne à droite », « stop » → Gemini Live déclenche move_robot(direction)OrionRobot → Arduino série → moteurs. Vitesse et durée configurables (ORION_CMD_SPEED / ORION_CMD_DURATION_SEC).

Config sans clavier

Changement de réseau WiFi depuis l'écran ou un téléphone via /wifi (scan + connexion nmcli). Sur le visage kiosk, un clic droit (souris de secours) ouvre directement la page maintenance réseau.

Le Pi 5, le cloud, l'Arduino

┌──────────────────────────┐   série 115200   ┌────────────────────┐
│   Raspberry Pi 5 (8 GB)  │◄────────────────►│  Elegoo Mega 2560   │
│   + Hailo 8L (13 TOPS)   │                  │  2× BTS7960 (pont H)│
│                          │                  │  2× moteurs DC avant│
│  Flask :5000             │                  │  2× encodeurs Hall  │
│  Gemini Live (WebSocket) │                  │  PID V4.0 · WD 500ms│
│  Hailo YOLOv8s ~30 FPS   │                  └────────────────────┘
│  FaceID (Haar + cosine)  │
│  Mémoire SQLite LOCALE    │  WiFi / HTTPS   ┌────────────────────┐
│  Webcam C270 + micro USB │◄────────────────►│  Google Gemini API │
└──────────────────────────┘                  │  audio natif + tools│
  Écran 10.1" HDMI                            └────────────────────┘
  600×1024 portrait                        (Railway Hub / Cloudflare
  Chromium Kiosk                            Tunnel = accès distant, opt.)
Pi5 + Hailo Vision · Audio · Flask
Gemini Live Cerveau · Voix · Tools
Elegoo Mega Moteurs + PID

Hailo 8L — 13 TOPS

Détection d'objets

YOLOv8s accéléré hardware, ~30 FPS, 80 classes COCO traduites en français, seuil de confiance 0.55. Fallback CPU YOLOv8n si Hailo indisponible.

Reconnaissance faciale

Haar cascade + cosine similarity. Encodage 64×64 normalisé, vote majoritaire sur 3 frames consécutives. Seuil ≥ 0.88.

Détection du regard

3 états : looking_at_camera, looking_away, turned_away. Déclenche des réactions spontanées ("Eh, regarde-moi quand je te parle").

Analyse de scène

SceneAnalyzer : positions spatiales, activité humaine, tracking de mouvement, classification (bureau, cuisine, salon, extérieur). La description est injectée dans le system prompt de Gemini Live à chaque reconnexion — Orion « voit » ce qu'elle commente.

12 événements visuels

person_very_close, person_recognized, stranger_detected, person_approaching, looking_at_camera, person_staring… chacun avec cooldowns et priorités.

Vidéo vers Gemini

Envoi d'un JPEG à Gemini Live ~1×/s (ORION_LIVE_VIDEO) : Orion peut réagir à ce qu'elle voit en temps réel, en plus des événements visuels locaux. Cadence vision plafonnée (ORION_VISION_FPS) pour préserver la fluidité audio.

Gemini Live — audio natif, tool calling

Cerveau + voixgemini-3.1-flash-live-preview en mode Live : un WebSocket bidirectionnel où le micro est streamé en continu et Gemini répond en audio natif (pas de STT→texte→TTS). Voix native Leda (30 voix dispo, configurable via ORION_LIVE_VOICE).

Contrôle moteur vocalfunction calling : « avance », « tourne à droite », « stop » → Gemini appelle move_robot(direction)OrionRobot → Arduino. Un outil remember écrit aussi en mémoire.

Anti-écho — pour qu'Orion ne s'entende pas : mute micro pendant sa parole, post-speech guard 0.8 s, et seuil RMS. VAD réglée (start LOW / end HIGH, prefix 200 ms, silence 500 ms).

Mémoire persistante — SQLite locale sur le Pi (orion_memory.db) : prénoms, préférences, faits, compétences — aucune dépendance cloud pour la mémoire. STT Vosk offline conservé en fallback.

13 émotions

neutral happy joy sad angry surprised love suspicious thinking sleepy wink blink listening

Formes SVG multicouches du visage animé V4 — double lèvres à animation syllabique, glow réactif à la voix, 10 palettes couleur. L'expression suit l'état émotionnel piloté par le prompt de personnalité.

Une vraie attitude

Prompt de ton dédié : « condescendance élégante », hautaine mais pas méchante, répliques courtes et cinglantes, petits rires narquois. Orion connaît aussi son contexte système (heure, CPU, RAM, connexion) et s'interdit d'halluciner sur ce qu'elle voit.

Navigation autonome par vision Gemini

Stop-and-go — pas de LIDAR : l'évitement repose à 100 % sur la caméra frontale. Cycle : STOP → photo → décision Gemini (~1 s) → impulsion bornée → STOP. Orion ne roule jamais à l'aveugle et ne peut plus foncer dans un mur nu. Modèle lite (gemini-3.1-flash-lite).

Avance surveillée — pendant l'impulsion avant, une image fraîche est renvoyée à Gemini à mi-parcours : si un obstacle apparaît, l'avance est coupée tôt. Fini l'angle mort en cours de mouvement.

Récupération « vision bouchée » — nez au mur, l'image devient uniforme (peu de détail, std bas) même si elle est claire : Orion le détecte et recule pour se dégager, au lieu de se figer.

Anti-blocage encodeurs — impulsion commandée mais robot immobile (tapis, rainure) → escalade bornée : recul doux → recul fort → poussée max.

Modèle nav flash-lite
Latence ~1 s
Seuil « bouché » std<30
Avance 170 PWM
Virage 150 PWM
Recul 150 PWM

Triple watchdog anti-dérive

CoucheMécanismeDélaiAction
1. App PC/TéléphoneArrêt au relâchement des touchesImmédiatEnvoie STOP via API
2. Watchdog Pi (Flask)Thread daemon surveille l'activité /api/move600msEnvoie STOP via série
3. Watchdog ArduinoTimer firmware sans commande série500msbrakeAll() — freinage dur

Même si l'app PC se déconnecte totalement, le robot s'arrête en maximum 500ms.

Visage SVG V4 + télécommande

/face (V4)

Yeux SVG multicouches (fill dégradé, contour glow, highlight, halo), bouche organique double lèvres, 10 palettes par émotion. V4 = V3 + scan d'allumage au boot + glow réactif à la voix. Un clic droit ouvre la maintenance réseau.

/control — télécommande

Interface mobile : joystick tactile → différentiel L/R, slider vitesse, flux caméra MJPEG, chat texte, boutons STOP / mode / mute, stats temps réel. L'IP LAN est affichée sur le visage via une capsule QR.

/wifi + /dashboard

/wifi : scan et connexion réseau (nmcli) sans clavier. /dashboard : design "Porcelaine Divine" 600×1024, jauges CPU/charge/RAM, waveform audio. /splash : boot 6 modules avec progression.

Hardware embarqué

ComposantModèle
ComputeRaspberry Pi 5 (8GB)
NPUHailo 8L (13 TOPS)
Micro-contrôleurElegoo Mega 2560 + Screw Shield
Moteurs2× DC avant + 2× BTS7960 (pont en H)
Encodeurs2× rotatifs (ISR : INT5/INT4 gauche, INT0/INT1 droit)
CaméraWebcam USB Logitech C270 (+ micro intégré)
Écran10.1" HDMI 1024×600 (portrait 600×1024)
AudioMicro USB + haut-parleur (PipeWire)
RéseauWiFi (wlan0) — power-save désactivé

Boucles concurrentes

BoucleRôleFréquence
gemini_live (WebSocket)Audio natif bidirectionnel + tool calling move_robotContinu
vision_loop_backgroundCapture caméra + Hailo YOLOv8s + FaceID~30 FPS (plafonné 12)
gemini_nav_processNavigation autonome par vision Gemini (stop-and-go)cycle ~2–3 s
arduino_processTélémétrie Arduino + batterie2 s
_motor_safety_watchdogWatchdog moteur Pi-side5 Hz

Le tout dans un seul process Python : la cadence vision est plafonnée (ORION_VISION_FPS) pour éviter que le GIL et le lien USB partagé (micro + caméra sur la même C270) ne fassent saccader l'audio Live.

Endpoints Flask

Système

GET/api/statsTélémétrie complète
GET/api/boot_statusÉtat du boot
POST/api/shutdownÉteindre le Pi
POST/api/rebootRedémarrer le Pi

Voix & IA

POST/api/sayFaire parler Orion (texte → commande vocale)
POST/api/toggle_muteMode muet
POST/api/toggle_wakewordWake word on/off
POST/api/set_voiceChanger la voix TTS
GET/api/modelsModèles LLM disponibles
POST/api/set_modelChanger le modèle LLM

Vision & Visages

GET/api/visionStatut vision + dernière scène
GET/api/cameraSnapshot JPEG (+ /stream MJPEG)
GET/api/face_statusIdentité courante
POST/api/enroll_faceInscrire un visage
DEL/api/delete_faceSupprimer un visage

WiFi

GET/api/wifi/scanScanner les réseaux (nmcli)
POST/api/wifi/connectSe connecter à un réseau
GET/api/wifi/statusÉtat connexion (ssid, ip, internet)

Moteurs & Navigation

POST/api/moveMouvement différentiel
POST/api/stopArrêt immédiat
POST/api/rotateRotation sur place
GET/api/motor_statusMoteurs + encodeurs + mode
GET/api/drive_modeMode de conduite (manuel/autonome)
GET/api/pidÉtat PID
POST/api/pidConfigurer PID

Dépendances principales

PackageVersionUsage
Flask3.1.2Serveur web + API REST
websockets16.0Gemini Multimodal Live (audio natif)
PyAudio0.2.14Capture micro 16 kHz → Live
opencv-python4.13.0Vision, FaceID, Haar cascades
ultralytics8.4.12YOLO (fallback CPU du Hailo)
torch2.10.0Backend YOLO
numpy2.4.2Calculs vision + encodages
vosk / ollama0.3.45 / 0.6.1STT + LLM locaux (fallback)
psutil7.2.2Monitoring système

60 dépendances au total. Projet 100% portable — chemins relatifs, clés dans .env.

Orion Control

Interface IA locale pour piloter Orion — Electron + React + Tailwind

v2.1.1 Electron 39 React 19 Tailwind CSS 4 AppImage Linux

L'app de contrôle complète

💬 Chat IA

Conversation streaming avec modèles Ollama. Synthèse vocale Piper TTS, pièces jointes images, sauvegarde mémoire persistante, détection d'émotions.

🎭 Visage Neon 2D

Rendu Canvas 2D avec effets néon et particules. 9 émotions, yeux kawaii avec gaze tracking, sourcils 7 couches, bouche synchronisée avec la parole.

🎮 Contrôle robot

Joystick tactile pour pilotage temps réel via Wi-Fi. Modes Manuel / Autonome / Suivre. Watchdog serveur 500ms, stop retries (3 tentatives).

🧠 Mémoire persistante

SQLite intégrée (better-sqlite3). Catégories : conversations, préférences, faits, compétences. API REST complète avec tags et épinglage.

🖥️ Serveur & Proxy

Proxy Ollama sur port 11435. Proxy contrôle robot vers orion.local:5000. Endpoint TTS HTTP, interception LLM pour détection d'émotions streaming.

👁️ Vision

Analyse d'images via modèles multimodaux (LLaVA). Le Pi5 interroge /face/status (JSON) et rend le visage localement — plus de stream MJPEG.

Architecture Electron

┌─────────────────┐    /face/status     ┌──────────────────┐
│   Ce PC (GPU)   │ ←── poll JSON ──────│  Pi5 (rendu local)│
│  Electron + React│                     │  Écran 10.1"     │
│  Détection émotion│                    │  600×1024 portrait│
└────────┬────────┘                     └──────────────────┘
         │
    Proxy :11435
    ├── /api/chat    → Ollama :11434 (+ détection émotion)
    ├── /face/status → État expression (JSON polling)
    ├── /control/*   → orion.local:5000 (Flask API)
    ├── /tts         → Piper TTS
    └── /memory/*    → SQLite local
Electron 39 React 19 Vite 7 Tailwind CSS 4 Ollama Piper TTS better-sqlite3 electron-builder

Projet opensource disponible

Créé par Mathieu — Irkeedia. Base : Montseret, Aude — France.

Voir tous les projets