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 et de localiser des marqueurs ArUco. Elle est toujours en cours de développement.
Avertissement
Actuellement, la calibration de la mesure de la distance (axe Z) est faite, mais pas les autres axes. Vérifiez les mesures avant de les utiliser.
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/.
Avertissement
Pour le bon fonctionnement de la reconnaissance d’image, il est nécessaire que les marqueurs fassent très exactement 53mm de côté et qu’ils possèdent une petite bande blanche autour d’eux.
Installation
Pour installer esieabot-ai, exécutez simplement la commande suivate : sudo apt install esieabot-ai-api
.
Avertissement
esieabot-ai-api ne peut pas fonctionner en même temps qu’une autre application utilisant la caméra, comme par exemple esieabot-webcamera. Vous devez donc la désinstaller avec la commande sudo apt remove esieabot-webcamera avant de continuer.
Test
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.
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
Avertissement
Il n’est pas possible d’utiliser en même temps la fonction get_image et la fonction get_markers. Vous ne pouvez donc pas afficher ce que voit la caméra et en même temps demander la liste des marqueurs.
Note
Il faut environ 300ms pour traiter une image complète. Il faut prendre en compte ce délai dans vos programmes.
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.
Utilisation en C
Vous pouvez utiliser la bibliothèque esieabot-ai directement dans un programme C comme ceci :
#include <stdio.h>
#include <stdlib.h>
#include <esieabot-ai.h>
int main() {
while (1) {
marker *markers = get_markers();
while (markers->id != -1) {
printf("Marker found: number %d at %dcm distance. x=%d y=%d\n", markers->id, markers->z, markers->x, markers->y);
markers++;
}
}
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
à 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
import math
response = requests.get('http://127.0.0.1:5001/get_markers').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
marker
est une structure qui contient les champs suivant :int id
est l’id du marqueurint x
est sa position sur l’axe X en cmint y
est sa position sur l’axe Y en cmint z
est sa position sur l’axe Z en cmint 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°