Kazalo:

Wallacejev avtonomni robot - 4. del - Dodajte IR razdaljo in senzorje "Amp": 6 korakov
Wallacejev avtonomni robot - 4. del - Dodajte IR razdaljo in senzorje "Amp": 6 korakov

Video: Wallacejev avtonomni robot - 4. del - Dodajte IR razdaljo in senzorje "Amp": 6 korakov

Video: Wallacejev avtonomni robot - 4. del - Dodajte IR razdaljo in senzorje
Video: Luați un loc special al expresului limitat „rapi: t” de la Aeroportul Internațional Kansai 2024, Julij
Anonim
Image
Image
Dodaj podporno vezje (MCP3008)
Dodaj podporno vezje (MCP3008)

Pozdravljeni, danes začenjamo naslednjo fazo izboljšanja Wallaceovih zmogljivosti. Natančneje, poskušamo izboljšati njegovo sposobnost zaznavanja in izogibanja oviram z uporabo infrardečih senzorjev razdalje, prav tako pa izkoristimo sposobnost motornega krmilnika Roboclaw, da spremlja tok in ga spremeni v virtualni (programski) "senzor". Nazadnje bomo pogledali, kako krmariti brez SLAM (hkratna lokacija in kartiranje) (za zdaj), saj robot še nima senzorjev IMU (inercijska merilna enota) ali ToF (čas letenja).

Z navigacijo bosta sprva le dva glavna cilja:

  1. izogibajte se oviram
  2. prepoznati, ko je nekje obtičal in ne napreduje. ("napredek" pomeni, ali se je premaknil za kakšno pomembno razdaljo naprej)
  3. možen tretji cilj bi lahko bil, da se poskuša poravnati naravnost ob steno.

Ta projekt se je začel z kompletom robotov in osnovnimi gibi pri delu s povezavo tipkovnice in ssh.

Druga faza je bila dodajanje zadostnega podpornega vezja za pripravo na dodajanje številnih senzorjev.

V prejšnjem Instructable smo dodali več akustičnih senzorjev HCSR04 in robot se lahko zdaj izogiba oviram, ko se premika po stanovanju.

Čeprav se dobro obnese v kuhinji in na hodniku z dobrimi, trdnimi ravnimi površinami, je pri približevanju jedilnici popolnoma slep. Ne more "videti" mize in nog stola.

Ena izboljšava je lahko spremljanje tipičnih motornih tokov, in če vrednosti skočijo, mora robot nekaj udariti. To je dober "načrt B" ali celo C. Toda to mu v resnici ne pomaga pri krmarjenju po jedilnici.

(Posodobitev: pravzaprav je trenutno spremljanje toka načrt A pri vzvratni vožnji, saj sem začasno odstranil in senzorje od zadaj).

Video za ta razdelek je zadnja faza senzorjev za izogibanje oviram.

V videu vidite šest sprednjih akustičnih senzorjev HCSR04 in dva IR senzorja Sharp. IR senzorji v videu niso prišli v veliko vlogo. Njihova prednost je predvsem, ko se robot znajde v jedilnici, obrnjen proti nogam mize in stola.

Poleg senzorjev je še posebej pri vzvratni vožnji prišel v poštev trenutni monitor, če se v kaj zaleti.

Nazadnje uporablja zgodovino zadnjih 100 potez in nekaj osnovnih analiz za odgovor na eno vprašanje:

"Ali je v zadnjem času prišlo do resnega napredka naprej (ali se je zataknilo v kakšnem ponavljajočem se plesu)?"

Torej, ko v videoposnetku vidite ponovitev naprej-nazaj, se nato obrne, kar pomeni, da je prepoznal vzorec naprej-nazaj, zato poskusi nekaj drugega.

Edini programirani cilj te različice programske opreme je bil poskušati stalno napredovati in se izogibati oviram.

1. korak: Dodajte podporno vezje (MCP3008)

Dodaj podporno vezje (MCP3008)
Dodaj podporno vezje (MCP3008)
Dodaj podporno vezje (MCP3008)
Dodaj podporno vezje (MCP3008)
Dodaj podporno vezje (MCP3008)
Dodaj podporno vezje (MCP3008)

Preden lahko dodamo IR senzorje, potrebujemo vmesniško vezje med njimi in Raspberry Pi.

Dodali bomo analogno-digitalni pretvornik MCP3008. Obstaja veliko spletnih virov, kako povezati ta čip z Raspberry Pi, zato se tukaj ne bom veliko spuščal v to.

V bistvu imamo izbiro. Če različica IR senzorjev deluje na 3 V, lahko deluje tudi MCP3008, nato pa se lahko neposredno povežemo z malino.

[3V IR senzor] - [MCP3008] - [Raspberrry Pi]

V mojem primeru pa uporabljam večinoma 5V, tako da to pomeni dvosmerni menjalnik ravni.

[5V IR senzor]-[MCP3008]-[dvosmerno vodilo 5V do 3V]-[Raspberry Pi]

Opomba: Iz IR senzorja je samo en signal. Gre neposredno na eno od vhodnih analognih signalnih linij MCP3008. Od MCP3008 obstajajo 4 podatkovne linije, ki jih moramo povezati (prek dvosmernega vodila) na Raspberry Pi.

Trenutno bo naš robot deloval le z dvema IR senzorjema, vendar bi lahko zlahka dodali še več. MCP3008 osem analognih vhodnih kanalov.

Korak: Namestite IR senzorje

Namestite IR senzorje
Namestite IR senzorje
Namestite IR senzorje
Namestite IR senzorje
Namestite IR senzorje
Namestite IR senzorje
Namestite IR senzorje
Namestite IR senzorje

Sharp izdeluje več različnih IR senzorjev, ki imajo različne dosege in območje pokritosti. Slučajno sem naročil model GP2Y0A60SZLF. Izbrani model bo vplival na postavitev in orientacijo senzorja. Na žalost zame nisem natančno raziskal, katere senzorje bi dobil. To je bila bolj odločitev "katere lahko dobim v razumnem času in po ugodni ceni od uglednega vira, od tistih, ki jih ponujajo".

(Posodobitev: To pa morda ni pomembno, saj se zdi, da te senzorje zmoti notranja zunanja razsvetljava. Še vedno raziskujem to težavo)

Obstajajo vsaj trije načini za namestitev teh senzorjev na robota.

  1. Postavite jih v fiksni položaj, spredaj, obrnjeni rahlo drug od drugega.
  2. Postavite jih na servo, spredaj, obrnjene nekoliko drug od drugega.
  3. Postavite jih v fiksni položaj spredaj, vendar v skrajni levi in najbolj desni rob, nagnjene drug proti drugemu.

Če primerjam izbiro #1 z izbiro #3, mislim, da bo številka 3 pokrila večjo površino trka. Če si ogledate slike, lahko izbiro #3 naredite ne le tako, da se polja senzorjev prekrivajo, ampak lahko zajemajo tudi sredino in zunaj širine robota.

Pri izbiri št. 1, bolj ko so senzorji nagnjeni drug proti drugemu, bolj je slepa točka na sredini.

Lahko bi naredili #2, (dodal sem nekaj slik s servomotorjem) in jih poizvedli, očitno pa to lahko zajema največ področja. Vendar pa želim čim dlje odložiti uporabo servomotorja iz vsaj dveh razlogov:

  • Uporabili bomo enega od komunikacijskih kanalov PWM na Raspberry Pi. (To je mogoče izboljšati, vendar še vedno …)
  • Trenutni žreb s servomotorjem je lahko pomemben
  • Dodatno dodaja strojno in programsko opremo

Pri dodajanju pomembnejših senzorjev, kot je Time-of-Flight (ToF), ali morda fotoaparata, bi želel servo možnost pustiti pozneje.

Obstaja še ena možna prednost pri izbiri #2, ki pri drugih dveh možnostih ni na voljo. Ti IR senzorji se lahko zmedejo, odvisno od osvetlitve. Lahko se zgodi, da robot odčita predmet, ki je neizmerno blizu, čeprav v resnici ni predmeta v bližini. Z izbiro #3, ker se njuna polja lahko prekrivata, lahko oba senzorja registrirata isti predmet (iz različnih zornih kotov).

Torej gremo na izbiro umestitve #3.

3. korak: Čas za testiranje

Image
Image

Ko smo vzpostavili vse povezave med Raspberry Pi, ADC MCP3008 in IR -senzorji Sharp, je čas za testiranje. Preprost preizkus, da preverite, ali sistem deluje z novimi senzorji.

Kot v prejšnjih Instructables, uporabljam knjižnico wiringPi C kolikor je le mogoče. Olajša stvari. Nekaj, kar pri pregledu spletnega mesta wiringPi ni ravno očitno, je, da obstaja neposredna podpora za MCP3004/3008.

Tudi brez tega bi lahko uporabili samo razširitev SPI. Ampak ni treba. Če natančno pogledate Gordonovo skladišče git za ožičenjePi, boste naleteli na seznam podprtih čipov, od katerih je eden za MCP3004/3008.

Odločil sem se, da bom kodo priložil kot datoteko, ker je nisem mogel pravilno prikazati na tej strani.

4. korak: Virtualni senzor - AmpSensor

Bolj kot na različne načine lahko robot prejme informacije o zunanjem svetu, tem bolje.

Robot ima trenutno osem akustičnih sonarnih senzorjev HCSR04 (niso v središču tega Instructable), zdaj pa ima dva Sharp IR senzorja razdalje. Kot smo že omenili, lahko izkoristimo nekaj drugega: funkcijo zaznavanja motornih tokov Roboclawa.

Ta klic poizvedbe do krmilnika motorja lahko zavijemo v razred C ++ in ga pokličemo kot AmpSensor.

Z dodajanjem nekaj "pametnih" programov lahko spremljamo in prilagajamo tipično črpanje toka med ravnim gibanjem (naprej, nazaj) in tudi rotacijskimi gibi (levo, desno). Ko poznamo te razpone ojačevalnikov, lahko izberemo kritično vrednost, tako da, če AmpSensor od krmilnika motorja dobi trenutno vrednost, ki presega to vrednost, vemo, da so se motorji verjetno ustavili, kar običajno pomeni, da je robot udaril v nekaj.

Če programski opremi dodamo nekaj prožnosti (argumenti ukazne vrstice in / ali vnos s tipkovnice med delovanjem), lahko med eksperimentiranjem zvišamo / znižamo prag "kritičnih ojačevalnikov", tako da pustimo robotu, da se premika in trči v predmete, tako naravnost kot med vrtenjem.

Ker naš navigacijski del programske opreme pozna smer gibanja, lahko vse te podatke uporabimo za morda ustavitev gibanja in poskus kratek čas za nazaj, preden poskusimo kaj drugega.

5. korak: Navigacija

Robot je trenutno omejen s povratnimi informacijami v resničnem svetu. Ima nekaj senzorjev za izogibanje oviram na bližnji razdalji in ima tehniko povratnega spremljanja porabe toka, če senzorji razdalje zgrešijo oviro.

Nima motorjev z dajalniki in nima IMU (inercialna merilna enota), zato je težje ugotoviti, ali se res premika ali vrti, in za koliko.

Medtem ko lahko s senzorji, ki so trenutno na robotu, dobimo nekakšno oznako razdalje, je njihovo vidno polje široko in obstaja nepredvidljivost. Akustični sonar morda ne bo pravilno odseval nazaj; infrardečo svetlobo lahko zamenja druga osvetlitev ali celo več odsevnih površin. Nisem prepričan, da je vredno poskusiti dejansko slediti spremembi razdalje kot tehniko, da ugotovimo, ali se robot premika ter za koliko in v katero smer.

Namerno sem se odločil, da NE uporabljam mikrokrmilnika, kot je Arduino, ker a) mi ni všeč, da je okolje psuedo-C ++, b) in da bo preveč razvoja obrabilo pomnilnik za branje in pisanje (?), In da sem bi za razvoj potreboval gostiteljski računalnik (?). Ali pa se mi preprosto zgodi kot Raspberry Pi.

Pi z operacijskim sistemom Raspbian pa ni operacijski sistem v realnem času, zato sem med nestabilnostjo teh senzorjev in operacijskim sistemom, ki se ne bere vsakič, menil, da je namen teh senzorjev bolj primeren za izogibanje oviram in ne dejansko merjenje razdalje.

Ta pristop se je zdel zapleten in ni imel toliko koristi, ko lahko za ta namen (SLAM) uporabimo boljše senzorje ToF (čas letenja) (kasneje).

Eden od pristopov, ki ga lahko uporabimo, je, da sledimo nekakšnemu sledenju tem, kateri ukazi za gibanje so bili izdani v zadnjih X sekundah ali ukazih.

Na primer, recimo, da je robot zaljubljen v kot diagonalno. En niz senzorjev pove, da je preblizu ene stene, zato se vrti, nato pa drugi niz senzorjev pove, da je preblizu druge stene. Na koncu se samo ponovi vzorec od strani do strani.

Zgornji primer je le en zelo preprost primer. Če dodate nekaj pametnosti, lahko ponovljeni vzorec dvignete na novo raven, vendar robot ostane zataknjen v kotu.

Na primer, namesto da bi se vrtel naprej in nazaj, se vrti v eno smer, za trenutek obrača nazaj (kar nato počisti navedbe kritične razdalje) in tudi če se vrti v drugo smer, gre še vedno pod nekim kotom nazaj v kot, ponavljanje bolj zapletenega vzorca v bistvu iste stvari.

To pomeni, da bi res lahko uporabili zgodovino ukazov in si ogledali, kako te podatke izkoristiti in uporabiti.

Lahko se spomnim dveh zelo osnovnih (rudimentarnih) načinov uporabe zgodovine gibanja.

  • ali se za zadnje X število potez ujemajo z vzorcem Y. Preprost primer je lahko (in to se je zgodilo) "NAPREJ, NAZAJ, NAPREJ, NAZAJ, …..". Torej obstaja ta ujemajoča se funkcija, ki vrne TRUE (vzorec je najden) ali FALSE (ni najden). Če je v navigacijskem delu programa TRUE, poskusite z drugimi zaporedji premikov.
  • za zadnje število X potez obstaja splošno ali neto gibanje naprej. Kako bi lahko ugotovili, kaj je resnično gibanje naprej? No.. enostavna primerjava je, da se pri zadnjih X potezah "NAPREJ" pojavi več kot "NAZAJ". Ni pa nujno, da je edini. Kaj pa tole: "DESNO, DESNO, LEVO, DESNO". V tem primeru mora robot zaviti desno, da bi prišel iz kota ali ker se je steni približal pod kotom, kar bi lahko šteli za pravi napredek naprej. Po drugi strani pa se "LEVO, DESNO, LEVO, DESNO …" morda ne šteje za pravi napredek naprej. Če se torej "DESNO" pojavi več kot "LEFT" ali "LEFT se pojavi več kot" DESNO ", je to lahko pravi napredek.

Na začetku tega Instructable sem omenil, da bi bil možen tretji cilj kvadratura ali poravnava s steno. Za to pa potrebujemo več kot "ali smo blizu kakšnega predmeta". Na primer, če lahko dobimo dva zvočno usmerjena senzorja, ki gledata naprej (ni v središču tega članka), da podata razmeroma dobre in stabilne odzive glede razdalje, očitno, če eden poroča o precej drugačni vrednosti od drugega, se je robot približal steni pod kotom in bi lahko poskusil z manevriranjem preveriti, ali se te vrednosti približujejo drug drugemu (naravnost obrnjene proti steni).

Korak 6: Zadnje misli, naslednja faza…

Upam, da je ta Instructable dal nekaj idej.

Dodajanje več senzorjev prinaša nekatere prednosti in izzive.

V zgornjem primeru so vsi akustični senzorji dobro delovali skupaj in je bilo s programsko opremo precej preprosto.

Ko so bili v mešanico vneseni IR senzorji, je postalo nekoliko zahtevnejše. Razlog je v tem, da so se nekatera njihova vidna polja prekrivala s tistimi pri akustičnih senzorjih. IR senzorji so se ob spreminjajočih se svetlobnih pogojih zdeli nekoliko občutljivi in nepredvidljivi, na svetlobo pa seveda ne vpliva zvočni senzor.

In zato je bil izziv v tem, kaj storiti, če nam zvočni senzor pove, da ni ovir, ampak IR senzor je.

Zaenkrat so se po poskusih in napakah stvari končale v tej prioriteti:

  1. ojačevalnik
  2. IR zaznavanje
  3. akustično zaznavanje

Kar sem naredil, je bilo le znižanje občutljivosti IR senzorjev, tako da bi zaznali le zelo blizu predmete (na primer skorajšnje noge stola)

Zaenkrat še ni bilo treba izvajati programske opreme z več niti ali prekinitvami, čeprav se občasno srečujem z izgubo nadzora med Raspberry Pi in krmilnikom motorja Roboclaw (izguba serijske komunikacije).

Tu bi običajno prišli v uporabo vezje E-Stop (glej prejšnja navodila). Ker pa se (še) ne želim ukvarjati s tem, da bi moral Roboclaw ponastaviti med razvojem, robot pa ne gre tako hitro, jaz pa sem prisoten, da ga spremljam in zaprem, nisem priključil E-Stop.

Sčasoma bo najverjetneje potrebno več niti.

Naslednji koraki…

Hvala, ker ste prišli tako daleč.

Dobil sem nekaj senzorjev VL53L1X IR laser ToF (čas letenja), zato je to najverjetneje tema naslednjega Instructable skupaj s servo.

Priporočena: