Sadržaj:

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

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

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

Inženjer sam ugrađenog softvera u njemačkoj automobilskoj tvrtki. Ovaj sam projekt započeo kao platforma za učenje o ugrađenim sustavima. Projekt je rano otkazan, ali toliko sam uživao da sam nastavio u slobodno vrijeme. Ovo je rezultat…

Imao sam sljedeće zahtjeve:

  • Jednostavan hardver (fokus je softver)
  • Jeftin hardver (oko 100 €)
  • Proširivo (neke su opcije već dio opisa)
  • Napon napajanja za sve komponente iz jednog izvora 5V (powerbank)

Osim učenja, zapravo nije postojao cilj. Platforma se može koristiti za učenje, nadzor, robotska natjecanja,…

To nije vodič za početnike. Trebate osnovno znanje o:

  • Programiranje (Python)
  • Osnovna elektronika (za povezivanje modula odgovarajućim naponom)
  • Osnovna teorija upravljanja (PID)

Konačno ćete se vjerojatno suočiti s problemima kao i ja. S malo znatiželje i izdržljivosti proći ćete kroz projekt i riješiti izazove. Moj je kôd što je moguće jednostavniji, a kritični retci koda komentirani su kako bi dali savjete.

Cjeloviti izvorni kod i datoteke dostupni su ovdje:

Pribor:

Mehanika

  • 1x ploča od šperploče (veličina A4, debljine 4 mm)
  • 3x M4 x 80 Vijak i matica
  • 2x reduktorski motori sa sekundarnom izlaznom osovinom za davač. Kotači.
  • 1x Besplatni kotač

1x montaža kamere za okretanje i naginjanje (opcionalno)

Elektronika

  • 1x Raspberry Pi Zero sa zaglavljem i kamerom
  • 1x PCA 9685 servo upravljač
  • 2x kotač optičkog enkodera i krug
  • 1x Žice za kratkospojnike
  • 1x USB powerbank
  • 1x DRV8833 pokretač s dvostrukim motorom
  • 2x mikro servo pogona SG90 za pomicanje i naginjanje kamere (po izboru)
  • 1x MPU9250 IMU (opcionalno)
  • 1x HC-SR04 ultrazvučni senzor udaljenosti (opcionalno)
  • 1x perforirana ploča i žica za lemljenje, zaglavlja,…

Korak 1: Izgradite šasiju

Napravite šasiju
Napravite šasiju
Napravite šasiju
Napravite šasiju
Napravite šasiju
Napravite šasiju

Nisam dobar dizajner mehaničara. Također, cilj projekta nije trošiti previše vremena na šasiju. U svakom slučaju definirao sam sljedeće zahtjeve:

  • Jeftini materijali
  • Brza montaža i demontaža
  • Proširivo (npr. Prostor za dodatne senzore)
  • Lagani materijali za uštedu energije za elektroniku

Jednostavno i jeftino podvozje može biti izrađeno od šperploče. Lako se obrađuje frezom i ručnom bušilicom. Možete lijepiti male drvene dijelove kako biste stvorili držače za senzore i motore.

Razmislite o zamjeni neispravnih komponenti ili električnom otklanjanju pogrešaka. Glavni dijelovi trebaju biti pričvršćeni vijcima kako bi bili zamjenjivi. Pištolj za vruće ljepilo može biti jednostavan, ali vjerojatno nije najbolji način za izgradnju šasije … Trebalo mi je puno vremena za razmišljanje o jednostavnom konceptu za jednostavno rastavljanje dijelova. 3D ispis dobra je alternativa, ali može biti prilično skup ili oduzima puno vremena.

Besplatni kotač konačno je vrlo lagan i jednostavan za montažu. Alternative su bile sve teške ili pune trenja (isprobao sam ih nekoliko prije nego što sam pronašao konačni). Morao sam samo izrezati drveni odstojnik za izravnavanje kotača bez repa nakon montaže glavnih kotača.

Svojstva kotača (za proračune softvera)

Opseg: 21, 5 cm Impulsi: 20 impulsa/okretaj Rezolucija: 1, 075 cm (na kraju 1 impuls iznosi oko 1 cm, što je jednostavno za softverske proračune)

Korak 2: Elektronika i ožičenje

Elektronika i ožičenje
Elektronika i ožičenje
Elektronika i ožičenje
Elektronika i ožičenje
Elektronika i ožičenje
Elektronika i ožičenje

Projekt koristi različite module kako je prikazano na dijagramu.

Raspberry Pi Zero je glavni kontroler. Čita senzore i upravlja motorima pomoću PWM signala. Povezan je s udaljenim računalom putem WiFi -ja.

DRV8833 je dvomotorni H-most. Omogućuje dovoljnu struju motorima (što Raspberry Pi ne može učiniti jer izlazi mogu isporučiti samo nekoliko mA).

Optički koder daje signal kvadratnog oblika svaki put kad svjetlost prolazi kroz kotače kodera. Koristit ćemo HW prekide Raspberry Pi za dobivanje informacija svaki put kada se signal prebacuje.

Pca9695 je servo upravljačka ploča. Komunicira I2C serijskom sabirnicom. Ova ploča pruža PWM signale i opskrbni napon koji kontroliraju servomotore za pomicanje i naginjanje brega.

MPU9265 je troosno ubrzanje, troosna kutna brzina rotacije i troosni osjetnik magnetskog toka. Koristit ćemo ga uglavnom za dobivanje smjera kompasa.

Svi različiti moduli povezani su kratkospojnom žicom. Matična ploča djeluje kao dispečer i osigurava opskrbne napone (5V i 3.3V) i uzemljenje. Sve veze su opisane u tablici povezivanja (vidi privitak). Spajanje 5V na 3.3V ulaz vjerojatno će uništiti vaš čip. Pazite i prije opskrbe dvaput provjerite sve svoje ožičenje (ovdje se posebno mora uzeti u obzir davač). Prije povezivanja svih ploča, trebali biste izmjeriti glavni napon napajanja na dispečerskoj ploči multimetrom. Moduli su pričvršćeni najlonskim vijcima u kućište. Također sam bio sretan što sam ih popravio, ali i uklonio u slučaju kvara.

Jedino lemljenje konačno su bili motori, ploha i zaglavlja. Da budem iskren, sviđaju mi se kratkospojne žice, ali one mogu dovesti do labave veze. U nekim situacijama, neki softverski nadzori mogu vam pomoći u analizi veza.

Korak 3: Softverska infrastruktura

Softverska infrastruktura
Softverska infrastruktura
Softverska infrastruktura
Softverska infrastruktura

Nakon postizanja mehanike, postavit ćemo određenu softversku infrastrukturu za ugodne razvojne uvjete.

Git

Ovo je besplatni i otvoreni sustav kontrole verzija. Koristi se za upravljanje velikim projektima kao Linux, ali se također može lako koristiti za male projekte (vidi Github i Bitbucket).

Promjene projekta mogu se pratiti lokalno, a također se mogu premjestiti na udaljeni poslužitelj za dijeljenje softvera sa zajednicom.

Glavne korištene naredbe su:

git clone https://github.com/makerobotics/RPIbot.git [Nabavite izvorni kôd i git konfiguraciju]

git pull origin master [preuzmite najnovije podatke iz udaljenog spremišta]

git status [dobiti status lokalnog spremišta. Jesu li promijenjene neke datoteke?] Git log [preuzmi popis urezivanja] git add. [dodaj sve promijenjene datoteke u fazu koja će se uzeti u obzir pri sljedećem urezivanju] git commit -m "komentar za urezivanje" [urezivanje promjena u lokalno spremište] git push origin origin [guranje svih urezivanja u udaljeno spremište]

Zapisivanje

Python nudi neke ugrađene funkcije zapisivanja. Softverska struktura trebala bi definirati već cijeli okvir za bilježenje prije početka daljnjeg razvoja.

Zapisnik se može konfigurirati za bilježenje s definiranim formatom u terminalu ili u datoteci dnevnika. U našem primjeru zapisivač je konfiguriran klasom webservera, ali to možemo učiniti i sami. Ovdje samo postavljamo razinu bilježenja na DEBUG:

logger = logging.getLogger (_ name_)

logger.setLevel (logging. DEBUG)

Mjerenje i crtanje

Za analizu signala tijekom vremena najbolje je iscrtati ih u grafikon. Kako Raspberry Pi ima samo konzolni terminal, podatke ćemo pratiti u csv datoteci odvojenoj točkom i zarezom te je iscrtati s udaljenog računala.

Datoteka praćenja razdvojena točkom i zarezom generira naš glavni python kôd i mora imati ovakva zaglavlja:

vremenska oznaka; 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 stupac sadrži vremensku oznaku. Sljedeći stupci su besplatni. Poziva se skripta za crtanje s popisom stupaca za iscrtavanje:

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

Skripta zacrta dostupna je u mapi alata:

Ploter koristi mathplotlib u Pythonu. Morate ga kopirati na računalo.

Za veću udobnost, python skriptu poziva bash skripta (plot.sh) koja se koristi za kopiranje datoteke praćenja Raspberry Pi na udaljeno računalo i pozivanje plotera s odabirom signala. Bash skripta "plot.sh" pita ako se datoteka mora kopirati. Ovo mi je bilo prikladnije umjesto ručnog kopiranja svaki put. "sshpass" se koristi za kopiranje datoteke s Raspberry Pi na udaljeno računalo putem scp. U stanju je kopirati datoteku bez traženja lozinke (prenosi se kao parametar).

Na kraju se otvara prozor s crtežom kako je prikazano na slici.

Komunikacija na daljinu

Razvojno sučelje za Raspberry Pi je SSH. Datoteke se mogu uređivati izravno na meti ili kopirati pomoću scp.

Za upravljanje robotom, na poslužitelju je pokrenut web poslužitelj koji pruža kontrolu putem Websocketa. Ovo sučelje je opisano u sljedećem koraku.

Postavite Raspberry Pi

Postoji datoteka koja opisuje postavljanje Raspberry Pi u mapi "doc" izvornog koda (setup_rpi.txt). Nema mnogo objašnjenja, ali mnogo korisnih naredbi i veza.

Korak 4: Korisničko sučelje

Korisničko sučelje
Korisničko sučelje

Za hosting korisničkog sučelja koristimo lagani Tornado web poslužitelj. To je Python modul koji nazivamo prilikom pokretanja softvera za upravljanje robotom.

Arhitektura softvera

Korisničko sučelje izgrađeno je sljedećim datotekama: gui.html [Opisivanje kontrola i izgleda web stranica] gui.js [Sadrži javascript kôd za rukovanje kontrolama i otvaranje websocket veze s našim robotom] gui.css [Sadrži stilove html kontrole. Položaji kontrola definirani su ovdje]

Websocket komunikacija

Korisničko sučelje nije najhladnije, ali radi svoj posao. Ovdje sam se usredotočio na tehnologije koje su mi bile nove poput Websocketa.

Web stranica komunicira s robotskim web poslužiteljem putem Websocketsa. Ovo je dvosmjerni komunikacijski kanal koji će ostati otvoren kako je veza započela. Šaljemo naredbe robota putem Websocketa na Raspberry Pi i dobivamo informacije (brzina, položaj, tok kamere) natrag za prikaz.

Raspored sučelja

Korisničko sučelje ima ručni unos za naredbe. Ovo se koristilo na početku za slanje naredbi robotu. Potvrdni okvir uključuje i isključuje stream kamere. Dva klizača kontroliraju pomicanje i naginjanje kamere. Gornji desni dio korisničkog sučelja kontrolira kretanje robota. Možete kontrolirati brzinu i udaljenost do cilja. Osnovni telemetrijski podaci prikazani su na crtežu robota.

Korak 5: Programiranje platforme robota

Programiranje robotske platforme
Programiranje robotske platforme
Programiranje robotske platforme
Programiranje robotske platforme
Programiranje robotske platforme
Programiranje robotske platforme

Ovaj dio bio je glavni cilj projekta. Mnogo sam softvera preradio dok sam predstavljao novu šasiju s istosmjernim motorima. Koristio sam Python kao programski jezik iz različitih razloga:

  • To je glavni jezik Raspberry Pi
  • To je jezik visoke razine s mnogo ugrađenih značajki i proširenja
  • Objektno je orijentiran, ali se može koristiti i za sekvencijalno programiranje
  • Nije potrebno sastavljanje niti lanac alata. Uredite kôd i pokrenite ga.

Glavna arhitektura softvera

Softver je objektno orijentiran, podijeljen u nekoliko objekata. Moja ideja je bila podijeliti kôd u 3 funkcionalna bloka:

Sense Think Actuate

Sense.py

Nabavka i obrada glavnih senzora. Podaci su pohranjeni u rječniku koji će se koristiti u sljedećoj fazi.

Control.py

Podrazred aktiviranja upravlja motorima i servo motorima nakon određene apstrakcije. Glavni upravljački objekt je rukovanje naredbama na visokoj razini, kao i upravljačkim algoritmima (PID) za motor.

rpibot.py

Ovaj glavni objekt je upravljanje Tornado web poslužiteljem i instanciranje smisla i klasa kontrole u zasebnim nitima.

Svaki modul može se izvoditi sam ili kao dio cijelog projekta. Možete osjetiti i ispisati samo podatke senzora kako biste provjerili jesu li senzori ispravno spojeni i isporučuju prave informacije.

PID kontrola

Prvi zadatak je saznati što želimo kontrolirati. Počeo sam pokušavajući kontrolirati položaj, koji je bio vrlo složen i nije puno pomagao.

Konačno, želimo kontrolirati svaku brzinu kotača, a također i smjer robota. Da bismo to učinili, moramo kaskadirati dvije kontrolne logike.

Kako bi se korak po korak povećala složenost, robota treba kontrolirati:

otvorena petlja (s konstantnom snagom)

pwm = K

zatim dodajte algoritam zatvaranja petlje

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

i na kraju dodajte kontrolu smjera kao posljednji korak.

Za kontrolu brzine koristio sam "PI" kontrolu i "P" samo za zakretanje. Ručno sam postavio parametre eksperimentiranjem. Ovdje bi se vjerojatno mogli koristiti mnogo bolji parametri. Moja meta je bila samo ravna linija i skoro sam je dobio. U softveru sam stvorio sučelje za pisanje nekih varijabli putem korisničkog sučelja. Postavljanje parametra Kp na 1.0 zahtijeva sljedeću naredbu u korisničkom sučelju:

SET; Kp; 1,0

Mogao sam postaviti parametar P dovoljno nisko da izbjegnem bilo kakvo prekomjerno isticanje. Preostala pogreška ispravlja se parametrom I (integrirana pogreška)

Bilo mi je teško otkriti kako kaskadirati obje kontrole. Rješenje je jednostavno, ali prije sam pokušao na mnogo drugih načina … Pa sam konačno promijenio cilj brzine kotača da se okrene u jednom ili drugom smjeru. Izmjena izlaza kontrole brzine izravno je bila pogreška jer je kontrola brzine pokušavala ukloniti ovu smetnju.

Korišteni kontrolni dijagram nalazi se u privitku. Prikazuje samo lijevu stranu kontrole robota.

Korak 6: Kalibracije senzora

Kalibracije senzora
Kalibracije senzora
Kalibracije senzora
Kalibracije senzora
Kalibracije senzora
Kalibracije senzora

Prvo što treba uzeti u obzir je da cijeli IMU mora raditi ispravno. Naručio sam 3 dijela i poslao ih natrag dok nisam imao potpuno ispravan senzor. Svaki prethodni senzor imao je neke dijelove senzora koji nisu radili ispravno ili uopće nisu radili. Koristio sam neke primjere skripti za testiranje osnova prije nego što sam ih ugradio u robota.

Signale IMU osjetnika potrebno je kalibrirati prije uporabe. Neki signali senzora ovise o kutu i položaju ugradnje.

Kalibracija brzine ubrzanja i rotacije

Najjednostavnije kalibriranje je uzdužno ubrzanje (A_x). U mirovanju bi trebalo biti oko 0 m/s². Ako pravilno rotirate senzor, možete izmjeriti gravitaciju (oko 9, 8 m/s²). Da biste kalibrirali a_x, samo ga morate pravilno montirati, a zatim definirati pomak kako biste postigli 0 m/s² u mirovanju. Sada je A_x kalibriran. Na sličan način možete dobiti pomake za brzine vrtnje pri mirovanju.

Kalibracija magnetometra za kompas

Za senzore magnetskog polja potrebna je složenija kalibracija. Koristit ćemo m_x i m_y da magnetsko polje dovedemo u vodoravnu razinu. M_x i m_y dat će nam mogućnost izračunavanja smjera kompasa.

Radi naše jednostavne svrhe kalibrirat ćemo samo odstupanje tvrdog željeza. To se mora učiniti jer je senzor u konačnom položaju, ovisno o smetnjama magnetskog polja.

Snimamo m_x i m_y dok okrećemo robota oko z-osi. Ucrtavamo m_x vs m_y u XY grafikon. Rezultat je elipsa kao što je prikazano na slici. Elipsa mora biti centrirana prema ishodištu. Ovdje razmatramo maksimalne i minimalne vrijednosti m_x i m_y kako bismo dobili pomake u oba smjera. Na kraju provjeravamo kalibraciju i vidimo da je elipsa sada centrirana.

Kalibracija mekim željezom značila bi promjenu slike iz elipse u krug. To se može učiniti dodavanjem faktora na svaku vrijednost senzora.

Testna rutina sada se može kodirati za ponovnu kalibraciju ili barem za provjeru jesu li senzori još uvijek kalibrirani.

Kurs kompasa

Podaci magnetometra sada će se koristiti za izračun smjera kompasa. Za to moramo pretvoriti signale m_x i m_y u kut. Python izravno pruža funkciju math.atan2 koja ima ovaj cilj. Cjeloviti izračun definiran je u datoteci mpu9250_i2c.py ("calcHeading (mx, my, mz)").

Korak 7: Alternativni dizajni

Alternativni dizajn
Alternativni dizajn
Alternativni dizajn
Alternativni dizajn
Alternativni dizajn
Alternativni dizajn

Projekt je oduzeo puno vremena jer je dizajn bio potpuno otvoren. Za svaku komponentu napravio sam prototip implementacije i iskusio ograničenja sustava.

Najsloženija tema bio je enkoder kotača. Testirao sam 3 različite mogućnosti prije nego što sam pronašao trenutno korišteni optički koder. Mislim da su prekinuta rješenja također vrlo zanimljiva u takvom projektu. To se tiče dijelova u kojima sam najviše naučio.

Servo s kontinuiranim okretanjem spojen na pca 9695

Kako bih izbjegao dodatni H-most za istosmjerni motor, prvo sam počeo s servo motorima s kontinuiranom rotacijom. Njima je upravljao već prisutni servo upravljački program pca 9695. Sva pogonska mehanika i odgovarajuća elektronika bili su mnogo jednostavniji. Ovaj dizajn imao je dva nedostatka:

  • Loš raspon upravljanja servo pogonima.
  • Nedostaje mjesto čuvanja kodera

Servomotori se kreću s 50% pwm i imaju punu brzinu od oko 55%. Ovo je vrlo loš raspon kontrole.

Bez držača kodera, bilo je vrlo teško pronaći gotov enkoder. Testirao sam 3 različita kodera refleksije koji su montirani na šasiju. Na vanjsku stranu kotača zalijepio sam kotač enkodera sa crno -bijelim dijelovima. Koristio sam QTR-1RC senzore koji trebaju puno obrade signala da bi dobili pravi signal. Raspberry Pi nije mogao izvesti takvu vrstu obrade u stvarnom vremenu. Stoga sam odlučio robotu dodati NodeMCU D1 mini kao kontroler u stvarnom vremenu. Serijskim UART -om bio je povezan s malinom Pi radi isporuke obrađenih podataka senzora. NodeMCU je također upravljao senzorom HC-SR04. Mehanika je bila teška i ne baš robusna, serijska linija je dobivala buku iz I2C linije i motora, pa sam konačno izgradio drugu verziju šasije s jednostavnim istosmjernim motorima s pogonom H-most. Ovi motori imaju sekundarno izlazno vratilo za postavljanje optičkog kodera.

Korak 8: Obrada slike

Obrada slike
Obrada slike
Obrada slike
Obrada slike
Obrada slike
Obrada slike
Obrada slike
Obrada slike

Kako bismo poboljšali autonomnu vožnju, možemo napraviti neku obradu slike.

Knjižnica opencv je referenca za to. Python ga može koristiti za brzu implementaciju otkrivanja prepreka.

Snimimo sliku i primijenimo neke zadatke obrade slike:

Prvi testovi izvedeni su s Cannyjevom i Sobelovom transformacijom. Canny može biti dobar kandidat, ali nije dovoljno razuman. Sobel je previše razuman (otkriveno je previše objekata).

Na kraju sam napravio vlastiti filter za miješanje svih vodoravnih i okomitih nagiba (otkrivanje namještaja):

  • Pretvorite sliku u boji u sliku sive razine
  • Zamaglite sliku kako biste uklonili mali šum
  • Prag slike na crno -bijelu sliku
  • Sada otkrivamo vodoravne i okomite nagibe kako bismo otkrili objekte kao zidove i namještaj
  • Filtriramo samo velike preostale konture (pogledajte konture u boji na slici)

Sada možemo koristiti ove nove podatke za otkrivanje prepreka …

Korak 9: Sljedeći koraci …

Sljedeći koraci…
Sljedeći koraci…
Sljedeći koraci…
Sljedeći koraci…

Sada imamo jednostavnu robotsku platformu sa senzorima, aktuatorima i kamerom. Cilj mi je autonomno kretanje i povratak na stanicu bez dodavanja daljnjih senzora. Za to će mi biti potrebni sljedeći koraci:

  • Fuzija senzora zakretanja i signala magnetskog smjera
  • Obrada slike kamerom (za to je dostupan samo nizak CPU)
  • Detekcija sudara (ultrazvučna udaljenost i kamera)
  • Izgradnja karte ili orijentacija

Sada idite i stvorite vlastite izazove ili ciljeve …

Preporučeni: