Taula de continguts:

Rpibot - Sobre l'aprenentatge de la robòtica: 9 passos
Rpibot - Sobre l'aprenentatge de la robòtica: 9 passos

Vídeo: Rpibot - Sobre l'aprenentatge de la robòtica: 9 passos

Vídeo: Rpibot - Sobre l'aprenentatge de la robòtica: 9 passos
Vídeo: What is Robotics Engineering? Scope of Robotics Engineering | Everything you need to know 😀😀😀 2024, De novembre
Anonim
Rpibot - Quant a l'aprenentatge de robòtica
Rpibot - Quant a l'aprenentatge de robòtica

Sóc enginyer de programari incrustat en una empresa d'automoció alemanya. Vaig començar aquest projecte com una plataforma d’aprenentatge per a sistemes incrustats. El projecte es va cancel·lar aviat, però em va agradar tant que vaig continuar en el meu temps lliure. Aquest és el resultat …

Tenia els requisits següents:

  • Maquinari senzill (el focus és el programari)
  • Maquinari barat (uns 100 €)
  • Ampliable (algunes opcions ja formen part de la descripció)
  • Tensió d'alimentació per a tots els components d'una única font de 5V (powerbank)

Realment no hi havia cap objectiu a part d’aprendre. La plataforma es pot utilitzar per a aprenentatge, vigilància, concursos de robòtica, …

No és un tutorial per a principiants. Necessiteu alguns coneixements bàsics sobre:

  • Programació (Python)
  • Electrònica bàsica (per connectar mòduls entre si mitjançant la tensió correcta)
  • Teoria bàsica del control (PID)

Finalment, probablement tindreu problemes com jo. Amb certa curiositat i resistència, passareu pel projecte i resoldreu els reptes. El meu codi és el més senzill possible i es comenten les línies de codi crítiques per donar-los suggeriments.

El codi font i els fitxers complets estan disponibles aquí:

Subministraments:

Mecànica

  • 1x tauler contraxapat (mida A4, 4 mm de gruix)
  • 3x M4 x 80 Cargol i rosca
  • 2x motors d'engranatges amb eix de sortida secundari per al codificador. Rodes.
  • 1x roda lliure

1x muntatge de càmera panoràmica i inclinable (opcional)

Electrònica

  • 1x Raspberry Pi Zero amb capçalera i càmera
  • 1 servo control de PCA 9685
  • 2x roda i circuit de codificador òptic
  • 1x cables de pont femení
  • 1x banc de potència USB
  • 1 controlador de doble motor DRV8833
  • 2 micro servos SG90 per a panoràmica i inclinació de la càmera (opcional)
  • 1x MPU9250 IMU (opcional)
  • 1x sensor de distància ultrasònic HC-SR04 (opcional)
  • 1x tauler perforat i filferro de soldadura, capçaleres, …

Pas 1: creeu el xassís

Construeix el xassís
Construeix el xassís
Construeix el xassís
Construeix el xassís
Construeix el xassís
Construeix el xassís

No sóc un bon dissenyador mecànic. A més, l'objectiu del projecte no és passar massa temps al xassís. De tota manera, he definit els requisits següents:

  • Materials barats
  • Muntatge i desmuntatge ràpid
  • Ampliable (per exemple, espai per a sensors afegits)
  • Materials lleugers per estalviar energia per a l'electrònica

Un xassís fàcil i barat es pot fer de fusta contraxapada. És fàcil de mecanitzar amb una serra de serrar i una broca manual. Podeu enganxar petites peces de fusta per crear els suports per a sensors i motors.

Penseu en la substitució de components defectuosos o la depuració elèctrica. Les peces principals s’han de fixar mitjançant cargols per substituir-les. Una pistola de cola calenta pot ser senzilla, però probablement no sigui la millor manera de construir un xassís … Necessitava molt de temps per pensar en un concepte fàcil per desmuntar les peces fàcilment. La impressió 3D és una bona alternativa, però pot costar bastant o requereix molt de temps.

La roda lliure és per fi molt lleugera i fàcil de muntar. Les alternatives eren totes pesades o plenes de fricció (en vaig provar un parell abans de trobar-ne l’última). Només vaig haver de tallar un separador de fusta per anivellar la roda lliure de la cua després de muntar les rodes principals.

Propietats de la roda (per a càlculs de programari)

Circumferència: 21, 5 cm Impulsos: 20 polsos / revolució Resolució: 1, 075 cm (finalment 1 pols fa aproximadament 1 cm, cosa que és fàcil per als càlculs de programari)

Pas 2: electrònica i cablejat

Electrònica i cablejat
Electrònica i cablejat
Electrònica i cablejat
Electrònica i cablejat
Electrònica i cablejat
Electrònica i cablejat

El projecte utilitza diferents mòduls com es mostra al diagrama.

El Raspberry Pi Zero és el controlador principal. És llegir els sensors i controlar els motors mitjançant un senyal PWM. Està connectat a un PC remot per wifi.

El DRV8833 és un pont H de doble motor. Proporciona el corrent suficient als motors (cosa que el Raspberry Pi no pot fer, ja que les sortides només poden lliurar una mica de mA).

El codificador òptic proporciona un senyal de forma quadrada cada vegada que la llum passa per les rodes del codificador. Utilitzarem les interrupcions HW del Raspberry Pi per obtenir la informació cada vegada que es commuta el senyal.

El pca9695 és una placa de servo control. Es comunica mitjançant un bus sèrie I2C. Aquesta placa proporciona els senyals PWM i la tensió d’alimentació que controlen els servos per a la panoràmica i la inclinació de la lleva.

El MPU9265 és un accelerador de 3 eixos, una velocitat de rotació angular de 3 eixos i un sensor de flux magnètic de 3 eixos. L’utilitzarem principalment per dirigir la brúixola.

Els diferents mòduls es connecten tots junts mitjançant un cable de pont. Una taula de treball actua com a distribuïdor i proporciona tensions d’alimentació (5V i 3,3V) i sòls. Totes les connexions es descriuen a la taula de connexions (vegeu l’adjunt). Si connecteu 5V a una entrada de 3,3V, probablement destruireu el vostre xip. Tingueu cura i comproveu tot el cablejat dues vegades abans de subministrar-lo (aquí cal tenir en compte especialment el codificador). Abans de connectar totes les plaques, heu de mesurar les tensions d’alimentació principals a la placa d’enviament amb un multímetre. Els mòduls es fixaven mitjançant cargols de niló al xassís. Aquí també vaig estar encantat de tenir-los solucionats, però també extraïbles en cas de mal funcionament.

L'única soldadura va ser finalment els motors, la taula de tall i les capçaleres. Per ser sincer, m'agraden els cables del pont, però poden provocar una connexió fluixa. En algunes situacions, algunes monitoritzacions de programari us poden ajudar a analitzar les connexions.

Pas 3: Infraestructura de programari

Infraestructura de programari
Infraestructura de programari
Infraestructura de programari
Infraestructura de programari

Després d’aconseguir la mecànica, crearem algunes infraestructures de programari per tenir unes condicions de desenvolupament còmodes.

Git

Es tracta d’un sistema de control de versions de codi obert i gratuït. S'utilitza per gestionar projectes grans com Linux, però també es pot utilitzar fàcilment per a projectes petits (vegeu Github i Bitbucket).

Els canvis del projecte es poden fer un seguiment local i també enviar-los a un servidor remot per compartir programari amb la comunitat.

Les principals ordres utilitzades són:

git clone https://github.com/makerobotics/RPIbot.git [Obteniu el codi font i la configuració de git]

git pull origin master [obtingueu les últimes novetats del dipòsit remot]

