Projet

Général

Profil

Actions

Lib yarp APP » Historique » Révision 1

Révision 1/25 | Suivant »
Frederic Elisei, 22/01/2025 16:59


Objectif

Pouvoir réaliser rapidement une maquette, en python, d'une interaction avec le robot Furhat, en faisant intervenir :
  • synthèse et reconnaissance de parole via Furhat
  • détection des interlocuteurs avec la caméra de Furhat
  • détection visuelle avec YOLO (cartes vues de dessus par exemple) et une caméra externe
  • gestion du regard/orientation de la tête vers les interlocuteurs ou les cartes détectées par YOLO
    On découpera l'application sous forme d'un automate réactif, en états simples.
    L'environnement d'exécution s'appuie aussi sur [www.yarp.com], pour permettre la répartition des tâches entre plusieurs machines (windows, Linux...) qui communiqueront par messages.

Squelette minimal :

On va s'appuyer sur lib_yarp_APP.py (et indirectement sur my_yarp.py) pour créer nos états et programmer les transitions et actions.

#! /usr/bin/env python3

# import app, furhat, State, AnyKeywords, yolo_center, yolo_target
from lib_yarp_APP import *

# create and run initial state, through its name
State("main")
app.run("main")

Gestion des évènements :

Les états, comme "main" dans l'exemple précédent, sont des objets, dérivés de la classe State ou d'une sous-classe. Les états doivent avoir des noms différents. Pour implémenter des réactions à des évènements, il faut qu'ils fournissent une implémentation de tout ou partie des prototypes :

do_in(self) appelée lorsqu'on rentre nouvellement dans l'état. Par exemple pour dire un message de bienvenue.
do_out(self) appelée lorsqu'on quitte l'état
do_reco(self, key, msg)
do_detect(self, data,yins,ydel)

on peut sous-classer State, ou attacher une méthode

class StateParrot(State):

  def do_reco(self,key,msg):
      app.say(msg)

StateParrot("repeat_as_parrot")
app.run("repeat_as_parrot")

Actions possibles

Dans un état, au moment où on y entre ou à réception d'un évènement, il est possible de générer certaines actions. On ne peut pas générer d'action régulière (idle), ou au bout d'un certain temps sans passer par ces évènements ou transitions. C'est un choix lié à la vitesse d'exécution sous Python et éviter de se retrouver avec beaucoup d'évènements en retard non traités.
Voici les actions possibles :

app.switch("etat2") prépare la transition vers un autre état. Elle ne sera pas instantanée, laissant aux évènements déjà en
app.sayNB("texte à prononcer") fait prononcer au robot le texte voulu. La suite du traitement des évènements va reprendre dès que la phrase commencera à être prononcée (NB = non blocking)
app.say("texte à prononcer") fait prononcer au robot le texte voulu. Attention, l'appel est bloquant et des évènements risquent de s'empiler dans la pile de traitement.
app.look("x y z",duration=X) demande au robot de regarder aux coordonnées correspondant à la chaine (str) en paramètre. Celle-ci peut être obtenue par yolo ou construite avec

Mis à jour par Frederic Elisei il y a 8 jours · 25 révisions