Inhaltsverzeichnis:

IRobot Create-Mars Expedition Rover Mark I - Gunook
IRobot Create-Mars Expedition Rover Mark I - Gunook

Video: IRobot Create-Mars Expedition Rover Mark I - Gunook

Video: IRobot Create-Mars Expedition Rover Mark I - Gunook
Video: How to build your own Mars rover (in 12,195 easy steps) 2024, Juli
Anonim
IRobot Create-Mars Expedition Rover Mark I
IRobot Create-Mars Expedition Rover Mark I

Diese Anleitung zeigt Ihnen, wie Sie den iRobot Create mit MatLab-Codierung einrichten. Ihr Roboter kann nach Mineralien suchen, indem er Formen unterscheidet, unwegsames Gelände mithilfe von Klippensensoren manövrieren und über einen Live-Feed manuell gesteuert werden.

Schritt 1: Zubehör

Lieferungen
Lieferungen

Für dieses Projekt benötigen Sie einen iRobot Create, eine programmierbare Version des Roomba Roboter-Staubsaugers. Der Roboter ist mit allen für dieses Projekt benötigten Sensoren ausgestattet, insbesondere Stoßsensoren, Klippensensoren und "Light Bump" -Sensoren. Sie benötigen außerdem einen Raspberry Pi und eine Videokamera, die für die drahtlose Kommunikation, die Live-Programmierung und den Live-Video-Feed verwendet werden. Schließlich benötigen Sie eine 3D-gedruckte Halterung für den Raspberry Pi und die Kamera.

Schritt 2: Codierung entwickeln, um das gewünschte Ergebnis zu erreichen

Entwickeln Sie die Codierung, um das gewünschte Ergebnis zu erreichen
Entwickeln Sie die Codierung, um das gewünschte Ergebnis zu erreichen

Nachdem Sie Ihren Roomba angeschlossen haben, müssen Sie einen Matlab-Code erstellen, der Ihnen nach Ihren gewünschten Eingaben die gewünschten Ausgaben liefert.

Der Code ist hier zu sehen:

%Roomba-Projekt%Brenten Arnold (barnol15); Julianne Korn (qdp218); Mike Heal(mheal) %4/11/19 %Problembeschreibung: Erstelle einen Rover, um den Menschen bei der %Erkundung/Bewohnung des Mars zu helfen. %Lösungsmethode: Suche nach organischer (grüner) Substanz durch Verwendung von %light-Bumpern, Klippensensoren und Kamera, um nach organischer Substanz zu suchen. Erlauben Sie dem Rover, durch die Verwendung von Stoßfängern, Klippensensoren und Radhöhensensoren durch unwegsames Gelände zu navigieren. Ermöglichen Sie es Menschen, den Rover aus einer sicheren Entfernung von % zu steuern und manuell nach Mineralien zu suchen. choice = {'LEBEN', 'ROUGH TERRAIN', 'BENUTZERKONTROLLE'}; %Drei Optionen im Dialogmenü Einstellung = menu('', Auswahlmöglichkeiten) if Einstellung>0 %Wenn Option ausgewählt, fragen Sie nach der Benutzerbestätigung Auswahl2 = {'Ja', 'Nein'} %Erzeuge ein Zellenfeld für "ja" oder "Nein " choice Confirm = menu(['Sie haben den Modus "' choice{Setting} '" gewählt.'], choice2) %Bestätigen Sie die Auswahl der Benutzereinstellungen, wenn Bestätigen==1, wenn Einstellung==1 =0 while i==0 r.setLEDDigits(num2str('LIFE')) %Anzeige von 'LIFE' auf LED für i=1:100 r.setDriveVelocity(0.05) %Roomba vorwärts bewegen mit 0.05 m/sy = r.getCliffSensors %Klippensensorwerte in Zellenstruktur "y" abrufen und speichern l = r.getLightBumpers % Lichtstoßwerte in Struktur "f" abrufen und speichern, wenn l.links>100 %Überprüfen, ob linker Lichtstoßfänger abgedeckt ist r.moveDistance(-0.05) %Roomba 0,05 Meter rückwärts bewegen r.turnAngle(20) %Roomba um 20 Grad gegen den Uhrzeigersinn drehen img=r.getImage %Bild von der Himbeer-Pie-Kamera auf dem Roomba erhalten rect = [100 0 150 150]; img = imcrop(img, rect) %Bild zuschneiden, um auf die Mitte zu fokussieren rot = mean(mean(img(:,:, 1))) %durchschnittliche Rotintensität grün = mean(mean(img(:,:, 2))) %durchschnittliche Grünintensität blau = mean(mean(img(:,:, 3))) %durchschnittliche Blauintensität wenn grün>rot && grün>blau %Überprüfe ob Pflanze im Bild ist d=msgbox(['Life found! ']); %Zeigen Sie ein Meldungsfeld mit der Meldung "Leben gefunden!" warten auf(d); end elseif l.leftFront>100 %Check is left/Front Light Bumper ist abgedeckt r.moveDistance(-0.05) %Roomba nach hinten 0.05 Meter bewegen img=r.getImage %Bild von der Raspberry Pie Kamera auf Roomba holen und in Variable 'img. speichern 'recht = [100 0 150 150]; img = imcrop(img, rect) %Bild zuschneiden, um auf die Mitte zu fokussieren rot = mean(mean(img(:,:, 1))) %durchschnittliche Rotintensität grün = mean(mean(img(:,:, 2))) %durchschnittliche Grünintensität blau = mean(mean(img(:,:, 3))) %durchschnittliche Blauintensität wenn grün>rot && grün>blau %Überprüfe ob Pflanze im Bild ist d=msgbox(['Life found! ']); %Zeigen Sie ein Meldungsfeld mit der Meldung "Leben gefunden!" warten auf(d); end elseif l.leftCenter>100 %Überprüfen Sie, ob der linke/mittlere Lichtstoßfänger abgedeckt ist r.moveDistance(-0.05) %Roomba um 0,05 Meter nach hinten verschieben img=r.getImage %Bild von der Himbeer-Pie-Kamera auf roomba holen und in der Variablen 'img. speichern 'recht = [100 0 150 150]; img = imcrop(img, rect) %Bild zuschneiden, um auf die Mitte zu fokussieren Rot = mean(mean(img(:,:, 1))) %durchschnittliche Rotintensität grün = mean(mean(img(:,:, 2))) %durchschnittliche Grünintensität blau = mean(mean(img(:,:, 3))) %durchschnittliche Blauintensität wenn grün>rot && grün>blau %Überprüfe ob Pflanze im Bild ist d=msgbox(['Life found! ']); %Zeigen Sie ein Meldungsfeld mit der Meldung "Leben gefunden!" warten auf(d); end elseif l.rightCenter>100 %Überprüfen Sie, ob der rechte/mittlere Lichtstoßfänger abgedeckt ist r.moveDistance(-0.05)%Roomba 0,05 Meter rückwärts bewegen img=r.getImage % Holen Sie sich das Bild von der Himbeer-Pie-Kamera auf dem Roomba und speichern Sie es in der Variablen 'img 'recht = [100 0 150 150]; img = imcrop(img, rect) %Bild zuschneiden, um auf die Mitte zu fokussieren rot = mean(mean(img(:,:, 1))) %durchschnittliche Rotintensität grün = mean(mean(img(:,:, 2))) %durchschnittliche Grünintensität blau = mean(mean(img(:,:, 3))) %durchschnittliche Blauintensität wenn grün>rot && grün>blau %Überprüfe ob Pflanze im Bild ist d=msgbox(['Life found! ']); %Zeigen Sie ein Meldungsfeld mit der Meldung "Leben gefunden!" warten auf(d); end elseif l.rightFront>100 %Überprüfen Sie, ob der rechte/vordere Lichtstoßfänger abgedeckt ist r.moveDistance(-0.05)%Roomba 0,05 Meter nach hinten bewegen img=r.getImage % Holen Sie sich das Bild von der Himbeer-Pie-Kamera auf dem Roomba und speichern Sie es in der Variablen 'img 'recht = [100 0 150 150]; img = imcrop(img, rect) %Bild zuschneiden, um auf die Mitte zu fokussieren Rot = mean(mean(img(:,:, 1))) %durchschnittliche Rotintensität grün = mean(mean(img(:,:, 2))) %durchschnittliche Grünintensität blau = mean(mean(img(:,:, 3))) %durchschnittliche Blauintensität wenn grün>rot && grün>blau %Überprüfe ob Pflanze im Bild ist d=msgbox(['Life found! ']); %Zeigen Sie ein Meldungsfeld mit der Meldung "Leben gefunden!" warten auf(d); end elseif l.right>100 %Überprüfen Sie, ob der rechte Lichtstoßfänger abgedeckt ist r.moveDistance(-0.05)%Roomba 0.05 Meter rückwärts bewegen r.turnAngle(-20)%Rotate roomba 20 Grad CW img=r.getImage %Get image from Raspberry Pie Kamera auf Roomba und speichern in Variable 'img' rect = [100 0 150 150]; img = imcrop(img, rect) %Bild zuschneiden, um auf die Mitte zu fokussieren rot = mean(mean(img(:,:, 1))) %durchschnittliche Rotintensität grün = mean(mean(img(:,:, 2))) %durchschnittliche Grünintensität blau = mean(mean(img(:,:, 3))) %durchschnittliche Blauintensität wenn grün>rot && grün>blau %Überprüfe ob Pflanze im Bild ist d=msgbox(['Life found! ']); %Zeigen Sie ein Meldungsfeld mit der Meldung "Leben gefunden!" warten auf(d); end elseif y.leftFront<1500 %Überprüfen Sie, ob der linke/vordere Teil des Roomba außerhalb der Klippe liegt r.moveDistance(-0,1, 0,05) %Roomba 0,1 Meter rückwärts bewegen mit 0,05 m/s Grad CW elseif y.rightFront<1500 %Überprüfen Sie, ob der rechte/vordere Teil des Roomba außerhalb der Klippe ist r.moveDistance(-0,1, 0,05) %Roomba 0,1 Meter rückwärts bewegen mit 0,05 m/s Grad CCW elseif y.left<1000 %Überprüfen Sie, ob die linke Seite des Roomba außerhalb der Klippe ist CW elseif y.right0 %Run wenn Taste gedrückt wird if Continue==1 i=0 %Suche nach Leben fortsetzen else i=1 %End LIFE mode end end end elseif Einstellung==2 %Überprüfen, ob die Einstellung "ROUGH TERRAIN" gewählt wurde i=0 während i==0 r.setLEDDigits(num2str('RGH')) %Anzeige 'Rough' auf LED-Anzeige für i=1:1000 r.setDriveVelocity(0.05) %Setze die Geschwindigkeit des Roomba-Antriebs auf 0.05 m/sx = r.getBumpers %Abrufen und Speichern von Stoßfängersensorwerten in der Struktur "x" y = r.get CliffSensors %Klippensensorwerte in Struktur "y" abrufen und speichern, wenn x.right==1 %Überprüfen, ob der rechte Stoßfänger gedrückt ist r.turnAngle(10) %Rotation roomba 10 Grad CCW elseif x.left==1 %Check if left Stoßstange wird gedrückt r.turnAngle(-10) %Rotate roomba 10 Grad CW elseif x.front==1 %Überprüfen Sie, ob die Front Bumper gedrückt ist r.turnAngle(20) %Rotate roomba 20 Grad CCW elseif x.rightWheelDrop==1 % Überprüfen Sie, ob das rechte Rad abgesenkt ist r.turnAngle(-20)%Rotate roomba 20 Grad CW elseif x.leftWheelDrop==1 %Überprüfen Sie, ob das linke Rad abgesenkt ist r.turnAngle(20) %Rotate roomba 20 Grad CCW elseif y.leftFront< 1500 %Überprüfen Sie, ob der vordere linke Teil des Roomba außerhalb der Klippe ist r.moveDistance(-0.05, 0.05) %Roomba 0.05 Meter rückwärts bewegen mit 0.05 m/s r.turnAngle(-5)%Rotate roomba 5 Grad CW elseif y.rightFront< 1500 %Überprüfen Sie, ob sich der rechte vordere Teil des Roomba außerhalb der Klippe befindet r.moveDistance(-0.05, 0.05)%Roomba 0.05 Meter rückwärts bewegen mit 0.05 m/s %Überprüfen Sie, ob der linke Teil aus ist f roomba is off cliff r.moveDistance(-0.05, 0.05)%Roomba 0.05 Meter rückwärts bewegen mit 0.05 m/s r.turnAngle(-10)%Rotate roomba 10 Grad CW elseif y.right0 if Continue==1 i=0 %Unwegsames Gelände fortsetzen else i=1 %Ende unwegsames Gelände beenden Ende else %Manual Mode i=0 r.setLEDDigits(num2str('USER')) %Anzeige von 'USER' auf LED-Anzeige d=msgbox(['Pfeiltasten - Bewegung; S - Rover anhalten; ESC - Endbenutzerkontrolle; A - Ressource lokalisieren']); warten auf(d); while i==0 r.showCamera % Rasberry Pie Kamera Live-Feed in separatem Fenster öffnen D=getkey(1) % Vom Benutzer gedrückte Taste abrufen, ASCII-Wert als Variable speichern D if D==30 %Überprüfen, ob der "Auf"-Pfeil hat wurde gedrückt r.setDriveVelocity(0.1) %Roomba vorwärts mit 0,2 m/s senden elseif D==28 %Überprüfen, ob der "linke" Pfeil gedrückt wurde r.setDriveVelocity(0) %Roomba daran hindern, vorwärts oder rückwärts zu fahren r.turnAngle(15, 0.05)%Rotate roomba 45 Grad CCW with 0.05 m/s elseif D==31 %Überprüfen Sie, ob der "Abwärts"-Pfeil gedrückt wurde r.setDriveVelocity(-0.1) %Roomba rückwärts bewegen mit 0.2 m/s elseif D==29 % Überprüfen Sie, ob der Pfeil nach rechts gedrückt ist r.setDriveVelocity(0) %Roomba daran hindern, sich vorwärts oder rückwärts zu bewegen r.turnAngle(-15, 0,05) %Rotation roomba 45 Grad CW mit 0,05 m/s elseif D==27 %Check if die Taste "esc" (Escape) wurde gedrückt i=1 %Ändere den Wert der Variablen "i" um die Schleife zu verlassen d=msgbox('Beenden der "Benutzerkontrolle"') %Informiere den Benutzer, dass der manuelle Modus beendet wird elseif D== 115 %Überprüfen Sie, ob die "s"-Taste gedrückt wurde r.setDriveVelocity(0) %Roomba ab. stoppen vorwärts oder rückwärts gehen elseif D==97 %Prüfen, ob "a" gedrückt wurde image = r.getImage; imwrite(image, 'image.png') W = Classify(image) K = mode(W) if K == 3 d=msgbox('Resource found') %Anzeige wenn rechteckige Ressource erkannt waitfor(d); %Warten, bis der Benutzer die Nachrichtenbox "d" schließt elseif K == 0 d=msgbox('Not Resource:(') %Anzeige, wenn die rechteckige Ressource nicht erkannt wurde waitfor(d); %Warten, bis der Benutzer die Nachrichtenbox "d" schließt end else d=msgbox('Keine gültige Tasteneingabe.') %Anzeige, wenn Benutzer das Menü "Einstellung wählen" schließt waitfor(d); %Warten auf Benutzer, um Nachrichtenbox zu schließen "d" end waitfor(d); %Warte auf Benutzer soll Nachrichtenbox schließen "d" end end end else d=msgbox('Goodbye') %Verabschiedet sich, wenn Optionen geschlossen sind end waitfor(d);

Schritt 3: Testen

Testen
Testen

Sobald Ihr Code geschrieben wurde, müssen Sie Ihren Roomba testen. Obwohl Ihr Code korrekt erscheinen mag, müssen viele Ihrer Werte, insbesondere für Farbe oder Form, geändert werden, damit die Objekte, die Ihr Roomba identifizieren soll, richtig erkannt werden.

Schritt 4: Beobachten Sie die visuellen Ausgaben

Beobachten Sie die visuellen Ausgaben
Beobachten Sie die visuellen Ausgaben
Beobachten Sie die visuellen Ausgaben
Beobachten Sie die visuellen Ausgaben

Anhand der visuellen Ausgaben wird deutlich, ob Sie Ihren Roomba erfolgreich programmiert haben.

Zu den Ausgängen gehören:

  • Formerkennung: Die Fähigkeit des Roomba, Formen richtig zu unterscheiden, um die richtigen Mineralien zu finden
  • Geländemanöver: Vermeidet Klippen oder dunkle Bereiche
  • Manueller Modus: Live-Feed und die Möglichkeit, den Roomba zu steuern
  • Bilder: Bilder von Mineralien
  • Leben gefunden!: Ein MatLab-Textfeld, das anzeigt, dass Ihre Pflanze organisches Leben identifiziert hat.

Das ist das Ende unseres Tutorials, viel Spaß mit Ihrem neuen Mars Expedition Rover!

Empfohlen: