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, Novembar
Anonim
Rpibot - O učenju robotike
Rpibot - O učenju robotike

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

Imao sam sledeće uslove:

  • Jednostavan hardver (fokus je softver)
  • Jeftin hardver (oko 100 €)
  • Proširivo (neke opcije su 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 takmičenja,…

To nije vodič za početnike. Potrebno vam je 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 kôd je što je moguće jednostavniji i kritične linije koda su komentirane kako bi dale natuknice.

Kompletan izvorni kod i datoteke dostupni su ovdje:

Potrošni materijal:

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č. Točkovi.
  • 1x Besplatni točak

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

Elektronika

  • 1x Raspberry Pi Zero sa zaglavljem i kamerom
  • 1x PCA 9685 servo kontrola
  • 2x Točak optičkog enkodera i kolo
  • 1x Žice za kratkospojnike
  • 1x USB powerbank
  • 1x DRV8833 drajver sa dvostrukim motorom
  • 2x mikro servo pogona SG90 za pomeranje i naginjanje kamere (opcionalno)
  • 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đe, cilj projekta nije trošenje 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 kućište može se napraviti 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 grešaka. Glavni dijelovi trebaju biti pričvršćeni vijcima kako bi bili zamjenjivi. Pištolj za vruće ljepilo može biti jednostavan, ali vjerovatno nije najbolji način za izgradnju šasije … Trebalo mi je puno vremena da razmislim 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 (pokušao sam ih nekoliko prije nego što sam pronašao posljednji). Morao sam samo izrezati drveni odstojnik kako bih izravnao točak bez repa nakon što sam montirao glavne kotače.

Svojstva kotača (za proračune softvera)

Opseg: 21, 5 cm Impulsi: 20 impulsa/okretaj Rezolucija: 1, 075 cm (konačno 1 impuls je oko 1 cm, što je lako 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 sa udaljenim računarom putem WiFi -ja.

DRV8833 je H-most s dva motora. 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 -a za dobivanje informacija svaki put kada se signal uključi.

Pca9695 je servo upravljačka ploča. Komunicira I2C serijskom sabirnicom. Ova ploča daje PWM signale i napon napajanja koji kontroliraju servo za kretanje i naginjanje brega.

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

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

Jedino lemljenje konačno su bili motori, ploča 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 sistem kontrole verzija. Koristi se za upravljanje velikim projektima kao Linux, ali se lako može koristiti i za male projekte (pogledajte Github i Bitbucket).

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

Glavne komande koje se koriste su:

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

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

git status [dobijte status lokalnog spremišta. Da li su neke datoteke promijenjene?] Git log [preuzmi listu urezivanja] git add. [dodajte 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 master [guranje svih urezivanja na udaljeno spremište]

Logging

Python nudi neke ugrađene funkcije logovanja. Softverska struktura bi već trebala definirati sav okvir zapisivanja prije početka daljnjeg razvoja.

Zapisnik se može konfigurirati za logovanje s definiranim formatom u terminalu ili u datoteci dnevnika. U našem primjeru, zapisnik 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 tokom vremena najbolje je iscrtati ih u grafikonu. Kako Raspberry Pi ima samo konzolni terminal, mi ćemo pratiti podatke u csv datoteci odvojenoj tačkom i zarezom i iscrtati ih sa udaljenog računara.

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;

Prva kolona sadrži vremensku oznaku. Sljedeće kolone su besplatne. Scenarij crtanja se poziva sa listom kolona koje treba iscrtati:

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

Scenarij zacrta dostupan je u mapi alata:

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

Za veću udobnost, python skriptu poziva bash skripta (plot.sh) koja se koristi za kopiranje Raspberry Pi datoteke praćenja na udaljeni računar i pozivanje plotera sa 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 -a na udaljeni računar putem scp -a. U stanju je kopirati datoteku bez traženja lozinke (prenosi se kao parametar).

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

Komunikacija na daljinu

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

Za upravljanje robotom, na serveru je pokrenut web server koji pruža kontrolu putem Websockets -a. Ovo sučelje je opisano u sljedećem koraku.

Postavite Raspberry Pi

Postoji datoteka koja opisuje postavljanje Raspberry Pi -a u fascikli "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 smještaj korisničkog sučelja koristimo lagani Tornado web server. To je Python modul koji nazivamo pri pokretanju softvera za upravljanje robotom.

Softverska arhitektura

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 su definirani ovdje]

Websocket komunikacija

Korisničko sučelje nije najhladnije, ali radi svoj posao. Ovdje sam se fokusirao na tehnologije koje su mi bile nove poput Websockets -a.

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

Izgled interfejsa

Korisničko sučelje ima ručni unos za naredbe. Ovo se koristilo na početku za slanje naredbi robotu. Polje za potvrdu uključuje i isključuje prijenos 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. Osnovne informacije o telemetriji prikazane su na crtežu robota.

Korak 5: Programiranje robotske platforme

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

Ovaj dio je bio 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 na visokom nivou s mnogo ugrađenih funkcija i proširenja
  • Objektno je orijentiran, ali se može koristiti i za sekvencijalno programiranje
  • Nije potrebna kompilacija niti lanac alata. Uredite kôd i pokrenite ga.

Glavna arhitektura softvera

Softver je objektno orijentisan, 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 kontrolni objekt je rukovanje naredbama na visokom nivou, 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 šta želimo kontrolirati. Počeo sam pokušavajući kontrolirati položaj, koji je bio vrlo složen i nije mnogo 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.

Da biste povećali složenost korak po korak, robota treba kontrolirati:

otvorena petlja (sa 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 mogli koristiti mnogo bolji parametri. Moja meta je bila samo ravna linija i skoro sam je dobio. Napravio sam sučelje u softveru za pisanje nekih varijabli pomoću 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 preklapanje. Preostala greška ispravlja se parametrom I (integrirana greš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 greška jer je kontrola brzine pokušavala ukloniti ovu smetnju.

Korišteni kontrolni dijagram je priložen. 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 nazad sve dok nisam imao potpuno ispravan senzor. Svaki prethodni senzor je imao 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 upotrebe. Neki signali senzora zavise od ugla i položaja ugradnje.

Kalibracije 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 rotacije u mirovanju.

Kalibracija magnetometra za kompas

Za senzore magnetskog polja potrebna je složenija kalibracija. Koristit ćemo m_x i m_y za postavljanje magnetskog polja u vodoravnu razinu. M_x i m_y će nam dati priliku da izračunamo kurs kompasa.

Radi naše jednostavne svrhe, kalibrirat ćemo samo odstupanje tvrdog željeza. To se mora izvesti 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. Iscrtavamo m_x vs m_y u XY grafikonu. 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 postići dodavanjem faktora na svaku vrijednost senzora.

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

Kurs kompasa

Podaci magnetometra sada će se koristiti za izračunavanje smjera kompasa. Za to moramo pretvoriti m_x i m_y signale u kut. Python direktno 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 sistema.

Najkompleksnija tema bio je enkoder kotača. Testirao sam 3 različite opcije 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 sa kontinuiranom rotacijom spojen na pca 9695

Kako bih izbjegao dodatni H-most za istosmjerni motor, prvo sam započeo sa 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 lokacija za čuvanje kodera

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

Bez 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 self -made koder sa crno -bijelim dijelovima. Koristio sam QTR-1RC senzore kojima je potrebno mnogo obrade signala da bi se dobio pravi signal. Raspberry Pi nije mogao izvesti takvu vrstu obrade u stvarnom vremenu. Stoga sam odlučio dodati robotu NodeMCU D1 mini kao kontroler u stvarnom vremenu. Povezan je s malinom Pi serijskim UART -om za isporuku obrađenih podataka senzora. NodeMCU je također upravljao senzorom HC-SR04. Mehanika je bila teška i ne baš robusna, serijska linija je dobijala buku iz I2C linije i motora, pa sam konačno izgradio drugu verziju šasije s jednostavnim istosmjernim motorima sa pogonom na 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.

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

Snimamo sliku i primjenjujemo neke zadatke obrade slike:

Prvi testovi su napravljeni sa Canny i Sobel transformacijama. Canny može biti dobar kandidat, ali nije dovoljno razborit. 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 boje
  • Zamaglite sliku kako biste uklonili mali šum
  • Ograničite sliku 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 obojene konture na slici)

Sada možemo koristiti ove nove informacije 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. Moj cilj je kretanje autonomno i povratak na stanicu bez dodavanja daljnjih senzora. Za ovo ć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čuje se: