Aller au contenu

Smart Turret


L’objectif de ce projet est de construire une tourelle automatique et intelligente. Elle a pour mission d’être capable d’analyser une pièce en tournant sur elle-même, détecter et suivre les visages ainsi que tirer à l’aide d’un pistolet nerf par exemple. Nous utiliserons une carte Raspberry Pi 4B, une caméra RaspiCam V2 pour le traitement des images et deux servomoteurs pour orienter la tourelle.

Organisation du travail


Notre projet s’organise autour de deux axes:
Une partie mécanique : support de la caméra et des servomoteurs.
Une partie programmation : contrôle des servomoteurs et détection faciale.
Les codes et fichiers sont disponibles à travers ce lien : TourelleIA

Partie méca


La première étape du projet est de créer les parties supérieures et inférieures de ce qui consistera notre support. Dans un premier temps, nous faisons le choix de créer un prototype plus petit que la version finale afin de s’assurer de son bon fonctionnement.
Tout d’abord, nous nous contentons d’un seul axe de rotation. Le modèle imaginé consiste en un support suffisamment large pour être stable (première boîte sans fond) sur laquelle nous allons fixer l’axe du moteur qui entraîne la rotation de la caméra. La partie supérieure de la tourelle est aussi une boîte dans laquelle le premier moteur est fixé.
On crée donc une boîte à l’aide du logiciel INKSCAPE et des modèles enregistrés par défaut. Nous découpons ces pièces à l’aide de la découpeuse laser après avoir été formés. Au milieu de la face supérieure, nous faisons un petit trou pour y faire passer une vis. Cette vis est le lien entre les deux parties et termine sa course dans un servomoteur MG996R. Cela permet à la partie supérieure de tourner.
Afin d’éviter qu’elle ne tombe, nous ajoutons trois convoyeurs à bille de soutien. Cependant, la boite du dessous est trop petite pour accueillir ces roues. Nous devons alors refaire la refaire. Pour cela, nous utilisons de nouveau la découpeuse laser pour créer une boite de 15 cm de côté. Une fois réalisée, nous nous sommes rendu compte que la vis que nous utilisons n’est pas assez longue pour faire le lien entre les deux morceaux. Nous utilisons alors deux écrous mis en tension l’un contre l’autre. L’étape suivante est d’apporter une alimentation dans la boîte capable d’alimenter le moteur. Pour cela, nous utilisons quatre piles pour créer 6V de tension et alimenter correctement le servomoteur. Finalement, nous utilisons une carte Arduino Uno pour tester la rotation du moteur. Nous nous rendons compte alors que le moteur tourne mais n’entraîne pas la partie du haut. Il faut donc une pièce qui soit solidaire à la fois de l’axe du moteur et du support.
Nous nous basons sur un modèle 3D libre de droit trouvé sur internet que nous adaptons à notre usage (voir image modèle 3D). Une fois installée, cette pièce transmet bel et bien les efforts du moteur et permet de mettre en rotation la partie supérieure de la tourelle.
Cette pièce sert également d’axe pour la deuxième rotation.

Fig1 – Modèle 3D de l’axe moteur


Une fois notre premier essai effectué avec la carte raspberry et sa caméra simplement posées sur la partie supérieure, nous constatons que notre tourelle est capable de suivre le visage d’une personne en n’ayant qu’un seul axe de rotation. Nous avons créé de nouvelles pièces permettant d’accueillir la raspberry, de cacher le premier moteur et d’offrir un support au deuxième moteur qui permettra d’ajouter un autre axe de rotation (suivi vertical de la personne). Nous avons pu rapidement essayer la tourelle avec ses deux axes et constaté qu’elle arrivait à suivre une personne (pourvu qu’elle ne se déplace pas trop vite).

Pour garder un minimum d’esthétique, nous avons choisi de cacher le bloc d’alimentation à l’intérieur de la boîte pour cacher le maximum de fils possible, nous obligeant alors à faire un trou dans le dessus de la boîte. Cette décision nous a permis d’ajouter un interrupteur sur le côté pour n’alimenter les moteurs que lorsqu’on souhaite les utiliser.

Fig2 – Tourelle avec son design mécanique complet

Partie programmation


Niveau programmation, on utilise Python3. Plusieurs bibliothèques nous ont aidées dans le développement de la tourelle, à savoir:
OpenCV, pour la gestion du flux vidéo et la détection faciale.
RGPIO, pour la gestion des pins d’entrées et sorties de la carte et donc pour le contrôle des servomoteurs.

Pour la détection faciale, j’utilise le réseau de neurones le plus populaire en ce moment pour la détection faciale: le Haar Cascade, que l’on peut utiliser directement via OpenCV en le téléchargeant au format .xml. Le résultat de l’application de ce réseau au flux vidéo de la Raspicam est une liste de la forme [ x1, y1, w1, h1x2, y2, w2, h2, …, xn, yn, wn, hn ], où xi, yi, wi, hi représente un rectangle sur l’image, soit le rectangle de coin supérieur gauche (xi, yi), de largeur wi et hauteur hi. Ce rectangle est le résultat de la détection + localisation d’un visage sur une image, ainsi le visage détecté est compris dans le rectangle.
À noter que l’existence de plusieurs xi, yi, wi, hi implique que le réseau est capable de détecter plusieurs visages sur une même image. D’où le premier problème: Si le réseau détecte plusieurs visages, lequel doit être visé par la tourelle ? Ce problème est résolu simplement en évaluant la surface du rectangle issue de la détection, le rectangle ayant la plus grande surface sera la cible de la tourelle.
Ensuite, on extrait la différence en pixel entre le centre de l’image et le centre du rectangle ciblé. De cette manière nous avons un vecteur Diff = (diffx, diffy), qui nous sert pour le contrôle des servomoteurs.
Enfin, si la valeur d’un des éléments du vecteur Diff est plus grande qu’un certain seuil haut (shaut), alors les servomoteurs s’actionnent pour réduire cette valeur jusqu’à un seuil bas (sbas), avec shaut > sbas. En suivant ce comportement la caméra suit le visage détecté.
Remarque: La distance de la caméra au visage détecté n’est pas prise en compte, cela a pour conséquence un effet oscillant des servomoteurs quand le visage détecté est éloigné de la caméra.

Fig3 – Détection faciale

Avancement du projet et conclusion


Au terme de toutes les séances, nous avons un robot fonctionnel sur deux axes de rotation. Celui-ci est capable de détecter des visages puis de les suivre. Ce projet nous a apporté plusieurs compétences techniques. En effet, nous avons été formés à la saisie de schéma sous INKSCAPE, à la découpe au laser ainsi qu’à l’impression 3D. Nous avons dû concevoir entièrement le design mécanique et faire face aux problèmes qui vont avec. Bien que nous n’ayons pas beaucoup de temps disponible, nous sommes parvenus à nos fins. En revanche, lorsque la cible est détectée trop loin, l’asservissement des moteurs n’est pas parfait et ceux-ci oscillent plus qu’ils ne devraient. Un asservissement plus précis en utilisant des régulateurs serait probablement plus adapté et plus polyvalent que notre asservissement actuel.

Une autre piste d’amélioration à laquelle nous avons pensé serait d’améliorer le design mécanique pour y intégrer un pistolet de type nerf afin de pouvoir envoyer des fléchettes en mousses sur les personnes trop proches du robot.

Liste du matériel utilisé

Boîte du dessous :
Planche de bois de 4mm d’épaisseur
Boite en 5 morceaux (non fermée sur le dessous) de 10 cm de côté

Boîte du dessus :
Planche de bois de 4mm d’épaisseur
Boite en 5 morceaux (non fermée sur le dessous) de 10 puis de 15 cm de côté
3 roues folles de convoyeur

1 pièce imprimée en 3D pour la liaison des 2 boites
2 servomoteurs MG996R
4 supports de pile AA 1,5V mis en série pour former 6 V et alimenter les moteurs
1 carte Arduino Uno pour faire les essais moteurs à vide
1 carte Raspberry Pi 4B pour la détection des visages et pour piloter les moteurs asservis