Cuprins:

Robot autonom Wallace - Partea 4 - Adăugați senzori de distanță IR și "Amp": 6 pași
Robot autonom Wallace - Partea 4 - Adăugați senzori de distanță IR și "Amp": 6 pași

Video: Robot autonom Wallace - Partea 4 - Adăugați senzori de distanță IR și "Amp": 6 pași

Video: Robot autonom Wallace - Partea 4 - Adăugați senzori de distanță IR și
Video: Night 2024, Iulie
Anonim
Image
Image
Adăugați circuite de suport (MCP3008)
Adăugați circuite de suport (MCP3008)

Bună ziua, astăzi începem următoarea fază de îmbunătățire a capacităților Wallace. Mai exact, încercăm să-i îmbunătățim capacitatea de a detecta și evita obstacolele folosind senzori de distanță în infraroșu și, de asemenea, profităm de capacitatea controlerului motor Roboclaw de a monitoriza curentul și de a-l transforma într-un „senzor” virtual (software). În cele din urmă, vom arunca o privire la modul în care navigați fără SLAM (localizare și mapare simultană) (deocamdată), deoarece robotul nu are încă un senzor IMU (unitate de măsurare a inerției) sau ToF (ora zborului).

Prin navigare, inițial vor fi doar două obiective principale:

  1. evita obstacolele
  2. recunoașteți când este blocat undeva și nu face niciun progres. („progres” înseamnă că a avansat la orice distanță semnificativă)
  3. un posibil al treilea obiectiv ar putea fi acela de a încerca să se alinieze direct la perete.

Acest proiect a început cu un kit robot și obținerea mișcărilor de bază pentru a funcționa folosind o tastatură și o conexiune ssh.

A doua fază a fost adăugarea unor circuite de susținere suficiente pentru a se pregăti pentru adăugarea multor senzori.

În Instructable-ul anterior, am adăugat mai mulți senzori acustici HCSR04, iar robotul poate evita acum obstacolele pe măsură ce se deplasează în jurul apartamentului.

Deși se descurcă bine în bucătărie și pe hol, cu suprafețe plane bune și solide, este complet orb când se apropie de sala de mese. Nu poate „vedea” masa și picioarele scaunului.

O îmbunătățire poate fi urmărirea curenților tipici ai motorului și, dacă valorile sar, atunci robotul trebuie să fi lovit ceva. Este un „plan B” bun sau chiar C. Dar asta nu-l ajută cu adevărat să navigheze prin zona de luat masa.

(Actualizare: de fapt, deocamdată, monitorizarea curentului este planul A la inversare, deoarece am scos temporar și senzorii din spate).

Videoclipul acestei secțiuni constituie faza finală a senzorilor de evitare a obstacolelor.

Ce vedeți în videoclip sunt șase senzori acustici frontali HCSR04 și doi senzori IR Sharp. Senzorii IR nu au intrat prea mult în joc în videoclip. Punctul lor forte este mai ales atunci când robotul se găsește în zona de luat masa cu fața spre picioarele mesei și scaunului.

În plus față de senzori, monitorul de curent a intrat în joc în special în timpul inversării, în cazul în care se lovește de ceva.

În cele din urmă, folosește istoria ultimelor 100 de mișcări și câteva analize de bază pentru a răspunde la o întrebare:

"A existat recent progrese reale înainte (sau este blocat într-un dans care se repetă)?"

Deci, în videoclip, când vedeți o repetare înainte-invers, apoi se întoarce, înseamnă că a recunoscut tiparul înainte-invers, încercând astfel altceva.

Singurul obiectiv programat al acestei versiuni a software-ului a fost să încerce să facă progrese continue înainte și să încerce să evite obstacolele.

Pasul 1: Adăugați circuite de susținere (MCP3008)

Adăugați circuite de suport (MCP3008)
Adăugați circuite de suport (MCP3008)
Adăugați circuite de suport (MCP3008)
Adăugați circuite de suport (MCP3008)
Adăugați circuite de suport (MCP3008)
Adăugați circuite de suport (MCP3008)

Înainte de a putea adăuga senzorii IR, vom avea nevoie de circuitele de interfață dintre acestea și Raspberry Pi.

Vom adăuga un convertor analog-digital MCP3008. Există multe resurse online cum să conectați acest cip la Raspberry Pi, așa că nu voi intra prea mult aici.

În esență, avem de ales. Dacă versiunea senzorilor IR funcționează la 3V, MCP3008 poate face acest lucru și ne putem conecta direct la Raspberry.

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

