Kazalo:

Rpibot - O učenju robotike: 9 korakov
Rpibot - O učenju robotike: 9 korakov

Video: Rpibot - O učenju robotike: 9 korakov

Video: Rpibot - O učenju robotike: 9 korakov
Video: Pyramids Are Not What You Think They Are: Underground Halls Beneath Them 2024, November
Anonim
Rpibot - O učenju robotike
Rpibot - O učenju robotike

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

Zgradite podvozje
Zgradite podvozje
Zgradite podvozje
Zgradite podvozje
Zgradite podvozje
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

Elektronika in ožičenje
Elektronika in ožičenje
Elektronika in ožičenje
Elektronika in ožičenje
Elektronika in ožičenje
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

Infrastruktura programske opreme
Infrastruktura programske opreme
Infrastruktura programske opreme
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

Uporabniški vmesnik
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

Programiranje robotske platforme
Programiranje robotske platforme
Programiranje robotske platforme
Programiranje robotske platforme
Programiranje robotske platforme
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

Kalibracije senzorjev
Kalibracije senzorjev
Kalibracije senzorjev
Kalibracije senzorjev
Kalibracije senzorjev
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

Alternativni modeli
Alternativni modeli
Alternativni modeli
Alternativni modeli
Alternativni modeli
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

Obdelava slik
Obdelava slik
Obdelava slik
Obdelava slik
Obdelava slik
Obdelava slik
Obdelava slik
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…

Naslednji koraki…
Naslednji koraki…
Naslednji koraki…
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: