Inhoudsopgave:

Mars Roomba Project UTK - Ajarnpa
Mars Roomba Project UTK - Ajarnpa

Video: Mars Roomba Project UTK - Ajarnpa

Video: Mars Roomba Project UTK - Ajarnpa
Video: EF 230 Roomba Project 2024, Juli-
Anonim
Mars Roomba Project UTK
Mars Roomba Project UTK
Mars Roomba Project UTK
Mars Roomba Project UTK

DISCLAIMER: DIT WERKT ALLEEN ALS DE ROOMBA IS INGESTELD IN A

ZEER SPECIFIEKE MANIER, DIT INSTRUCTABLE IS GEMAAKT VOOR EN BEDOELD OM TE WORDEN GEBRUIKT DOOR UNIVERSITEIT VAN TENNESSEE STUDENTEN EN FACULTEIT

Deze code wordt gebruikt om een Roomba in te stellen om lokaal geschreven en opgeslagen code in MATLAB uit te voeren. Dit werkt niet als u de benodigde bibliotheken niet van de website van de Universiteit van Tennessee kunt krijgen. Als u over de bibliotheken beschikt, kunt u deze gebruiken om uw eigen Roomba te programmeren met behulp van de functies in de bibliotheek. Deze Instructable leert je hoe je de bibliotheken installeert, een map voor alle code maakt en hoe je het programma codeert en gebruikt dat we hieronder hebben verstrekt.

Benodigde materialen:

· Kamerba

· MATLAB

· Raspberry Pi en Pi-camera

Stap 1: De bibliotheken verkrijgen

Op de engineering website is een toolbox/bibliotheek aanwezig, download deze en plaats deze in een nieuwe map. Deze map moet alle projectwerkbestanden bevatten, aangezien elke functie die in een programma dat u maakt, naar de bibliotheek moet verwijzen. Nadat je dit hebt gedaan, kun je aan je programma's gaan werken

Stap 2: De programma's schrijven

Er zijn nogal wat functies die in het programma kunnen worden gebruikt, deze functies zijn toegankelijk met het commando "doc roomba". Met deze functies kunt u uw Roomba op veel verschillende manieren bedienen. De onderstaande code gebruikt de stootsensoren, lichtbalksensoren, camera en klifsensoren op verschillende manieren om een marsrover te maken. We hebben de stootsensoren gebruikt om te detecteren wanneer de Roomba een object raakt. Wanneer dit gebeurt, zal de robot achteruitrijden, zich omdraaien en blijven bewegen. Voordat de Roomba een object raakt, zal de lichtbalk het object detecteren en de Roomba vertragen, zodat wanneer hij tegen het object botst om de stootsensor te activeren, de Roomba minder wordt beschadigd/beïnvloed door de impact. De camera zoekt naar water of lava op het oppervlak, als er geen vloeistof wordt gevonden, gaat de robot verder met zoeken, als er wat water wordt gevonden, zal de robot de operators een bericht sturen. De klifsensoren zijn ontworpen om de robot te stoppen als deze een klif nadert. Als de robot een klif detecteert, keert hij om en draait hij zich om om te voorkomen dat hij valt.

Stap 3: Coderen

Kopieer en plak dit in een MATLAB-bestand dat zich in dezelfde map als de bibliotheken bevindt

functieHoofdkamerbaFile(r)

r.setDriveVelocity(0.1, 0.1)

while true % Oneindige while-lus om de code actief te houden

dontFall = cliffCheck(r) % Wijst variabele 'dontFall' toe aan de functie 'cliffCheck'

if dontFall % if statement om verder te gaan in code nadat 'cliffCheck' is voltooid

r.setDriveVelocity(0.1, 0.1) % Houdt Roomba in beweging nadat 'cliffCheck' is voltooid

end % beëindigt 'dontFall' if-statement

bumper=bumpcheck(r) % Wijst variabele 'bumper' toe aan de functie 'bumpcheck'

if bumper % if statement om verder te gaan in code nadat 'bumpcheck' is voltooid

r.setDriveVelocity(0.1, 0.1) % Houdt Roomba in beweging nadat de 'bumpcheck' is voltooid

end % eindigt 'bumper' if statement

liquids = LiquidCheck(r) % Wijst variabele 'liquids' toe aan de functie 'LiquidCheck'

if liquids % if statement om verder te gaan in code nadat 'LiquidCheck' is voltooid

r.setDriveVelocity(0.1, 0.1) % Houdt Roomba in beweging nadat 'LiquidCheck' is voltooid

end % beëindigt 'liquids' if statement

lightbumper=lightcheck(r) % Wijst variabele 'lightbumper' toe aan de functie 'lightcheck'

pauze(0.1) % Pauzeer kort om continue lus-iteratie te voorkomen

end % eindigt oneindig while loop

einde % beëindigt functie

functie bumper=bumpcheck(r) % Creëert 'bumpcheck'-functie

bumpdata= r.getBumpers % Wijst alle gegevens van de bumper toe aan variabele 'bumpdata'

bumper = bumpdata.right || bumpdata.left || bumpdata.front % Creëert een opgeslagen variabele, 'bumper', voor de verschillende bumpers

if bumpdata.right>0 % If-instructie om ervoor te zorgen dat verschillende functies van de roomba worden uitgevoerd als er tegen de bumper wordt gestoten

r.stop % Stopt Roomba

r.moveDistance(-0.3, 0.2) % Keert Roomba 0.3m. om

r.turnAngle(90, 0,5) % Draait Roomba zo snel mogelijk 90 graden

einde

als bumpdata.front>0

r.stop

r.moveDistance(-0.3, 0.2)

r.turnAngle(randi(270), 0,5) % Draait Roomba zo snel mogelijk met een willekeurig interval tussen 0 en 270 graden

einde

if bumpdata.left>0

r.stop

r.moveDistance(-0.3, 0.2)

r.turnAngle(-90, 0.5) % Draait Roomba -90 graden zo snel mogelijk

einde

einde

functie lightbumper=lightcheck(r) % Creëert 'lightcheck'-functie

lightdata= r.getLightBumpers % Wijst alle gegevens van de lichtstootsensor toe aan variabele 'lightdata'

lightbumper = lightdata.left || lightdata.right || lightdata.rightCenter || lightdata.leftCenter % Creëert een opgeslagen variabele, 'lightbumper', voor de verschillende lichtbumpers

if lightbumper % If-statement om de lightbumper-gegevens van boven aan te roepen

if lightdata.left>10 % If-instructie om ervoor te zorgen dat verschillende functies van de roomba worden uitgevoerd als de lichtbumper meer dan 10 waarden waarneemt

r.setDriveVelocity(0.05, 0.05) % Vertraagt roomba om zich voor te bereiden op stoten

end % beëindigt initiële if-instructie

als lightdata.rightCenter>10

r.setDriveVelocity(0.05; 0.05)

einde

if lightdata.right>10

r.setDriveVelocity(0.05; 0.05)

einde

if lightdata.leftCenter>10

r.setDriveVelocity(0.05; 0.05)

einde

end % beëindigt 'lightbumper' if statement

einde %beëindigt lichtcontrolefunctie

functie dontFall = cliffCheck(r) % Creëert 'cliffCheck' functie

data = r.getCliffSensors; % Wijst alle data van de cliff-sensor toe aan variabele 'data'

dontFall = data.left<1020 || data.leftFront<1020 || data.rightFront<1020 || data.right<1020 % Creëert een opgeslagen variabele, 'dontFall', voor de verschillende klifsensoren

if dontFall % If-instructie om de cliff-sensorgegevens van boven op te roepen

if data.left < 1010 % If-statement om verschillende functies van de roomba te laten plaatsvinden als de cliff-sensor minder dan 1010 waarden waarneemt

r.stop

r.moveDistance(-0.2, 0.2) % Keert Roomba 0.2m. om

r.turnAngle(-90, 0.5) % Draait Roomba -90 graden zo snel mogelijk

elseif data.leftFront < 1010

r.stop

r.moveDistance(-0.3, 0.2)

r.turnAngle(90, 0,5) % Draait Roomba zo snel mogelijk 90 graden

elseif data.rightFront < 1010

r.stop

r.moveDistance(-0.3, 0.2)

r.turnAngle(90, 0,5) % Draait Roomba zo snel mogelijk 90 graden

elseif data.right < 1010

r.stop

r.moveDistance(-0.3, 0.2)

r.turnAngle(90, 0,5) % Draait Roomba zo snel mogelijk 90 graden

einde

einde

einde

functie vloeistoffen = LiquidCheck(r) % Creëert 'LiquidCheck' functie

while true %start oneindige lus voor kalibreren

img = r.getImage; % leest de camera van de robot af

image(img) % toont de afbeelding in een figuurvenster

red_mean = mean(mean(img(200, 150, 1)))% leest het gemiddelde aantal rode pixels

blue_mean = mean(mean(img(200, 150, 3)))% leest het gemiddelde aantal blauwe pixels

vloeistoffen = red_mean || blue_mean % Creëert een opgeslagen variabele, 'liquids', voor de verschillende kleurvariabelen

if liquids % If-instructie om de afbeeldingsgegevens van boven op te roepen

if red_mean>170 % If-instructie om ervoor te zorgen dat verschillende functies van de roomba worden uitgevoerd als de camera een gemiddelde rode kleur van meer dan 170 ziet

r.stop % stopt roomba

r.setLEDCenterColor(255) % zet cirkel op kleur rood

r.setLEDDigits(); % wis het scherm

f = wachtbalk (0, '*INKOMEND BERICHT*'); % maakt een wachtbalk voor een laadbericht

r.setLEDDigits('HOT'); % stelt LED-display in op uitgang 'HOT'

pauze(0.5) %Korte Pauze om weergegeven informatie te lezen

r.setLEDDigits('LAVA'); % stelt LED-display in op uitgang 'LAVA'

pauze(0.5)

wachtbalk(.33, f, '*INKOMEND BERICHT*'); %creëert een verhoging in de wachtbalk

r.setLEDDigits('HOT');

pauze(0.5)

r.setLEDDigits('LAVA');

pauze(0.5)

wachtbalk(.67, f, '*INKOMEND BERICHT*'); % creëert een toename in de wachtbalk

r.setLEDDigits('HOT');

pauze(0.5)

r.setLEDDigits('LAVA');

wachtbalk (1, f, '*INKOMEND BERICHT*'); %voltooit de wachtbalk

pauze(1)

close(f) %sluit de wachtbalk

r.setLEDDigits(); % wist het LED-display

sluit alles %Sluit alle vorige vensters

axes('Color', 'none', 'XColor', 'none', 'YColor', 'none') % Wist het plotvenster van de assen en het diagram

y=0,5; % stelt de y-positie van de tekst in het plotvenster in

x=0,06; % stelt de x-positie van de tekst in het plotvenster in

title('FROM MARS ROOMBA', 'fontsize', 32) % Voegt een titel toe aan het plotvenster

quadeqtxt = 'GEVAAR LAVA'; % Stelt de variabele 'quadeqtxt' in op uitvoer 0

text(x, y, quadeqtxt, 'interpreter', 'latex', 'fontsize', 36); % geeft de quadeq-tekst weer in het plotvenster

r.moveDistance(-0.2, 0.2) % keert de roomba 0.2m. om

r.turnAngle(180, 0,5) %draait de roomba zo snel mogelijk 180 graden

r.setLEDCenterColor(128, 128); % stelt de roomba center LED in op oranje

sluit alle %sluit resterende open vensters

elseif blue_mean>175 % If-instructie om ervoor te zorgen dat verschillende functies van de roomba worden uitgevoerd als de camera een gemiddelde blauwe kleur van meer dan 175 ziet

r.stop % stopt roomba

r.setLEDCenterColor(255) % zet cirkel op kleur rood

r.setLEDDigits(); % wis het scherm

f = wachtbalk (0, '*INKOMEND BERICHT*'); % maakt een wachtbalk voor een laadbericht

r.setLEDDigits('LOOK'); % stelt LED-display in op uitgang 'LOOK'

pauze(0.5) %Korte Pauze om weergegeven informatie te lezen

r.setLEDDigits('WATR'); % stelt LED-display in op uitgang 'WATR'

pauze(0.5)

wachtbalk(.33, f, '*INKOMEND BERICHT*'); %creëert een verhoging in de wachtbalk

r.setLEDDigits('LOOK');

pauze(0.5)

r.setLEDDigits('WATR');

pauze(0.5)

wachtbalk(.67, f, '*INKOMEND BERICHT*'); % creëert een toename in de wachtbalk

r.setLEDDigits('LOOK');

pauze(0.5)

r.setLEDDigits('WATR');

wachtbalk (1, f, '*INKOMEND BERICHT*'); %voltooit de wachtbalk

pauze(1)

close(f) %sluit de wachtbalk

r.setLEDDigits(); % wist het LED-display

sluit alles %Sluit alle vorige vensters

axes('Color', 'none', 'XColor', 'none', 'YColor', 'none') % Wist het plotvenster van de assen en het diagram

y=0,5; % stelt de y-positie van de tekst in het plotvenster in

x=0,06; % stelt de x-positie van de tekst in het plotvenster in

title('FROM MARS ROOMBA', 'fontsize', 32) % Voegt een titel toe aan het plotvenster

quadeqtxt = 'GEVONDEN WATER'; % Stelt de variabele 'quadeqtxt' in op uitvoer 0

text(x, y, quadeqtxt, 'interpreter', 'latex', 'fontsize', 36); % geeft de quadeq-tekst weer in het plotvenster

r.moveDistance(-0.2, 0.2) % keert de roomba 0.2m. om

r.turnAngle(180, 0,5) %draait de roomba zo snel mogelijk 180 graden

r.setLEDCenterColor(128, 128); % stelt de roomba center LED in op oranje

sluit alle %sluit resterende open vensters

end %ends 'red_mean' if-statement

end %ends 'liquids' if statement

end % sluit oneindig terwijl lus

einde % beëindigt functie 'LiquidCheck'

Stap 4: De code uitvoeren

Nadat u de code in MATLAB hebt gekopieerd en geplakt, moet u verbinding maken met de Roomba. Zodra de Roomba is aangesloten, moet u de variabele r een naam geven. De functies gebruiken de variabele r bij het verwijzen naar de Roomba, dus de Roomba moet worden gedefinieerd als de variabele r. Na het uitvoeren van de code zou de Roomba moeten werken volgens de instructies.

Aanbevolen: