Inhaltsverzeichnis:

Robo-Techniker - Gunook
Robo-Techniker - Gunook

Video: Robo-Techniker - Gunook

Video: Robo-Techniker - Gunook
Video: Funktionsablauf Robo-Bar 2024, Juli
Anonim
Robo-Techniker
Robo-Techniker

Stellen Sie sich für eine Sekunde vor, Sie wären einer der Astronauten, die auf dem Mars landen. Sie haben eine Million Dinge zu tun, Proben zu nehmen, Experimente durchzuführen, Daten zu sammeln, aber ein- oder zweimal am Tag müssen Sie in den Wohn- und/oder Forschungsmodulen, in denen Sie leben und arbeiten, herumlaufen, um sie zu inspizieren. Es ist notwendig, dass jemand dafür sorgen muss, dass das Ding in gutem Zustand ist, dass all die Tausenden von Teilen und Teilen funktionieren und an ihrem Platz sind. Aber was wäre, wenn es einen automatisierten Helfer gäbe, der Ihnen einige dieser Aufgaben abnimmt. Was wäre, wenn es einen kleinen Roboter gäbe, der sich in den Modulen bewegen könnte, um sicherzustellen, dass alles an seinem Platz ist, funktioniert und sicher ist.

Robo-Techniker zur Rettung.

Im Wesentlichen steuert dieser Code den Robo-Techniker, wie er einem hellen Pfad auf dem Boden folgt. Er folgt diesem Weg, bis er eine Weggabelung oder eine Abzweigung findet, die eine Fotoaufnahme zur Bildbearbeitung veranlasst, damit der Robo-Techniker eine Entscheidung treffen kann, wohin er als nächstes gehen soll. Die leichten Stoß- und Stoßsensoren schützen den Robo-Techniker vor Beschädigungen, und die Stoßsensoren steuern, wann ein Diagnosefoto aufgenommen wird. Alles in allem ist der Robo-Techniker so konzipiert, dass er in den Modulen des Mars herumzoomt und den Astronauten Zeit spart, während er die grundlegende Aufgabe der Inspektion erledigt, und nur menschliche Eingaben ruft, wenn er etwas falsch findet.

Nochmals als Warnung, dies ist in Arbeit. Der Code, so wie er existiert, funktioniert, aber er hat Probleme, zumal mehrere, sich überschneidende Programme beteiligt sind. Damit dieses Projekt in einer tatsächlichen Mars-Mission funktioniert, müsste ein Roboter für diesen speziellen Zweck gebaut werden, also denke ich, dass dies wieder ein "Proof of Concept"-Build ist.

Es gibt ein paar Dinge, die Sie benötigen, um dies zum Laufen zu bringen. Sie benötigen ein teures Programm, Support-Pakete für dieses Programm und ein wenig Hintergrundwissen im Programmieren. Da ich Student bin und ein Teil des Codes im Erdgeschoss bereitgestellt wurde (für den Himbeer-Pi), werde ich nicht speziell über die Einrichtung sprechen. Nachfolgend finden Sie alle Links für diesen Basiscode. Kommen wir zur Materialliste.

Hardware

  • Raspberry Pi (wir haben eine Version 3 verwendet)
  • iRobot®
  • eine Art Haltevorrichtung, um den Raspberry Pi am Robo-Techniker zu halten
  • Raspberry Pi Kamera (egal welche Art, solange Autofokus und Bildauflösung gut sind)
  • eine Art Ständer oder Holster, damit die Kamera auf dem Robo-Techniker nach vorne zeigt
  • ein Material, das als Streifen verwendet werden kann, weiß (oder sehr hell), das sicher auf dem Boden gehalten wird. Es muss nur etwas breiter sein als der Raum zwischen den beiden vorderen Klippensensoren.
  • 4 Schilder mit sehr großem Text (mit den Worten IMAGE, RIGHT, BACK und LEFT aufgedruckt)
  • Blätter farbiges Papier (mindestens drei und vorzugsweise rot, grün und blau)

Software

  • Matlab (2018a und 2017b wurden beide verwendet und scheinen kaum einen Unterschied zu machen)
  • Raspberry Pi Supportpaket für Matlab
  • Raspberry Pi-Code zur Verbindung mit Matlab (Link zum unten bereitgestellten Quellcode)
  • Bildverarbeitungs-Toolbox für Matlab (Sie können dieses Projekt so gut wie nicht ohne die Toolbox durchführen)
  • OPTIONAL: Matlab Mobile auf Ihrem Telefon installiert, was ich später erklären werde

Schritt 1: Einrichten der Hardware

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

Dies ist der Link für den Basiscode, um sicherzustellen, dass der iRobot® mit Matlab kommunizieren kann, zusammen mit einem grundlegenden Tutorial. Wie ich bereits sagte, werde ich diesen speziellen Teil nicht behandeln, da das Tutorial bereits sehr gut aufgebaut ist. Ich werde erwähnen, dass Sie, sobald Sie die Schritte auf dem Link befolgt haben, den Befehl "doc" von Matlab verwenden können, um die enthaltenen Informationen anzuzeigen. Speziell:

doc roomba

Und noch ein ganz wichtiger Punkt.

Wenn Sie die Dateien über den obigen Link herunterladen, SETZEN SIE SIE IN DEN OBEN BESCHRIEBENEN ORDNER, da Matlab erfordert, dass sich benutzergenerierte Dateien im aktuellen Arbeitsordner befinden.

Wenn das aus dem Weg ist, kommen wir zum Code.

Schritt 2: Finden all dieser Sensoren

All diese Sensoren finden
All diese Sensoren finden
All diese Sensoren finden
All diese Sensoren finden

Nehmen Sie sich eine Sekunde Zeit und geben Sie dem iRobot® eine Inspektion. Es ist gut zu wissen, wo diese sind, damit Sie eine Vorstellung davon haben, welche Eingaben der Robo-Techniker erhält, und Sie können herausfinden, warum sich das Ding im Kreis dreht, anstatt dem Pfad zu folgen, den Sie einrichten (dies könnte oder wäre nicht passiert). Sie werden offensichtlich den großen physischen Stoßsensor auf der Vorderseite sehen. Die Klippensensoren sind etwas schwieriger zu erkennen, Sie müssen sie umdrehen und nach den vier durchsichtigen Kunststofffenstern in der Nähe der Vorderkante suchen. Die leichten Stoßsensoren sind noch versteckter, aber für den Moment reicht es aus, das Leben in dem glänzenden schwarzen Band zu sagen, das um die Vorderseite des iRobot® verläuft, das sich auf der Vorderseite der physischen Stoßsensorleiste befindet.

Es gibt Radsturzsensoren, aber diese werden in diesem Projekt nicht verwendet, daher werden wir die Sensoren testen.

Schritt 3: Testen, um Parameter einzustellen

Testen zum Einstellen von Parametern
Testen zum Einstellen von Parametern

Bevor wir den Robo-Techniker losschicken können, um seine Arbeit zu erledigen, müssen wir seine spezifischen Eigenheiten und Sensorbereiche herausfinden. Da jeder iRobot® ein wenig anders ist und sich im Laufe der Lebensdauer des Roboters ändert, müssen wir herausfinden, wie die Sensoren die Bereiche lesen, in denen er arbeiten wird. Am einfachsten ist dies, wenn Sie einen hellen Pfad einrichten (Ich habe weiße Druckerpapierstreifen verwendet, aber alles, was hell ist, reicht aus) auf der Oberfläche, die der Robo-Techniker bedienen wird.

Starten Sie Matlab und öffnen Sie ein neues Skript. Speichern Sie das Skript IM GLEICHEN ORDNER, DEN ICH VORHER BESCHRIEBEN HABE, und benennen Sie es wie Sie wollen (versuchen Sie es jedoch kurz zu halten, da der Name dieser Datei der Funktionsname ist). Schalten Sie den Roboter ein und verwenden Sie das Roomba-Variablen-Setup aus dem Tutorial, indem Sie die Befehle in das Befehlsfenster eingeben.

Stellen Sie sicher, dass der Raspberry Pi an den iRobot® angeschlossen ist und Ihr Computer mit derselben Internetverbindung verbunden ist. Sie werden weniger Zeit damit verbringen, sich die Haare auszureißen, um herauszufinden, warum Matlab keine Verbindung herstellt

r = roomba (von Ihnen eingerichtete Nummer)

Die Variable " r " ist in diesem Fall nicht notwendig, Sie können sie beliebig nennen, aber es macht das Leben einfacher, eine Variable mit einem einzigen Buchstaben zu verwenden.

Sobald der Pfad eingerichtet und der Roomba erfolgreich verbunden wurde, platzieren Sie den zukünftigen Robo-Techniker dort, wo sich ein oder zwei der Klippensensoren über dem Pfad befinden. Das bedeutet natürlich, dass die anderen zwei oder drei über der von Ihnen gewählten Oberfläche liegen.

Starten Sie nun die Testsensoren mit dem Befehl:

r.testSensoren

Denken Sie daran, dass das " r. " die Variable ist, die Sie zuvor definiert haben. Wenn es also nicht ' r ' ist, ändern Sie das ' r.' zu was auch immer du dich entschieden hast. Dadurch wird der Testsensorbildschirm mit einer Menge Informationen angezeigt.

Konzentrieren Sie sich für dieses Projekt auf die Abschnitte lightBumpers, Bumper und Cliff. Bewegen Sie den Robo-Techniker umher und achten Sie darauf, wie sich die Sensoren über verschiedene Oberflächen ändern oder wie nahe ein Objekt sein muss, damit sich die Lichtstoßstangen-Werte ändern usw. Beachten Sie diese Zahlen (oder schreiben Sie sie auf), denn Sie werden brauchen sie, um Ihre Parameter in einer Sekunde einzustellen.

Schritt 4: Starten des Codes

Zunächst konstruieren Sie eine Funktion. Ich habe es "Pfad" genannt, aber auch hier ist der Name nicht notwendig, aber ich werde es von nun an als "Pfad" bezeichnen.

Der obere Teil des Codes richtet einige Benutzereingabeoptionen ein. Es erstellt einige Listen, die in listdlg verwendet werden, und öffnet dann ein Listendialogfeld. Auf diese Weise kann der Benutzer auswählen, welcher Pfadfarbe er folgen möchte, die später ins Spiel kommt.

list = {'Rot', 'Blau', 'Grün'}

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

Die Variablen "prob" und "driv" müssen hier deklariert werden, da sie in der Haupt-While-Schleife der Funktion verwendet werden. Wenn Sie jedoch eine dieser Variablen umbenennen oder die Listenauswahl ändern möchten, ist dies in Ordnung, solange Sie sind im Rest des Codes konsistent.

Schritt 5: Oberseite der While-Schleife: Physische Stoßsensoren

Der obere Teil der while-Schleife enthält die physische Bump-Sensor-Logik. Grundsätzlich, wenn der Robo-Techniker auf etwas stößt, stoppt er (oder für den vorderen Stoßsensor geht er 0,1 Meter zurück) und positioniert sich dann, um ein Bild aufzunehmen. Lassen Sie uns zuerst den Abschnitt zur Geschwindigkeits- und Positionssteuerung behandeln.

Wenn Sie in den vorherigen Schritten alle Sensoren des Robo-Technikers getestet haben, wissen Sie, dass die Stoßsensoren einen logischen Wert (0 oder 1) haben, wobei Null die normale, nicht gedrückte Position des Sensors darstellt. Beachten Sie das für den 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

Dies ist der grundlegende Teil "Wenn es etwas trifft, hör auf". Wenn die Sensoren eine Kollision erkennen, geht es zum nächsten Teil des Codes, der die Position des Robo-Technikers neu justiert, um ein Foto zu erhalten.

if S.left ~= 0 %if loop nimmt Bumper-Info und richtet die Kamera auf das Foto aus r.turnAngle(5) pause(0.5) img = r.getImage %nimmt Foto auf und zeigt Bild(img) %Dialogfeld prob = listdlg(' PromptString', 'Unerwartetes Hindernis gefunden, bitte identifizieren'…, 'SelectionMode', 'single', 'ListString', problist) elseif S.right ~=0 r.turnAngle(-5) pause(0.5) img = r. getImage image(img) prob = listdlg('PromptString', 'Unerwartetes Hindernis gefunden, bitte identifizieren'…, 'SelectionMode', 'single', 'ListString', problist) elseif S.front ~= 0 r.moveDistance(- 0.1) pause(0.5) img = r.getImage image(img) prob = listdlg('PromptString', 'Unerwartetes Hindernis gefunden, bitte identifizieren'…, 'SelectionMode', 'single', 'ListString', problist) end

Grundsätzlich wird nach der Aufnahme des Bildes ein weiteres Dialogfeld mit drei Optionen angezeigt. Die ersten beiden Optionen speichern das Foto in einem bestimmten Ordner, den ich später behandeln werde, während die dritte Option einfach das Dialogfeld schließt und die Schleife durchläuft. Wenn Sie sich nicht an die Optionen erinnern können, sehen Sie sich den vorherigen Schritt an.

Jetzt habe ich einen Codeabschnitt zwischen dem Stoßsensorteil und dem Fotospeicherteil eingefügt. Dies nimmt die LightBumper-Werte und setzt die Fahrgeschwindigkeit auf 0,025 Meter/Sekunde (sehr langsam), was nicht wirklich notwendig ist, aber es reduziert das Einschlagen des Robo-Technikers und schließlich den Verschleiß der physischen Stoßsensoren.

L = r.getLightBumpers wenn L.links > 100 || L.linksvorne >100 || L.rechtsvorne >100 || L.rechts >100 Antrieb = 0.025 r.setDriveVelocity(0.025) sonst Antrieb = 0.1 end

Dies wäre der Teil, in dem die Werte, die Sie zuvor beobachtet (und hoffentlich aufgeschrieben) haben, ins Spiel kommen

Die "L. (Seite und Richtung des Sensors) > 100" basiert auf den von mir beobachteten Werten. Wenn Ihre Beobachtungen unterschiedlich sind, ändern Sie diese Zahlen. Die Idee ist, dass, wenn der Robo-Techniker etwas ein paar Zentimeter davor etwas wahrnimmt, er langsamer wird, mehr als das ist unnötig.

Im nächsten Teil werden Fotos für später gespeichert.

%wenn erste oder zweite Option im Prob-Dialog ausgewählt wurde, speichert Bild if Prob == 1 %if Schleife erstellt Dateiinfo für Foto, schreibt mit Zeitstempel t = clock; basename = sprintf('\img_%d_%d_%d_%d_%d.png', t(1), t(2), t(3), t(4), t(5)); Ordner = 'E:\UTK\Classes\fall 18\ef230\irobot\images'; fullFileName = fullfile(Ordner, Basisname); imwrite(img, fullFileName) close Abbildung 1 pause(2) elseif prob == 2 t = clock; basename = sprintf('\img_%d_%d_%d_%d_%d.png', t(1), t(2), t(3), t(4), t(5)); Ordner = 'E:\UTK\Classes\fall 18\ef230\irobot\images'; fullFileName = fullfile(Ordner, Basisname); imwrite(img, fullFileName) schließen Abbildung 1 pause(2) end

