Sisukord:

Rpibot - robootika õppimisest: 9 sammu
Rpibot - robootika õppimisest: 9 sammu

Video: Rpibot - robootika õppimisest: 9 sammu

Video: Rpibot - robootika õppimisest: 9 sammu
Video: How I Make Viral AI History Shorts (6+ Hour Course) 2024, Juuli
Anonim
Rpibot - robootika õppimisest
Rpibot - robootika õppimisest

Olen sisseehitatud tarkvarainsener ühes Saksa autotööstusettevõttes. Alustasin seda projekti sisseehitatud süsteemide õppeplatvormina. Projekt tühistati varakult, kuid mulle meeldis see nii palju, et jätkasin vabal ajal. See on tulemus…

Mul olid järgmised nõuded:

  • Lihtne riistvara (fookuses on tarkvara)
  • Odav riistvara (umbes 100 €)
  • Laiendatav (mõned valikud on juba osa kirjeldusest)
  • Toitepinge kõikidele komponentidele ühest 5 V allikast (powerbank)

Õppimise kõrval ei olnud tegelikult eesmärki. Platvormi saab kasutada õppimiseks, jälgimiseks, robotivõistlusteks…

See ei ole algajate õpetus. Teil on vaja mõningaid põhiteadmisi:

  • Programmeerimine (Python)
  • Põhielektroonika (moodulite ühendamiseks õige pingega)
  • Põhiline juhtimisteooria (PID)

Lõpuks seisate tõenäoliselt silmitsi probleemidega nagu mina. Teatud uudishimu ja vastupidavusega läbite projekti ja lahendate väljakutsed. Minu kood on võimalikult lihtne ja kriitilised koodiridad on vihjete andmiseks kommenteeritud.

Kogu lähtekood ja failid on saadaval siin:

Tarvikud:

Mehaanika

  • 1x vineerplaat (A4 suurus, paksus 4 mm)
  • 3x M4 x 80 Kruvi ja mutter
  • 2x Käigumootorid sekundaarse väljundvõlliga kodeerija jaoks. Rattad.
  • 1x vaba ratas

1x panoraam- ja kallutuskaamera (valikuline)

Elektroonika

  • 1x Raspberry Pi Zero koos päise ja kaameraga
  • 1x PCA 9685 servojuhtimine
  • 2x optilise kodeerija ratas ja ahel
  • 1x naissoost juhtmed
  • 1x USB toitepank
  • 1x kahe mootoriga draiver DRV8833
  • 2x Mikroservod SG90 kaamera panoraami ja kallutamise jaoks (valikuline)
  • 1x MPU9250 IMU (valikuline)
  • 1x HC-SR04 ultraheli kaugusandur (valikuline)
  • 1x perforeeritud plaat ja jootetraat, päised,…

Samm: ehitage šassii

Ehitage šassii
Ehitage šassii
Ehitage šassii
Ehitage šassii
Ehitage šassii
Ehitage šassii

Ma ei ole hea mehaanikukujundaja. Samuti ei ole projektide eesmärk veeta šassiis liiga palju aega. Igatahes määratlesin järgmised nõuded:

  • Odavad materjalid
  • Kiire kokkupanek ja demonteerimine
  • Laiendatav (nt ruumi lisatud anduritele)
  • Kerged materjalid säästavad elektroonika jaoks energiat

Lihtne ja odav šassii saab valmistada vineerist. Seda on lihtne freessaagi ja käsipuuriga töödelda. Andurite ja mootorite hoidete loomiseks võite liimida väikesi puidust osi.

Mõelge defektsete komponentide asendamisele või elektrilisele silumisele. Peamised osad tuleb vahetatavate kruvidega kinnitada. Kuum liimipüstol võib olla lihtne, kuid ilmselt mitte parim viis šassii ehitamiseks … Mul oli vaja palju aega, et mõelda lihtsale kontseptsioonile osade hõlpsaks lahtivõtmiseks. 3D -printimine on hea alternatiiv, kuid võib olla üsna kallis või aeganõudev.

Tasuta ratas on lõpuks väga kerge ja kergesti paigaldatav. Kõik alternatiivid olid rasked või täis hõõrdumist (proovisin paar neist enne lõpliku leidmist). Pärast pearataste paigaldamist pidin sabavaba ratta tasandamiseks lõikama ainult puidust vahekauguse.

Ratta omadused (tarkvara arvutuste jaoks)

Ümbermõõt: 21, 5 cm Impulsid: 20 impulssi/pööre. Lahendus: 1, 075 cm (lõpuks on 1 impulss umbes 1 cm, mis on tarkvara arvutamiseks lihtne)

Samm: elektroonika ja juhtmestik

Elektroonika ja juhtmestik
Elektroonika ja juhtmestik
Elektroonika ja juhtmestik
Elektroonika ja juhtmestik
Elektroonika ja juhtmestik
Elektroonika ja juhtmestik

Projekt kasutab erinevaid mooduleid, nagu skeemil näidatud.

Raspberry Pi Zero on peamine kontroller. See loeb andureid ja juhib mootoreid PWM -signaali abil. See on WiFi -ga ühendatud kaugarvutiga.

DRV8833 on kahe mootoriga H-sild. See tagab mootoritele piisava voolu (mida Raspberry Pi ei saa teha, kuna väljundid suudavad väljastada ainult osa mA).

Optiline kodeerija annab ruudukujulise signaali iga kord, kui valgus läbib kodeerimisrattaid. Kasutame Raspberry Pi HW katkestusi, et saada teavet iga kord, kui signaal ümber lülitub.

Pca9695 on servo juhtpaneel. See suhtleb I2C jadasiini kaudu. See plaat pakub PWM -signaale ja toitepinget, mis kontrollivad nukkude panoraamimise ja kallutamise servosid.

MPU9265 on 3-teljeline kiirendus, 3-teljeline pöörlemiskiirus ja 3-teljeline magnetvoo andur. Kasutame seda peamiselt kompassi pealkirja saamiseks.

Kõik erinevad moodulid on ühendatud hüppajajuhtmega. Leivaplaat toimib dispetšerina ja pakub toitepinget (5 V ja 3,3 V) ja maandust. Kõik ühendused on kirjeldatud ühendustabelis (vt manus). 5 V ühendamine 3,3 V sisendiga hävitab tõenäoliselt teie kiibi. Olge ettevaatlik ja kontrollige kogu juhtmestikku kaks korda enne tarnimist (siin tuleb eriti arvesse võtta kodeerijat). Enne kõigi tahvlite ühendamist peaksite multimeedriga mõõtma saatmisplaadi peamist toitepinget. Moodulid kinnitati šassii külge nailonkruvidega. Ka siin olin õnnelik, et sain need parandatud, kuid ka rikke korral eemaldatavad.

Ainus jootmine oli lõpuks mootorid ning leivalaud ja päised. Ausalt öeldes mulle meeldivad hüppaja juhtmed, kuid need võivad põhjustada lõdva ühenduse. Mõnes olukorras võivad mõned tarkvara jälgimised teid ühenduste analüüsimisel toetada.

3. samm: tarkvara infrastruktuur

Tarkvara infrastruktuur
Tarkvara infrastruktuur
Tarkvara infrastruktuur
Tarkvara infrastruktuur

Pärast mehaanika saavutamist seadistame mõningase tarkvara infrastruktuuri, et oleks mugavad arendustingimused.

Git

See on tasuta ja avatud lähtekoodiga versioonide juhtimissüsteem. Seda kasutatakse suurte projektide haldamiseks Linuxina, kuid seda saab hõlpsasti kasutada ka väikeste projektide jaoks (vt Github ja Bitbucket).

Projekti muudatusi saab kohapeal jälgida ja ka kaugserverisse edastada, et tarkvara kogukonnaga jagada.

Peamised kasutatavad käsud on järgmised:

git kloon https://github.com/makerobotics/RPIbot.git [Hangi lähtekood ja giti konfiguratsioon]

git pull päritolu kapten [hankige uusim teave hoidlast]

git status [saate kohaliku hoidla oleku. Kas faile on muudetud?] Git log [hankige kohustuste loend] git add. [lisage kõik muudetud failid etappi, mida tuleb järgmiseks siduda] git pühendus -m "kommentaar kohustuseks" [muudatuste tegemine kohalikku hoidlasse] git push päritolu kapten [lükake kõik kohustused kaughoidlasse]

Logimine

Python pakub sisseehitatud logimisfunktsioone. Tarkvara struktuur peaks enne edasise arendamise alustamist juba määratlema kogu logiraamistiku.

Logijat saab konfigureerida logima määratud vormingus terminalis või logifailis. Meie näites on logija konfigureeritud veebiserveri klassi poolt, kuid me võiksime seda teha ka iseseisvalt. Siin määrame logimise tasemeks ainult DEBUG:

logger = logging.getLogger (_ nimi_)

logger.setLevel (logging. DEBUG)

Mõõtmine ja joonistamine

Signaalide analüüsimiseks aja jooksul on kõige parem joonistada need diagrammile. Kuna Raspberry Pi -l on ainult konsooliterminal, jälgime andmeid semikooloniga eraldatud csv -failis ja joonistame need kaugarvutist.

Semikooloniga eraldatud jäljefaili genereerib meie peamine pythoni kood ja sellel peavad olema sellised päised:

timestamp; yawCorr; encoderR; I_L; odoDistance; ax; encoderL; I_R; yaw; eSpeedR; eSpeedL; pwmL; speedL; CycleTimeControl; wz; pwmR; speedR; Iyaw; hdg; m_y; m_x; eYaw; cycleT

1603466959.65;0;0;25;0.0;-0.02685546875;0;25;0;25;25;52;0.0;23;0.221252441406;16;0.0;0;252.069366413;-5.19555664062;-16.0563964844;0;6; 1603466959.71;0;0;50;0.0;0.29150390625;0;50;0;25;25;55;0.0;57;-8.53729248047;53;0.0;0;253.562118111;-5.04602050781;-17.1031494141;0;6; 1603466959.76;0;-1;75;0.0;-0.188232421875;1;75;2;25;25;57;0;52;-24.1851806641;55;0;0;251.433794171;-5.64416503906;-16.8040771484;2;7;

Esimene veerg sisaldab ajatemplit. Järgmised veerud on tasuta. Joonistamisskripti kutsutakse koos joonistatavate veergude loendiga:

remote@pc: ~/python rpibot_plotter -f trace.csv -p speedL, speedR, pwmL, pwmR

Graafiku skript on saadaval tööriistade kaustas:

Plotter kasutab Pythonis mathplotlibi. Peate selle oma arvutisse kopeerima.

Mugavuse huvides kutsub pythoni skripti bash -skript (plot.sh), mida kasutatakse Raspberry Pi jäljefaili kopeerimiseks kaugarvutisse ja helistamiseks joonistajale. Bash -skript "plot.sh" küsib kui faili tuleb kopeerida. See oli minu jaoks mugavam, mitte iga kord käsitsi kopeerida. "sshpass" kasutatakse faili kopeerimiseks Raspberry Pi -st kaugarvutisse scp kaudu. See on võimeline faili kopeerima ilma parooli küsimata (see edastatakse parameetrina).

Lõpuks avatakse aken joonisega, nagu pildil näidatud.

Kaugsuhtlus

Raspberry Pi arendusliides on SSH. Faile saab redigeerida otse sihtmärgil või kopeerida scp abil.

Roboti juhtimiseks töötab Pi -l veebiserver, mis pakub juhtimist Websocketide kaudu. Seda liidest kirjeldatakse järgmises etapis.

Seadistage Raspberry Pi

Lähtekoodi kaustas "doc" on fail Raspberry Pi seadistamist kirjeldav fail (setup_rpi.txt). Seletusi pole palju, kuid palju kasulikke käske ja linke.

4. samm: kasutajaliides

Kasutajaliides
Kasutajaliides

Kasutame kasutajaliidese majutamiseks kerget Tornado veebiserverit. See on Pythoni moodul, mida me kutsume roboti juhtimistarkvara käivitamisel.

Tarkvara arhitektuur

Kasutajaliides on üles ehitatud järgmiste failide abil: gui.html [Veebilehe juhtelementide ja paigutuse kirjeldamine] gui.js [Sisaldab JavaScripti koodi, mis haldab juhtelemente ja avab veebipistiku ühenduse meie robotiga] gui.css [Sisaldab html juhtelemendid. Juhtseadiste asukohad on määratletud siin]

Veebipistiku side

Kasutajaliides ei ole kõige lahedam, kuid teeb tööd. Keskendusin siin tehnoloogiatele, mis olid mulle uued, näiteks Websockets.

Veebisait suhtleb roboti veebiserveriga Websocketsi kaudu. See on kahesuunaline suhtluskanal, mis jääb ühenduse loomise ajal avatuks. Saadame roboti käsud Websocket'i kaudu Raspberry Pi -le ja saame teabe (kiirus, asukoht, kaamera voog) kuvamiseks tagasi.

Liidese paigutus

Kasutajaliidesel on käskude käsitsi sisestamine. Seda kasutati alguses robotile käskluste saatmiseks. Märkeruut lülitab kaamera voo sisse ja välja. Kaks liugurit juhivad kaamera panoraami ja kallutamist. Kasutajaliidese ülemine parempoolne osa juhib robotite liikumist. Saate juhtida kiirust ja sihtmärgi kaugust. Telemeetria põhiteave kuvatakse roboti joonisel.

Samm: robotplatvormi programmeerimine

Robotplatvormi programmeerimine
Robotplatvormi programmeerimine
Robotplatvormi programmeerimine
Robotplatvormi programmeerimine
Robotplatvormi programmeerimine
Robotplatvormi programmeerimine

See osa oli projekti peamine eesmärk. Ma uuendasin palju tarkvara, kui tutvustasin uut šassii alalisvoolumootoritega. Ma kasutasin Pythoni programmeerimiskeelena erinevatel põhjustel:

  • See on Raspberry Pi peamine keel
  • See on kõrgetasemeline keel, millel on palju sisseehitatud funktsioone ja laiendusi
  • See on objektorienteeritud, kuid seda saab kasutada ka järjestikuseks programmeerimiseks
  • Kompileerimist ega tööriistaketti pole vaja. Muutke koodi ja käivitage see.

Peamine tarkvaraarhitektuur

Tarkvara on objektorienteeritud, jagatud mõneks objektiks. Minu idee oli jagada kood kolmeks funktsionaalseks plokiks:

Sense Think Actuate

Sense.py

Põhianduri hankimine ja töötlemine. Andmed salvestatakse sõnastikku, mida kasutatakse järgmises etapis.

Control.py

Käivitamise alamklass juhib mootoreid ja servosid pärast mõningast abstraktsiooni. Peamine juhtimisobjekt käsitleb mootori kõrgetasemelisi käske ja ka juhtimisalgoritme (PID).

rpibot.py

Selle peamine eesmärk on Tornado veebiserveri haldamine ning tunnete ja juhtimisklasside loomine eraldi lõimedeks.

Iga moodulit saab käivitada üksi või kogu projekti osana. Saate tuvastada ja printida ainult anduriteavet, et kontrollida, kas andurid on õigesti ühendatud ja edastavad õiget teavet.

PID -kontroll

Esimene ülesanne on välja selgitada, mida me tahame kontrollida. Alustasin sellega, et proovisin positsiooni kontrollida, mis oli väga keeruline ja ei aidanud palju.

Lõpuks tahame kontrollida iga ratta kiirust ja ka roboti suunda. Selleks peame kaks juhtloogikat kaskaadima.

Keerukuse suurendamiseks samm -sammult tuleks robotit juhtida:

avatud ahel (pideva võimsusega)

pwm = K

seejärel lisage suletud ahela algoritm

pwm = Kp.speedError+Ki. Integratsioon (speedError)

ja lõpuks lisage viimase sammuna suunakontroll.

Kiiruse reguleerimiseks kasutasin "PI" juhtseadet ja "P" ainult pöörde jaoks. Seadistasin parameetrid katsetades käsitsi. Siin saaks ilmselt kasutada palju paremaid parameetreid. Minu sihtmärk oli lihtsalt sirgjoon ja ma sain selle peaaegu kätte. Lõin tarkvarasse liidese, et kasutajaliidese abil mõned muutujad kirjutada. Parameetri Kp seadmine väärtusele 1.0 vajab kasutajaliideses järgmist käsku:

SET; Kp; 1.0

Ma võin P parameetri seadistada piisavalt madalaks, et vältida ülekoormust. Ülejäänud viga parandatakse parameetriga I (integreeritud viga)

Mul oli raske teada saada, kuidas mõlemat juhtseadet kaskaadida. Lahendus on lihtne, kuid proovisin enne ka mitmel muul viisil … Lõpuks muutsin rataste kiiruseesmärki, et pöörata ühte või teise suunda. Kiiruse reguleerimise väljundi vahetamine oli viga, kuna kiiruse reguleerimine üritas seda häiret eemaldada.

Kasutatud juhtimisskeem on lisatud. See näitab ainult roboti juhtelemendi vasakut külge.

6. samm: anduri kalibreerimine

Anduri kalibreerimine
Anduri kalibreerimine
Anduri kalibreerimine
Anduri kalibreerimine
Anduri kalibreerimine
Anduri kalibreerimine

Kõigepealt tuleb arvestada, et kogu IMU peab korralikult töötama. Tellisin 3 osa ja saatsin need tagasi, kuni andur oli täis. Igal varasemal anduril ei töötanud mõned anduri osad korralikult või üldse mitte. Ma kasutasin mõningaid näidiskripte, et testida põhitõdesid enne roboti paigaldamist.

IMU anduri signaalid tuleb enne kasutamist kalibreerida. Mõned andurisignaalid sõltuvad kinnitusnurgast ja asendist.

Kiirenduse ja pöörlemiskiiruse kalibreerimine

Kõige lihtsam on kalibreerida pikikiirendust (A_x). Seismisel peaks olema umbes 0 m/s². Kui pöörate andurit õigesti, saate mõõta raskusastet (umbes 9,8 m/s²). A_x kalibreerimiseks peate selle lihtsalt õigesti paigaldama ja seejärel nihke määratlema, et saada seisakul 0 m/s². Nüüd on A_x kalibreeritud. Pöörlemiskiiruste nihkeid saate seiskumisel samamoodi.

Magnetomeetri kalibreerimine kompassi jaoks

Magnetvälja andurite jaoks on vaja keerukamat kalibreerimist. Magnetvälja horisontaaltasandile saamiseks kasutame m_x ja m_y. M_x ja m_y omamine annab meile võimaluse arvutada kompassi pealkiri.

Oma lihtsal eesmärgil kalibreerime ainult kõva raua kõrvalekalde. Seda tuleb teha nii, et andur on lõppasendis, kuna see sõltub magnetvälja häiretest.

Salvestame m_x ja m_y, pöörates robotit ümber z-telje. Joonestame m_x vs m_y diagrammi XY. Tulemuseks on ellips, nagu pildil näidatud. Ellips peab olema päritolu keskmes. Siin kaalume m_x ja m_y maksimaalseid ja minimaalseid väärtusi, et saada nihkeid mõlemas suunas. Lõpuks kontrollime kalibreerimist ja näeme, et ellips on nüüd tsentreeritud.

Pehme raua kalibreerimine tähendaks, et muudame pildi ellipsist ringiks. Seda saab teha, lisades igale sentoorväärtusele teguri.

Testi rutiini saab nüüd kodeerida, et uuesti kalibreerida või vähemalt kontrollida, kas andurid on endiselt kalibreeritud.

Kompassi pealkiri

Magnetomeetri andmeid kasutatakse nüüd kompassi suuna arvutamiseks. Selleks peame m_x ja m_y signaalid nurgaks teisendama. Python pakub otseselt funktsiooni math.atan2, millel on see eesmärk. Täielik arvutus on määratletud failis mpu9250_i2c.py ("calcHeading (mx, my, mz)").

Samm: alternatiivsed kujundused

Alternatiivsed kujundused
Alternatiivsed kujundused
Alternatiivsed kujundused
Alternatiivsed kujundused
Alternatiivsed kujundused
Alternatiivsed kujundused

Projekt võttis palju aega, kuna disain oli täiesti avatud. Iga komponendi jaoks tegin mõned prototüübid ja kogesin süsteemi piire.

Kõige keerulisem teema oli rataste kodeerija. Enne praegu kasutatava optilise kodeerija leidmist katsetasin 3 erinevat võimalust. Arvan, et ka katkestatud lahendused on sellises projektis väga huvitavad. See puudutab neid osi, kus ma kõige rohkem õppisin.

Pideva pöörlemise servo ühendatud seadmega pca 9695

Alalisvoolumootori täiendava H-silla vältimiseks alustasin esmalt pideva pöörlemise servodega. Neid juhtis juba kohal olev servojuht pca 9695. Kogu tõukejõu mehaanika ja vastav elektroonika olid palju lihtsamad. Sellel disainil oli kaks puudust:

  • Servode halb juhtimisulatus.
  • Puudub kodeerija hoidmiskoht

Servod hakkavad liikuma 50% pwm ja nende täiskiirus on umbes 55%. See on väga halb juhtimisvahemik.

Ilma kodeerijata oli väga raske leida kasutusvalmis kodeerijat. Testisin 3 erinevat peegeldusandurit, mis olid šassiile paigaldatud. Teipisin isetehtud kodeerimisratta ratta välisküljele mustvalgete sektsioonidega. Kasutasin QTR-1RC andureid, mis vajavad õige signaali saamiseks palju signaalitöötlust. Raspberry Pi ei suutnud sellist reaalajas töötlemist teostada. Seega otsustasin robotile lisada reaalajas kontrolleriks NodeMCU D1 mini. Seeria UART ühendas selle vaarika Pi -ga töödeldud anduri andmete edastamiseks. NodeMCU haldas ka andurit HC-SR04. Mehaanika oli keeruline ja mitte eriti vastupidav, seerialiin sai I2C liinist ja mootoritest müra, nii et lõpuks ehitasin šassii teise versiooni lihtsate hammasratastega alalisvoolumootoritega H-sild. Nendel mootoritel on optilise kodeerija paigutamiseks sekundaarne väljundvõll.

8. samm: pilditöötlus

Pildi töötlemine
Pildi töötlemine
Pildi töötlemine
Pildi töötlemine
Pildi töötlemine
Pildi töötlemine
Pildi töötlemine
Pildi töötlemine

Autonoomse sõidu parandamiseks saame pilditöötlust teha.

Opencv raamatukogu on selleks viide. Python saab seda kasutada takistuste tuvastamise kiireks rakendamiseks.

Jäädvustame pildi ja rakendame mõningaid pilditöötlusülesandeid:

Esimesed testid tehti Canny ja Sobeli teisendustega. Canny võib olla hea kandidaat, kuid pole piisavalt mõistlik. Sobel on liiga mõistlik (tuvastati liiga palju objekte).

Lõpuks tegin oma filtri kõigi horisontaalsete ja vertikaalsete gradientide segamiseks (mööbli tuvastamiseks):

  • Muutke värviline pilt halli taseme kujutiseks
  • Väikese müra eemaldamiseks hägustage pilt
  • Lävendage pilt mustvalgeks
  • Nüüd tuvastame horisontaalseid ja vertikaalseid kaldeid, et tuvastada esemeid kui seinu ja mööblit
  • Filtreerime ainult järelejäänud suured kontuurid (vt värvilisi kontuure pildil)

Nüüd saame seda uut teavet kasutada takistuste avastamiseks …

Samm: järgmised sammud…

Järgmised sammud…
Järgmised sammud…
Järgmised sammud…
Järgmised sammud…

Nüüd on meil lihtne robotplatvorm koos andurite, ajamite ja kaameraga. Minu eesmärk on liikuda autonoomselt ja minna tagasi jaama ilma täiendavaid andureid lisamata. Selleks vajan järgmisi samme:

  • Anduri sulandumine pöörde ja magnetilise suuna signaalide suhtes
  • Kaamera pilditöötlus (selle jaoks on saadaval ainult madal protsessor)
  • Kokkupõrke tuvastamine (ultraheli kaugus ja kaamera)
  • Kaardi koostamine või orientatsioon

Nüüd minge ja looge oma väljakutsed või eesmärgid…

Soovitan: