esieabot-ai

../_images/esieabot-ai.png

esieabot-ai est une bibliothèque facultative qui permet d’utiliser facilement des fonctions de reconnaissance d’images sur son esieabot. Actuellement, elle permet de :

  • Détecter des cercles de couleur

  • Détecter et de localiser des marqueurs ArUco

Marqueur ArUco

../_images/ArUco.png

Les marqueurs ArUco sont des marqueurs simplistes utilisés notamment pour des applications de réalité augmentée. Chaque marqueur représente un nombre, dans le cas présent esieabot-ai reconnait les marqueurs ArUco de 4 cases par 4, en couvrant les nombres de 0 à 250. Grâce à un traitement d’image, la position et l’angle d’orientation des marqueurs est reconnu. Cela permet donc de géolocaliser l’esieabot dans l’espace en utilisant uniquement sa caméra. Vous pouvez générer des marqueurs sur ce site : https://chev.me/arucogen/.

Installation

Tout d’abord, vous devez brancher la caméra sur votre Raspberry Pi. Pour ce faire, suivez ces instructions :

Avertissement

Vous devez éteindre votre Raspberry Pi avant de brancher la caméra. Si vous ne le faites pas, vous endommagerez la caméra.

../_images/step-8a.png ../_images/step-8b.png ../_images/step-8c.png ../_images/step-8d.png

Connectez la caméra en écartant doucement la partie noire du connecteur, insérez le câble comme indiqué et remettez la partie noire en place. Faites de même du côté de la caméra si ce n’est pas déjà fait. Le côté noir du câble doit être orienté vers le capteur de la caméra.

Pour installer esieabot-ai, exécutez la commande suivate : sudo apt install esieabot-ai-api.

Note

esieabot-ai-api ne peut pas fonctionner en même temps qu’une autre application utilisant la caméra, comme par exemple esieabot-webcamera qui sera désinstallé automatiquement.

Test

Tester la détection de cercles de couleur

../_images/Circle.jpg

Vous pouvez tester la reconnaissance d’images en vous connectant à l’adresse suivante depuis votre navigateur internet : http://<adresse_de_votre_esieabot>/ai/get_image?r=255&g=0&b=0&tolerance=30 (attention à ne pas oublier la deuxième ligne)

  • Dans l’URL, les paramètres r, g et b correspondent à la couleur du cercle que vous voulez détecter. Par exemple, pour un cercle vert, vous pouvez mettre r=0, g=255 et b=0. Leurs valeurs doivent être comprises entre 0 et 255.

  • Dans l’URL, le paramètre tolerance correspond à la tolérance de détection de la couleur. Plus elle est élevée, plus les cercles qui ne sont pas exactement de la couleur demandée seront détectés. Sa valeur doit être comprise entre 0 et 255. Cependant, cela peut aussi faire que des objets d’une autre couleur soient détectés. Vous devrez faire des tests pour trouver les paramètres qui conviennent le mieux à votre utilisation.

Pour vous aider à trouver les bons paramètres, vous verrez les valeurs RGB du cercle détecté dans l’image. Vous devriez essayer différents éclairages et angles pour trouver les meilleurs paramètres pour votre cas d’usage.

Tester la détection de marqueurs ArUco

Vous pouvez tester la reconnaissance d’images en vous connectant à l’adresse suivante depuis votre navigateur internet : http://<adresse_de_votre_esieabot>/ai/get_image

Note

L’adresse de votre esieabot est son adresse IP que vous pouvez obtenir avec la commande ip a. Si vous êtes connecté à son hotspot, l’adresse est toujours 10.42.0.1. Sinon, vous devez regarder l’adresse ip de votre robot sur votre réseau. Si vous possédez un esieabot avec un écran, vous pouvez également voir l’adresse IP sur l’écran.

Pour connaître les détails des marqueurs ArUco qui sont détectés, vous pouvez ouvrir la page suivante : http://<adresse_de_votre_esieabot>/ai/get_markers. Par défaut, vous obtiendrez les informations pour des marqueurs de 51mm de côté. Si vous souhaitez spécifier une taille différente, vous devez rajouter « ?marker_size_mm= » puis la taille en millimètres du marqueur à la fin de l’URL.

Avertissement

Il n’est pas possible d’utiliser en même temps la fonction get_image et les autres fonctions de détection. Vous ne pouvez donc pas afficher ce que voit la caméra et en même temps demander la liste des marqueurs ou cercles.

Note

Il faut environ 150ms (sur Raspberry Pi Zero 2W) ou 300ms (sur Raspberry Pi Zero W) pour traiter une image complète. Il faut prendre en compte dans vos programmes que le traitement n’est pas instantané.

Débogage

Si les tests ne fonctionnent pas, vous pouvez vous rendre dans le dossier /esieabot/logs pour y trouver un fichier esieabot-ai-api.py.log. Ce fichier contient des messages d’erreurs qui pourraient sûrement vous intéresser. Si il n’existe pas, c’est qu’esieabot-ai n’est pas installé correctement. Dans tous les cas, si l’application ne fonctionne pas c’est vraissemblablement car vous avez une autre application qui monopolise la caméra.

Si la reconnaissance d’image ne fonctionne pas, vous pouvez exécutez la commande libcamera-still --list-cameras afin de voir si la caméra est bien reconnue par le système.

Utilisation en C

Détection de cercles de couleur

Vous pouvez utiliser la bibliothèque esieabot-ai pour trouver un cercle de couleur directement dans un programme C comme ceci :

#include "esieabot-ai.h"
#include <stdio.h>
#include <stdlib.h>

int main() {
    while (1) { // Boucle infinie du programme
        struct circle *c = get_circle(255, 0, 0, 30); // Recherche d'un cercle rouge avec une tolérance de +/- 30
        if (c->found) // Si un cercle a été trouvé...
            printf("Cercle rouge trouvé: x=%d y=%d diamètre=%dpx\n", c->x, c->y, c->diameter);
        free(c);
    }
    return 0;
}

Ce programme simple va en boucle interroger esieabot-ai afin de détecter la présence d’un cercle qui correspondrait aux critères spécifiés. Pour le compiler, il faut ajouter -lesieabot-ai -lcurl à la commande de compilation.

Détection de marqueurs ArUco

Vous pouvez utiliser la bibliothèque esieabot-ai pour trouver des marqueurs ArUco directement dans un programme C comme ceci :

#include "esieabot-ai.h"
#include <stdio.h>
#include <stdlib.h>

int main() {
    while (1) { // Boucle infinie du programme
        struct marker *markers = get_markers(51); // Récupération des marqueurs de 51mm de côté (à modifier en fonction de vos marqueurs !)
        struct marker *m;
        for (m = markers; m->id != -1; m++) { // Pour tous les marqueurs trouvés...
            printf("Marqueur trouvé: numéro %d à %dcm de distance. x=%d y=%d\n", m->id, m->z, m->x, m->y);
        }
    }
    return 0;
}

Ce programme simple va en boucle interroger esieabot-ai afin de récupérer la liste des marqueurs sous forme de tableau et d’itérer dedans. Pour le compiler, il faut ajouter -lesieabot-ai -lcurl à la commande de compilation.

Utilisation en Python

Vous pouvez également utiliser la bibliothèque esieabot-ai en python. Cependant, vous aurez a faire une requête par vous même. Pour cela, il faut importer en premier lieu la bibliothèque requests.

import requests

# Recherche d'un cercle rouge avec une tolérance de +/- 30
response = requests.get('http://127.0.0.1:5001/get_circle?r=255&g=0&b=0&tolerance=30').json()

if response["found"]:
    print("Cercle rouge trouvé: x={} y={} diamètre={}px".format(response["x"], response["y"], response["diameter"]))

Ce programme va faire une requête pour trouver un cercle rouge avec une tolérance de +/- 30. Si un cercle est trouvé, les informations à son sujet sont affichées.

import requests
import math

# Marqueurs de 51mm de côté. A modifier en fonction des marqueurs que vous utilisez.
response = requests.get('http://127.0.0.1:5001/get_markers?marker_size_mm=51').json()

for marker in response["markers"]:
    distance = math.sqrt(marker["x"] ** 2 + marker["y"] ** 2 + marker["z"] ** 2)
    print("Marker found: number {} at {}cm distance. x={} y={} z={}".format(marker["id"], distance, marker["x"], marker["y"], marker["z"]))

Ce programme va, comme dans l’exemple en C, récupérer la liste des marqueurs, mais sous la forme d’un dictionaire. Le programme va ainsi itérer dedans pour chaque élément.

Structures

  • circle est une structure qui contient les champs suivant :
    • int found est à 1 si un cercle a été trouvé, 0 sinon

    • int x est la position du cercle sur l’axe X en pixel

    • int y est la position du cercle sur l’axe Y en pixel

    • int diameter est le diamètre du cercle en pixel

  • marker est une structure qui contient les champs suivant :
    • int id est l’id du marqueur

    • int x est sa position sur l’axe X en cm

    • int y est sa position sur l’axe Y en cm

    • int z est sa position sur l’axe Z en cm

    • int pitch est sa rotation (axe tangage) en degré

    • int roll est sa rotation (axe roulis) en degré

    • int yaw est sa rotation (axe lacet) en degré

Les angles sont renvoyés en degrés, entre -180 et 180.

Note

Un marqueur aligné perpendiculairement à la camera aura un roll (roulis) de 180° mais un pitch (tangage) et un yaw (lacet) de 0°

Orientation

../_images/yaw-pitch-roll.png