Kazalo:
- 1. korak: Zgradite podvozje
- 2. korak: Elektronika in ožičenje
- 3. korak: Infrastruktura programske opreme
- 4. korak: uporabniški vmesnik
- 5. korak: Programiranje robotske platforme
- Korak 6: Kalibracije senzorjev
- 7. korak: Alternativni modeli
- 8. korak: Obdelava slik
- 9. korak: Naslednji koraki…
Video: Rpibot - O učenju robotike: 9 korakov
2024 Avtor: John Day | [email protected]. Nazadnje spremenjeno: 2024-01-30 12:02
Sem inženir programske opreme v nemškem avtomobilskem podjetju. Ta projekt sem začel kot učna platforma za vgrajene sisteme. Projekt je bil predčasno odpovedan, vendar sem v njem tako užival, da sem nadaljeval v prostem času. To je rezultat…
Imel sem naslednje zahteve:
- Preprosta strojna oprema (poudarek je programska oprema)
- Poceni strojna oprema (približno 100 €)
- Razširljivo (nekatere možnosti so že del opisa)
- Napajalna napetost za vse komponente iz enega samega 5V vira (powerbank)
Razen učenja res ni bil cilj. Platforma se lahko uporablja za učenje, nadzor, robotska tekmovanja,…
To ni vadnica za začetnike. Potrebujete osnovno znanje o:
- Programiranje (Python)
- Osnovna elektronika (za povezavo modulov z ustrezno napetostjo)
- Osnovna teorija upravljanja (PID)
Končno se boste verjetno soočili s težavami, kot sem se jaz. Z nekaj radovednosti in vzdržljivosti boste šli skozi projekt in rešili izzive. Moja koda je čim bolj preprosta in kritične kodne vrstice so komentirane, da dajo namige.
Celotna izvorna koda in datoteke so na voljo tukaj:
Zaloge:
Mehanika
- 1x vezana plošča (velikost A4, debelina 4 mm)
- 3x M4 x 80 Vijak in matica
- 2x zobniški motorji s sekundarno izhodno gredjo za dajalnik. Kolesa.
- 1x prosto kolo
1x montaža kamere za premikanje in nagibanje (neobvezno)
Elektronika
- 1x Raspberry Pi Zero z glavo in kamero
- 1x servo krmiljenje PCA 9685
- 2x optično dajalno kolo in vezje
- 1x Ženske mostičke
- 1x USB powerbank
- 1x gonilnik z dvojnim motorjem DRV8833
- 2x mikro servomotor SG90 za premikanje in nagib fotoaparata (neobvezno)
- 1x MPU9250 IMU (neobvezno)
- 1x ultrazvočni senzor razdalje HC-SR04 (neobvezno)
- 1x perforirana plošča in spajkalna žica, glave,…
1. korak: Zgradite podvozje
Nisem dober oblikovalec mehanikov. Tudi cilj projektov ni preživeti preveč časa v podvozju. Vsekakor sem opredelil naslednje zahteve:
- Poceni materiali
- Hitra montaža in demontaža
- Razširljivo (npr. Prostor za dodatne senzorje)
- Lahki materiali za varčevanje z energijo za elektroniko
Enostavno in poceni podvozje je lahko iz vezanega lesa. Je enostaven za strojno obdelavo z žago in ročnim vrtalnikom. Lahko lepite majhne lesene dele, da ustvarite ohišja za senzorje in motorje.
Pomislite na zamenjavo okvarjenih komponent ali električno odpravljanje napak. Glavni deli morajo biti pritrjeni z vijaki, da jih je mogoče zamenjati. Pištola za vroče lepilo je lahko preprosta, vendar verjetno ni najboljši način za izdelavo podvozja … Potreboval sem veliko časa, da sem razmišljal o enostavnem konceptu za enostavno razstavljanje delov. 3D tiskanje je dobra alternativa, vendar je lahko precej drago ali dolgotrajno.
Prosto kolo je končno zelo lahko in ga je enostavno namestiti. Vse alternative so bile vse težke ali polne trenja (nekaj sem jih preizkusil, preden sem našel zadnjega). Po montaži glavnih koles sem moral izrezati le lesen distančnik za izravnavo repnega kolesa.
Lastnosti koles (za izračun programske opreme)
Obseg: 21, 5 cm Impulzi: 20 impulzov/vrtljaj Ločljivost: 1, 075 cm (nazadnje je 1 impulz približno 1 cm, kar je enostavno za programske izračune)
2. korak: Elektronika in ožičenje
Projekt uporablja različne module, kot je prikazano na diagramu.
Glavni krmilnik je Raspberry Pi Zero. Odčitava senzorje in krmili motorje s PWM signalom. Z oddaljenim računalnikom je povezan prek wifi.
DRV8833 je dvomotorni H-most. Motorjem zagotavlja zadosten tok (česar Raspberry Pi ne zmore, saj lahko izhodi oddajo le nekaj mA).
Optični dajalnik zagotavlja signal kvadratne oblike vsakič, ko svetloba gre skozi koda dajalnika. HV prekinitve Raspberry Pi bomo uporabili za pridobivanje informacij ob vsakem preklopu signala.
Pca9695 je servo krmilna plošča. Komunicira z zaporednim vodilom I2C. Ta plošča zagotavlja signale PWM in napajalno napetost, ki nadzoruje servomotorje za premikanje in nagib odmikača.
MPU9265 je 3-osni pospešek, 3-osna kotna hitrost vrtenja in 3-osni senzor magnetnega toka. Uporabili ga bomo predvsem za naslov kompasa.
Različni moduli so med seboj povezani z mostično žico. Matična plošča deluje kot dispečer in zagotavlja napajalne napetosti (5V in 3.3V) in podlago. Vse povezave so opisane v tabeli povezav (glej prilogo). Priključitev 5V na 3.3V vhod bo verjetno uničila vaš čip. Bodite previdni in dvakrat preverite vso napeljavo (preden upoštevate dajalnik). Pred priključitvijo vseh plošč morate izmeriti glavne napajalne napetosti na odpremni plošči z multimetrom. Moduli so bili pritrjeni z najlonskimi vijaki v ohišje. Tudi tukaj sem bil vesel, da sem jih popravil, a tudi odstranil v primeru okvare.
Edino spajkanje so bili nazadnje motorji in plošča ter glave. Če sem iskren, so mi skakalne žice všeč, vendar lahko vodijo do ohlapne povezave. V nekaterih primerih vam lahko pri spremljanju povezav pomagajo nekateri nadzori programske opreme.
3. korak: Infrastruktura programske opreme
Ko bomo dosegli mehaniko, bomo vzpostavili nekaj programske infrastrukture za udobne razvojne pogoje.
Git
To je brezplačen in odprtokodni sistem za nadzor različic. Uporablja se za upravljanje velikih projektov kot Linux, lahko pa tudi za majhne projekte (glejte Github in Bitbucket).
Spremembam projekta je mogoče slediti lokalno in jih potisniti na oddaljeni strežnik za skupno rabo programske opreme s skupnostjo.
Glavni uporabljeni ukazi so:
git clone https://github.com/makerobotics/RPIbot.git [Pridobite izvorno kodo in git konfiguracijo]
git pull origin master [prenesite najnovejše podatke iz oddaljenega skladišča]
git status [dobite status lokalnega skladišča. Ali so kakšne datoteke spremenjene?] Git log [dobite seznam zavez] git add. [dodaj vse spremenjene datoteke v fazo, ki bo upoštevana pri naslednji predaji] git commit -m "komentar za oddajo" [posreduj spremembe v lokalno skladišče] git push origin master [potisni vse ureze v oddaljeno skladišče]
Zapisovanje
Python ponuja nekaj vgrajenih funkcij beleženja. Struktura programske opreme bi morala pred začetkom nadaljnjega razvoja opredeliti že ves okvir za beleženje.
Zapisovalnik je mogoče konfigurirati tako, da se v terminalu ali v dnevniški datoteki zapisuje z določeno obliko. V našem primeru je zapisovalnik nastavljen s razredom spletnega strežnika, lahko pa tudi sami. Tukaj nastavimo le raven beleženja na DEBUG:
logger = logging.getLogger (_ ime_)
logger.setLevel (logging. DEBUG)
Merjenje in risanje
Za analizo signalov skozi čas je najbolje, da jih narišete v grafikonu. Ker ima Raspberry Pi samo konzolni terminal, bomo podatke izsledili v datoteki csv, ločeni s podpičjem, in jih narisali iz oddaljenega računalnika.
Datoteko za sledenje, ločeno s podpičjem, ustvari naša glavna koda python in mora imeti take glave:
časovni žig; 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;
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;
Prvi stolpec vsebuje časovni žig. Naslednji stolpci so brezplačni. Skript za načrtovanje se pokliče s seznamom stolpcev, ki jih je treba narisati:
oddaljeni@pc: ~/python rpibot_plotter -f trace.csv -p speedL, speedR, pwmL, pwmR
Scenarij zapleta je na voljo v mapi z orodji:
Ploter uporablja mathplotlib v Pythonu. Morate ga kopirati v računalnik.
Za večje udobje se skript python pokliče z bash skriptom (plot.sh), ki se uporablja za kopiranje datoteke sledi Raspberry Pi v oddaljeni računalnik in klicanje ploterja z izbiro signala. Bash skript "plot.sh" vpraša če je treba kopirati datoteko. To je bilo zame bolj priročno, namesto da vsakič ročno kopiram. "sshpass" se uporablja za kopiranje datoteke iz Raspberry Pi na oddaljeni računalnik prek scp. Sposoben je kopirati datoteko, ne da bi zahteval geslo (posreduje se kot parameter).
Končno se odpre okno s ploskvijo, kot je prikazano na sliki.
Komunikacija na daljavo
Razvojni vmesnik za Raspberry Pi je SSH. Datoteke lahko urejate neposredno na tarči ali jih kopira scp.
Za nadzor robota se na Pi -ju izvaja spletni strežnik, ki zagotavlja nadzor prek Websockets. Ta vmesnik je opisan v naslednjem koraku.
Namestite Raspberry Pi
V mapi "doc" izvorne kode (setup_rpi.txt) je datoteka, ki opisuje nastavitev Raspberry Pi. Razlag ni veliko, je pa veliko uporabnih ukazov in povezav.
4. korak: uporabniški vmesnik
Za gostovanje uporabniškega vmesnika uporabljamo lahek spletni strežnik Tornado. To je modul Python, ki ga pokličemo ob zagonu programske opreme za upravljanje robotov.
Arhitektura programske opreme
Uporabniški vmesnik je zgrajen z naslednjimi datotekami: gui.html [Opisovanje kontrolnikov in postavitve spletne strani] gui.js [Vsebuje kodo javascript za krmiljenje in odpiranje povezave websocket z našim robotom] gui.css [Vsebuje sloge html kontrole. Položaji kontrol so opredeljeni tukaj]
Komunikacija prek spletnega vtičnice
Uporabniški vmesnik ni najbolj kul, vendar opravlja svoje delo. Tu sem se osredotočil na nove tehnologije, kot je Websockets.
Spletno mesto komunicira z robotskim spletnim strežnikom prek Websockets. To je dvosmerni komunikacijski kanal, ki bo ostal odprt, ko se je povezava vzpostavila. Ukaze robota pošljemo prek Websocketa na Raspberry Pi in dobimo informacije (hitrost, položaj, tok kamere) nazaj za prikaz.
Postavitev vmesnika
Uporabniški vmesnik ima ročni vnos za ukaze. Ta je bil na začetku uporabljen za pošiljanje ukazov robotu. Potrditveno polje vklopi in izklopi tok kamere. Oba drsnika nadzorujeta premikanje in nagibanje kamere. Zgornji desni del uporabniškega vmesnika nadzoruje gibanje robotov. Lahko nadzorujete hitrost in ciljno razdaljo. Osnovne informacije o telemetriji so prikazane na risbi robota.
5. korak: Programiranje robotske platforme
Ta del je bil glavni cilj projekta. Veliko programske opreme sem prenovil, ko sem predstavil novo ohišje z enosmernimi motorji. Python sem uporabil kot programski jezik iz različnih razlogov:
- Je glavni jezik Raspberry Pi
- To je jezik na visoki ravni z mnogimi vgrajenimi funkcijami in razširitvami
- Je objektno naravnan, lahko pa se uporablja tudi za zaporedno programiranje
- Sestavljanje in veriga orodij nista potrebna. Uredite kodo in jo zaženite.
Glavna arhitektura programske opreme
Programska oprema je objektno naravnana, razdeljena na nekaj predmetov. Moja ideja je bila razdeliti kodo na 3 funkcionalne bloke:
Sense Think Actuate
Sense.py
Pridobivanje in obdelava glavnih senzorjev. Podatki so shranjeni v slovarju za uporabo v naslednji fazi.
Control.py
Podrazred za aktiviranje krmili motorje in servomotorje po določeni abstrakciji. Največji nadzorni objekt obravnava ukaze na visoki ravni in tudi krmilne algoritme (PID) za motor.
rpibot.py
Ta glavni predmet je upravljanje spletnega strežnika Tornado in ustvarjanje primerov čutilnih in nadzornih razredov v ločenih nitih.
Vsak modul se lahko izvaja sam ali kot del celotnega projekta. Zaznate lahko samo informacije o senzorju in jih natisnete, da preverite, ali so senzorji pravilno priključeni in dajejo prave informacije.
PID nadzor
Prva naloga je ugotoviti, kaj želimo nadzorovati. Začel sem s poskusom nadzora položaja, ki je bil zelo kompleksen in ni veliko pomagal.
Končno želimo nadzorovati vsako hitrost kolesa in tudi smer robota. Za to moramo uvrstiti dve kontrolni logiki.
Za povečanje kompleksnosti korak za korakom je treba robota nadzorovati:
odprta zanka (s konstantno močjo)
pwm = K
nato dodajte algoritem zaprte zanke
pwm = Kp.speedError+Ki. Integracija (speedError)
in nazadnje dodaj nadzor smeri kot zadnji korak.
Za nadzor hitrosti sem uporabil "PI" kontrolo in "P" samo za nihanje. Parametre sem ročno nastavil z eksperimentiranjem. Tu bi verjetno lahko uporabili veliko boljše parametre. Moja tarča je bila samo ravna črta in skoraj sem jo dobil. V programski opremi sem ustvaril vmesnik za pisanje nekaterih spremenljivk z uporabniškim vmesnikom. Za nastavitev parametra Kp na 1.0 je potreben naslednji ukaz v uporabniškem vmesniku:
SET; Kp; 1,0
Parameter P bi lahko nastavil ravno tako nizko, da se izognem kakršnemu koli pregrešitvi. Preostalo napako odpravi parameter I (integrirana napaka)
Težko mi je bilo ugotoviti, kako umakniti obe kontroli. Rešitev je preprosta, vendar sem že prej poskusil na številne druge načine … Tako sem končno spremenil cilj hitrosti koles, da se obrne v eno ali drugo smer. Neposredna sprememba izhoda za nadzor hitrosti je bila napaka, saj je nadzor hitrosti poskušal odstraniti to motnjo.
Uporabljeni kontrolni diagram je priložen. Prikazuje le levo stran robotskega upravljalnika.
Korak 6: Kalibracije senzorjev
Najprej je treba upoštevati, da mora celotna IMU delovati pravilno. Naročil sem 3 dele in jih poslal nazaj, dokler nisem imel popolnoma delujočega senzorja. Vsak prejšnji senzor je imel nekatere dele senzorja, ki niso delovali pravilno ali pa sploh niso delovali. Uporabil sem nekaj primerov skriptov, da sem preizkusil osnove, preden sem jih namestil v robota.
Signale senzorja IMU je treba pred uporabo kalibrirati. Nekateri signali senzorjev so odvisni od kota in položaja vgradnje.
Umerjanje pospeška in vrtenja
Najlažja kalibracija je za vzdolžni pospešek (A_x). V mirovanju naj bo okoli 0 m/s². Če senzor pravilno zavrtite, lahko izmerite težo (okoli 9, 8 m/s²). Če želite umeriti a_x, ga morate samo pravilno namestiti in nato definirati odmik, da dosežete 0 m/s² v mirovanju. Zdaj je A_x umerjen. Na podoben način lahko v mirovanju dobite odmike za hitrosti vrtenja.
Kalibracija magnetometra za kompas
Za senzorje magnetnega polja je potrebna bolj zapletena kalibracija. Uporabili bomo m_x in m_y, da magnetno polje postavimo na vodoravno raven. M_x in m_y nam bosta dala priložnost izračunati smer kompasa.
Za naš preprost namen bomo kalibrirali le odstopanje trdega železa. To je treba izvesti, ko je senzor v končnem položaju, saj je to odvisno od motenj magnetnega polja.
Zabeležimo m_x in m_y, medtem ko obračamo robota okoli osi z. Narišemo m_x proti m_y v grafikonu XY. Rezultat je elipsa, kot je prikazano na sliki. Elipsa mora biti centrirana na izvor. Tu upoštevamo največje in najmanjše vrednosti m_x in m_y, da dobimo odmike v obe smeri. Na koncu preverimo umerjanje in vidimo, da je elipsa zdaj centrirana.
Umerjanje iz mehkega železa bi pomenilo, da sliko spremenimo iz elipse v krog. To je mogoče doseči z dodajanjem faktorja vsaki vrednosti senzorja.
Zdaj je mogoče kodirati preskusno rutino za ponovno kalibracijo ali vsaj preveriti, ali so senzorji še vedno umerjeni.
Nagib kompasa
Podatki magnetometra bodo zdaj uporabljeni za izračun smeri kompasa. Za to moramo pretvoriti signale m_x in m_y v kot. Python neposredno zagotavlja funkcijo math.atan2, ki ima ta cilj. Celoten izračun je opredeljen v datoteki mpu9250_i2c.py ("calcHeading (mx, my, mz)").
7. korak: Alternativni modeli
Projekt je trajal veliko časa, saj je bila zasnova popolnoma odprta. Za vsako komponento sem naredil nekaj prototipov in doživel omejitve sistema.
Najbolj zapletena tema je bil kodirnik koles. Pred iskanjem trenutno uporabljenega optičnega kodirnika sem preizkusil 3 različne možnosti. Menim, da so tudi prekinjene rešitve pri takem projektu zelo zanimive. To zadeva dele, kjer sem se največ naučil.
Servo z neprekinjenim vrtenjem priključen na pca 9695
Da bi se izognili dodatnemu H-mostu za enosmerni motor, sem najprej začel s servomotorji z neprekinjenim vrtenjem. Te je poganjal že prisotni servo gonilnik pca 9695. Vsa pogonska mehanika in ustrezna elektronika sta bili veliko enostavnejši. Ta zasnova je imela dve pomanjkljivosti:
- Slab nadzor nad servomotorji.
- Manjka lokacija za shranjevanje kodirnika
Servomotorji se začnejo premikati s 50% pwm in imajo polno hitrost pri približno 55%. To je zelo slabo območje nadzora.
Brez dajalnika dajalnika je bilo zelo težko najti dajalnik, pripravljen za uporabo. Preizkusil sem 3 različne dajalnike odbojnosti, ki so bili nameščeni na ohišju. Na zunanjo stran kolesa sem prilepil samokodirano kodirno kolo s črno -belimi odseki. Uporabil sem senzorje QTR-1RC, ki potrebujejo veliko obdelave signala, da dobijo pravi signal. Raspberry Pi ni mogel izvesti takšne obdelave v realnem času. Zato sem se odločil, da bom robotu dodal NodeMCU D1 mini kot krmilnik v realnem času. Serijski UART ga je povezal z malino Pi za dostavo obdelanih podatkov senzorja. NodeMCU je upravljal tudi senzor HC-SR04. Mehanika je bila težka in ne zelo robustna, serijska linija je dobivala hrup iz linije I2C in motorjev, zato sem na koncu zgradil drugo različico podvozja z enostavnimi zobniškimi motorji z enosmernim tokom H-most. Ti motorji imajo sekundarno izhodno gred za namestitev optičnega dajalnika.
8. korak: Obdelava slik
Za izboljšanje avtonomne vožnje lahko naredimo nekaj obdelave slik.
Knjižnica opencv je referenca za to. Python ga lahko uporablja za hitro izvedbo zaznavanja ovir.
Posnamemo sliko in uporabimo nekaj nalog obdelave slik:
Prvi preskusi so bili izvedeni s transformacijami Cannyja in Sobela. Canny je lahko dober kandidat, vendar ni dovolj razumen. Sobel je preveč razumen (odkritih je preveč predmetov).
Nazadnje sem naredil lasten filter za mešanje vseh vodoravnih in navpičnih nagibov (zaznavanje pohištva):
- Barvno sliko spremenite v sivo sliko
- Zameglite sliko, da odstranite majhen šum
- Sliko meji na črno -belo sliko
- Zdaj zaznavamo vodoravne in navpične naklone, da zaznamo predmete kot stene in pohištvo
- Filtriramo samo velike preostale konture (glej barvne konture na sliki)
Zdaj lahko te nove podatke uporabimo za odkrivanje ovir …
9. korak: Naslednji koraki…
Zdaj imamo preprosto robotsko platformo s senzorji, aktuatorji in kamero. Moj cilj je avtonomno premikanje in vrnitev na postajo brez dodajanja dodatnih senzorjev. Za to bom potreboval naslednje korake:
- Zlitje senzorjev signalov nihanja in magnetnega smeri
- Obdelava slik kamere (za to je na voljo le nizek procesor)
- Zaznavanje trkov (ultrazvočna razdalja in kamera)
- Gradnja ali orientacija zemljevida
Zdaj pa pojdite in si ustvarite lastne izzive ali cilje …
Priporočena:
Rokavice iz mehke robotike: 8 korakov (s slikami)
Soft Robotics Rokavice: Moj projekt je softrobotic rokavica. Na vsakem prstu je nameščen aktuator; spodnji del rokavice je odstranjen, da jo uporabnik olajša. Sprožilce aktivira naprava, nameščena na zapestju, nekoliko večja od ure.
Števec korakov - mikro: Bit: 12 korakov (s slikami)
Števec korakov - Micro: Bit: Ta projekt bo števec korakov. Za merjenje korakov bomo uporabili senzor pospeška, ki je vgrajen v Micro: Bit. Vsakič, ko se Micro: Bit trese, bomo štetju dodali 2 in ga prikazali na zaslonu
Pomočnik pri učenju in njegovi materiali: 4 koraki
Pomočnik pri učenju in njegovi materiali: Za predmet delam napravo, ki bo ljudem pomagala pri boljšem učenju in imeli več počitka za študente, za napravo, senzor bi lahko odšteval, koliko časa ste študirali, koliko časa za počitek bi lahko koliko časa je imel študent
Prvi dan robotike K-2: Moč projektnega drevesa!: 8 korakov (s slikami)
Prvi dan robotike K-2: moč projektnega drevesa !: Prvi dan 1. stopnje robotike (z uporabo Racer Pro-botov ®) učence seznanimo z " njihovimi roboti " nato pa jim pokažite Project Challenge-Tree ™ Št. 1. Drevesa projektov ustvarjajo pogoje za aktivno učno cono ™
Delavnica robotike HackerBoxes: 22 korakov
Delavnica robotike HackerBoxes: Delavnica robotike HackerBoxes je bila zasnovana tako, da je nudila zelo zahteven, a prijeten uvod v robotske sisteme DIY in tudi elektroniko za ljubitelje na splošno. Delavnica robotike je namenjena izpostavljanju udeležencev tem pomembnim