TUTO Tag Aruco et UART
Pour ce tuto vous devez d’abord faire celui du haut afin de pouvoir avoir la base du code.
Allumer PuTTY puis écrivez (pour coller faites un clic droit):
sudo passwd root
On va vous demander d’écrire un nouveau mot de passe afin de se connecter avec root pour avoir tous les droits sur votre Raspberry (si vous ne voyez pas le mot de passe s’écrire c’est normal)
Écrire :
su
Rentrer le mot de passe que vous venez d’ajouter.
Écrire ces lignes pour ne plus être connecté à Vigibot puis reboot la Raspberry:
systemctl disable vigiclient
reboot
Se reconnecter puis écrire :
su
(il faut remettre le même mot de passe)
Écrire :
cd /usr/local/vigiclient/opencv
nano aruco/main.cpp
En dessous des include ajouter :
#include <string>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#include <unistd.h>
Après:
Ptr<Dictionary> dictionary = getPredefinedDictionary(DICT_6X6_50);
Écrire :
int serial_port = open("/dev/ttyAMA0", O_RDWR);
struct termios tty;
tty.c_cflag &= ~PARENB;
tty.c_cflag &= ~CSTOPB;
tty.c_cflag &= ~CSIZE;
tty.c_cflag |= CS8;
tty.c_cflag &= ~CRTSCTS;
tty.c_cflag |= CREAD | CLOCAL;
tty.c_lflag &= ~ICANON;
tty.c_lflag &= ~ECHO;
tty.c_lflag &= ~ECHOE;
tty.c_lflag &= ~ECHONL;
tty.c_lflag &= ~ISIG;
tty.c_iflag &= ~(IXON | IXOFF | IXANY);
tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL);
tty.c_oflag &= ~OPOST;
tty.c_oflag &= ~ONLCR;
tty.c_cc[VTIME] = 10;
tty.c_cc[VMIN] = 0;
cfsetispeed(&tty, B9600);
cfsetospeed(&tty, B9600);
Aller dans la boucle while et mettez cette ligne en commentaire avec // ;
drawAxis(image, cameraMatrix, distCoeffs, rvecs[i], tvecs[i], 0.05);
Cela permet d’afficher les vecteurs lorsque nous somme connecter à Vigibot, ici ça ne nous sert donc à rien.
A coter du for ajouter une accolade {
En dessous écrire :
string c11 = to_string(corners[0][0].x) + " ";
string c12 = to_string(corners[0][0].y) + " ";
string c21 = to_string(corners[0][1].x) + " ";
string c22 = to_string(corners[0][1].y) + " ";
string c31 = to_string(corners[0][2].x) + " ";
string c32 = to_string(corners[0][2].y) + " ";
string c41 = to_string(corners[0][3].x) + " ";
string c42 = to_string(corners[0][3].y) ;
Pour calculer les coordonnées des coins du Tag Aruco.
Pour afficher ces coordonnées il faut toutes les écrire sur une seule ligne :
string msg = "id " + to_string(i) + " = " + to_string(ids[i]) + "/ " + "X1 "+c11+ "Y1 "+c12+ "X2 "+c21+ "Y2 "+c22+ "X3 "+c31+ "Y3 "+c32+ "X4 "+c41+ "Y4 "+c42 + "\n\r";
En dessous écrire :
int n = msg.length();
char char_array[n + 1];
strcpy(char_array, msg.c_str());
write(serial_port, char_array, n);
}
Attention à ne pas oublier l’accolade à la fin.
En dessous mettre en commentaire :
writeModem(fd, telemetryFrame);
et
fwrite(image.data, size, 1, stdout);
Sinon vous on ne voit rien sur le port Série.
Faites CTRL + X afin d’enregistrer et fermer.
Pour que le programme compile faites :
./make.sh
Maintenant connecter votre Raspberry à votre ordinateur (ou à un Arduino par exemple)
Attention si vous souhaiter vous connecter à un Arduino il vous faut un convertisseur de niveau logique sinon vous aller cramer votre Raspberry.
Pour se connecter à l’ordinateur il vous faut un convertisseur usb uart.
Brancher 3 fils au convertisseur, un sur Tx, un sur Rx et un sur Gnd.
Brancher le fil Rx sur le Tx, le fil Tx sur le Rx et le Gnd sur le Gnd (Ground) sur la Raspberry
Brancher le tout à votre PC en USB.
Il faut trouver sur quel port se trouve la connexion.
Si vous avez l’IDE Arduino aller dans Outils puis Port.
Sinon dans la barre de recherche de Windows chercher gestionnaire de périphériques puis cliquer sur ports, le numéro se trouve à coter de COM (ici COM9)
Ouvrez à nouveau PuTTY (sans fermer l’autre fenêtre) en faisant clic droit sur l’icône du logiciel puis cliquer sur PuTTY.
Cliquer sur Serial.
Rentrer le numéro de votre port dans Serial line.
Cliquer sur Open, si une fenêtre noire s’affiche c’est que ça c’est bien ouvert.
Retourner sur la première fenêtre de PuTTY et écrire :
aruco/bin
Maintenant mettez un Tag Aruco devant votre caméra et regarder ce qui se passe sur le moniteur série.
Si rien ne s’affiche c’est que vous avez oublié quelque chose, relisez bien votre code ou que le Tag Aruco n’est pas de la bonne dimension (ici 6X6).
Faire CTRL + C pour arrêter le code.
Ce code permet d’afficher les coordonnées des 4 coins du Tag Aruco, nous allons voir maintenant pour calculer les longueurs du Tag Aruco et la position de son centre.
Revenir sur le code avec nano aruco/main.cpp
Mettre cette ligne en commentaire :
//string msg = "id " + to_string(i) + " = " + to_string(ids[i]) + "/" + c11+ c12+ "|" + c21+ c22+ "|" + c31+ c32+ "|" + c41+ c42 + "\n\r";
Au dessus écrire :
string coordcentrex = to_string((corners[0][0].x+corners[0][1].x+corners[0][2].x+corners[0][3].x)/4);
string coordcentrey = to_string((corners[0][0].y+corners[0][1].y+corners[0][2].y+corners[0][3].y)/4);
string dist1 = to_string(sqrt(pow(corners[0][0].x-corners[0][1].x,2)+pow(corners[0][0].y-corners[0][1].y,2)));
string dist2 = to_string(sqrt(pow(corners[0][1].x-corners[0][2].x,2)+pow(corners[0][1].y-corners[0][2].y,2)));
string dist3 = to_string(sqrt(pow(corners[0][2].x-corners[0][3].x,2)+pow(corners[0][2].y-corners[0][3].y,2)));
string dist4 = to_string(sqrt(pow(corners[0][3].x-corners[0][0].x,2)+pow(corners[0][3].y-corners[0][0].y,2)));
En dessous écrire :
string msg1 = "id " + to_string(i) + " = " + to_string(ids[i]) + "/ " +"x_centre : "+coordcentrex+" y_centre : "+ coordcentrey + "\n\r";
string msg2 = "distance 1 : " + dist1 + " / distance 2 : " + dist2 + " / distance 3 : " + dist3 + " / distance 4 : " + dist4 + "\n\r\n";
string msg = msg1+msg2;
Sauvegarder et fermer avec CTRL + X
Faites ./make.sh puis aruco/bin
Remettre un Tag Aruco devant la caméra et regarder le moniteur série.
Si tout marche vous pouvez maintenant envoyer des données de votre Raspberry vers un autre système. Mais si vous voulez un système plus optimisé pour ensuite utiliser ces données sur un Arduino par exemple il faut envoyer les données autrement.