În cazul meu, totuși, rulez în principal 5V, deci asta înseamnă un schimbător de nivel bidirecțional.

[Senzor IR 5V] - [MCP3008] - [magistrală bidirecțională 5V-la-3V] - [Raspberry Pi]

Notă: Există un singur semnal de ieșire de la senzorul IR. Merge direct la una dintre liniile de semnal analogice de intrare ale MCP3008. De la MCP3008, există 4 linii de date de care trebuie să ne conectăm (prin magistrala bidirecțională) la Raspberry Pi.

În acest moment, robotul nostru va rula folosind doar doi senzori IR, dar am putea adăuga cu ușurință mai mulți. MCP3008 opt canale de intrare analogice.

Pasul 2: Montați senzorii IR

Montați senzorii IR
Montați senzorii IR
Montați senzorii IR
Montați senzorii IR
Montați senzorii IR
Montați senzorii IR
Montați senzorii IR
Montați senzorii IR

Sharp produce mai mulți senzori IR diferiți și au intervale și zone de acoperire diferite. Am întâmplat să fi comandat modelul GP2Y0A60SZLF. Modelul pe care îl alegeți va afecta amplasarea și orientarea senzorului. Din păcate pentru mine, nu am cercetat cu exactitate ce senzori să obțin. A fost mai degrabă o decizie „pe care le pot obține la un moment și preț rezonabil dintr-o sursă de încredere, din cele pe care le oferă”.

(Actualizare: totuși, s-ar putea să nu aibă importanță, deoarece acești senzori par să se confunde cu iluminarea ambientală interioară. Încă explorez această problemă)

Există cel puțin trei moduri de a monta acești senzori pe robot.

  1. Așezați-le într-o poziție fixă, în față, orientate ușor unul față de celălalt.
  2. Așezați-le pe un servo, în față, orientate ușor unul față de celălalt.
  3. Așezați-le într-o poziție fixă, în față, dar în colțurile cele mai îndepărtate din stânga și din dreapta, înclinate una față de cealaltă.

Comparând alegerea # 1 cu alegerea # 3, cred că # 3 va acoperi mai mult din zona de coliziune. Dacă aruncați o privire asupra imaginilor, alegerea # 3 se poate face nu numai astfel încât câmpurile senzorului să se suprapună, ci și să poată acoperi centrul și dincolo de lățimea exterioară a robotului.

Cu alegerea # 1, cu cât senzorii sunt mai înclinați unul de celălalt, cu atât mai mult este un punct mort în centru.

Am putea face # 2, (am adăugat câteva imagini cu servo ca posibilitate) și să le punem să facă o măturare și, evident, aceasta poate acoperi cea mai mare zonă. Cu toate acestea, vreau să întârzie utilizarea unui servo cât mai mult timp posibil, din cel puțin două motive:

  • Vom folosi unul dintre canalele de comunicare PWM de pe Raspberry Pi. (Este posibil să îmbunătățim acest lucru, dar totuși …)
  • Extragerea curentă cu servo poate fi semnificativă
  • Se adaugă mai mult la hardware și software

Aș dori să las opțiunea servo pentru mai târziu, când adăugăm senzori mai importanți, cum ar fi Time-of-Flight (ToF) sau poate o cameră.

Există un alt avantaj posibil cu alegerea # 2, care nu este disponibil împreună cu celelalte două opțiuni. Acești senzori IR pot deveni confuzi, în funcție de iluminare. S-ar putea ca robotul să obțină o lectură a unui obiect care este aproape iminent atunci când de fapt nu există un obiect apropiat. Cu alegerea # 3, deoarece câmpurile lor se pot suprapune, ambii senzori pot înregistra același obiect (din unghiuri diferite).

Așadar, vom alege opțiunea de plasare nr. 3.

Pasul 3: Timp pentru testare

Image
Image

După ce am făcut toate conexiunile între Raspberry Pi, MCP3008 ADC și senzorii IR Sharp, este timpul să testăm. Doar un test simplu pentru a vă asigura că sistemul funcționează cu noii senzori.

Ca și în Instructables anterioare, folosesc biblioteca wiringPi C cât mai mult posibil. Face lucrurile mai ușoare. Ceva care nu este foarte evident în urma revizuirii site-ului wiringPi, este că există asistență directă pentru MCP3004 / 3008.

Chiar și fără asta, ai putea folosi doar extensia SPI. Dar nu este nevoie. Dacă aruncați o privire atentă la depozitul git al lui Gordon pentru wiringPi, veți găsi o listă de cipuri acceptate, dintre care unul este pentru MCP3004 / 3008.

Am decis să atașez codul ca fișier, deoarece nu am putut să-l afișez corect pe această pagină.

Pasul 4: Un senzor virtual - AmpSensor

Cu cât robotul primește mai multe moduri diferite de informații despre lumea exterioară, cu atât mai bine.

Robotul are în prezent opt senzori sonari acustici HCSR04 (nu sunt în centrul acestui instructabil) și are acum doi senzori de distanță IR Sharp. După cum sa menționat mai devreme, putem profita de altceva: caracteristica de detectare a curenților motori ai lui Roboclaw.

Putem înfășura acel apel de interogare către controlerul motor într-o clasă C ++ și îl putem numi AmpSensor.

Prin adăugarea unor „smart-uri” la software, putem monitoriza și regla tipul de curent tipic în timpul mișcării drepte (înainte, înapoi), precum și mișcărilor de rotație (stânga, dreapta). Odată ce cunoaștem acele game de amplificatori, putem selecta o valoare critică, astfel încât dacă AmpSensor obține o citire curentă de la controlerul motorului care depășește această valoare, știm că motoarele s-au blocat și, de obicei, indică faptul că robotul s-a lovit în ceva.

Dacă adăugăm o oarecare flexibilitate software-ului (argumente de linie de comandă și / sau intrare de la tastatură în timpul funcționării), atunci putem crește / micșora pragul „amplificatorilor critici” pe măsură ce experimentăm, lăsând robotul să se miște și să se lovească de obiecte, ambele direct sau în timp ce se rotesc.

Deoarece porțiunea noastră de navigare din software cunoaște direcția mișcării, putem folosi toate acele informații pentru a opri mișcarea și a încerca să inversăm mișcarea pentru o perioadă scurtă de timp înainte de a încerca altceva.

Pasul 5: Navigare

În prezent, robotul este limitat în feedback-ul din lumea reală. Are câțiva senzori la distanță mică pentru evitarea obstacolelor și are o tehnică de retragere a monitorizării atragerii curentului în cazul în care senzorii de distanță ratează un obstacol.

Nu are motoare cu codificatoare și nu are un IMU (unitate de măsurare inerțială), astfel încât este mai dificil să știi dacă este într-adevăr în mișcare sau rotire și cu cât.

Deși se poate obține un fel de indicație a distanței cu senzorii aflați în prezent pe robot, câmpul lor vizual este larg și există imprevizibilitate. Este posibil ca sonarul acustic să nu se reflecte corect; infraroșul poate fi confundat de alte lumini sau chiar de suprafețe reflectorizante multiple. Nu sunt sigur că merită deranjul să încercăm efectiv să urmărim schimbarea distanței ca tehnică pentru a ști dacă robotul se mișcă și cu cât și în ce direcție.

Am ales în mod intenționat să NU folosesc un micro-controler, cum ar fi un Arduino, deoarece a) nu-mi place mediul psuedo-C ++, b) și că prea multă dezvoltare va uza memoria de citire-scriere (?) Și că ar avea nevoie de un computer gazdă pentru a se dezvolta (?). Sau poate mi se întâmplă doar ca Raspberry Pi.

Cu toate acestea, Pi care rulează Raspbian nu este un sistem de operare în timp real, deci între instabilitățile acestor senzori și sistemul de operare care nu citesc exact de fiecare dată, am simțit că scopul acestor senzori este mai potrivit pentru evitarea obstacolelor și nu măsurarea distanței reale.

Această abordare părea complicată și cu beneficii nu atât de mari, când putem folosi senzori ToF (timp de zbor) mai buni (mai târziu) în acest scop (SLAM).

O abordare pe care o putem folosi este să păstrăm un fel de urmărire a comenzilor de mișcare care au fost emise în ultimele X secunde sau comenzi.

De exemplu, spuneți că robotul este blocat cu fața către un colț în diagonală. Un set de senzori îi spune că este prea aproape de un perete, deci pivotează, dar apoi celălalt set de senzori îi spune că este prea aproape de celălalt perete. Se termină doar repetând un model lateral.

Exemplul de mai sus este doar un caz foarte simplu. Adăugarea unor inteligențe poate ridica modelul repetat la un nou nivel, dar robotul rămâne blocat în colț.

Exemplu, în loc să se rotească înainte și înapoi în poziție, se rotește într-un sens, face inversarea momentană (care apoi șterge indicațiile de distanță critică) și chiar dacă se rotește în cealaltă direcție, tot merge înainte cu un unghi înapoi în colț, repetând un model mai complicat, în esență, același lucru.

Asta înseamnă că am putea folosi cu adevărat un istoric al comenzilor și să aruncăm o privire asupra modului de exploatare și utilizare a acestor informații.

Mă pot gândi la două moduri foarte elementare (rudimentare) de utilizare a istoriei mișcării.

  • pentru ultimul X număr de mișcări, se potrivesc Y modelul. Un exemplu simplu ar putea fi (și acest lucru s-a întâmplat) „FORWARD, INVERSE, FORWARD, REVERSE, …..”. Deci, există această funcție de potrivire care returnează TRUE (model găsit) sau FALSE (nu a fost găsit). Dacă este ADEVĂRAT, în porțiunea de navigare a programului, încercați alte secvențe de mișcare.
  • pentru ultimul X număr de mișcări, există o mișcare generală sau netă înainte. Cum se poate determina ce este mișcarea reală înainte? Ei bine.. o comparație ușoară este că pentru ultimele X mutări, „FORWARD” apare mai mult decât „INVERSARE”. Dar asta nu trebuie să fie singura. Ce zici de asta: „DREAPTA, DREAPTA, STÂNGA, DREAPTA”. În acest caz, robotul trebuie să facă viraje la dreapta pentru a ieși dintr-un colț sau pentru că s-a apropiat de perete într-un unghi, ceea ce ar putea fi considerat un progres real înainte. Pe de altă parte, „STÂNGA, DREAPTA, STÂNGA, DREAPTA …” s-ar putea să nu fie considerat un progres real real. Astfel, dacă „DREAPTA” apare mai mult decât „STÂNGA” sau „STÂNGA apare mai mult decât„ DREAPTA”, atunci acesta ar putea fi un progres real.

La începutul acestui Instructable, am menționat că un posibil al treilea obiectiv ar putea fi pătratul sau alinierea la un perete. Pentru asta, însă, avem nevoie de mai mult decât „suntem aproape de un obiect”. De exemplu, dacă putem obține doi senzori acustici orientați spre înainte (nu punctul central al acestui articol) pentru a oferi răspunsuri rezonabile și stabile în ceea ce privește distanța, evident dacă unul raportează o valoare mult diferită față de celălalt, robotul s-a apropiat de perete într-un unghi și ar putea încerca unele manevre pentru a vedea dacă valorile respective se apropie una de cealaltă (cu fața la perete direct).

Pasul 6: Gânduri finale, faza următoare …

Sper că acest Instructable a dat câteva idei.

Adăugarea mai multor senzori introduce câteva avantaje și provocări.

În cazul de mai sus, toți senzorii acustici au funcționat bine împreună și a fost destul de simplu cu software-ul.

Odată ce senzorii IR au fost introduși în mix, a devenit ceva mai provocator. Motivul este că unele dintre câmpurile lor de vedere s-au suprapus cu cele ale senzorilor acustici. Senzorii IR par un pic sensibili și imprevizibili cu condițiile de lumină ambientală în schimbare, în timp ce, desigur, senzorii acustici nu sunt afectați de iluminare.

Așadar, provocarea a fost ce să facem dacă un senzor acustic ne spune că nu există nici un obstacol, dar senzorul IR este.

Deocamdată, după încercări și erori, lucrurile au ajuns în această prioritate:

  1. detectarea amplificatorului
  2. Sensibilitate IR
  3. acustic-senzorial

Și ceea ce am făcut a fost doar pentru a reduce sensibilitatea senzorilor IR, astfel încât aceștia să detecteze numai obiecte foarte apropiate (cum ar fi picioarele iminente ale scaunului)

Până în prezent, nu a fost nevoie să fac niciun software multi-threading sau întrerupt, deși întâlnesc ocazional pierderea controlului între Raspberry Pi și controlerul motor Roboclaw (pierderea comunicațiilor seriale).

Aici ar intra în mod normal circuitul E-Stop (vezi Instructables anterioare). Cu toate acestea, din moment ce nu vreau (încă) să mă ocup de nevoia de a reseta Roboclaw în timpul dezvoltării, iar robotul nu merge atât de repede și sunt prezent pentru a-l monitoriza și a-l opri, nu am a conectat E-Stop-ul.

În cele din urmă, multi-threading va fi cel mai probabil necesar.

Pasii urmatori…

Vă mulțumesc că ați ajuns până aici.

Am obținut niște senzori laser ToF (timp de zbor) VL53L1X IR, deci cel mai probabil este subiectul următorului instructabil, împreună cu un servo.

Recomandat: