Circuits

Com construir un robot de navegació pròpia: 7 passos

Robot móvil para la navegación y detección de fuegos dentro de una estructura tipo vivienda.

Robot móvil para la navegación y detección de fuegos dentro de una estructura tipo vivienda.

Taula de continguts:

Anonim

Aquest és un tutorial detallat sobre com realitzar un robot que parteix de zero i que li permetrà navegar de manera autònoma en un entorn desconegut.
Es cobriran tots els arguments típics relacionats amb la robòtica: mecànica , electrònica i programació .
Tot el robot està dissenyat per ser fabricat per qualsevol persona a casa sense necessitat d'eines i equips professionals (és a dir, cars).
La taula del cervell (dsNav ) es basa en un Microchip dsPIC33 DSC amb capacitats de codificador i controlador de motor. La posició es calcula per odometria (codificador) sense cap referència externa (recompte mort).
A la versió final alguns controladors s'utilitzen per controlar sensors (Arduino) i per gestionar sensors analògics (PSoC).

Subministraments:

Pas 1: la plataforma bàsica

Un exemple de com construir una plataforma robòtica molt senzilla amb components i peces fàcils de trobar a tot arreu, sense necessitat d'eines o equips professionals i sense una habilitat especial en treballs mecànics.
La mida de la base permet el seu ús en moltes categories diferents de concursos robòtics: Explorer, Line Follower, Can Collector, etc.

Pas 2: què volem obtenir? i com?

Aquest robot, com la majoria dels robots construïts per hobbysts, es basa en un sistema de direcció diferencial que ens permet conèixer les coordenades de posició del robot en un moment donat, simplement coneixent l'espai cobert per cada roda periòdicament amb la suficient precisió.
Aquest sistema de navegació per estimar està afectat per un error acumulat; la precisió de mesura ha de ser alta per assegurar un petit cercle d'error després d'un camí llarg. Així, després d’un bon resultat amb codificadors casolans, vaig decidir utilitzar alguna cosa millor: un parell de motors de 12V-200 rpm, connectats a un parell de 300 codificadors de Count Per Revolution (cpr), tots dos disponibles a moltes botigues de robòtica d’Internet.
Principis bàsics
Per capturar tots els polsos generats pel codificador 300 cpr en un motor de 3000 rpm en mètode de descodificació 4x (120 kHz), necessitem maquinari dedicat per a cada codificador (QEI = Quadrature Encoder Interface). Després d’experimentar amb un doble PIC18F2431, vaig determinar que l’actualització correcta és a un dsPIC. Al principi van ser dos controladors de motor dsPIC30F4012 per controlar la posició i la velocitat de les rodes, per dur a terme odometria i per proporcionar dades dels dos motors a un dsPIC30F3013. Aquest DSC de propòsit general és prou potent com per obtenir dades, fer trigonometria per calcular les coordenades de posició i emmagatzemar dades relacionades amb el camí recorregut per obtenir un mapa del camp, tot a un ritme molt elevat.
Quan el tauler i els programes estaven gairebé finalitzats, Microchip va presentar un nou i poderós SPDIP de 28 pins a la sèrie dsPIC33F per a versions tant de controlador de motor (MC) com de propòsit general (GP). Són significativament més ràpids que el dsPIC30F, tenen una memòria de programa i memòria RAM molt més útils (útils per al mapeig de camps), requereixen menys energia (bona per a un robot amb bateria) i les seves capacitats DMA simplifiquen moltes operacions d'E / S.
El més important és que són els primers controladors de motors Microchip amb dues QEIs al mateix xip. Iniciarem un nou port de nou. El el diagrama de blocs lògic és similar al de la placa anterior , però el maquinari i el programari són molt més senzills des de llavors Puc utilitzar un DSC només instal·lat de tres . No es necessita una comunicació d’alta velocitat entre el supervisor i els controladors de motor per intercanviar paràmetres de navegació. Cada procés és senzill de sincronitzar perquè està en el mateix xip. La capacitat de selecció de pins perifèrics de la sèrie dsPIC33F simplifica encara més la PCB, permetent una connexió interna de perifèrics i una major flexibilitat.
Això ens porta a la "placa de control de navegació basada en dsPIC" o dsNavCon per resumir. Aquest tauler ha estat dissenyat com a part d’un sistema més complex. En un robot explorador complet, altres taules controlaran so, llum, sensors de gas, així com para-xocs i cercadors de rangs ultrasònics per trobar objectius i evitar obstacles.
Com a pissarra independent, dsNavCon També es pot utilitzar per a un simple robot "seguidor de línia", una cosa més complexa com un robot per a un concurs d'odometria i de recompte de víctimes mortes, o un anomenat "robot de can pot" (per a la recopilació de competicions poden). Encara hi ha molta memòria de programa gratuïta per afegir codi per a aquestes tasques. Amb canvis menors o nul·les en el programari, també es pot utilitzar independentment per a un vehicle controlat a distància, utilitzant el mòdem RF bidireccional amb algun tipus de control remot intel·ligent. Aquest control remot pot enviar comandes complexes com "moure FWD 1m", "girar a 15 º cap a l'esquerra", "executar FWD a 50 cm / s", "anar a X, Y coordenades" o alguna cosa similar.
El tauler i el robot també estan dissenyats per ser fabricats per qualsevol persona a casa sense necessitat d'eines i equips professionals.

Pas 3: El maquinari de codi obert

Diagrama de blocs
El subsistema de control de navegació està compost per la dsNav com el tauler "intel·ligent" del sistema i un tauler de pont H dual basat en L298 per controlar els motors de transmissió de 12 V (Hsiang Neng HN-GH12-1634TR). La retroalimentació del moviment prové d'un parell de codificadors de 300 cpr (US digital e4p-300-079-ht).
La comunicació amb el món extern es realitza a través de les dues interfícies de sèrie UART; un per a la telemetría i l'altre per obtenir dades de la placa de sensors. El mòdul XBee es pot connectar a UART1 o UART2 a través de jumpers JP1 i JP2. Els endolls J1 i J16 estan disponibles per a altres tipus de connexions. El port COMM1 (J16) també es pot utilitzar per a una comunicació I2C gràcies a la capacitat de selecció de pins perifèrics de la sèrie dsPIC33F.
El diagrama esquemàtic original en format Eagle es pot trobar aquí:
http://www.guiott.com/Rino/dsNavCon33/dsNavCon33_Eagle_project/DsPid33sch.zip
Com es pot veure, l’esquema és tan senzill que es pot implementar en un perfboard com jo. Si no voleu utilitzar aquest sistema i no voleu realitzar el vostre propi PCB, hi ha disponible un tauler comercial basat en el meu treball original i totalment compatible amb el meu programari de codi obert: http: //www.robot-italy .com / product_info.php? products_id = 1564

Pas 4: El programari de codi obert

El programari es desenvolupa amb l'IDE lliure MPLAB® i s'escriu amb el compilador MPLAB® C30 (fins i tot en una versió gratuïta o estudiantil), ambdós (és clar) de Microchip:
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=81
Tot el projecte està disponible com a codi obert a Google Code
http://code.google.com/p/dspid33/
Consulteu la versió més recent, els comentaris, les descripcions, etc.
El programa es descriu pas a pas dins del codi. Per tenir un alt nivell de comentaris i un codi més llegible, a cada punt significatiu hi ha un número entre parèntesi (per exemple: 7) com a referència a un fitxer extern (és a dir: descrEng.txt) al projecte MPLAB .
El diagrama mostra l'arquitectura global dels procediments de control de la placa dsNav i les estratègies de navegació aplicades a la base del projecte.
Els controladors de motor es poden veure com a caixes negres que tenen cura de la velocitat de les rodes. La part supervisora ​​del programa els envia la velocitat de referència (VeldDesX: velocitat desitjada). Els mòduls de captura d’entrada del microcontrolador obtenen pulsos dels codificadors connectats a l’eix del motor i obtenen la velocitat de rotació dels motors (VelMesX: velocitat mesurada). Combinant cada 1 ms aquests valors al control PID "Speed ​​PID" obtenim el valor de PWM correcte per mantenir la velocitat desitjada de cada roda.
Els mòduls QEI (Quadrature Encoder Interface) obtenen els polsos A i B dels codificadors i retornen a la funció supervisora ​​la direcció de desplaçament i el nombre de polsos en mode 4x (comptant les vores ascendents i descendents del senyal A i el senyal B: 2 x 2 = 4).
Multiplicant el nombre de polsos per un K que indica l’espai recorregut per a cada pols del codificador, obtenim la distància recorreguda per les rodes dreta i esquerra cada 10 ms. El supervisor combina aquestes informacions de viatge i aplica el procediment de càlcul de morts per obtenir les coordenades de posició mesurades del bot: Xmes, Ymes, θMes (angle de orientació).
El supervisor rep comandament de navegació des de fora per interfície sèrie (telemetría).
Es poden aplicar diferents estratègies:
A - Viatgeu a una velocitat determinada en una direcció donada (VelDes, )Des).
B - Viatgeu cap a un punt donat amb les coordenades XDes, YDes.
C - Viatgeu per una determinada distància en una direcció donada (DistDes, θDes).
Mode A : Amb el "control lògic commutador" a la posició 1, només el control PID "Angle PID" és utilitzat per les funcions de supervisor. Aquest combina l’angle desitjat withDes amb l’angle mesurat θMes calculat per procediment d’odometria, per tal d’obtenir el valor de la velocitat angular de rotació ω del vehicle al voltant del seu eix vertical, necessari per corregir l’error d’orientació.
El valor de DeltaV és proporcional a. S'afegeix a VelDes per obtenir la velocitat de la roda esquerra i restar-la a VelDes per obtenir la velocitat de la roda dreta, per tal de mantenir l’encapçalament corresponent al valor valueDes, mentre que el centre del robot segueix viatjant a la velocitat de VelDes.
Mode B : amb els "interruptors de control lògic" a la posició 2, el VelDes de velocitat desitjat es calcula mitjançant el control PID "Dist PID" i s'utilitza com en el mode A. L'entrada mesurada d'aquest PID (DistMes) es calcula en funció de les coordenades actuals i les coordenades de destinació. L’angle d’orientació desitjat θDes també prové del mateix procediment i s’utilitza com a entrada de referència per al "Angle PID". L’entrada de referència per a "Dist PID" és 0, de manera que s’aconsegueix la destinació. Amb ω i VelDes disponibles, el control de velocitat de les rodes funciona com a mode A.
Mode C : amb els "interruptors de control lògic" a la posició 2, la destinació cordinates Xdes, Ydes es calculen una vegada al principi com a funció dels paràmetres d’entrada DistDes, θDes. Després d'això, tot va com a mode B

Pas 5: Detalls del programari: control de velocitat i altres funcions bàsiques

El programa està ple impulsat per interrupcions . A l'inici, després de la inicialització, el programa entra en un bucle principal senzill, que actua com a màquina d'estat. Al bucle principal, el programa comprova les banderes habilitades per esdeveniments externs i entra en l'estat relatiu segons els seus valors.
Ja que és una mena de cooperativa molt simple "Sistema operatiu en temps real , "cada rutina ha d’executar-se en el menor temps possible, alliberant el sistema per tenir cura de les interrupcions molt freqüents.
No hi ha cap "espera fins" i no hi hagi retards en el codi. Sempre que sigui possible, s’utilitzen interrupcions, en particular per a operacions lentes com la transmissió o recepció de cadenes de caràcters. La comunicació UART té l'avantatge de les capacitats DMA del dsPIC33F per estalviar temps de la CPU fent tot el treball "brut" del maquinari.
Perifèrics utilitzats a dsPIC33FJ128MC802:
- QEIs per calcular el camí recorregut.
- Captura d’entrada (IC) per calcular la velocitat.
- Convertidors A / D per llegir el corrent del motor.
- PWMs millorats per conduir els motors.
- UART per comunicar-se amb el món extern
Mòduls QEI s’utilitzen per saber quant han recorregut les rodes i en quina direcció. Aquest valor s'acumula algebraicament en una variable cada 1 ms i enviat a les funcions del supervisor a la seva petició. Un cop enviat el valor, es restabliran les variables.
La velocitat es mesura a cada pols del codificador tal com es descriu a continuació. Cada 1 ms calcula la velocitat mitjana promediant mostres, executa l'algoritme PID i corregeix la velocitat del motor segons el seu resultat, canviant el cicle de treball PWM. Per obtenir una descripció detallada de l’aplicació de la biblioteca CID P30, vegeu Exemple de codi de microprocessador: CE019 - Utilització de controladors de derivats integrals proporcionals (PID) en sistemes de control de bucle tancat. http://ww1.microchip.com/downloads/en/DeviceDoc/CE019_PID.zip
Les variacions de velocitat dels motors s’executen sense problemes, accelerant o desaccelerant amb una rampa inclinada ascendent o descendent per tal d’evitar un esforç mecànic pesat i un lliscament de la roda que pugui provocar errors d’odometria. La desacceleració és més ràpida que la acceleració per evitar cops amb obstacles durant la frenada.
I C , els mòduls de captura d’entrada s’utilitzen per mesurar el temps transcorregut entre dos polsos generats pel codificador, s que significa quan les rodes van viatjar per una quantitat d’espai fixa coneguda (constant) SPACE_ENC ). Connectats en paral·lel a QEA (internament a la DSC gràcies a les capacitats de selecció de perifèrics del dsPIC33F), capturen el temps transcorregut en senyal de vora ascendent dels codificadors. TIMER2 s'utilitza en mode de funcionament lliure. A cada interrupció de l’IC, el valor actual de TMR2 s’emmagatzema i el seu valor anterior s’ha de restar; aquest és el període de pols. Llavors el valor actual es converteix en el valor anterior, a l'espera de la següent interrupció. Cal marcar el senyalador de TMR2 per saber si es produeix un desbordament al registre de 16 bits. En cas afirmatiu, cal afegir la diferència entre 0xFFFF i la mostra anterior al valor actual. A les mostres s’hi afegeix algebraicament IcPeriod variable segons _UPDN bit, per determinar també la direcció de la velocitat. Aquest és un dels mètodes suggerits a Nota d'aplicació de microprocessador AN545 .
La variable IcIndx conté el nombre de mostres afegides a IcPeriod .
Cada 1 ms es calcula la velocitat mitjana V = Espai / Temps
on Space = SPACE_ENC • IcIndx
(= espai cobert per un pols codificador • nombre de polsos)
i Hora = TCY • IcPeriod
(= període de TMR únic • es van sumar els períodes).
Single_TMR_period = TCY = 1 / FCY (freqüència de rellotge).
Tan V = Kvel • (IcIndx / IcPeriod)
on Kvel = SPACE_ENC • FCY tenir velocitat en m / s.
Canviar a l'esquerra de 15 bits Kvel const ( KvelLong = Kvel << 15 ) La velocitat es calcula ja en format fraccional (també si només s’utilitzen variables enteres) a punt per ser utilitzades en la rutina PID. Consulteu el fitxer "descrEng.txt" al projecte MPLAB per obtenir una descripció més detallada.
Convertidors A / D mesurar contínuament els motors actuals, emmagatzemant valors als tampons ADCBUF de 16 posicions. Quan els buffers estan plens, es produeix una interrupció i es calcula un valor mitjà aproximadament cada 1 ms.
UARTs s’utilitzen per rebre comandes des de l’exterior i retornar els resultats de les mesures. La part de comunicació del programa s'executa com una màquina d'estat. Les variables d’estat s’utilitzen per executar accions en seqüència. Les rutines de servei d’interrupció molt simples i ràpides (ISR) obtenen o posen cada byte de o cap a un buffer i estableixen les banderes correctes per permetre l’execució de la funció adequada.
Si es produeix qualsevol error durant la recepció (UART, suma de verificació, errors d'anàlisi), la variable d'estat es posa a un nombre negatiu i el led vermell s'encén per comunicar externament aquesta condició de falla. Consulteu el fitxer "descrEng.txt" al projecte MPLAB per obtenir una llista completa dels possibles errors.
El protocol que s’utilitza per l’enllaç de mans és independent de la capa física , i es pot utilitzar també amb el bus I2C o RS485 per comunicar-se.
El primera capa es controla mitjançant la interfície dsPIC perifèrica. El maquinari detecta els errors de marc o d'error (UART) o col·lisions (I2C), establint el senyalador adequat.
El segona capa es gestiona mitjançant rutines ISR. Omplen el buffer RX amb els bytes rebuts de les interfícies. També detecten desbordament de memòria intermèdia i excés d’ordres.
Les funcions UartRx o UartRx2 gestionen el fitxer tercera capa . Com ja s’ha descrit (vegeu també diagrames de flux), aquestes rutines actuen com una màquina d’estat, obtenint bytes del buffer i descodificant la cadena d’ordres.
Els bytes s’intercanvien entre la segona i la tercera capa (funció ISR i UartRx) a través d’un buffer circular. ISR rep un byte, el guarda en una matriu i incrementa un punter a la matriu; si el punter arriba al final de la matriu, es reinicia al principi. La funció UartRx té el seu propi punter per a llegir la mateixa matriu, incrementada (també de forma circular) tan aviat com el byte es decodifica en l'estat RX actual. El bucle principal truca la funció UartRx sempre que el punter "in" difereix del punter "out".
Cada paquet de comandes està compost per:
0 - Capçalera @
1 - ID 0-9 ASCII
2 - Cmd A-Z ASCII
3 - CmdLen N = 1-MAX_RX_BUFF # de bytes següents (suma de verificació inclosa)
4 - Dades …

N-1 - Dades
N - Checksum 0-255 obtingut simplement sumant en una variable de 8 bits, tots els bytes que componen el missatge (la suma de comprovació s'exclou).
Aquesta capa controla els temps d'espera i els errors de comprovació, així com la coherència de paquets (encapçalament correcte, longitud correcta). Si tot està bé, habilita la rutina de l’analitzador (quarta capa ) per descodificar el missatge i executar l’acció necessària. Aquesta rutina estableix l’indicador d’error adequat si el codi de missatge rebut no es coneix.
TMR1 genera un rellotge de temps de 1000 Hz: el batec del programa. A cada interrupció de TMR1 s'actualitzen els temporitzadors interns, es neteja el control de vigilància i s'estableix un senyalador per habilitar la funció que demana el valor de l’espai viatjat. Cada funció "All_Parameters_Ask" de 10 ms (velocitat, posició, corrent) està habilitada.

Pas 6: Detalls del programari: dominiometria i assignació de camps = on sóc?

Optimització de l'algorisme general per a un ús en un sistema basat en DSC o MCU
Un cop tenim la informació sobre la distància recorreguda per cada roda en una actualització de temps discret (odometria), podem estimar les coordenades de posició del robot amb la mateixa periodicitat sense cap referència externa (recompte mort).
Alguns antecedents teòrics relacionats amb l'homogeneïtat es poden trobar en el llibre de Johann Borenstein:
"On estic? - Sensors i mètodes per al posicionament de robots mòbils"
i a les següents pàgines web:
http://www.seattlerobotics.org/encoder/200010/dead_reckoning_article.html
El fons matemàtic i una explicació profunda del mètode general utilitzat es poden trobar a G.W. Paper de Lucas: un model de trajectòria elemental i tutorial per al sistema de direcció diferencial dels actuadors de rodes de robot, disponible a Internet:
http://rossum.sourceforge.net/papers/DiffSteer/DiffSteer.html
Alguns algorismes simplificats també es poden trobar en aquesta mateixa documentació, de manera que és possible obtenir el compromís correcte entre la precisió i la velocitat d’elaboració, utilitzant la capacitat matemàtica (trigonomètrica) de la sèrie dsPIC33F.
Es pot trobar una descripció de les matemàtiques utilitzades per calcular la posició a les imatges adjuntes a aquest pas. El primer mostra el significat dels símbols, el segon mostra les fórmules utilitzades amb aquests símbols. En fer clic a les caselles situades al costat de cada pas computacional, es mostra una breu descripció.
Al final sabem quant el robot va moure en aquest interval de temps com un delta de l’orientació, un delta a l’eix X i un delta a l’eix Y al camp de referència carthesian.
La acumulació de cada valor delta en la seva pròpia variable coneixem les coordenades actuals (posició i orientació) de la plataforma.
Per tal d'evitar errors computacionals (dividir per zero) i perdre el temps del controlador, s'ha de fer una comprovació prèvia tant a les variables Sr i Sl. Definint un valor quasi zero que s'encarregui de les aproximacions mecàniques i computacionals mínimes, podem simplificar les fórmules si el robot viatja en línia recta (l'espai cobert per la roda dreta és gairebé el mateix que l'espai viatjat per la roda esquerra) o si fa pivotar al voltant del seu eix vertical (l'espai cobert per la roda dreta és gairebé el mateix que l'espai viatjat per la roda esquerra però en sentit contrari), tal com es detalla al diagrama de flux que es mostra a la darrera imatge.

Aquest vídeo mostra un exemple de quina precisió podem obtenir:
http://www.youtube.com/watch?v=d7KZDPJW5n8


Mapatge de camps
Amb les dades computades per funcions anteriors, es realitza un mapatge de camps.
Cada Xms, després de l’elaboració de la posició actual, es realitza un mapatge de camps que divideix el camp desconegut en una graella de cel·les de 10 x 10 cm. Definint una dimensió màxima de camp de 5 x 5 m, obtenim una matriu de cèl·lules de 50 x 50 = 2500. Cada cel·la es defineix amb un nibble, amb una ocupació total de memòria de 1250 bytes. Es poden assignar setze valors diferents a cada cel·la:
n = 00 cel·la desconeguda
n = 01 - 10 cel·la visitada n vegades
n = 11 obstacle trobat
n = 12 objectiu de gas trobat
n = 13 objectiu clar trobat
n = 14 objectiu de so trobat
El robot pot començar des de qualsevol posició del camp; aquestes seran les coordenades de referència (0,0) en el seu sistema de referència.
El mapatge de camps és útil per trobar la millor estratègia d’exploració en un camp desconegut. El robot pot dirigir-se a la part menys explorada del camp (el valor "n" més baix), pot estalviar temps si no s'atura dues vegades en un objectiu ja descobert, pot trobar el millor camí per arribar a una coordenada determinada i molt més.

Pas 7: Consola remota

Aquesta és l’aplicació que controla remotament la placa dsNavCon des d’un Mac / PC mitjançant una comunicació en sèrie a través d’un parell de dispositius XBee com es descriu al diagrama de blocs.
Perquè sigui fàcil de desenvolupar i funcioni en qualsevol sistema operatiu, està escrit amb Processament llenguatge:
http://www.processing.org/
El codi font d’aquest programa també està disponible com a codi obert a Google Code:
http://code.google.com/p/dsnavconconsole/
Amb el panell principal (primeres imatges) podem realitzar telemetria mirant a la graella el camí seguit pel robot (tal com s'estima per l'odometria) en un camp de mida configurable i alguns altres valors importants llegits a la pàgina dsNav .
Els indicadors mostren els valors mesurats:
- MesSpeed ​​en un rang de +/- 500 mm / s, el valor mitjà de la velocitat de les dues rodes (la velocitat del centre de la plataforma).
- Corrent mesurat en mA (la suma del corrent dels dos motors).
- Angle mesurat, tal com s'extimeix per odometria.
Altres panells s'utilitzen per configurar els paràmetres del robot i per emmagatzemar al robot un camí definit a seguir (si cal). Un panell important, almenys durant el desenvolupament del robot, és el panell de detalls (segona imatge) que mostra la velocitat de cada roda en temps real, molt útil per al calibratge de tots els paràmetres.
La vista central de la graella es pot canviar amb la vista d’una càmera web per controlar, fins i tot per la vista, el camí que el robot està seguint.
En aquest vídeo es mostra un exemple pràctic d’ús d’aquesta consola:
http://www.youtube.com/watch?v=OPiaMkCJ-r0