Circuite

Cum de a construi un robot de auto-navigare: 7 pași

У рабочих автозавода Ford в Кёльне появились напарники-роботы

У рабочих автозавода Ford в Кёльне появились напарники-роботы

Cuprins:

Anonim

Acesta este un tutorial detaliat cu privire la modul de a realiza un robot pornind de la zero, oferindu-i posibilitatea de a naviga autonom într-un mediu necunoscut.
Toate argumentele tipice implicate în robotică vor fi acoperite: mecanică , Electronică și programare .
Robotul este conceput pentru a fi realizat de oricine acasă fără unelte și echipamente profesionale (adesea scumpe).
Placa creierului (dsNav ) se bazează pe un microchip dsPIC33 DSC cu capabilități de codificator și controler de motor. Poziția este calculată de odometrie (codificator) fără nici o referință externă (calculul mort).
În versiunea finală, alți controlori sunt utilizați pentru controlul senzorilor (Arduino) și pentru gestionarea senzorilor analogi (PSoC).

Furnituri:

Pasul 1: Platforma de bază

Un exemplu de construire a unei platforme robotizate foarte simple, cu componente și piese ușor de găsit peste tot, fără a avea nevoie de unelte sau echipamente profesionale și fără o abilitate specială pentru lucrările mecanice.
Dimensiunile bazei permit utilizarea sa în mai multe categorii diferite de concursuri robotizate: Explorer, Line Follower, Can Collector, etc.

Pasul 2: Ce vrem să obținem? si cum?

Acest robot, ca și majoritatea robotilor construiți de hobbyști, se bazează pe un sistem de direcție diferențiat, permițându-ne să cunoaștem coordonatele de poziție ale robotului în orice moment dat, știind pur și simplu spațiul acoperit de fiecare roată cu suficientă precizie.
Acest sistem de navigare calculat mort este afectat de eroarea cumulativă; precizia de măsurare trebuie să fie ridicată pentru a asigura un cerc de eroare mic după o lungă cale. Deci, după câteva rezultate bune cu encodere de casă, am decis să folosesc ceva mai bun: câteva motoare cu roți de 12V-200 rpm, conectate la un număr de 300 de codificatoare Count Per Revolution (cpr), ambele disponibile la multe magazine de robotică pe Internet.
Principii de baza
Pentru a captura toate impulsurile generate de codorul 300 cpr pe un motor de 3000 rpm în metoda de decodare de 4x (120 kHz), avem nevoie de hardware dedicat pentru fiecare codificator (QEI = Quadrature Encoder Interface). După ce am experimentat cu un dublu PIC18F2431, am stabilit că actualizarea corectă este la un dsPIC. La început, au fost doi controleri de motor dsPIC30F4012 pentru a controla poziția și viteza roților, a efectua oomerizarea și a furniza datele celor două motoare unui dsPIC30F3013. Acest DSC cu scop general este suficient de puternic pentru a obține date, pentru a calcula coordonatele poziției și a stoca date legate de traiectoria acoperită pentru a obține o hartă a câmpului, toate cu o rată foarte ridicată.
Când placa și programele au fost aproape finalizate, Microchip a scos un SPDIP nou, puternic, cu 28 de pini, în seria dsPIC33F, atât pentru versiunile cu motor cât și pentru versiunea generală (GP). Sunt mult mai rapide decât dsPIC30F, au mult mai multă memorie de program disponibilă și memorie RAM (utilă pentru cartografierea câmpului), necesită mai puțină putere (bun pentru un robot acționat de baterie), iar capacitățile lor DMA simplifică multe operații I / O.
Cel mai important, acestea sunt primele controlere de motor Microchip cu două QEI-uri pe același cip. Să începem din nou un nou port! schema logică bloc este similară celei pentru placa anterioară , dar hardware-ul și software-ul sunt mult mai simple Pot folosi o singură DSC inseminată de trei . Nu este nevoie de o comunicare de mare viteză între supraveghetor și controlorii de motor pentru a schimba parametrii de navigație. Fiecare proces este simplu de sincronizat deoarece este pe același chip. Capacitatea periferică de selectare a seriei dsPIC33F simplifică în continuare PCB, permițând o conexiune internă a perifericelor și o mai mare flexibilitate.
Acest lucru ne aduce la "dsPIC based Navigation Control board" sau dsNavCon pe scurt. Această placă este concepută ca parte a unui sistem mai complex. Într-un robot complet de exploratori, alte plăci vor controla sunetul, lumina, senzorii de gaz, precum și barele de protecție și dispozitivele de căutare cu ultrasunete pentru a găsi ținte și pentru a evita obstacolele.
Ca un stand independent, dsNavCon poate fi folosit si pentru un robot simplu "follower", ceva mai complex ca un robot pentru un concurs de odometrie si socoteala necenzurata sau un asa-numit "can robot" (pentru colectia de concursuri). Există încă o mulțime de memorie de programe gratuite pentru a adăuga cod pentru astfel de sarcini. Cu mici sau fără modificări în software-ul, acesta poate fi de asemenea utilizat independent pentru un vehicul controlat la distanță, folosind modemul RF bidirecțional cu un fel de telecomandă inteligentă. Această telecomandă poate trimite comenzi complexe cum ar fi "mișcați FWD 1m", "rotiți 15 ° stânga", "alerga FWD la 50 cm / s", "mergi la coordonatele X, Y" sau ceva similar.
Bordul și robotul, de asemenea, sunt concepute pentru a fi realizate de oricine acasă fără instrumente profesionale și echipament.

Pasul 3: Hardware Open Source

Diagramă bloc
Subsistemul de control al navigației este compus din dsNav ca placa "inteligentă" a sistemului și o placă dublă H-bridge bazată pe L298 pentru a controla motoarele 12V adaptate (Hsiang Neng HN-GH12-1634TR). Feedbackul de mișcare provine de la un număr de 300 de codificatori cpr (US digital e4p-300-079-ht).
Comunicarea cu lumea exterioară se realizează prin cele două interfețe seriale UART; unul pentru telemetrie și celălalt pentru a obține date de la placa senzorilor. Modulul XBee poate fi conectat la UART1 sau UART2 prin intermediul jumperilor JP1 și JP2. Prizele J1 și J16 sunt disponibile pentru alte tipuri de conexiuni. Portul COMM1 (J16) poate fi de asemenea utilizat pentru o comunicație I2C datorită capacității de selectare a pinilor periferici din seria dsPIC33F.
Diagrama schematică originală în format Eagle poate fi găsită aici:
http://www.guiott.com/Rino/dsNavCon33/dsNavCon33_Eagle_project/DsPid33sch.zip
După cum puteți vedea schematică este atât de simplă încât poate fi implementată pe un perfboard așa cum am făcut-o. Dacă nu doriți să utilizați acest sistem și nu doriți să realizați propriul PCB, o placă comercială bazată pe munca mea originală și pe deplin compatibilă cu software-ul meu open source este disponibil la adresa: http://www.robot-italy .com / product_info.php? products_id = 1564

Pasul 4: Software-ul open source

Software-ul este dezvoltat cu MPLAB® free IDE și scris cu MPLAB® C30 compilator (chiar și într-o versiune gratuită sau student), ambele (desigur) de Microchip:
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=81
Întregul proiect este disponibil ca sursă open source la Google Code
http://code.google.com/p/dspid33/
Consultați aici cea mai recentă versiune, comentariu, descrieri etc.
Programul este descris pas cu pas în interiorul codului. Pentru a avea un nivel înalt de comentare și un cod mai ușor de citit, la fiecare punct semnificativ există un număr în paranteze (de exemplu: 7) ca referință la un fișier extern (de exemplu: descrEng.txt) în proiectul MPLAB .
Diagrama prezintă arhitectura generală a procedurilor de control ale panoului dsNav și strategiile de navigație aplicate la baza proiectului.
Controlerele motorului pot fi văzute ca niște cutii negre care se ocupă de viteza roților. Partea de supraveghere a programului le trimite viteza de referință (VeldDesX: viteza dorită). Modulele Input Capture ale microcontrolerului primesc impulsuri de la encodere conectate la axa motorului și derivă viteza de rotație a motoarelor (VelMesX: viteza măsurată). Combinând la fiecare 1ms aceste valori în controlul PID "Speed ​​PID" obținem valoarea PWM corectă pentru a menține viteza dorită a fiecărei roți.
Modulele QEI (Interfața cu Encoder Quadratură) obțin ambele impulsuri A și B de la encodere și dau înapoi funcției de supervizor direcția de deplasare și numărul de impulsuri în modul 4x (numărarea marginilor în creștere și de cădere ale semnalului A și ale semnalului B: 2 x 2 = 4).
Înmulțind numărul de impulsuri cu un K care indică spațiul parcurs pentru fiecare impuls encoder, obținem distanța parcursă de roțile din dreapta și din stânga la fiecare 10ms. Supraveghetorul combină aceste informații de călătorie și aplică procedura de reținere mortală pentru a obține coordonatele de poziție măsurate ale lui bot: Xmes, Ymes, θMes (unghiul de orientare).
Supraveghetorul primește comanda de navigare din exterior prin interfața serială (telemetrie).
Pot fi aplicate strategii diferite:
A - deplasarea la o anumită viteză într-o anumită direcție (VelDes, θDes).
B - deplasarea către un punct dat cu coordonatele XDes, YDes.
C - deplasarea pentru o anumită distanță într-o anumită direcție (DistDes, θDes).
Modul A : cu "comutatoarele de comandă logică" din poziția 1, numai funcția PID "Angle PID" este folosită de funcțiile supervizorului. Aceasta combină unghiul dorit θDes cu unghiul măsurat θMes calculat prin procedura de odometrie, pentru a obține valoarea vitezei unghiale de rotație ω a vehiculului în jurul axei sale verticale, necesară pentru a corecta eroarea de orientare.
Valoarea lui DeltaV este proporțională cu ω. Se adaugă la VelDes pentru a obține viteza roții din stânga și a scădea la VelDes pentru a obține viteza roții din dreapta, pentru a păstra poziția corespunzătoare valorii θDes, în timp ce centrul robotului încă se deplasează la viteza VelDes.
Modul B : cu "comutatoarele de comandă logică" din poziția 2, viteza dorită VelDes se calculează prin comanda PID "Dist PID" și se utilizează ca în modul A. Intrarea măsurată pentru acest PID (DistMes) este calculată în funcție de coordonatele actuale și coordonatele destinației. Unghiul de orientare dorit θDes, de asemenea, vine de la aceeași procedură și este folosit ca intrare de referință pentru "Angle PID". Intrarea de referință pentru "Dist PID" este 0, ceea ce înseamnă că destinația este atinsă. Cu ajutorul opțiunilor ω și VelDes, controlul vitezei roților funcționează ca în modul A.
Modul C : cu "comutatoarele de control logic" din poziția 2, coordonatele de destinație Xdes, Ydes sunt calculate o dată la început ca o funcție a parametrilor de intrare DistDes, θDes. După aceea, totul merge ca în modul B

Pasul 5: Detalii despre software: Controlul vitezei și alte funcții de bază

Programul este plin întrerupeți condusul . La pornire, după inițializare, programul intră într-o buclă principală foarte simplă, acționând ca o mașină de stat. În buclă principală, programul verifică steagurile activate de evenimente externe și intră în starea relativă în funcție de valorile lor.
Deoarece este un fel de cooperare foarte simplă "Sistem de operare în timp real , "fiecare rutină trebuie să fie executată în cel mai scurt timp posibil, eliberându-l pe sistem să aibă grijă de întreruperile foarte frecvente.
Nu există "așteptați până" și nu există întârzieri în cod. Ori de câte ori sunt posibile întreruperi, în special pentru operații lente cum ar fi transmiterea sau recepția de șiruri de caractere. Comunicarea UART are avantajul capabilităților DMA ale dsPIC33F pentru a economisi timpul procesorului făcând toate lucrările "murdare" din hardware.
Periferice utilizate pe dsPIC33FJ128MC802:
- QEI pentru a calcula traseul parcurs.
- Input Capture (IC) pentru a calcula viteza.
- Convertoare A / D pentru citirea curentului motorului.
- PWM-uri îmbunătățite pentru a conduce motoarele.
- UART-uri pentru a comunica cu lumea exterioară
Module QEI sunt folosite pentru a ști cât de mult au călătorit roțile și în ce direcție. Această valoare este algebric cumulată într-o variabilă la fiecare 1ms și trimisă la funcția de supraveghetor la cererea sa. După trimiterea valorii, variabilele sunt resetate.
Viteza este măsurată la impulsul fiecărui codificator, după cum este descris mai jos. Fiecare 1ms calculează viteza medie prin eșantioanele medii, execută algoritmul PID și corectează viteza motorului în funcție de rezultatul său, schimbând ciclul de funcționare PWM. Pentru o descriere detaliată a aplicației bibliotecii C30 PID, a se vedea exemplul codului microcipului: CE019 - Utilizarea controlerelor derivate integrale proporționale (PID) în sistemele de control în buclă închisă. http://ww1.microchip.com/downloads/en/DeviceDoc/CE019_PID.zip
Variațiile de viteză ale motoarelor sunt executate fără probleme, accelerând sau decelerând cu o rampă înclinată în creștere sau care se încadrează, pentru a evita tensiunile mecanice grele și alunecarea roților, care ar putea provoca erori în odometrie. Decelerația este mai rapidă decât accelerația pentru a evita loviturile cu obstacole în timpul frânării.
IC , modulele de captare a intrărilor sunt utilizate pentru a măsura timpul scurs între două impulsuri generate de codor, în sensul când roțile au călătorit pentru o cantitate fixă ​​de spațiu bine cunoscută (constantă SPACE_ENC ). Conectat în paralel cu QEA (intern la DSC datorită capabilităților Peripheral Pin Select ale dsPIC33F), captează timpul scurs pe marginea în creștere a semnalelor de codare. TIMER2 este utilizat în modul de funcționare liberă. La fiecare întrerupere IC, valoarea curentă a TMR2 este stocată și valoarea sa anterioară este scăzută din ea; aceasta este perioada de impuls. Apoi, valoarea curentă devine valoarea anterioară, așteptând următoarea întrerupere. Tastatura lui TMR2 trebuie să fie verificată pentru a afla dacă sa întâmplat o depășire în registrul de 16 biți. Dacă da, diferența dintre 0xFFFF și proba precedentă trebuie adăugată la valoarea curentă. Probele sunt adăugate algebric în IcPeriod variabilă în funcție de _UPDN bit, pentru a determina și direcția de viteză. Aceasta este una dintre metodele sugerate în Notă privind aplicarea microcipului AN545 .
Variabila IcIndx conține numărul de eșantioane adăugate în IcPeriod .
La fiecare 1ms viteza medie este calculată ca V = Spațiu / Timp
Unde Spațiu = SPACE_ENC • IcIndx
(= spațiul acoperit de un impuls de codificator • numărul de impulsuri)
și Timpul = TCY • IcPeriod
(= perioadă unică TMR • sumare a perioadelor).
Single_TMR_period = TCY = 1 / FCY (frecvența ceasului).
Asa de V = Kvel • (IcIndx / IcPeriod)
Unde Kvel = SPACE_ENC • VALUTA pentru a avea viteza în m / s.
Schimbarea a lăsat 15 biți Kvel const ( KvelLong = Kvel << 15 ) viteza este calculată deja în format fracțional (de asemenea, dacă sunt utilizate numai variabilele întregi) pregătite pentru a fi utilizate în rutina PID. Consultați fișierul "descrEng.txt" din proiectul MPLAB pentru o descriere mai detaliată.
Convertoare A / D măsurați continuu valorile curente ale motoarelor, stocând valorile în cele 16 poziții ale tampoanelor ADCBUF. Atunci când tampoanele sunt pline, apare o întrerupere și se calculează o valoare medie la aproximativ 1 ms.
UARTs sunt utilizate pentru a primi comenzi din exterior și pentru a trimite înapoi rezultatele măsurătorilor. Porțiunea de comunicare a programului funcționează ca o mașină de stat. Variabilele de stare sunt folosite pentru a executa acțiuni în ordine. Rutele de întrerupere foarte rapide și rapide (ISR) obțin sau pun fiecare singur octet de la sau la un tampon și stabiliți steagurile potrivite pentru a permite executarea funcției corespunzătoare.
Dacă apare orice fel de eroare în timpul primirii (UART, sumă de verificare, erori de parsing), variabila de stare este setată la un număr negativ, iar LED-ul roșu este alimentat pentru a comunica extern această condiție de defecțiune. Consultați fișierul "descrEng.txt" din proiectul MPLAB pentru o listă completă a posibilelor erori.
Protocolul folosit pentru strângerea de mână este stratul fizic independent , și poate fi utilizat împreună cu magistrala I2C sau RS485 pentru a comunica.
primul strat este controlată de interfața periferică dsPIC. Erori pentru cadre sau depășiri (UART) sau coliziuni (I2C) sunt detectate de hardware, setând un steag corespunzător.
al doilea strat este gestionată de rutinele ISR. Ele umple tamponul RX cu octeții recepționați de la interfețe. De asemenea, detectează depășirea tamponului și depășirea comenzii.
Funcțiile UartRx sau UartRx2 gestionează al treilea strat . Așa cum am descris deja (vezi și graficele de flux) aceste rutine funcționează ca o mașină de stat, obținând octeți din buffer și decodificând șirul de comandă.
Byte-urile sunt schimbate între straturile secunde și al treilea (funcția ISR și UartRx) printr-un buffer circular. ISR primește un octet, îl stochează într-o matrice și adaugă un pointer la matrice, dacă pointerul ajunge la sfârșitul matricei este repornit la început. Funcția UartRx are propriul pointer pentru a citi aceeași matrice, incrementată (și într-un mod circular) de îndată ce octetul este decodificat în starea curentă RX. Bucla principală apelează funcția UartRx ori de câte ori indicatorul "in" diferă de indicatorul "out".
Fiecare pachet de comandă este compus din:
0 - Header @
1 - ID 0-9 ASCII
2 - Cmd A-Z ASCII
3 - CmdLen N = 1-MAX_RX_BUFF număr de octeți următor (suma de control inclusă)
4 - Date …

N-1 - Date
N - Sumă de control 0-255 obținută prin simpla înscriere într-o variabilă de 8 biți, toți octeții care compun mesajul (suma de control exclusă).
Acest nivel controlează erorile de expirare și sumele de control, precum și consistența pachetelor (antet corect, lungime corectă). Dacă totul este în regulă, permite parcurgerea rutinei (al patrulea strat ) pentru a decoda mesajul și pentru a executa acțiunea necesară. Această rutină stabilește indicatorul de eroare adecvat dacă codul de primire primit nu este cunoscut.
TMR1 generează un ceas de sincronizare de 1000 Hz - bataile inimii ale programului. La întreruperea fiecărui TMR1, cronometrele interne sunt actualizate, cronometrul este șters și un steguleț este setat pentru a activa funcția care solicită valoarea spațiului călătorit. Fiecare funcție de 10ms "All_Parameters_Ask" (viteză, poziție, curent) este activată.

Pasul 6: Detalii despre software: Odometrie și maparea câmpului = Unde sunt eu?

Optimizarea algoritmului general pentru utilizarea într-un sistem DSC sau MCU
Odată ce avem informațiile despre distanța parcursă de fiecare roată într-o actualizare discretă (odometrie), putem estima coordonatele poziției robotului cu aceeași periodicitate fără nici o referință externă (calculul mort).
Unele fundamente teoretice privind calculul mort prin osometrie pot fi găsite în cartea lui Johann Borenstein:
"Unde sunt eu?" - senzori și metode pentru poziționarea robotului mobil "
și pe următoarele pagini web:
http://www.seattlerobotics.org/encoder/200010/dead_reckoning_article.html
Fundalul matematic și o explicație profundă a metodei generale utilizate pot fi găsite pe G.W. Lucrarea lui Lucas Un model de trasură și model elementar pentru sistemul de direcție diferențială al servomotoarelor de roți rotative, disponibile pe Internet:
http://rossum.sourceforge.net/papers/DiffSteer/DiffSteer.html
Alți algoritmi simplificați pot fi găsiți și în aceeași documentație, astfel încât este posibil să se obțină un compromis corect între precizie și viteza de elaborare, utilizând capacitatea matematică (trigonometrică) a seriei dsPIC33F.
O descriere a matematicii utilizate pentru a calcula poziția poate fi găsită în imaginile atașate la acest pas. Primul arată semnificația simbolurilor, al doilea prezintă formulele utilizate cu aceste simboluri. Dând clic pe casetele din dreptul fiecărui pas de calcul, este prezentată o scurtă descriere.
În final, știm cât de mult robotul sa mutat în acel interval de timp ca o deltă a orientării, o deltă pe axa X și o deltă pe axa Y în câmpul de referință cartusian.
Cumularea fiecărei valori delta în propria ei variabilă cunoaștem coordonatele actuale (poziția și orientarea) platformei.
Pentru a evita erorile de calcul (împărțirea la zero) și pierderea timpului de controler, trebuie făcută o verificare în avans atât pe variabilele Sr, cât și pe Sl. Definind o valoare cvasi-zero, care are grijă de aproximări mecanice și computaționale minime, putem simplifica formulele dacă robotul se deplasează în linie dreaptă (spațiul acoperit de roata dreaptă este aproape același cu spațiul parcurs de roata din stânga) sau dacă se rotește în jurul axei sale verticale (spațiul acoperit de roata din dreapta este aproape același cu spațiul parcurs de roata din stânga, dar într-o direcție opusă), așa cum este detaliat în diagrama prezentată în ultima imagine.

Acest videoclip arată un exemplu de precizie pe care o putem obține:
http://www.youtube.com/watch?v=d7KZDPJW5n8


Cartografierea câmpului
Cu datele calculate de funcțiile anterioare se efectuează o mapare de câmp.
Fiecare Xms, după elaborarea poziției curente, realizează o cartografiere a câmpului împărțind câmpul necunoscut într-o rețea de celule de 10 x 10 cm. Definind o dimensiune maximă a câmpului de 5 x 5m, obținem o matrice de 50 x 50 = 2500 celule. Fiecare celulă este definită cu o nibble, cu o ocupare totală de memorie de 1250 de octeți. Pentru fiecare celulă pot fi atribuite șaisprezece valori diferite:
n = 00 celule necunoscute
n = 01 - 10 celule vizitate n de ori
n = 11 obstacol găsit
n = 12 tinta de gaz gasita
n = 13 obiectiv de lumină găsit
n = 14 tinta de sunet gasita
Robotul poate porni din orice poziție în teren; acestea vor fi coordonatele de referință (0,0) din sistemul său de referință.
Cartografierea pe teren este utilă pentru a găsi cea mai bună strategie de explorare într-un domeniu necunoscut. Robotul se poate direcționa spre partea mai puțin explorată a câmpului (valoare mai mică "n"), poate economisi timp stopând de două ori într-o țintă deja descoperită, poate găsi calea cea mai bună pentru a ajunge la o anumită coordonată și multe altele.

Pasul 7: Consola de la distanță

Aceasta este aplicația care controlează de la distanță placa dsNavCon de la un Mac / PC prin comunicație serială prin intermediul a două dispozitive XBee așa cum este descris în diagrama bloc.
Pentru a fi ușor de dezvoltat și bun pentru a rula în orice sistem de operare, este scris cu Prelucrare limba:
http://www.processing.org/
De asemenea, codul sursă pentru acest program este disponibil ca sursă deschisă la Google Code:
http://code.google.com/p/dsnavconconsole/
Cu panoul principal (primele imagini), putem efectua telemetrie prin căutarea pe grilă a căii urmată de robot (estimată prin odometrie) într-un câmp de mărime configurabil și alte câteva valori importante citite pe dsNav .
Măsurătorile arată valorile măsurate:
- MesSpeed ​​într-un interval de +/- 500 mm / s, valoarea medie a vitezei celor două roți (viteza centrului platformei).
- Curentul măsurat în mA (suma curentului de la cele două motoare).
- Unghiul măsurat, astfel cum a fost extimat prin odometrie.
Alte panouri sunt utilizate pentru a configura parametrii robotului și pentru a stoca în robot o cale definită de urmat (dacă este necesar). Un panou important, cel puțin în timpul dezvoltării robotului, este panou de detaliu (a doua imagine) care arată viteza fiecărei roți în timp real, foarte utilă pentru calibrarea tuturor parametrilor.
Vederea centrală a rețelei poate fi comutată cu vizualizarea unei camere web pentru a controla, chiar și prin vizualizare, calea pe care o urmează robotul.
Un exemplu practic de utilizare pentru această consolă este afișat în acest videoclip:
http://www.youtube.com/watch?v=OPiaMkCJ-r0