Table des matières:

Robot-technicien : 8 étapes
Robot-technicien : 8 étapes

Vidéo: Robot-technicien : 8 étapes

Vidéo: Robot-technicien : 8 étapes
Vidéo: How to Make a Mini Robot bug 2024, Juillet
Anonim
Robot-Technicien
Robot-Technicien

Imaginez une seconde que vous faites partie des astronautes qui atterrissent sur Mars. Vous avez un million de choses à faire, des échantillons à prélever, des expériences à mener, des données à collecter, mais une ou deux fois par jour, vous devez parcourir l'habitation et/ou les modules de recherche dans lesquels vous vivez et travaillez pour les inspecter. Il est nécessaire que quelqu'un s'assure que la chose est en bon état, que les milliers de pièces et de pièces fonctionnent et sont en place. Mais que se passerait-il s'il y avait un assistant automatisé pour vous soulager de certaines de ces tâches. Et s'il y avait un petit robot qui pouvait se déplacer à l'intérieur des modules pour s'assurer que tout était en place, fonctionnel et sûr.

Robot-technicien à la rescousse.

Essentiellement, ce code contrôle le robot-technicien car il suit un chemin de couleur claire sur le sol. Il suivra ce chemin jusqu'à ce qu'il trouve une jonction dans le chemin ou un virage, ce qui demandera une photo à prendre pour le traitement de l'image pour permettre au Robo-Technicien de prendre une décision sur la prochaine étape. Les capteurs de choc léger et de choc fonctionnent pour protéger le robot-technicien des dommages, et les capteurs de choc contrôlent le moment où une photo de diagnostic sera prise. Dans l'ensemble, le robot-technicien est conçu pour zoomer dans les modules de Mar, libérant ainsi le temps des astronautes tout en effectuant la tâche de base de l'inspection, en ne faisant appel à l'intervention humaine que lorsqu'il trouve quelque chose qui ne va pas.

Encore une fois à titre d'avertissement, il s'agit d'un travail en cours. Le code, tel qu'il existe, fonctionne mais il a des ratés, d'autant plus qu'il y a plusieurs programmes qui se chevauchent. De plus, pour que ce projet fonctionne dans une mission réelle sur Mars, un robot devrait être construit à cet effet spécifique, donc encore une fois, je suppose qu'il s'agit d'une construction de "preuve de concept".

Il y a quelques éléments dont vous aurez besoin pour le mettre en place et le faire fonctionner. Vous aurez besoin d'un programme coûteux, de packages de support pour ce programme et d'un peu d'expérience en codage. Comme je suis étudiant et qu'une partie du code du rez-de-chaussée a été fournie (pour le raspberry pi), je ne parlerai pas spécifiquement de la configuration. Vous pouvez trouver tous les liens pour ce code de base ci-dessous. Venons-en à la liste des matériaux.

Matériel

  • Raspberry Pi (nous avons utilisé une version 3)
  • iRobot®
  • une sorte de dispositif de maintien pour maintenir le Raspberry Pi attaché au robot-technicien
  • Appareil photo Raspberry Pi (peu importe le type, tant qu'il a une bonne mise au point automatique et une bonne résolution d'image)
  • une sorte de support ou d'étui pour garder la caméra vers l'avant sur le Robo-Technician
  • un matériau à utiliser comme bande, blanc (ou de couleur très claire), qui est solidement maintenu au sol. Il doit être juste légèrement plus large que l'espace entre les deux capteurs de falaise avant.
  • 4 panneaux avec un très gros texte (avec les mots IMAGE, RIGHT, BACK et LEFT imprimés dessus)
  • Feuilles de papier de couleur (au moins trois et de préférence rouge, vert et bleu)

Logiciel

  • Matlab (2018a et 2017b ont tous deux été utilisés et semblent faire peu de différence)
  • Pack de support Raspberry Pi pour Matlab
  • Code Raspberry Pi pour la connexion à Matlab (lien vers le code source fourni ci-dessous)
  • Boîte à outils de traitement d'images pour Matlab (vous ne pouvez pratiquement pas faire ce projet sans la boîte à outils)
  • OPTIONNEL: Matlab Mobile installé sur votre téléphone, ce que j'expliquerai plus tard

Étape 1: configuration du matériel

ef.engr.utk.edu/ef230-2018-08/projects/roo…

Il s'agit du lien vers le code de base pour s'assurer que l'iRobot® peut communiquer avec Matlab, ainsi qu'un didacticiel de base. Comme je l'ai déjà dit, je ne couvrirai pas cette partie spécifique car le didacticiel est déjà très bien présenté. Je mentionnerai qu'une fois que vous avez suivi les étapes du lien, vous pouvez utiliser la commande "doc" de Matlab pour consulter les informations incluses. Spécifiquement:

doc roomba

Et encore un point très important.

Lorsque vous téléchargez les fichiers à partir du lien ci-dessus, PLACEZ-LES DANS LE DOSSIER QUE J'AI DÉCRIT CI-DESSUS, car Matlab exige que les fichiers générés par l'utilisateur se trouvent dans le dossier de travail actuel.

Cela étant réglé, passons au code.

Étape 2: Trouver tous ces capteurs

Trouver tous ces capteurs
Trouver tous ces capteurs
Trouver tous ces capteurs
Trouver tous ces capteurs

Prenez une seconde et inspectez l'iRobot®. Il est bon de savoir où ils se trouvent afin que vous ayez une idée des entrées que le robot-technicien reçoit, et vous serez en mesure de comprendre pourquoi la chose tourne en rond au lieu de suivre le chemin que vous allez configurer (cela peut ou n'aurait peut-être pas eu lieu). Vous verrez évidemment le gros capteur de choc physique à l'avant. Les capteurs de falaise sont un peu plus difficiles à voir, vous devrez le retourner et rechercher les quatre fenêtres en plastique transparent près du bord avant. Les capteurs de choc lumineux sont encore plus cachés, mais pour l'instant, il suffira de dire en direct dans la bande noire brillante le contour de l'avant de l'iRobot®, qui se trouve à l'avant de la barre du capteur de choc physique.

Il existe des capteurs de chute de roue, mais ceux-ci ne sont pas utilisés dans ce projet, nous allons donc passer au test des capteurs.

Étape 3: Tester pour définir les paramètres

Tester pour définir les paramètres
Tester pour définir les paramètres

Avant de pouvoir envoyer le robot-technicien faire son travail, nous devons déterminer ses bizarreries spécifiques et les plages de capteurs. Étant donné que chaque iRobot® est un peu différent et change au cours de la vie du robot, nous devons déterminer comment les capteurs lisent les zones dans lesquelles il fonctionnera. Le moyen le plus simple de le faire est de configurer votre chemin de couleur claire (J'ai utilisé des bandes de papier d'imprimante blanc mais tout ce qui est de couleur claire fera l'affaire) sur la surface que le robot-technicien opérera.

Démarrez Matlab et ouvrez un nouveau script. Enregistrez le script DANS LE MÊME DOSSIER QUE J'AI DÉCRIT PLUS TT et nommez-le comme vous le souhaitez (essayez de le garder court, car le nom de ce fichier sera le nom de la fonction). Allumez le robot et utilisez la configuration de la variable roomba du didacticiel, en tapant les commandes dans la fenêtre de commande.

Assurez-vous que le Raspberry Pi est branché sur l'iRobot® et que votre ordinateur est connecté à la même connexion Internet. Vous passerez moins de temps à vous arracher les cheveux à essayer de comprendre pourquoi Matlab ne se connecte pas

r = roomba (numéro que vous avez configuré)

La variable " r " dans ce cas n'est pas nécessaire, vous pouvez l'appeler comme vous voulez, mais cela rend la vie plus facile d'utiliser une variable à une seule lettre.

Une fois que le chemin est configuré et que le roomba a été connecté avec succès, placez le futur robot-technicien là où un ou deux des capteurs de falaise se trouvent au-dessus du chemin. Évidemment, cela signifie que les deux ou trois autres sont au-dessus de la surface que vous avez choisie.

Démarrez maintenant les capteurs de test avec la commande:

r.testSensors

Gardez à l'esprit que le " r. " est la variable que vous avez définie plus tôt, donc si ce n'est pas " r " changez le " r ". à tout ce que vous avez décidé. Cela fera apparaître l'écran du capteur de test avec une tonne d'informations.

Pour ce projet, concentrez-vous sur les pare-chocs légers, les pare-chocs et les sections de falaise. Déplacez le robot-technicien en vous assurant de regarder comment les capteurs changent sur différentes surfaces, ou à quelle distance un objet doit être pour que les valeurs de ligthBumper changent, etc. Gardez ces chiffres à l'esprit (ou écrivez-les) car vous allez besoin d'eux pour définir vos paramètres en une seconde.

Étape 4: Commencer le code

Tout d'abord, vous allez construire une fonction. Je l'ai appelé "chemin" mais encore une fois, le nom n'est pas nécessaire, mais je l'appellerai désormais "chemin".

La partie supérieure du code configure certaines options de saisie utilisateur. Il construit des listes qui seront utilisées dans le in listdlg, puis affiche une boîte de dialogue de liste. Cela permet à l'utilisateur de sélectionner la couleur du chemin qu'il souhaite suivre, qui entre en jeu plus tard.

list = {'Rouge', 'Bleu', 'Vert'}

problist = {'Casualty, Save Image', 'Component Out of Place, Save Image', 'Expected, Continue'} pathcolor = listdlg('PromptString', 'Select a Path Color', … 'SelectionMode', 'single', 'ListString', liste) prob = 0; conduire = ;

Les variables "prob" et "driv" doivent être déclarées ici car elles seront utilisées dans la boucle while principale de la fonction, mais encore une fois, si vous souhaitez renommer l'une de ces variables ou modifier les sélections de la liste, tout va bien tant que vous êtes cohérent dans le reste du code.

Étape 5: Haut de la boucle While: Capteurs de choc physique

Le haut de la boucle while contient la logique du capteur de choc physique. Fondamentalement, lorsque le robot-technicien heurte quelque chose, il s'arrête (ou pour le capteur de choc avant, il recule de 0,1 mètre), puis se positionne pour prendre une photo. Voyons d'abord la partie contrôle de vitesse et de position.

Si vous avez testé tous les capteurs sur le Robo-Technician dans les étapes précédentes, vous saurez que les capteurs de choc ont une valeur logique (0 ou 1) avec zéro représentant la position normale non enfoncée du capteur. Gardez cela à l'esprit pour le code.

while true %main while loop %receive bumper info S = r.getBumpers if S.left ~= 0 r.stop elseif S.right ~= 0 r.stop elseif S.front ~= 0 r.stop end

Il s'agit de la partie de base « si elle heurte quelque chose, arrêtez ». Si les capteurs détectent une collision, il passe à la partie suivante du code, qui réajuste la position du robot-technicien pour obtenir une photo.

if S.left ~= 0 % si la boucle prend les informations du bumper et aligne la caméra pour la photo r.turnAngle(5) pause(0.5) img = r.getImage % prend la photo et affiche l'image (img) % boîte de dialogue prob = listdlg(' PromptString', 'Trouvé un obstacle inattendu, veuillez identifier'…, 'SelectionMode', 'single', 'ListString', problist) elseif S.right ~=0 r.turnAngle(-5) pause(0.5) img = r. getImage image(img) prob = listdlg('PromptString', 'Trouvé un obstacle inattendu, veuillez identifier'…, 'SelectionMode', 'single', 'ListString', problist) elseif S.front ~= 0 r.moveDistance(- 0.1) pause(0.5) img = r.getImage image(img) prob = listdlg('PromptString', 'Trouvé un obstacle inattendu, veuillez identifier'…, 'SelectionMode', 'single', 'ListString', problist) end

Fondamentalement, une fois l'image prise, une autre boîte de dialogue apparaîtra avec trois options. Les deux premières options enregistrent la photo dans un dossier spécifié, que je couvrirai plus tard, tandis que la troisième option ferme simplement la boîte de dialogue et continue la boucle. Si vous ne vous souvenez plus des options, jetez un œil à l'étape précédente.

Maintenant, j'ai inséré une section de code entre la partie du capteur de choc et la partie de sauvegarde des photos. Cela prend les valeurs de lightBumper et définit la vitesse d'entraînement à 0,025 mètre/seconde (très lent), ce qui n'est pas réellement nécessaire, mais cela réduit le fait que le robot-technicien heurte les objets et finisse par user les capteurs de choc physiques.

L = r.getLightBumpers si L.gauche > 100 || L.gaucheAvant >100 || L.droitAvant >100 || L.right >100 driv = 0.025 r.setDriveVelocity(0.025) sinon driv = 0.1 end

Ce serait la partie où les valeurs que vous avez observées (et, espérons-le, notées) plus tôt entrent en jeu

Le "L. (côté et direction du capteur) > 100" était basé sur les valeurs que j'ai observées, donc si vos observations sont différentes, modifiez ces nombres. L'idée est que si le Robo-Technicien détecte quelque chose à quelques centimètres devant lui, il ralentira, pas plus que cela n'est inutile.

La partie suivante est l'endroit où les photos sont enregistrées pour plus tard.

% si la première ou la deuxième option a été sélectionnée dans la boîte de dialogue du prob, enregistre l'image si prob == 1 % si la boucle crée des informations sur le fichier pour la photo, écrit avec l'horodatage t = horloge; nom de base = sprintf('\img_%d_%d_%d_%d_%d.png', t(1), t(2), t(3), t(4), t(5)); dossier = 'E:\UTK\Classes\fall 18\ef230\irobot\images'; fullFileName = fullfile(dossier, nom de base); imwrite(img, fullFileName) close Figure 1 pause(2) elseif prob == 2 t = clock; nom de base = sprintf('\img_%d_%d_%d_%d_%d.png', t(1), t(2), t(3), t(4), t(5)); dossier = 'E:\UTK\Classes\fall 18\ef230\irobot\images'; fullFileName = fullfile(dossier, nom de base); imwrite(img, fullFileName) fermer Figure 1 pause(2) end

Tous les noms de fichiers et emplacements où les photos sont enregistrées sont facultatifs. J'ai choisi un dossier qui est imbriqué dans le dossier roomba que j'ai créé à l'étape d'introduction, mais il peut être n'importe où. De plus, les photos sont enregistrées avec l'horodatage, mais ce n'est pas particulièrement nécessaire (bien que ce serait hypothétiquement utile pour une mission sur Mars).

Avec les capteurs de bosse physiques couverts, nous pouvons passer aux capteurs de falaise et au suivi de chemin.

Étape 6: Suivre le chemin

Le code des capteurs d'escarpement est configuré pour comparer les valeurs des deux capteurs avant et des deux capteurs latéraux. Vous devrez modifier ces valeurs (probablement) en fonction de vos valeurs observées. Vous devrez également probablement modifier ces valeurs après quelques tests et les modifier en fonction de la lumière ambiante, de l'heure de la journée (en fonction de l'éclairage de la zone de test) ou lorsque les fenêtres du capteur sont sales.

Avant d'arriver au code du capteur de falaise, j'ai inséré un segment de code court pour vider certaines des données inutiles de Matlab. Cette partie n'est pas nécessaire, mais je l'ai utilisée pour réduire le stockage requis pour exécuter le programme.

clear img clear t clear basename clear fullFileName effacer le dossier

Le segment de code suivant est la viande du projet. Il permet au robot-technicien de suivre le chemin de couleur claire qui a été placé sur le sol. En un mot, il essaie de se diriger de manière à ce que les deux capteurs de falaise avant soient au-dessus du seuil, en fonction de vos valeurs observées, et permet au programme de commencer les étapes de traitement d'image un peu plus tard.

C = r.getCliffSensors %if la boucle suit une bande de couleur (blanc) si C.leftFront > 2000 && C.rightFront >2000 % guidage en ligne droite r.setDriveVelocity(driv) elseif C.leftFront 2000 % tourne à droite si le robot va trop loin left r.turnAngle(-2.5) elseif C.leftFront >2000 && C.rightFront<2000% tourne à gauche si le robot va trop loin à droite r.turnAngle(2.5) elseif C.leftFront <2000 && C.rightFront 100 || L.gaucheAvant >100 || L.droitAvant >100 || L.right >100 img = r.getImage end % vérifie s'il y a un coude dans le chemin si C.left >2800 && C.right <2800 r.turnAngle(2.5) elseif C.left 2800 r.turnAngle(- 2.5) end %placeholder pour le disp de reconnaissance d'image de chemin ('OBTENIR L'IMAGE') end end end

Gardez à l'esprit que les noms de variables que j'ai choisis sont facultatifs, mais encore une fois, je pense qu'il est plus facile d'utiliser des variables à une seule lettre lorsque cela est possible

Pour expliquer la partie médiane du code, lorsque les deux capteurs avant dépassent le bord du chemin (quand il s'agit d'une intersection ou lorsqu'il atteint la fin du chemin), il regarde s'il y a quelque chose devant lui. Vous devrez placer un objet sur le sol au bout du chemin ou à toutes les intersections pour que cela fonctionne.

Une fois la photo prise, il utilise la reconnaissance d'image pour déterminer ce qu'il faut faire. Il y a aussi un espace réservé dans cette section de code:

%placeholder pour la reconnaissance d'image de chemindisp('OBTENIR L'IMAGE')

Je l'ai utilisé pour le moment parce que je voulais parler spécifiquement du traitement du texte et des couleurs qui se produit, qui est à l'étape suivante.

Étape 7: Traitement d'image

Le traitement de l'image comporte deux volets. La première est la reconnaissance des couleurs, qui calcule l'intensité des couleurs dans l'image pour décider de continuer ou non à la reconnaissance de texte. Les calculs de couleur sont basés sur le choix qui a été fait dans cette toute première boîte de dialogue au début (j'ai utilisé le rouge, le bleu, le vert mais vous pouvez choisir les couleurs que vous voulez, tant que les valeurs moyennes pour l'intensité de la couleur peuvent être reconnues par le caméra Raspberry Pi).

img = r.getImage img = imcrop(img, [0 30 512 354]) imgb =imcrop(img, [0 30 512 354]) imgt = imcrop(img, [0 30 512 354]) rouge = moyenne(moyenne(imgb(:,:, 1))); g = moyenne(moyenne(imgb(:,:, 2))); b = moyenne(moyenne(imgb(:,:, 3)));

C'est le contrôle d'intensité. Cela sera utilisé dans le segment suivant pour décider ce qu'il veut faire.

si rouge > g && rouge >b si pathcolor == 1 imgc = imcrop(img, [0 30 512 354]) R = ocr(img) if R. Words{1} == IMAGE || R. Mots{2} == IMAGE || R. Mots{3} ==IMAGE t = horloge; nom de base = sprintf('\img_%d_%d_%d_%d_%d.png', t(1), t(2), t(3), t(4), t(5)); dossier = 'E:\UTK\Classes\fall 18\ef230\irobot\images'; fullFileName = fullfile(dossier, nom de base); imwrite(img, fullFileName) pause(2) elseif R. Words{1} == RIGHT || R. Mots{2} == DROIT || R. Words{3} ==RIGHT r.turnAngle(-75) elseif R. Words{1} == LEFT || R. Mots{2} == GAUCHE || R. Words{3} == GAUCHE r.turnAngle(75) elseif R. Words{1} == RETOUR || R. Mots{2} == RETOUR || R. Words{3} ==BACK r.turnAngle(110) end else r.turnAngle(110) end end

Ce segment décide si la couleur qui a été sélectionnée dans la première boîte de dialogue correspond à la couleur que la caméra voit. Si c'est le cas, il lance la reconnaissance de texte. Il regarde pour voir quel mot (IMAGE, BACK, RIGHT ou LEFT) apparaît, puis tourne (pour la droite et la gauche), tourne (pour le dos) ou prend une photo et l'enregistre de la même manière que précédemment.

Je n'ai fourni qu'une seule section du code pour les différentes couleurs

Pour permettre au code de reconnaître le bleu et le vert, copiez simplement le code et modifiez la vérification logique en haut du segment et définissez le " pathcolor == (number) " pour qu'il corresponde aux sélections de couleurs de la boîte de dialogue du haut (pour le code tel qu'il est affiché, le bleu serait 2 et le vert serait 3).

Étape 8: Le produit fini

Le produit fini
Le produit fini

Maintenant, le robot-technicien devrait zoomer autour des modules de mission sur Mars et informer les astronautes lorsque quelque chose ne va pas.

N'oubliez pas que toutes les valeurs du capteur de falaise et du lightBumper doivent être modifiées pour correspondre à vos valeurs observées. De plus, par expérience, j'ai trouvé qu'il était préférable de tester ce projet sur un sol de couleur sombre et c'est encore mieux si ce sol n'est pas réfléchissant. Cela augmente le contraste entre le chemin et le sol, ce qui augmente la probabilité que le robot-technicien le suive correctement.

J'espère que vous avez apprécié la mise en place d'un petit assistant pour la mission sur Mars et que vous vous amusez à construire.

Conseillé: