Inhaltsverzeichnis:

Mars Roomba Project UTK - Gunook
Mars Roomba Project UTK - Gunook

Video: Mars Roomba Project UTK - Gunook

Video: Mars Roomba Project UTK - Gunook
Video: EF 230 Roomba Project 2024, November
Anonim
Mars Roomba-Projekt UTK
Mars Roomba-Projekt UTK
Mars Roomba-Projekt UTK
Mars Roomba-Projekt UTK

HAFTUNGSAUSSCHLUSS: DIES FUNKTIONIERT NUR, WENN DER ROOMBA IN A. AUFGESTELLT IST

SEHR SPEZIFISCHE ART UND WEISE, DIESE ANLEITUNG WURDE FÜR STUDIERENDE UND FAKULTÄT DER UNIVERSITÄT VON TENNESSEE ERSTELLT UND BEABSICHTIGT

Dieser Code wird verwendet, um einen Roomba einzurichten, um lokal geschriebenen und gespeicherten Code in MATLAB auszuführen. Dies funktioniert nicht, wenn Sie die erforderlichen Bibliotheken nicht von der Website der University of Tennessee abrufen können. Wenn Sie über die Bibliotheken verfügen, können Sie diese verwenden, um Ihren eigenen Roomba mit den Funktionen in der Bibliothek zu programmieren. In diesem Instructable erfahren Sie, wie Sie die Bibliotheken installieren, einen Ordner für den gesamten Code erstellen und das Programm, das wir unten bereitgestellt haben, codieren und verwenden.

Benötigtes Material:

· Roomba

· MATLAB

· Raspberry Pi und Pi-Kamera

Schritt 1: Abrufen der Bibliotheken

Auf der Engineering-Website steht eine Toolbox/Bibliothek zur Verfügung, laden Sie sie herunter und legen Sie sie in einen neuen Ordner. Dieser Ordner muss alle Projektarbeitsdateien enthalten, da jede Funktion, die in einem von Ihnen erstellten Programm verwendet wird, auf die Bibliothek verweisen muss. Nachdem Sie dies getan haben, können Sie mit der Arbeit an Ihren Programmen beginnen

Schritt 2: Schreiben der Programme

Es gibt eine ganze Reihe von Funktionen, die im Programm verwendet werden können, diese Funktionen können mit dem Befehl "doc roomba" aufgerufen werden. Mit diesen Funktionen können Sie Ihren Roomba auf viele verschiedene Arten steuern. Der unten angegebene Code verwendet die Stoßsensoren, Lichtbalkensensoren, Kameras und Klippensensoren auf unterschiedliche Weise, um einen Mars-Rover zu erstellen. Wir haben die Stoßsensoren verwendet, um zu erkennen, wenn der Roomba auf ein Objekt trifft. Wenn dies passiert, fährt der Roboter rückwärts, dreht sich um und bewegt sich weiter. Bevor der Roomba auf ein Objekt trifft, erkennt der Lichtbalken das Objekt und verlangsamt den Roomba, sodass der Roomba weniger beschädigt/beeinträchtigt wird, wenn er gegen das Objekt stößt, um den Stoßsensor zu aktivieren. Die Kamera sucht nach Wasser oder Lava auf der Oberfläche. Wenn keine Flüssigkeit gefunden wird, sucht der Roboter weiter, wenn Wasser gefunden wird, benachrichtigt der Roboter die Bediener. Die Klippensensoren sollen den Roboter stoppen, wenn er sich einer Klippe nähert. Wenn der Roboter eine Klippe erkennt, fährt er rückwärts und dreht sich um, um einen Sturz zu vermeiden.

Schritt 3: Code

Kopieren Sie diese und fügen Sie sie in eine MATLAB-Datei ein, die sich im selben Ordner wie die Bibliotheken befindet

functionMainRoombaFile(r)

r.setDriveVelocity(0.1, 0.1)

while true % Infinte while-Schleife, um den Code am Laufen zu halten

dontFall = cliffCheck(r) % Weist die Variable 'dontFall' der Funktion 'cliffCheck' zu

if dontFall % if-Anweisung, um im Code fortzufahren, nachdem 'cliffCheck' abgeschlossen ist

r.setDriveVelocity(0.1, 0.1) % Hält Roomba in Bewegung, nachdem 'cliffCheck' abgeschlossen ist

end % beendet 'dontFall' if-Anweisung

Bumper=bumpcheck(r) % Weist die Variable 'bumper' der Funktion 'bumpcheck' zu

if Bumper % if Anweisung, um im Code fortzufahren, nachdem 'bumpcheck' abgeschlossen ist

r.setDriveVelocity(0.1, 0.1) % Hält Roomba in Bewegung, nachdem der 'Bumpcheck' abgeschlossen ist

end % beendet 'Stoßstange' if-Anweisung

liquids = LiquidCheck(r) % Weist die Variable 'liquids' der Funktion 'LiquidCheck' zu

if liquids % if-Anweisung, um im Code fortzufahren, nachdem 'LiquidCheck' abgeschlossen ist

r.setDriveVelocity(0.1, 0.1) % Hält Roomba in Bewegung, nachdem 'LiquidCheck' abgeschlossen ist

end % beendet 'Flüssigkeiten' if-Anweisung

lightbumper=lightcheck(r) % Weist die Variable 'lightbumper' der Funktion 'lightcheck' zu

pause(0.1) % Halten Sie kurz an, um eine kontinuierliche Schleifeniteration zu vermeiden

end % endet unendlich while Schleife

Ende % beendet Funktion

function buffer=bumpcheck(r) % Erzeugt die Funktion 'bumpcheck'

Bumpdata= r.getBumpers % Weist alle Daten des Bumpers der Variablen 'bumpdata' zu

Bumper = Bumpdata.right || Bumpdata.left || Bumpdata.front % Erstellt eine gespeicherte Variable, 'bumper', für die verschiedenen Stoßfänger

if Bumpdata.right>0 % If-Anweisung, um verschiedene Funktionen des Roomba auszuführen, wenn der Bumper angestoßen wird

r.stop % Stoppt Roomba

r.moveDistance(-0.3, 0.2) % kehrt Roomba 0.3m. um

r.turnAngle(90, 0.5) % Dreht Roomba so schnell wie möglich um 90 Grad

Ende

wenn Bumpdata.front>0

r.stop

r.moveDistance(-0,3, 0,2)

r.turnAngle(randi(270), 0.5) % Rotiert Roomba in einem zufälligen Intervall zwischen 0 und 270 Grad so schnell wie möglich

Ende

wenn Bumpdata.left>0

r.stop

r.moveDistance(-0,3, 0,2)

r.turnAngle(-90, 0.5) % Dreht Roomba so schnell wie möglich um -90 Grad

Ende

Ende

function lightbumper=lightcheck(r) % Erzeugt die 'Lightcheck'-Funktion

lightdata= r.getLightBumpers % Weist alle Daten des Lichtstoßsensors der Variablen 'lightdata' zu

lightbumper = lightdata.left || lightdata.right || lightdata.rightCenter || lightdata.leftCenter % Erstellt eine gespeicherte Variable, 'lightbumper', für die verschiedenen Light-Bumper

if lightbumper % If-Anweisung zum Aufrufen der Lightbumper-Daten von oben

if lightdata.left>10 % If-Anweisung, um verschiedene Funktionen des Roomba auszulösen, wenn der Lichtpuffer mehr als 10 Werte erkennt

r.setDriveVelocity(0.05, 0.05) % Verlangsamt Roomba, um sich auf Stöße vorzubereiten

end % beendet die initiale if-Anweisung

if lightdata.rightCenter>10

r.setDriveVelocity(0.05, 0.05)

Ende

if lightdata.right>10

r.setDriveVelocity(0.05, 0.05)

Ende

if lightdata.leftCenter>10

r.setDriveVelocity(0.05, 0.05)

Ende

end % beendet 'lightbumper' if-Anweisung

Ende %endet Lichtcheckfunktion

Funktion dontFall = cliffCheck(r) % Erzeugt die Funktion 'cliffCheck'

data = r.getCliffSensors; % Weist alle Daten vom Klippensensor der Variablen 'data' zu

dontFall = data.left<1020 || data.leftFront<1020 || data.rightFront<1020 || data.right<1020 % Erstellt eine gespeicherte Variable, 'dontFall', für die verschiedenen Klippensensoren

if dontFall % If-Anweisung zum Aufrufen der Klippensensordaten von oben

if data.left < 1010 % If-Anweisung, dass verschiedene Funktionen des Roomba ausgeführt werden, wenn der Cliff-Sensor weniger als 1010 Werte erfasst

r.stop

r.moveDistance(-0.2, 0.2) % kehrt Roomba 0.2m. um

r.turnAngle(-90, 0.5) % Dreht Roomba so schnell wie möglich um -90 Grad

elseif data.leftFront < 1010

r.stop

r.moveDistance(-0,3, 0,2)

r.turnAngle(90, 0.5) % Dreht Roomba so schnell wie möglich um 90 Grad

elseif data.rightFront < 1010

r.stop

r.moveDistance(-0,3, 0,2)

r.turnAngle(90, 0.5) % Dreht Roomba so schnell wie möglich um 90 Grad

elseif data.right < 1010

r.stop

r.moveDistance(-0,3, 0,2)

r.turnAngle(90, 0.5) % Dreht Roomba so schnell wie möglich um 90 Grad

Ende

Ende

Ende

function liquids = LiquidCheck(r) % Erzeugt die Funktion 'LiquidCheck'

while true %start Endlosschleife zum Kalibrieren

img = r.getImage; % liest die Kamera des Roboters aus

image(img) % zeigt das Bild in einem Abbildungsfenster

red_mean = mean(mean(img(200, 150, 1)))% liest die durchschnittliche Anzahl roter Pixel

blue_mean = mean(mean(img(200, 150, 3)))% liest die durchschnittliche Anzahl blauer Pixel

Flüssigkeiten = red_mean || blue_mean % Erzeugt eine gespeicherte Variable, 'Liquids', für die verschiedenen Farbvariablen

if liquids % If-Anweisung zum Aufrufen der Bilddaten von oben

if red_mean>170 % If-Anweisung, um verschiedene Funktionen des Roomba auszulösen, wenn die Kamera eine mittlere rote Farbe von mehr als 170. sieht

r.stop % stoppt roomba

r.setLEDCenterColor(255) % setzt den Kreis auf die Farbe Rot

r.setLEDDigits(); % löscht das Display

f = waitbar(0, '*EINKOMMENE NACHRICHT*'); % erstellt eine Warteleiste für eine Ladenachricht

r.setLEDDigits('HOT'); % setzt die LED-Anzeige auf die Ausgabe von 'HOT'

Pause(0.5) %Kurze Pause zum Lesen der angezeigten Informationen

r.setLEDDigits('LAVA'); % setzt LED-Anzeige auf Ausgabe 'LAVA'

Pause(0.5)

waitbar(.33, f, '*EINKOMMENE NACHRICHT*'); %erzeugt eine Erhöhung der Warteleiste

r.setLEDDigits('HOT');

Pause(0.5)

r.setLEDDigits('LAVA');

Pause(0.5)

waitbar(.67, f, '*EINKOMMENE NACHRICHT*'); % erzeugt eine Erhöhung der Warteleiste

r.setLEDDigits('HOT');

Pause(0.5)

r.setLEDDigits('LAVA');

waitbar(1, f, '*EINKOMMENE NACHRICHT*'); %vervollständigt die Warteleiste

Pause(1)

close(f) %schließt die Warteleiste

r.setLEDDigits(); % löscht die LED-Anzeige

Alle schließen %Schließt alle vorherigen Fenster

Achsen('Color', 'none', 'XColor', 'none', 'YColor', 'none') % Löscht das Plotfenster der Achsen und des Diagramms

y = 0,5; % setzt die y-Position des Textes im Plotfenster

x = 0,06; % setzt die x-Position des Textes im Plotfenster

title('FROM MARS ROOMBA', 'fontsize', 32) % Fügt dem Plot-Fenster einen Titel hinzu

quadeqtxt = 'GEFAHR LAVA'; % Setzt die Variable 'quadeqtxt' auf Ausgabe 0

text(x, y, quadeqtxt, 'Interpreter', 'Latex', 'Schriftgröße', 36); % zeigt den Quadeq-Text im Plotfenster an

r.moveDistance(-0.2, 0.2) % kehrt den Roomba 0.2m. um

r.turnAngle(180, 0.5) %dreht den Roomba so schnell wie möglich um 180 Grad

r.setLEDCenterColor(128, 128); % setzt die mittlere LED des Roomba auf orange

schließe alle %schließt die verbleibenden offenen Fenster

elseif blue_mean>175 % If-Anweisung, um verschiedene Funktionen des Roomba zu veranlassen, wenn die Kamera eine mittlere blaue Farbe von mehr als 175. sieht

r.stop % stoppt roomba

r.setLEDCenterColor(255) % setzt den Kreis auf die Farbe Rot

r.setLEDDigits(); % löscht das Display

f = waitbar(0, '*EINKOMMENE NACHRICHT*'); % erstellt eine Warteleiste für eine Ladenachricht

r.setLEDDigits('LOOK'); % setzt die LED-Anzeige auf die Ausgabe von 'LOOK'

Pause(0.5) %Kurze Pause zum Lesen der angezeigten Informationen

r.setLEDDigits('WATR'); % setzt LED-Anzeige auf Ausgabe 'WATR'

Pause(0.5)

waitbar(.33, f, '*EINKOMMENE NACHRICHT*'); %erzeugt eine Erhöhung der Warteleiste

r.setLEDDigits('LOOK');

Pause(0.5)

r.setLEDDigits('WATR');

Pause(0.5)

waitbar(.67, f, '*EINKOMMENE NACHRICHT*'); % erzeugt eine Erhöhung der Warteleiste

r.setLEDDigits('LOOK');

Pause(0.5)

r.setLEDDigits('WATR');

waitbar(1, f, '*EINKOMMENE NACHRICHT*'); %vervollständigt die Warteleiste

Pause(1)

close(f) %schließt die Warteleiste

r.setLEDDigits(); % löscht die LED-Anzeige

Alle schließen %Schließt alle vorherigen Fenster

Achsen('Color', 'none', 'XColor', 'none', 'YColor', 'none') % Löscht das Plotfenster der Achsen und des Diagramms

y = 0,5; % setzt die y-Position des Textes im Plotfenster

x = 0,06; % setzt die x-Position des Textes im Plotfenster

title('FROM MARS ROOMBA', 'fontsize', 32) % Fügt dem Plot-Fenster einen Titel hinzu

quadeqtxt = 'GEFUNDENES WASSER'; % Setzt die Variable 'quadeqtxt' auf Ausgabe 0

text(x, y, quadeqtxt, 'Interpreter', 'Latex', 'Schriftgröße', 36); % zeigt den Quadeq-Text im Plotfenster an

r.moveDistance(-0.2, 0.2) % kehrt den Roomba 0.2m. um

r.turnAngle(180, 0.5) %dreht den Roomba so schnell wie möglich um 180 Grad

r.setLEDCenterColor(128, 128); % setzt die mittlere LED des Roomba auf orange

schließe alle %schließt die verbleibenden offenen Fenster

end %endet 'red_mean' if-Anweisung

end %endet 'Flüssigkeiten' if-Anweisung

end % schließt unendlich while-Schleife

end % beendet Funktion 'LiquidCheck'

Schritt 4: Ausführen des Codes

Nachdem Sie den Code kopiert und in MATLAB eingefügt haben, müssen Sie sich mit dem Roomba verbinden. Sobald der Roomba verbunden ist, müssen Sie die Variable r benennen. Die Funktionen verwenden die Variable r, wenn sie sich auf den Roomba beziehen, daher muss der Roomba als Variable r definiert werden. Nach dem Ausführen des Codes sollte der Roomba wie angewiesen ausgeführt werden.

Empfohlen: