Intelligence embarque IMA5 2022/2023 G5

De Wiki d'activités IMA
Révision datée du 6 janvier 2023 à 12:41 par Akhalaf (discussion | contributions) (Librairie et STM32CUBE)

Contrôle gestuel pour la domotique

Présentation

L'idée consiste à développer une IA embarquée sur un microcontrôleur STM32 capable de reconnaître des gestes fixes sans mouvements de main, dans le but de contrôler certrain des systèmes domotiques.
En effet, dans le contexte sanitaire actuel (Covid), il serait intéressant de développer des systèmes de contrôle sans contact, pour éviter la propagation du virus. Par exemple, ouverture de porte, allumage des lumières, commander un ascenseur dans un environnement public ou hospitalier.
On pourrait aussi imaginer une application plus domestique à destination du grand public, qui controlerait une ampoule à variateur d'intensité, où notre système permettrait d'allumer, d'éteindre et de faire varier l'intensité de l'ampoule.

Gestes à implémenter

Pour l'environnement hospitalier

  • Main ouverte pour allumer l'ampoule
  • Poing fermé pour éteindre l'ampoule
  • Signe OK avec le pouce et l'index pour l'ouverture/fermeture de porte
  • Numérotation de l'étage souhaité avec les doigts pour l'ascenseur


Pour la domotique (ampoule à variateur)

  • Main ouverte pour allumer l'ampoule
  • Poing fermé pour éteindre l'ampoule
  • Pouce vers le haut pour augmenter l'intensité
  • Pouce vers le bas pour diminuer l'intensité

PoC

Pour la démonstration, l'idée pour le moment serait à minima de pouvoir contrôler l'allumage et l'extinction d'une LED.
Si c'est possible, nous afficherons dans un terminal le geste detecté pour pouvoir tester l'implémentation de plusieurs gestes.

Réalisation

Récupération d'un dataset avec le capteur ToF

Prise en main des outils logiciel

La première étape a été de prendre en main le kit STM32 Nucleo+Expansion board (capteurs ToF 8x8). Sous STM32Cube IDE, nous avons donc récupéré le code fourni, l'avons compilé puis nous avons téléversé l'exécutable sur le microcontrôleur.
Une fois l'exécutable fonctionnel sur la board, nous scrutons grâce à l'utilitaire minicom la liaison série, les données récupérées par les capteurs. Ces données sont affichées sous la formes d'une matrice 8x8, où les valeurs sont séparées par le caractère suivant : |.
Dans un second temps, nous nous sommes penchés sur la préparation des données pour notre application, où nous avons choisi de les classer sur un axe de taille de 64 valeurs (0 à 63), puisque la forme matricielle n'est pas utile dans notre cas.
Pour cela, nous avons modifié la fonction print_result dans le fichier app_x-cube-tof.c d'une manière que les délimiteurs soient le caractéres ;.
La modification du code est faite sous STM32Cube IDE. Sous NanoEdge, nous avons vérifié la bonne réception des signaux (des valeurs des capteurs); où ces derniers repectent bien la forme attendues.

Expérimentation

Dans un second temps, nous avons choisi d'enregistrer 3 signaux : le signe OK, le signe main ouverte, et le signe poing fermé. Après l'optimisation du dataset durant la phase de benchmarking, l'objectif était de vérifier si notre librairie ainsi construite remplissait son rôle, c'est à dire réussir à identifier les 3 gestes choisis.
Nous avons à ce stade rencontré plusieurs problèmes et pu identifier certaines erreurs à éviter :

  • Tout d'abord, lors de la phase d'émulation de la librairie pour vérifier la pertinence du dataset, il ne nous était pas possible de traiter des données récupérées en temps réel par le port USB, à cause d'une erreur de formattage des données. Nous avons pour cela dû changer le séparateur (le point virgule posait problème), et modifier quelque peu la fonction de print série
  • Ensuite, nous avons remarqué l'intérêt de prendre à minima une centaine de valeur pour avoir

Pas pertinent de faire plusieurs angles et plusieurs distances pour chaque signe car porte à confusion le modèle. Passage en plus de camarade dans notre dos. Ca aurait été possible mais il aurait fallu prendre beaucoup plus de données. Nous avons donc réenregistrer plusieurs dataset prenant en compte ces remarques.

Voici quelques images qui montrent les gestes et les signes lors de la construction de notre modèle :

signe FIVE
signe POING
Enregistrement des signaux sous nanoEdge par liaison série



Test du modèle

Une fois que nous avons construit nos dataset, nous avons réalisé quelques quelques expériences pour savoir si notre modèle répond bien à nos attente. Sous NanoEdge, nous avons testé le modèle en lui faisant un geste précis. Le modèle était capable de connaître le modèle parmi ceux qui étaient enregistrés lors de la construction du dataset.

Librairie et STM32CUBE

Après tester le modèle, on déploie une librairie du NanoEdge, qui contient le modèle du ML le plus aproprié à notre exemple. Ensuite, vu le but de notre projet (réalisation), nous avons decidé d'allumer une LED, si le signe FIVE est fait, et de l'éttiendre si on lui présente le signe POING. Pour cela nous avons choisi la LED2 présente sur le Nucleo comme cible. Un algorithme en Langage C a été mis en place, pour agir sur l'état de la LED, selon le geste fourni au capteur. Cette implémentation était testée, et nous avons eu le bon résultat attendu, d'où nous garantissons le fonctionnement de notre système.

LED VERTE allumée suite au signe FIVE
LED VERTE étiente suite au signe POING


controle de la LED

Soutenance du travail

Résultats

Voici un lien vers la vidéo qui montre le fonctionnement du système : Média:demo_g5.mp4