Microb Technology/2009/Scanner3D real

De Wikidroids

Sommaire

Scanner 3d final

Télémètre + miroir rotatif = Scanner 3d

Après lecture des règles de cette année, il s'avère que le prototype de scanner que nous désirions utilisé n'était pas autorisé (laser classe 2). Nous nous sommes donc tournés vers une autre idée, le scan vertical. Le principe reste le même, mais un bras porteur d'un miroir permet de déporter la visés au dessus de la zone à scanner, et ainsi de faire pointer le laser toujours vers le bas, et ainsi coller au règlement.

Voilà une image sur laquelle nous pouvons voir le bras qui servira de support du miroir (nous verrons plus loin son utilité) et le télémètre laser (dans le robot, juste sous le porte balise adverse)


Le miroir placé en bout de bras permet de réfléchir le laser (ainsi que le retour du faisceau). De plus, il est animé par un mouvement de bielle permettant de faire varier l'angle du laser ce qui permet de lui faire balayer une ligne, perpendiculairement à l'axe d'avance du robot. Pour finir, comme le robot avance pendant le scan, nous obtenons non plus une ligne de scan, mais une image.

Sur ces images, nous voyons (en partie) le petit moteur en bout de bras, ainsi que son codeur intégré, et son système de bielle qui fait pivoter le miroir. Le miroir est assez grand (4cm*4cm) mais ces dimensions sont nécessaires pour que le retour du laser soit vu par l'optique du miroir. En effet le télémètre laser utilisé ici est un télémètre à temps de vol.Il a donc besoin du retour du point laser pour mesurer le temps mis par la lumière pour parcourir la distance télémètre/cible, puis d'en déduire cette distance.


Plusieurs choses sont nécessaires pour obtenir une image exploitable. Tout d'abord, voilà l'état du faisceau laser dans diverses positions:


Le laser, ici en rouge, balaye une ligne. Nous désirons trouver la hauteur et l'abscisse du point cible du laser en fonction de l'angle du codeur du moteur, et de la distance renvoyée par le télémètre.

Conversion Télémètre/mm

Tout d'abord, nous calibrons le télémètre pour que ce dernier voit entre 0 et 60cm, distance qui sera la distance maximale scanné (hauteur + distance télémètre/miroir). Ceci est fait dans le but d'avoir une bonne précision. Ici, 60cm sera codé sur les 10V du télémètre. L'ADC de l'AVR se chargera ensuite de transformer ceci en valeur numérique.

Nous prenons ensuite un tableau de mesure entre 0 et 60 cm tout les 5 cm, pour trouver la relation entre la valeur numérique brute, et la valeur en cm. Comme les télémètres lasers sont en général très linéaires, nous avons utilisé une régression linéaire pour cette transformation. L'équation permettant de passer de la mesure brute au mm est donc du type:

L  = A*X + B

L est la distance en mm, X, la valeur télémétrique brute.

Conversion Codeur moteur/angle miroir

La deuxième chose à faire est de trouver l'angle formé par le miroir/bras en fonction du pas moteur. Attention toutefois, la valeur renvoyé par le codeur du moteur est relative. Pour avoir une position absolue, nous faisons une petite procédure de calibrage du miroir. Elle est basée sur l'utilisation d'un capteur de présence placé entre le bras et le miroir, et est activé lorsque le miroir est en position rentré.

Lors du démarrage du robot, le bras est sorti, le moteur commence à tourner au ralenti pendant que nous scrutons le capteurs. Lorsque le miroir est rentré, le capteur se déclenche, nous notons la position du codeur moteur, qui sera utilisé comme 0 pour toutes les manipulations futures.


Pour convertir les pas codeur moteur en angle, un calcul trigonométrique a été fait. Des équations: une liant les coordonnées du point en bout de bielle moteur au codeur moteur, l'autre liant le point en bout de miroir à l'angle miroir, et la dernière liant ces deux coordonnées car la bielle centrale à une longueur fixe.


XXX détails du calcul XXX

Notez que dans un tour de moteur, le laser décrit deux lignes: allé et retour. Voilà la capture d'un temple. Plusieurs lignes se superposent car le scan ici dure plusieurs secondes (et le moteur tourne à environ 8 tour/seconde).

Conversion (angle miroir,distance)/(abscisse, hauteur du point)

Durant le scan, nous relevons toutes les ms la valeur du codeur ainsi que la valeur du télémètre (en mode rapide, ie, une mesure par ms). Grâce aux calculs précédents, nous transformons le codeur en angle miroir, et la distance télémétrique en mm. Le dernier calcul sert à trouver les coordonnées du point visé.

Ici, nous cherchons H et X (abscisse, hauteur). Ceci est trouvé en utilisant un calcul trigonométrique, et les mesures physiques du système: la distance L sur le schéma est fixe et connue (mesuré sur le robot). La position du moteur par rapport à l'axe de rotation du miroir est également mesurée. L'angle du faisceau du laser est 2 fois celui du miroir (réflexion du laser).


XXX détails du calcul XXX


Une fois la relation trouvé, nous obtenons les premiers graphes de l'image "redressée".

Sur les abscisses, la distance du robot au point visé, en ordonnée, la hauteur du point. Dans le futur, la hauteur sera seuillée par niveau, pour faciliter le futur traitement d'image. Sur le graphe, nous observons le sol tout en bas, puis une hauteur de 1 palet, plus une colonne de 3 palet posée sur cette dernière et pour finir le bord d'un nouveau palet placé au sommet. Notez un artefact en bas à gauche de l'image ou le sol "remonte". Il s'agit en fait du laser qui voit le bord du robot. Notez également que la colonne n'est pas tout à fait horizontale. Ceci est du à plusieurs choses: les mesures physiques mesurées pas très précises, le télémètre laser qui n'est pas tout à fait horizontal, le servomoteur qui supporte le bras qui n'est pas tout à fait horizontal.


Déjà, nous pouvons avancer le robot à vitesse constante pendant le scan, ce qui donne ce genre d'image:


La chaleur de l'image est la hauteur des pixels. Le bleu foncé est un point non vu. Ce phénomène est observé quand un pixel est dans "l'ombre" d'une colonne par exemple. Ici, on l'observe sur le coté droit du rond central. L'explication est simple: plus un point est haut plus le cône de vu du scanner est petit; le passage brusque d'un point haut à un point plus bas fait avancer l'abscisse du point d'un coup. Les points intermédiaires ne sont pas vus.

Traitement d'image

Le traitement d'image se décompose en plusieurs points:

  • Le seuillage: transformant la hauteur en niveau de dépose (3cm = 1 niveau)
  • la détection des objets: un détourage permet de trouver les objets
  • le filtrage des objets: filtres les objets trop petits
  • la transformation des objets en polygones
  • la transformation des polygones en polygones convexes, pour filtrer les objets biscornus.
  • la recherche du rectangle d'aire minimum contenant le polygone (utilisant l'algorithme des "rotating calipers")
  • la découpe des rectangles en zones de déposes: une zone de dépose est défini par une zone sur laquelle un palet peut être déposé sans encombre.
  • un filtrage final permettant de s'assurer que la zone de dépose a assez de pixel de son niveau, et n'a pas de pixel de niveau plus haut trop proches de celle-ci. (pouvant perturber une dépose)


Tout ceci est réalisé sur l'AVR 8 bits. L'algorithme prend entre 100 et 200 ms. Celui-ci est disponible publiquement sur le CVS. (code sensorboard)

Prise de décision de dépose

Notre première idée fut de trouver les zones de déposes de façon à maximiser le nombre de points, avec un nombre de palet/linteau donnés (par la carte mère). Mais nous nous sommes rapidement rendu compte que ceci n'était pas une solution optimale. En effet, les dépose engendrées sont la plupart du temps en de multiples positions qui sont difficiles à atteindre avec les bras du robot, et nécessitant de bouger énormément.

Le code a donc été modifié et permet de répondre à 3 questions:

  • Etant donné un temple connu, vérifier si ce dernier est toujours présent: permet de voir si notre temple a été bougé, détruit, si un adversaire a déposé par dessus.
  • Etant donné l'écartement des bras, essayer de trouver 2 zones de déposes à bonne distance et de même hauteur permettant de déposer un temple sans faire de mouvement complexe avec le robot.
  • Trouver une zone permettant de déposer une colonne étant donnée une distance /hauteur maximale de dépose (avec 1 ou 2 bras, en exécutant une rotation du robot).

Les points de déposes sont également filtrés en fonction de la zone de travail: sur le rond central par exemple, si on détecte un palet trop proche du bord (et donc invalide) le palet sera rayé des points de déposes possibles.

Images finales

XXX todo XXX


Dépose sur colonne http://www.dailymotion.com/video/x9dndw_12-finale-coupe-robotique-2009-rcva_tech

Check temple (1'03"): http://www.dailymotion.com/video/x9dosj_finale-coupe-de-france-de-robotique_tech

Dépose sur temple adverse (5'48"): http://www.youtube.com/watch?v=2JkmQOUyR0Y


Problèmes rencontrés

  • Le télémètre laser ayant un temps de chauffe (30 minutes), il était nécessaire de trouver un moyen pour compenser les problèmes de niveau de hauteur lors des scan: En début de chauffe, le télémètre peut renvoyer des valeurs très différentes pendant les 90 secondes du match. Ceci a été réglé en ajoutant une calibration sur le sol lors du premier quart de cercle effectué par le robot. Celui-ci scanne le sol, et rattrape l'erreur engendrée par un télémètre froid.
  • Problème d'horizontalité du télémètre, du bras. Ceci a pour conséquence quelques déformations de l'image à traiter.
  • Problème de rapidité de trigo temps réel pour les points scannés. Sur le dernier code, le traitement est précalculé. Ceci est en fait moyennement utile car la vitesse du moteur a été légèrement ralenti car le bras vibre légèrement à pleine vitesse, et le télémètre a des dépassements lors de changement de hauteur brusque.
Boîte à outils
LANGUAGES