git status [obtenir l’estat del dipòsit local. Hi ha algun fitxer canviat?] Registre de git [obtenir la llista de confirmacions] git add. [afegiu tots els fitxers canviats a l'etapa per considerar-los per al següent commit] git commit -m "comentari per a commit" [confirmar els canvis al repositori local] git push origin master [empenta tots els commit al dipòsit remot]

Registre

Python proporciona algunes funcions de registre incorporades. L’estructura del programari hauria de definir ja tot el marc de registre abans d’iniciar el desenvolupament.

El registrador es pot configurar per registrar-se amb un format definit al terminal o en un fitxer de registre. En el nostre exemple, el registrador està configurat per la classe de servidor web, però també ho podríem fer tot sol. Aquí només establim el nivell de registre a DEBUG:

logger = logging.getLogger (_ nom_)

logger.setLevel (logging. DEBUG)

Mesura i traçat

Per analitzar els senyals al llarg del temps, el millor és representar-los en un gràfic. Com que el Raspberry Pi només té un terminal de consola, traçarem les dades en un fitxer CSV separat de punt i coma i les traçarem des del PC remot.

El fitxer de traça separat per punt i coma és generat pel nostre codi principal de python i ha de tenir capçaleres com aquesta:

marca de temps; 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; cycleTimeSense;

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;

La primera columna conté la marca de temps. Les columnes següents són gratuïtes. L'escript de traçat s'anomena amb una llista de columnes a traçar:

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

L'escript de trama està disponible a la carpeta d'eines:

El traçador utilitza mathplotlib a Python. Heu de copiar-lo al vostre PC.

Per a més comoditat, l’escriptura python s’anomena mitjançant un script bash (plot.sh) que s’utilitza per copiar el fitxer de traça Raspberry Pi al PC remot i trucar al plotter amb una selecció de senyal. si s'ha de copiar l'arxiu. Això em resultava més convenient en lloc de copiar manualment cada vegada. "sshpass" s'utilitza per copiar el fitxer del Raspberry Pi al PC remot mitjançant scp. És capaç de copiar un fitxer sense demanar la contrasenya (es passa com a paràmetre).

Finalment s'obre una finestra amb la trama tal com es mostra a la imatge.

Comunicació remota

La interfície de desenvolupament del Raspberry Pi és SSH. Els fitxers es poden editar directament a la destinació o copiar-los mitjançant scp.

Per controlar el robot, al servidor Pi s’executa un servidor web que proporciona control a través de Websockets. Aquesta interfície es descriu al següent pas.

Configureu el Raspberry Pi

Hi ha un fitxer que descriu la configuració del Raspberry Pi a la carpeta "doc" del codi font (setup_rpi.txt). No hi ha moltes explicacions, sinó moltes ordres i enllaços útils.

Pas 4: la interfície d'usuari

La interfície d'usuari
La interfície d'usuari

Utilitzem el servidor web lleuger Tornado per allotjar la interfície d’usuari. Es tracta d’un mòdul Python al que anomenem quan iniciem el programari de control del robot.

Arquitectura de programari

La interfície d'usuari es crea mitjançant els fitxers següents: gui.html [Descripció dels controls i disseny de les pàgines web] gui.js [Conté el codi javascript per gestionar els controls i obrir una connexió de websocket al nostre robot] gui.css [Conté els estils de els controls html. Les posicions dels controls es defineixen aquí]

La comunicació de websocket

La interfície d’usuari no és la més interessant, però està fent la feina. Em vaig centrar aquí en tecnologies que per a mi eren noves, com Websockets.

El lloc web es comunica amb el servidor web del robot mitjançant Websockets. Es tracta d’un canal de comunicació bidireccional que romandrà obert quan s’iniciï la connexió. Enviem les ordres del robot mitjançant Websocket al Raspberry Pi i obtenim informació (velocitat, posició, flux de càmera) per mostrar-la.

El disseny de la interfície

La interfície d'usuari té una entrada manual per a les ordres. Es va utilitzar al principi per enviar ordres al robot. Una casella de selecció està activant i desactivant el flux de la càmera. Els dos control lliscants controlen la panoràmica i la inclinació de la càmera. La part superior dreta de la interfície d’usuari controla el moviment dels robots. Podeu controlar la velocitat i la distància objectiu. La informació bàsica de telemetria es mostra al dibuix del robot.

Pas 5: programació de la plataforma de robots

Programació de la plataforma de robots
Programació de la plataforma de robots
Programació de la plataforma de robots
Programació de la plataforma de robots
Programació de la plataforma de robots
Programació de la plataforma de robots

Aquesta part era l’objectiu principal del projecte. Vaig reformar una gran part del programari quan vaig introduir el nou xassís amb els motors de corrent continu i vaig utilitzar Python com a llenguatge de programació per diferents motius:

  • És el llenguatge principal de Raspberry Pi
  • És un llenguatge d'alt nivell amb moltes funcions i extensions integrades
  • Està orientat a objectes però també es pot utilitzar per a programacions seqüencials
  • No cal cap recopilació ni cadena d'eines. Editeu el codi i executeu-lo.

Arquitectura principal de programari

El programari està orientat a objectes, dividit en pocs objectes. La meva idea era dividir el codi en 3 blocs funcionals:

Sense Think Actuate

Sense.py

Adquisició i processament del sensor principal. Les dades s’emmagatzemen en un diccionari per utilitzar-les en la següent etapa.

Control.py

Una subclasse d’actuació controla els motors i servos després d’alguna abstracció. L’objecte principal de control maneja les ordres d’alt nivell i també els algoritmes de control (PID) del motor.

rpibot.py

Aquest objecte principal és gestionar el servidor web Tornado i crear una instància de les classes de control i sentit en fils separats.

Cada mòdul es pot executar sol o com a part de tot el projecte. Només podeu detectar i imprimir la informació del sensor per comprovar que els sensors estan connectats correctament i proporcionar la informació adequada.

El control PID

La primera tasca és esbrinar què volem controlar. Vaig començar intentant controlar la posició, que era molt complexa i no ajudava molt.

Finalment, volem controlar la velocitat de cada roda i també la direcció del robot. Per fer-ho hem de posar en cascada dues lògiques de control.

Per augmentar la complexitat pas a pas, s’ha de controlar el robot:

bucle obert (amb una potència constant)

pwm = K

a continuació, afegiu l'algorisme de bucle tancat

pwm = Kp.speedError + Ki. Integration (speedError)

i, finalment, afegiu el control de direcció com a últim pas.

Per al control de velocitat he utilitzat un control "PI" i "P" només per al desviament. He configurat manualment els paràmetres experimentant. Probablement es podrien utilitzar paràmetres molt millors aquí. El meu objectiu era només una línia recta i gairebé ho aconseguia. Vaig crear una interfície al programari per escriure algunes variables per la interfície d'usuari. Definir el paràmetre Kp a 1.0 necessita l'ordre següent a la interfície d'usuari:

SET; Kp; 1.0

Podria establir el paràmetre P prou baix com per evitar qualsevol sobrepassament. L'error restant es corregeix amb el paràmetre I (error integrat)

Em va costar esbrinar com posar en cascada els dos controls. La solució és senzilla, però abans he provat moltes altres maneres … Finalment, he canviat l'objectiu de velocitat de les rodes per girar en una o l'altra direcció. Canviar directament la sortida del control de velocitat va ser un error, ja que el control de velocitat intentava eliminar aquesta pertorbació.

S'adjunta el diagrama de control utilitzat. Només mostra el costat esquerre del control del robot.

Pas 6: les calibracions del sensor

Calibracions del sensor
Calibracions del sensor
Calibracions del sensor
Calibracions del sensor
Calibracions del sensor
Calibracions del sensor

El primer que cal tenir en compte és que tota la IMU ha de funcionar correctament. He demanat 3 peces i les he tornat fins que he tingut un sensor de funcionament complet. Cada sensor anterior tenia algunes parts del sensor que no funcionaven correctament o en absolut. Vaig utilitzar alguns exemples de scripts per provar els conceptes bàsics abans de muntar-lo al robot.

Cal calibrar els senyals del sensor IMU abans d’utilitzar-lo. Alguns senyals del sensor depenen de l'angle i la posició de muntatge.

Calibració de la velocitat d’acceleració i rotació

El calibratge més senzill és per a l’acceleració longitudinal (A_x). A la parada hauria d’haver-hi uns 0 m / s². Si gireu el sensor correctament, podeu mesurar la gravetat (al voltant de 9, 8 m / s²). Per calibrar a_x, només heu de muntar-lo correctament i definir el desplaçament per obtenir 0 m / s² aturat. Ara A_x està calibrat. Podeu obtenir els desplaçaments de les velocitats de rotació d’una manera similar a la parada.

El calibratge del magnetòmetre per a la brúixola

Cal un calibratge més complex per als sensors de camp magnètic. Utilitzarem m_x i m_y per obtenir el camp magnètic en el nivell horitzontal. Tenir m_x i m_y ens donarà l’oportunitat de calcular un encapçalament de brúixola.

Per al nostre propòsit senzill, només calibrarem la desviació del ferro dur. Això s’ha de realitzar ja que el sensor es troba en la posició final, ja que depèn de les pertorbacions del camp magnètic.

Gravem m_x i m_y mentre girem el robot al voltant de l’eix z. Representem els m_x vs m_y en un gràfic XY. El resultat en una el·lipsi com es mostra a la imatge. L'el·lipsi s'ha de centrar a l'origen. Aquí considerem els valors màxim i mínim de m_x i m_y per obtenir els desplaçaments en ambdues direccions. Finalment comprovem el calibratge i veiem que l’el·lipsi ja està centrada.

Un calibratge suau del ferro significaria que canviem la imatge d’una el·lipsi a un cercle. Això es pot fer afegint un factor a cada valor de senor.

Ara es pot codificar una rutina de proves per tornar a calibrar o, si més no, per comprovar que els sensors encara estan calibrats.

L'encapçalament de la brúixola

Les dades del magnetòmetre s’utilitzaran ara per calcular l’encapçalament de la brúixola. Per a això, hem de convertir els senyals m_x i m_y en un angle. Python proporciona directament la funció math.atan2 que té aquest objectiu. El càlcul complet es defineix al fitxer mpu9250_i2c.py ("calcHeading (mx, my, mz)").

Pas 7: dissenys alternatius

Dissenys alternatius
Dissenys alternatius
Dissenys alternatius
Dissenys alternatius
Dissenys alternatius
Dissenys alternatius

El projecte va trigar molt de temps, ja que el disseny estava completament obert. Per a cada component vaig fer una implementació de prototips i vaig experimentar els límits del sistema.

El tema més complex era el codificador de rodes. He provat 3 opcions diferents abans de trobar el codificador òptic que s’utilitza actualment. Crec que les solucions avortades també són molt interessants en aquest projecte. Es tracta de les parts on vaig aprendre més.

Servo de rotació contínua connectat a pca 9695

Per evitar un pont H addicional per a un motor de corrent continu, primer vaig començar amb servos de rotació contínua. Aquests eren conduïts pel servo controlador pca 9695 ja present. Totes les mecàniques de propulsió i l'electrònica corresponent eren molt més senzilles. Aquest disseny tenia dos inconvenients:

  • L'abast de control dels servos.
  • El codificador que no conserva la ubicació

Els servos comencen a moure’s amb un 50% de pwm i tenen una velocitat màxima aproximada del 55%. Es tracta d’un rang de control molt pobre.

Sense mantenir un codificador, era molt difícil trobar un codificador a punt. He provat 3 codificadors de reflectància diferents que es van muntar al xassís. Vaig gravar una roda de codificador de fabricació pròpia a la part exterior de la roda amb seccions en blanc i negre. He utilitzat els sensors QTR-1RC que necessiten molt processament de senyal per obtenir el senyal correcte. El Raspberry Pi no va poder realitzar aquest tipus de processament en temps real. Així que vaig decidir afegir un NodeMCU D1 mini com a controlador en temps real al robot. Es va connectar al raspberry Pi mitjançant la sèrie UART per lliurar les dades del sensor processades. El NodeMCU també gestionava el sensor HC-SR04. La mecànica era difícil i poc robusta, la línia sèrie rebia sorolls de la línia I2C i dels motors, així que finalment vaig construir la segona versió del xassís amb motors de corrent continu senzills. un pont en H. Aquests motors tenen un eix de sortida secundari per col·locar un codificador òptic.

Pas 8: processament d'imatges

Processament d'imatge
Processament d'imatge
Processament d'imatge
Processament d'imatge
Processament d'imatge
Processament d'imatge
Processament d'imatge
Processament d'imatge

Per millorar la conducció autònoma, podem fer un tractament de la imatge.

La biblioteca opencv és una referència per a això. Pot ser utilitzat per Python per implementar ràpidament la detecció d'obstacles.

Capturem una imatge i apliquem algunes tasques de processament d'imatges:

Les primeres proves es van fer amb transformacions de Canny i Sobel. Canny pot ser un bon candidat però no és prou assenyat. Sobel és massa assenyat (es detecten massa objectes).

Finalment he creat el meu propi filtre per barrejar tots els gradients horitzontals i verticals (detectar mobles):

  • Transformeu la imatge en color a una imatge de nivell de grisos
  • Difuminar la imatge per eliminar el soroll petit
  • Llindar la imatge a una imatge en blanc i negre
  • Ara detectem gradients horitzontals i verticals per detectar objectes com a parets i mobles
  • Filtrem només els grans contorns restants (vegeu els contorns de colors a la imatge)

Ara podem utilitzar aquesta nova informació per detectar obstacles …

Pas 9: passos següents …

Propers passos…
Propers passos…
Propers passos…
Propers passos…

Ara tenim una plataforma robot senzilla amb sensors, actuadors i una càmera. El meu objectiu és moure’m de forma autònoma i tornar a l’estació sense afegir cap sensor. Per a això necessitaré els passos següents:

  • Fusió del sensor de senyals de desviament i encapçalament magnètic
  • Processament d'imatges de càmera (només hi ha una CPU baixa disponible per a això)
  • Detecció de col·lisions (distància ultrasònica i càmera)
  • Construcció o orientació de mapes

Ara aneu a crear els vostres propis reptes o objectius …

Recomanat: