Inhoudsopgave:

Robo-technicus: 8 stappen
Robo-technicus: 8 stappen

Video: Robo-technicus: 8 stappen

Video: Robo-technicus: 8 stappen
Video: Werkwijze Speciaal Machinebouw - alle 8 stappen 2024, Juli-
Anonim
Robo-technicus
Robo-technicus

Stel je voor dat je een van de astronauten bent die op Mars landt. Je hebt een miljoen dingen te doen, monsters te nemen, experimenten uit te voeren, gegevens te verzamelen, maar een of twee keer per dag moet je rond de woning en/of onderzoeksmodules waarin je woont en werkt om ze te inspecteren. Het is noodzakelijk, iemand moet ervoor zorgen dat het ding in goede staat is, dat alle duizenden onderdelen werken en op hun plaats zitten. Maar wat als er een geautomatiseerde helper was om u van sommige van die taken te ontlasten? Wat als er een kleine robot was die in de modules kon bewegen om ervoor te zorgen dat alles op zijn plaats, werkend en veilig was.

Robo-technicus te hulp.

In wezen bestuurt deze code de Robo-Technician terwijl deze een lichtgekleurd pad op de grond volgt. Het zal dit pad volgen totdat het een splitsing in het pad of een afslag vindt, waarna een foto moet worden gemaakt voor beeldverwerking, zodat de Robo-Technician een beslissing kan nemen over de volgende stap. De lichte stoot- en stootsensoren beschermen de Robo-technicus tegen schade, en de stootsensoren bepalen wanneer een diagnostische foto wordt genomen. Alles bij elkaar is de Robo-Technician ontworpen om rond te zoomen in de modules van de Mar, waardoor de astronauten tijd vrijmaken terwijl ze de basistaak van inspectie uitvoeren, en alleen menselijke input vragen als er iets mis is.

Nogmaals als waarschuwing, dit is een werk in uitvoering. De code, zoals die bestaat, werkt, maar er zijn problemen, vooral omdat er meerdere, overlappende programma's bij betrokken zijn. Om dit project in een echte Mars-missie te laten werken, zou er ook een robot voor dat specifieke doel moeten worden gebouwd, dus nogmaals, ik denk dat dit een "proof of concept" -build is.

Er zijn een paar dingen die je nodig hebt om dit op gang te krijgen. Je hebt een duur programma nodig, ondersteuningspakketten voor dat programma en een beetje achtergrond in coderen. Omdat ik een student ben en een deel van de code op de begane grond is verstrekt (voor de raspberry pi), zal ik niet specifiek over de opzet praten. Hieronder vind je alle links voor die basiscode. Laten we naar de materialenlijst gaan.

Hardware

  • Raspberry Pi (we gebruikten versie 3)
  • iRobot®
  • een soort houder om de Raspberry Pi aan de Robo-Technician vast te houden
  • Raspberry Pi-camera (maakt niet uit wat voor soort, zolang hij maar een goede autofocus en beeldresolutie heeft)
  • een soort standaard of holster om de camera naar voren gericht te houden op de Robo-Technician
  • een materiaal om te gebruiken als een strip, wit (of heel licht gekleurd), dat stevig op de vloer wordt vastgehouden. Het moet net iets breder zijn dan de ruimte tussen de voorste twee klifsensoren.
  • 4 borden met zeer grote tekst (met de woorden IMAGE, RIGHT, BACK en LEFT erop gedrukt)
  • Vellen gekleurd papier (minimaal drie en bij voorkeur rood, groen en blauw)

Software

  • Matlab (2018a en 2017b zijn beide gebruikt en lijken weinig verschil te maken)
  • Raspberry Pi-ondersteuningspakket voor Matlab
  • Raspberry Pi-code voor verbinding met Matlab (link naar de broncode hieronder)
  • Image Processing Toolbox voor Matlab (je kunt dit project vrijwel niet doen zonder de toolbox)
  • OPTIONEEL: Matlab Mobile geïnstalleerd op je telefoon, wat ik later zal uitleggen

Stap 1: De hardware instellen

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

Dit is de link voor de basiscode om ervoor te zorgen dat de iRobot® kan communiceren met Matlab, samen met een basishandleiding. Zoals ik al eerder zei, zal ik dit specifieke gedeelte niet behandelen, omdat de tutorial al erg goed is ingedeeld. Ik zal vermelden dat als je eenmaal de stappen op de link hebt gevolgd, je Matlab's "doc" -commando kunt gebruiken om de opgenomen informatie te bekijken. specifiek:

doc roomba

En nog een heel belangrijk punt.

Wanneer u de bestanden downloadt via de bovenstaande link, ZET ZE IN DE MAP DIE IK HIERBOVEN BESCHREVEN HEB, aangezien Matlab vereist dat door de gebruiker gegenereerde bestanden zich in de huidige werkmap bevinden.

Nu dat uit de weg is, gaan we verder met de code.

Stap 2: Al die sensoren vinden

Al die sensoren vinden
Al die sensoren vinden
Al die sensoren vinden
Al die sensoren vinden

Neem even de tijd en geef de iRobot® een inspectie. Het is goed om te weten waar deze zijn, zodat je een idee hebt van de invoer die de Robo-technicus ontvangt, en je zult in staat zijn om erachter te komen waarom het ding in cirkels ronddraait in plaats van het pad te volgen dat je instelt (dit kan of misschien niet is gebeurd). Je ziet duidelijk de grote fysieke stootsensor aan de voorkant. De klifsensoren zijn wat moeilijker te zien, je moet hem omdraaien en op zoek gaan naar de vier doorzichtige plastic ramen aan de voorkant. De lichte stootsensoren zijn nog meer verborgen, maar voor nu is het genoeg om te zeggen dat het leven in de glimmende zwarte band loopt rond de voorkant van de iRobot®, die zich aan de voorkant van de fysieke stootsensorbalk bevindt.

Er zijn wielvalsensoren, maar deze worden in dit project niet gebruikt, dus we gaan verder met het testen van de sensoren.

Stap 3: Testen om parameters in te stellen

Testen om parameters in te stellen
Testen om parameters in te stellen

Voordat we de Robo-Technician weg kunnen sturen om zijn werk te doen, moeten we zijn specifieke eigenaardigheden en sensorbereiken achterhalen. Aangezien elke iRobot® een beetje anders is en verandert gedurende de levensduur van de robot, moeten we uitzoeken hoe de sensoren de gebieden lezen waarin hij zal werken. De gemakkelijkste manier om dit te doen is door uw lichtgekleurde pad in te stellen (Ik heb stroken wit printerpapier gebruikt, maar alles wat lichtgekleurd is, is voldoende) op het oppervlak dat de Robo-technicus zal bedienen.

Start Matlab op en open een nieuw script. Bewaar het script IN DEZELFDE MAP DIE IK EERDER HEB BESCHREVEN en noem het wat je wilt (probeer het echter kort te houden, aangezien de naam van dit bestand de functienaam zal zijn). Schakel de robot in en gebruik de roomba-variabele instellingen uit de zelfstudie door de opdrachten in het opdrachtvenster te typen.

Zorg ervoor dat de Raspberry Pi is aangesloten op de iRobot® en dat uw computer is verbonden met dezelfde internetverbinding. U zult minder tijd besteden aan het uittrekken van uw haar om erachter te komen waarom Matlab geen verbinding maakt

r = roomba (nummer dat je hebt ingesteld)

De variabele " r " is in dit geval niet nodig, je kunt het noemen wat je wilt, maar het maakt het leven gemakkelijker om een variabele van één letter te gebruiken.

Zodra het pad is ingesteld en de roomba succesvol is aangesloten, plaatst u de toekomstige Robo-Technician waar een of twee van de klifsensoren zich boven het pad bevinden. Dat betekent natuurlijk dat de andere twee of drie boven het oppervlak liggen dat je hebt gekozen.

Start nu de testsensoren op met het commando:

r.testSensoren

Houd er rekening mee dat de " r. " de variabele is die u eerder hebt gedefinieerd, dus als het niet ' r ' is, wijzigt u de ' r.' naar wat je ook hebt besloten. Hierdoor wordt het testsensorscherm weergegeven met een heleboel informatie.

Voor dit project ligt de focus op de lightBumpers, bumpers en cliff-secties. Beweeg de Robo-Technician rond en let erop hoe de sensoren over verschillende oppervlakken veranderen, of hoe dichtbij een object moet zijn om de lichtBumper-waarden te laten veranderen, enz. Houd deze getallen in gedachten (of schrijf ze op), want u zult heb ze nodig om je parameters in een oogwenk in te stellen.

Stap 4: De code starten

Eerst ga je een functie bouwen. Ik noemde het "pad", maar nogmaals, de naam is niet nodig, maar ik zal er vanaf nu naar verwijzen als "pad".

Het bovenste gedeelte van de code stelt enkele gebruikersinvoeropties in. Het bouwt een aantal lijsten op die zullen worden gebruikt in de in listdlg en brengt dan een lijstdialoogvenster naar voren. Hierdoor kan de gebruiker selecteren welke padkleur hij wil volgen, wat later in het spel komt.

lijst = {'Rood', 'Blauw', 'Groen'}

problist = {'Ongeval, Afbeelding opslaan', 'Onderdeel niet op zijn plaats, Afbeelding opslaan', 'Verwacht, doorgaan'} pathcolor = listdlg('PromptString', 'Selecteer een padkleur', … 'SelectionMode', 'single', 'ListString', lijst) prob = 0; aandrijving = ;

De variabelen "prob" en "driv" moeten hier worden gedeclareerd, omdat ze binnen de hoofd while-lus van de functie worden gebruikt, maar nogmaals, als je een van deze variabelen wilt hernoemen of de lijstselecties wilt wijzigen, is het prima zolang je bent consistent in de rest van de code.

Stap 5: Top of the While-lus: fysieke stootsensoren

De bovenkant van de while-lus bevat de logica van de fysieke bumpsensor. Kortom, wanneer de Robo-technicus ergens tegenaan loopt, stopt hij (of voor de voorste stootsensor gaat hij 0,1 meter achteruit), en positioneert hij zichzelf om een foto te maken. Laten we eerst het snelheids- en positiecontrolegedeelte behandelen.

Als je in de vorige stappen alle sensoren op de Robo-Technician hebt getest, weet je dat de stootsensoren een logische waarde hebben (0 of 1) waarbij nul de normale, niet-ingedrukte positie van de sensor vertegenwoordigt. Houd dat in gedachten voor de code.

while true %main while-lus %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

Dit is het basisgedeelte "als het iets raakt, stop". Als de sensoren een botsing detecteren, gaat het naar het volgende deel van de code, dat de positie van de Robo-Technician opnieuw aanpast om een foto te maken.

if S.left ~= 0 %if loop neemt bumperinfo en lijnt camera uit voor foto r.turnAngle(5) pause(0.5) img = r.getImage %maakt foto en toont afbeelding(img) %dialoogvenster prob = listdlg(' PromptString', 'Onverwacht obstakel gevonden, identificeer aub'…, 'SelectionMode', 'single', 'ListString', problist) elseif S.right ~=0 r.turnAngle(-5) pause(0.5) img = r. getImage image(img) prob = listdlg('PromptString', 'Found an Unexpected Obstacle, Please Identificeer'…, 'SelectionMode', 'single', 'ListString', problist) elseif S.front ~= 0 r.moveDistance(- 0.1) pause(0.5) img = r.getImage image(img) prob = listdlg('PromptString', 'Found an Unexpected Obstacle, Please Identificeer'…, 'SelectionMode', 'single', 'ListString', problist) end

Kortom, zodra de afbeelding is gemaakt, verschijnt er een ander dialoogvenster met drie opties. De eerste twee opties slaan de foto op in een gespecificeerde map, die ik later zal behandelen, terwijl de derde optie gewoon het dialoogvenster sluit en door de lus gaat. Als je de opties niet meer weet, bekijk dan de vorige stap.

Nu heb ik een codegedeelte ingevoegd tussen het stootsensorgedeelte en het fotoopslaggedeelte. Dit neemt lightBumper-waarden en stelt de aandrijfsnelheid in op 0,025 meter/seconde (zeer langzaam), wat eigenlijk niet nodig is, maar het vermindert wel dat de Robo-Technician tegen dingen aanbotst en uiteindelijk de fysieke stootsensoren verslijt.

L = r.getLightBumpers als L.left > 100 || L.linksVoor >100 || L.rechtsVoor >100 || L.rechts >100 aandrijving = 0.025 r.setDriveVelocity(0.025) else aandrijving = 0.1 einde

Dit zou het deel zijn waar de waarden die je eerder hebt waargenomen (en hopelijk hebt opgeschreven) een rol gaan spelen

De "L.(zijde en richting van sensor)> 100" was gebaseerd op de waarden die ik heb waargenomen, dus als uw waarnemingen anders zijn, wijzigt u deze getallen. Het idee is dat als de Robo-Technician iets een paar centimeter ervoor voelt, hij zal vertragen, meer dan dat is niet nodig.

In het volgende gedeelte worden foto's opgeslagen voor later.

%als de eerste of tweede optie was geselecteerd in het prob-dialoogvenster, slaat de afbeelding op als prob == 1 %als de lus bestandsinfo voor de foto opbouwt, schrijft met tijdstempel t = klok; basisnaam = sprintf('\img_%d_%d_%d_%d_%d.png', t(1), t(2), t(3), t(4), t(5)); folder = 'E:\UTK\Classes\fall 18\ef230\irobot\images'; fullFileName = fullfile(map, basisnaam); imwrite(img, fullFileName) close Afbeelding 1 pause(2) elseif prob == 2 t = klok; basisnaam = sprintf('\img_%d_%d_%d_%d_%d.png', t(1), t(2), t(3), t(4), t(5)); folder = 'E:\UTK\Classes\fall 18\ef230\irobot\images'; fullFileName = fullfile(map, basisnaam); imwrite(img, fullFileName) close Afbeelding 1 pause(2) end

Alle bestandsnamen en locaties waar de foto's worden opgeslagen, zijn optioneel. Ik heb een map gekozen die is genest in de roomba-map die ik in de introductiestap heb gemaakt, maar deze kan overal zijn. Ook worden de foto's opgeslagen met de tijdstempel, maar dat is niet speciaal nodig (hoewel het hypothetisch nuttig zou zijn voor een Mars-missie).

Met de fysieke hobbelsensoren bedekt, kunnen we naar de klifsensoren gaan en het pad volgen.

Stap 6: Het pad volgen

De code voor de klifsensoren is ingesteld om de waarden van de twee voor- en twee zijsensorwaarden te vergelijken. U moet deze waarden (waarschijnlijk) wijzigen op basis van uw waargenomen waarden. U moet deze waarden waarschijnlijk ook na een paar testruns aanpassen en wijzigen op basis van het omgevingslicht, het tijdstip van de dag (afhankelijk van hoe goed het testgebied verlicht is) of wanneer de sensorvensters vuil zijn.

Voordat we echter bij de cliff-sensorcode komen, is er een kort codesegment dat ik heb ingevoegd om enkele van de onnodige gegevens van Matlab weg te spoelen. Dit onderdeel is niet nodig, maar ik heb het gebruikt om de opslagruimte te verminderen die nodig is om het programma uit te voeren.

wissen img wissen t wissen basisnaam wissen volledige bestandsnaam map wissen

Het volgende codesegment is het vlees van het project. Hiermee kan de Robo-Technician het lichtgekleurde pad volgen dat op de vloer is geplaatst. In een notendop, het probeert zichzelf te sturen zodat de voorste twee klifsensoren boven de drempel zijn, gebaseerd op uw waargenomen waarden, en stelt het programma in staat om iets later met de beeldverwerkingsstappen te beginnen.

C = r.getCliffSensors %if lus volgt een kleurenband (wit) als C.leftFront > 2000 && C.rightFront >2000 %rechte padgeleiding r.setDriveVelocity(driv) elseif C.leftFront 2000 %draait naar rechts als robot te ver gaat left r.turnAngle(-2.5) elseif C.leftFront >2000 && C.rightFront<2000%draait naar links als robot te ver naar rechts gaat r.turnAngle(2.5) elseif C.leftFront <2000 && C.rightFront 100 || L.linksVoor >100 || L.rechtsVoor >100 || L.right >100 img = r.getImage end %controleert of er een bocht in het pad is als C.left >2800 && C.right <2800 r.turnAngle(2.5) elseif C.left 2800 r.turnAngle(- 2.5) einde %plaatshouder voor pad beeldherkenning disp('GETTING IMAGE') einde einde einde

Houd er rekening mee dat de variabelenamen die ik heb gekozen optioneel zijn, maar nogmaals, ik denk dat het het leven gemakkelijker maakt om indien mogelijk variabelen met één letter te gebruiken

Om het middelste gedeelte van de code uit te leggen, wanneer de twee sensoren aan de voorkant van de rand van het pad lopen (als het gaat om een kruising of wanneer het het einde van het pad bereikt), kijkt het of er iets voor staat. Je moet een object op de grond aan het einde van het pad of op een kruispunt plaatsen om dit te laten werken.

Zodra de foto is gemaakt, gebruikt het beeldherkenning om erachter te komen wat te doen. Er is ook een plaatshouder in dit gedeelte van de code:

%plaatshouder voor pad beeldherkenningdisp('GETTING IMAGE')

Ik gebruikte dit voor het moment omdat ik specifiek wilde praten over de tekst- en kleurverwerking die plaatsvindt, wat in de volgende stap is.

Stap 7: Beeldverwerking

De beeldverwerking bestaat uit twee delen. Ten eerste is er de kleurherkenning, die de kleurintensiteit in de afbeelding berekent om te beslissen of er al dan niet doorgegaan wordt met tekstherkenning. De kleurberekeningen zijn gebaseerd op de keuze die in het begin in dat allereerste dialoogvenster is gemaakt (ik gebruikte rood, blauw, groen, maar je kunt alle kleuren kiezen die je wilt, zolang de gemiddelde waarden voor kleurintensiteit maar te herkennen zijn aan de Raspberry Pi-camera).

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 = gemiddelde(gemiddelde(imgb(:,:, 2))); b = gemiddelde(gemiddelde(imgb(:,:, 3)));

Dit is de intensiteitscontrole. Dit zal in het volgende segment worden gebruikt om te beslissen wat het wil doen.

if red > g && red >b if pathcolor == 1 imgc = imcrop(img, [0 30 512 354]) R = ocr(img) if R. Woorden{1} == IMAGE || R. Woorden{2} == AFBEELDING || R. Woorden{3} ==BEELD t = klok; basisnaam = sprintf('\img_%d_%d_%d_%d_%d.png', t(1), t(2), t(3), t(4), t(5)); folder = 'E:\UTK\Classes\fall 18\ef230\irobot\images'; fullFileName = fullfile(map, basisnaam); imwrite(img, fullFileName) pause(2) elseif R. Woorden{1} == RECHTS || R. Woorden{2} == RECHTS || R. Woorden{3} ==RECHTS r.turnAngle(-75) elseif R. Woorden{1} == LINKS || R. Woorden{2} == LINKS || R. Woorden{3} == LINKS r.turnAngle(75) elseif R. Woorden{1} == TERUG || R. Woorden{2} == TERUG || R. Words{3} ==TERUG r.turnAngle(110) end else r.turnAngle(110) end end

Dit segment bepaalt of de kleur die is geselecteerd in het eerste dialoogvenster overeenkomt met de kleur die de camera ziet. Als dit het geval is, wordt tekstherkenning uitgevoerd. Het kijkt welk woord (BEELD, TERUG, RECHTS of LINKS) verschijnt en draait vervolgens (voor rechts en links), draait rond (voor terug) of neemt een foto en slaat deze op dezelfde manier op als eerder.

Ik heb slechts een enkel gedeelte van de code voor de verschillende kleuren verstrekt

Om de code blauw en groen te laten herkennen, kopieert u eenvoudig de code en wijzigt u de logische controle bovenaan het segment en stelt u de " pathcolor == (nummer) " in om overeen te komen met de kleurselecties in het bovenste dialoogvenster (voor de code zoals deze wordt weergegeven, is blauw 2 en groen 3).

Stap 8: Het eindproduct

Het eindproduct
Het eindproduct

Nu moet de Robo-Technician rond de Mars-missiemodules zoomen en verslag uitbrengen aan de astronauten als er iets mis is.

Onthoud dat alle waarden van de klifsensor en lightBumper moeten worden gewijzigd in wat uw waargenomen waarden zijn. Ook heb ik uit ervaring geleerd dat het beter is om dit project te testen op een donker gekleurde vloer en het is nog beter als die vloer niet-reflecterend is. Hierdoor neemt het contrast tussen het pad en de vloer toe, waardoor de kans groter is dat de Robo-technicus het correct zal volgen.

Ik hoop dat je het leuk vond om een kleine helper voor de Mars-missie op te zetten, en veel plezier met het bouwen.

Aanbevolen: