esieabot-ai
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
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.
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
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
circleest une structure qui contient les champs suivant :int foundest à 1 si un cercle a été trouvé, 0 sinonint xest la position du cercle sur l’axe X en pixelint yest la position du cercle sur l’axe Y en pixelint diameterest le diamètre du cercle en pixel
markerest une structure qui contient les champs suivant :int idest l’id du marqueurint xest sa position sur l’axe X en cmint yest sa position sur l’axe Y en cmint zest sa position sur l’axe Z en cmint pitchest sa rotation (axe tangage) en degréint rollest sa rotation (axe roulis) en degréint yawest 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