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 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

../_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/.

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 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