Alle Dateinamen und Speicherorte, an denen die Fotos gespeichert werden, sind optional. Ich habe einen Ordner ausgewählt, der in dem Roomba-Ordner verschachtelt ist, den ich im Einführungsschritt erstellt habe, aber er kann sich an einem beliebigen Ort befinden. Außerdem werden die Fotos mit dem Zeitstempel gespeichert, aber das ist nicht unbedingt notwendig (obwohl es hypothetisch für eine Mars-Mission nützlich wäre).

Wenn die physischen Stoßsensoren abgedeckt sind, können wir zu den Klippensensoren und dem Pfad folgen.

Schritt 6: Dem Pfad folgen

Der Code für die Klippensensoren ist so eingerichtet, dass er die Werte der beiden vorderen und zwei seitlichen Sensorwerte vergleicht. Sie müssen diese Werte (wahrscheinlich) basierend auf Ihren beobachteten Werten ändern. Sie müssen diese Werte wahrscheinlich auch nach einigen Testläufen bearbeiten und je nach Umgebungslicht, Tageszeit (je nachdem, wie gut der Testbereich ausgeleuchtet ist) oder wenn die Sensorfenster verschmutzt sind, ändern.

Bevor wir jedoch zum Cliff-Sensor-Code kommen, gibt es ein kurzes Codesegment, das ich eingefügt habe, um einige der unnötigen Daten aus Matlab zu löschen. Dieser Teil wird nicht benötigt, aber ich habe ihn verwendet, um den für die Ausführung des Programms erforderlichen Speicherplatz zu reduzieren.

clear img clear t clear basename clear fullFileName clear folder

Das nächste Codesegment ist das Fleisch des Projekts. Es ermöglicht dem Robo-Techniker, dem hellen Weg zu folgen, der auf dem Boden platziert wurde. Kurz gesagt, es versucht sich selbst so zu steuern, dass die beiden vorderen Klippensensoren basierend auf Ihren beobachteten Werten über dem Schwellenwert liegen, und ermöglicht es dem Programm, etwas später mit den Bildverarbeitungsschritten zu beginnen.

C = r.getCliffSensors %if Schleife folgt einem Farbband (weiß) wenn C.leftFront > 2000 && C.rightFront >2000 %gerade Bahnführung r.setDriveVelocity(driv) elseif C.leftFront 2000 %dreht nach rechts, wenn Roboter zu weit geht left r.turnAngle(-2.5) elseif C.leftFront >2000 && C.rightFront<2000%dreht sich nach links, wenn der Roboter zu weit geht rechts r.turnAngle(2.5) elseif C.leftFront <2000 && C.rightFront 100 || L.linksvorne >100 || L.rechtsvorne >100 || L.right >100 img = r.getImage end %überprüft, ob es eine Krümmung im Pfad gibt, wenn C.left >2800 && C.right <2800 r.turnAngle(2.5) elseif C.left 2800 r.turnAngle(- 2.5) end %Platzhalter für Pfadbilderkennung disp('GETTING IMAGE') end end end

Denken Sie daran, dass die von mir gewählten Variablennamen optional sind, aber ich denke, es macht das Leben einfacher, wenn möglich, Variablen mit einem einzigen Buchstaben zu verwenden

Um den mittleren Abschnitt des Codes zu erklären, wenn die beiden vorderen Sensoren vom Rand des Weges abfahren (wenn er zu einer Kreuzung kommt oder wenn er das Ende des Weges erreicht), wird nachgesehen, ob sich etwas davor befindet. Damit dies funktioniert, müssen Sie am Ende des Pfads oder an Kreuzungen ein Objekt auf den Boden legen.

Sobald das Foto aufgenommen wurde, verwendet es die Bilderkennung, um herauszufinden, was zu tun ist. Auch in diesem Codeabschnitt gibt es einen Platzhalter:

%Platzhalter für Pfadbilderkennungdisp('GETTING IMAGE')

Ich habe dies für den Moment verwendet, weil ich speziell über die Text- und Farbverarbeitung sprechen wollte, die im nächsten Schritt stattfindet.

Schritt 7: Bildverarbeitung

Die Bildverarbeitung besteht aus zwei Teilen. Erstens die Farberkennung, die die Farbintensität im Bild berechnet, um zu entscheiden, ob mit der Texterkennung fortgefahren werden soll oder nicht. Die Farbberechnungen basieren auf der Auswahl in der ersten Dialogbox am Anfang (ich habe Rot, Blau, Grün verwendet, aber Sie können alle gewünschten Farben wählen, solange die Mittelwerte für die Farbintensität von der Raspberry Pi-Kamera).

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

Dies ist die Intensitätsprüfung. Dies wird im nächsten Segment verwendet, um zu entscheiden, was es tun möchte.

if red > g && red >b if pathcolor == 1 imgc = imcrop(img, [0 30 512 354]) R = ocr(img) if R. Words{1} == IMAGE || R. Wörter{2} == BILD || R. Wörter{3} ==BILD t = Uhr; basename = sprintf('\img_%d_%d_%d_%d_%d.png', t(1), t(2), t(3), t(4), t(5)); Ordner = 'E:\UTK\Classes\fall 18\ef230\irobot\images'; fullFileName = fullfile(Ordner, Basisname); imwrite(img, fullFileName) pause(2) elseif R. Words{1} == RECHTS || R. Wörter{2} == RECHTS || R. Wörter{3} ==RECHTS r. Wendewinkel(-75) elseif R. Wörter{1} == LINKS || R. Wörter{2} == LINKS || R. Wörter{3} == LINKS r. Wendewinkel(75) elseif R. Wörter{1} == ZURÜCK || R. Wörter{2} == ZURÜCK || R. Words{3} ==BACK r.turnAngle(110) end else r.turnAngle(110) end end

Dieses Segment entscheidet, ob die Farbe, die im ersten Dialogfeld ausgewählt wurde, mit der Farbe übereinstimmt, die die Kamera sieht. Wenn dies der Fall ist, wird die Texterkennung ausgeführt. Es schaut, welches Wort (BILD, ZURÜCK, RECHTS oder LINKS) erscheint und dreht sich dann entweder (für rechts und links), dreht sich um (für zurück) oder macht ein Bild und speichert es auf die gleiche Weise wie zuvor.

Ich habe nur einen einzelnen Abschnitt des Codes für die verschiedenen Farben bereitgestellt

Damit der Code Blau und Grün erkennen kann, kopieren Sie einfach den Code und ändern Sie die Logikprüfung am oberen Rand des Segments und stellen Sie die " pathcolor == (Zahl) " entsprechend der Farbauswahl aus der oberen Dialogbox (für die Code, wie er angezeigt wird, blau wäre 2 und grün wäre 3).

Schritt 8: Das fertige Produkt

Das fertige Produkt
Das fertige Produkt

Jetzt sollte der Robo-Techniker um die Mars-Missionsmodule herumzoomen und den Astronauten Bericht erstatten, wenn etwas fehl am Platz ist.

Denken Sie daran, dass alle Klippensensor- und LightBumper-Werte auf Ihre beobachteten Werte geändert werden müssen. Aus Erfahrung habe ich auch festgestellt, dass es besser ist, dieses Projekt auf einem dunklen Boden zu testen, und es ist noch besser, wenn dieser Boden nicht reflektierend ist. Dadurch erhöht sich der Kontrast zwischen dem Pfad und dem Boden, was es wahrscheinlicher macht, dass der Robo-Techniker ihm korrekt folgt.

Ich hoffe, es hat Ihnen Spaß gemacht, einen kleinen Helfer für die Mars-Mission einzurichten, und viel Spaß beim Bauen.

Empfohlen: