INHOUDSOPGAWE:

Rpibot - oor leerrobotika: 9 stappe
Rpibot - oor leerrobotika: 9 stappe

Video: Rpibot - oor leerrobotika: 9 stappe

Video: Rpibot - oor leerrobotika: 9 stappe
Video: Summary of My Robots | Robotics with RPi | 2017 - 2019 2024, Julie
Anonim
Rpibot - Oor die leer van robotika
Rpibot - Oor die leer van robotika

Ek is 'n ingeboude sagteware -ingenieur in 'n Duitse motoronderneming. Ek het hierdie projek begin as 'n leerplatform vir ingebedde stelsels. Die projek is vroeg gekanselleer, maar ek het dit so geniet dat ek in my vrye tyd aangegaan het. Dit is die resultaat …

Ek het die volgende vereistes gestel:

  • Eenvoudige hardeware (fokus is die sagteware)
  • Goedkoop hardeware (ongeveer 100 €)
  • Uitbreidbaar (sommige opsies is reeds deel van die beskrywing)
  • Voedingsspanning vir alle komponente van 'n enkele 5V -bron (powerbank)

Daar was nie regtig 'n doel behalwe om te leer nie. Die platform kan gebruik word vir leer, toesig, robotwedstryde, …

Dit is nie 'n beginner -tutoriaal nie. U benodig basiese kennis oor:

  • Programmering (Python)
  • Basiese elektronika (om modules met die regte spanning aan te sluit)
  • Basiese beheerteorie (PID)

Uiteindelik sal u waarskynlik probleme ondervind soos ek. Met 'n mate van nuuskierigheid en uithouvermoë, gaan u deur die projek en los u die uitdagings op. My kode is so eenvoudig as moontlik en die kritieke kode lyne word kommentaar gegee om wenke te gee.

Die volledige bronkode en lêers is hier beskikbaar:

Benodighede:

Meganika

  • 1x laaghoutbord (A4 -grootte, 4 mm dik)
  • 3x M4 x 80 Skroef en moer
  • 2x ratmotors met sekondêre uitsetas vir encoder. Wiele.
  • 1x gratis wiel

1x Pan- en kantelkamera -montering (opsioneel)

Elektronika

  • 1x Raspberry Pi Zero met kop en kamera
  • 1x PCA 9685 servobesturing
  • 2x Optiese encoderwiel en stroombaan
  • 1x vroulike springdrade
  • 1x USB -kragbank
  • 1x DRV8833 dubbelmotorbestuurder
  • 2x Micro servos SG90 vir kamerapan en kantel (opsioneel)
  • 1x MPU9250 IMU (opsioneel)
  • 1x ultrasoniese afstandsensor HC-SR04 (opsioneel)
  • 1x geperforeerde bord en soldeerdraad, koppe, …

Stap 1: Bou die onderstel

Bou die onderstel
Bou die onderstel
Bou die onderstel
Bou die onderstel
Bou die onderstel
Bou die onderstel

Ek is nie 'n goeie werktuigkundige ontwerper nie. Die doel van die projek is ook om nie te veel tyd in die onderstel te spandeer nie. Ek het in elk geval die volgende vereistes gedefinieer:

  • Goedkoop materiaal
  • Vinnige montering en demontage
  • Uitbreidbaar (bv. Ruimte vir ekstra sensors)
  • Ligte materiale om energie te bespaar vir die elektronika

'N Maklike en goedkoop onderstel kan van laaghout gemaak word. Dit is maklik om te bewerk met 'n fretsaw en 'n handboor. U kan klein houtonderdele plak om die houers vir sensors en motors te skep.

Dink aan die vervanging van defekte komponente of die elektriese ontfouting. Die hoofonderdele moet met skroewe vasgemaak word om vervangbaar te wees. 'N Warm lijmpistool is dalk eenvoudig, maar waarskynlik nie die beste manier om 'n onderstel te bou nie … Ek het baie tyd nodig gehad om na te dink oor 'n maklike konsep om die dele maklik uitmekaar te haal. 3D -drukwerk is 'n goeie alternatief, maar kan redelik duur of tydrowend wees.

Die gratis wiel is uiteindelik baie lig en maklik om te monteer. Die alternatiewe was almal swaar of vol wrywing (ek het 'n paar daarvan probeer voordat ek die finale een gevind het). Ek moes slegs 'n houtafstandhouer sny om die stertvrye wiel gelyk te maak nadat ek die hoofwiele gemonteer het.

Wieleienskappe (vir sagteware berekeninge)

Omtrek: 21, 5 cm Pulse: 20 pulse/omwenteling Resolusie: 1, 075 cm (uiteindelik is 1 pols ongeveer 1 cm, wat maklik is vir sagtewareberekeninge)

Stap 2: Elektronika en bedrading

Elektronika en bedrading
Elektronika en bedrading
Elektronika en bedrading
Elektronika en bedrading
Elektronika en bedrading
Elektronika en bedrading

Die projek gebruik verskillende modules soos op die diagram getoon.

Die Raspberry Pi Zero is die hoofbeheerder. Dit lees die sensors en beheer die motors met 'n PWM -sein. Dit is verbind met 'n afgeleë rekenaar via wifi.

Die DRV8833 is 'n dubbelmotorige H-brug. Dit bied die motors genoeg stroom (wat die Raspberry Pi nie kan doen nie, aangesien die uitsette slegs 'n paar mA kan lewer).

Die optiese encoder lewer elke keer as die lig deur die encoder wiele 'n vierkantige sein gee. Ons sal die HW -onderbrekings van die Raspberry Pi gebruik om die inligting te kry elke keer as die sein verander.

Die pca9695 is 'n servobestuurbord. Dit kommunikeer met 'n I2C -reeksbus. Hierdie bord verskaf die PWM -seine en voedingsspanning wat die servo's beheer vir die kantel en kantel van die nok.

Die MPU9265 is 'n 3-as versnelling, 'n drie-as hoekrotasie spoed en 'n 3-as magnetiese vloed sensor. Ons sal dit hoofsaaklik gebruik om die kompas koers te kry.

Die verskillende modules is almal met 'n jumperdraad verbind. 'N Broodplank werk as 'n versender en verskaf voedingsspannings (5V en 3.3V) en gronde. Die verbindings word almal in die verbindingstabel beskryf (sien aanhangsel). As u 5V aan 'n 3.3V -ingang koppel, sal u chip waarskynlik vernietig word. Wees versigtig en kontroleer al u bedrading twee keer voordat u dit lewer (veral hier moet die encoder in ag geneem word). U moet die hoofspanning op die stuurbord met 'n multimeter meet voordat u al die borde aansluit. Die modules is met nylonskroewe in die onderstel vasgemaak. Ook hier was ek bly om dit reg te stel, maar ook verwyderbaar in geval van fout.

Die enigste soldeerwerk was uiteindelik die motors en die broodbord en kopstukke. Om eerlik te wees, hou ek van die draaddrade, maar dit kan tot 'n los verbinding lei. In sommige situasies kan sommige sagteware -moniterings u ondersteun om die verbindings te ontleed.

Stap 3: Sagteware -infrastruktuur

Sagteware -infrastruktuur
Sagteware -infrastruktuur
Sagteware -infrastruktuur
Sagteware -infrastruktuur

Nadat ons die meganika bereik het, sal ons 'n sagteware -infrastruktuur opstel om gemaklike ontwikkelingstoestande te hê.

Git

Dit is 'n gratis en open source weergawe beheer stelsel. Dit word gebruik om groot projekte as Linux te bestuur, maar kan ook maklik vir klein projekte gebruik word (sien Github en Bitbucket).

Die projekveranderinge kan plaaslik gevolg word en ook na 'n eksterne bediener gestuur word om sagteware met die gemeenskap te deel.

Die belangrikste opdragte wat gebruik word, is:

git -kloon https://github.com/makerobotics/RPIbot.git [Kry die bronkode en git -opset]

git pull origin master [haal die nuutste uit die eksterne bewaarplek]

git status [kry die status van die plaaslike bewaarplek. Is daar lêers verander?] Git log [kry die lys van commits] git add. [voeg alle gewysigde lêers by die stadium om in aanmerking te kom vir die volgende verbintenis] git commit -m "comment for commit" [bring die veranderinge aan die plaaslike bewaarplek] git push oorsprong meester [stoot al die verbintenisse na die eksterne bewaarplek]

Logging

Python bied 'n paar ingeboude logfunksies. Die sagtewarestruktuur moet al die logboekraamwerk definieer voordat met verdere ontwikkeling begin word.

Die logger kan gekonfigureer word om met 'n gedefinieerde formaat in die terminale of in 'n loglêer aan te meld. In ons voorbeeld word die logger opgestel deur die webserver -klas, maar ons kan dit ook op ons eie doen. Hier stel ons slegs die aanmeldvlak op DEBUG:

logger = logging.getLogger (_ naam_)

logger.setLevel (logging. DEBUG)

Meting en plot

Om seine mettertyd te ontleed, is dit die beste om dit in 'n grafiek te teken. Aangesien die Raspberry Pi slegs 'n konsole -terminale het, sal ons die data in 'n semikolon -geskeide csv -lêer opspoor en dit van die eksterne rekenaar afplot.

Die semikolon -geskeide spoorlêer word gegenereer deur ons hoof python -kode en moet opskrifte soos hierdie hê:

tydstempel; 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; cycleTime

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;

Die eerste kolom bevat die tydstempel. Die volgende kolomme is gratis. Die plotskrip word genoem met 'n lys kolomme wat geplot moet word:

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

Die plotskrip is beskikbaar in die gereedskapmap:

Die plotter gebruik mathplotlib in Python. U moet dit na u rekenaar kopieer.

Vir meer gemak word die python -skrip genoem deur 'n bash -script (plot.sh) wat gebruik word om die Raspberry Pi -spoorlêer na die eksterne rekenaar te kopieer en die plotter te bel met 'n seine -keuse. Die bash -script "plot.sh" vra as die lêer gekopieer moet word. Dit was vir my meer gerieflik as om elke keer met die hand te kopieer. "sshpass" word gebruik om die lêer van die Raspberry Pi na die eksterne rekenaar via scp te kopieer. Dit kan 'n lêer kopieer sonder om na die wagwoord te vra (dit word as 'n parameter deurgegee).

Uiteindelik word 'n venster oopgemaak met die plot soos op die foto getoon.

Kommunikasie op afstand

Die ontwikkelingsvlak vir die Raspberry Pi is SSH. Lêers kan direk op die teiken geredigeer word, of deur scp gekopieer word.

Om die robot te beheer, loop 'n webbediener op die Pi, wat beheer bied via Websockets. Hierdie koppelvlak word in die volgende stap beskryf.

Stel die Raspberry Pi op

Daar is 'n lêer wat die opstelling van die Raspberry Pi beskryf in die 'doc' gids van die bronkode (setup_rpi.txt). Daar is nie baie verduidelikings nie, maar baie nuttige opdragte en skakels.

Stap 4: Die gebruikerskoppelvlak

Die gebruikerskoppelvlak
Die gebruikerskoppelvlak

Ons gebruik die liggewig Tornado -webbediener om die gebruikerskoppelvlak aan te bied. Dit is 'n Python -module wat ons noem terwyl ons die robotbeheersagteware begin.

Sagteware -argitektuur

Die gebruikerskoppelvlak is gebou deur die volgende lêers: gui.html [Beskrywing van die webbladkontroles en -uitleg] gui.js [Bevat die javascript -kode om die kontroles te hanteer en 'n websocket -verbinding met ons robot oop te maak] gui.css [Bevat die style van die html -kontroles. Die posisies van die kontroles word hier gedefinieer]

Die websocket -kommunikasie

Die gebruikerskoppelvlak is nie die coolste nie, maar dit doen die werk. Ek het hier gefokus op tegnologieë wat vir my nuut was, soos Websockets.

Die webwerf kommunikeer deur Websockets met die robotwebbediener. Dit is 'n tweerigtingkommunikasiekanaal wat oop sal bly namate die verbinding begin is. Ons stuur die robot se opdragte via Websocket na die Raspberry Pi en kry inligting (spoed, posisie, kamerastroom) terug vir vertoning.

Die koppelvlakuitleg

Die gebruikerskoppelvlak het 'n handmatige invoer vir die opdragte. Dit is aan die begin gebruik om opdragte na die robot te stuur. 'N Merkblokkie skakel die kamerastroom aan en af. Die twee skuifbalkies beheer die kamerapan en kantel. Die regter boonste deel van die gebruikerskoppelvlak beheer die beweging van robotte. U kan die snelheid en doelafstand beheer. Die basiese telemetrie -inligting word in die robottekening vertoon.

Stap 5: Programmering van die robotplatform

Die programmering van die robotplatform
Die programmering van die robotplatform
Die programmering van die robotplatform
Die programmering van die robotplatform
Die programmering van die robotplatform
Die programmering van die robotplatform

Hierdie deel was die hoofdoel van die projek. Ek het baie van die sagteware hersaamgemaak toe ek die nuwe onderstel met die DC -motors bekendgestel het. Ek het Python om verskillende redes as programmeertaal gebruik:

  • Dit is die Raspberry Pi -hooftaal
  • Dit is 'n taal op hoë vlak met baie ingeboude funksies en uitbreidings
  • Dit is objekgeoriënteerd, maar kan ook gebruik word vir opeenvolgende programmering
  • Geen samestelling of gereedskapsketting nodig nie. Wysig die kode en voer dit uit.

Die belangrikste sagteware -argitektuur

Die sagteware is objekgeoriënteerd, verdeel in 'n paar voorwerpe. My idee was om die kode in 3 funksionele blokke te verdeel:

Sin dink Aktiveer

Sin.py

Die verkryging en verwerking van die belangrikste sensor. Die data word in 'n woordeboek gestoor om in die volgende fase gebruik te word.

Beheer.py

'N Aktuerings -subklas beheer die motors en servo's na 'n mate van abstraksie. Die hoofbeheerobjek is die hantering van opdragte op hoë vlak en ook die stuuralgoritmes (PID) vir die motor.

rpibot.py

Hierdie hoofdoel is om die Tornado -webbediener te bestuur en die sin- en beheerklasse in afsonderlike drade te installeer.

Elke module kan alleen of as deel van die hele projek uitgevoer word. U kan slegs die sensorinligting aanvoel en afdruk om seker te maak dat sensors korrek gekoppel is en die regte inligting verskaf.

Die PID -beheer

Die eerste taak is om uit te vind wat ons wil beheer. Ek het begin deur die posisie te probeer beheer, wat baie kompleks was en nie veel gehelp het nie.

Ten slotte wil ons elke wielsnelheid en ook die robotrigting beheer. Om dit te kan doen, moet ons twee kontrolelogika onderbreek.

Om die kompleksiteit stap vir stap te verhoog, moet die robot beheer word:

oop lus (met konstante krag)

pwm = K

voeg dan die sluitlus -algoritme by

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

en voeg uiteindelik die rigtingbeheer by as 'n laaste stap.

Vir die spoedbeheer gebruik ek 'n "PI" -regelaar en "P" slegs vir die gaffel. Ek stel die parameters handmatig deur te eksperimenteer. Waarskynlik kan baie beter parameters hier gebruik word. My doelwit was net 'n reguit lyn en ek het dit amper bereik. Ek het 'n koppelvlak in die sagteware geskep om 'n paar veranderlikes deur die gebruikerskoppelvlak te skryf. Om die parameter Kp op 1.0 te stel, benodig die volgende opdrag in die gebruikerskoppelvlak:

SET; Kp; 1.0

Ek kan die P -parameter net laag genoeg stel om enige oorskot te vermy. Die oorblywende fout word reggestel deur die I -parameter (geïntegreerde fout)

Dit was vir my moeilik om uit te vind hoe ek albei kontroles moet onderbreek. Die oplossing is eenvoudig, maar ek het al baie ander maniere probeer … So uiteindelik het ek die spoeddoel van die wiele verander om in die een of ander rigting te draai. Dit was 'n fout om die uitset van die snelheidsbeheer direk te verander, aangesien die snelheidsbeheer hierdie versteuring probeer verwyder het.

Die gebruikte kontrolediagram is aangeheg. Dit wys slegs die linkerkant van die robotbeheer.

Stap 6: Die sensor kalibrasies

Die sensor kalibrasies
Die sensor kalibrasies
Die sensor kalibrasies
Die sensor kalibrasies
Die sensor kalibrasies
Die sensor kalibrasies

Die eerste ding wat u moet oorweeg, is dat die hele IMU behoorlik moet werk. Ek het 3 dele bestel en teruggestuur totdat ek 'n volledige werkende sensor gehad het. Elke vorige sensor het 'n paar dele van die sensor wat nie behoorlik werk nie of glad nie. Ek het 'n paar voorbeeldskrifte gebruik om die basiese beginsels te toets voordat dit in die robot gemonteer is.

Die IMU -sensorsignale moet gekalibreer word voordat dit gebruik word. Sommige sensors seine hang af van die monteerhoek en posisie.

Die kalibrasies van die versnelling en rotasie spoed

Die maklikste kalibrasie is vir die langsversnelling (A_x). By stilstand behoort daar ongeveer 0 m/s² te wees. As u die sensor behoorlik draai, kan u die swaartekrag meet (ongeveer 9, 8 m/s²). Om a_x te kalibreer, moet u dit net behoorlik monteer en dan die offset definieer om 0 m/s² stil te staan. Nou is A_x gekalibreer. U kan die offsets vir die rotasiesnelhede op 'n soortgelyke manier by stilstand kry.

Die magnetometer kalibrasie vir die kompas

'N Meer komplekse kalibrasie is nodig vir die magnetiese veldsensors. Ons sal m_x en m_y gebruik om die magnetiese veld in die horisontale vlak te kry. Met m_x en m_y sal ons die geleentheid kry om 'n kompasopskrif te bereken.

Vir ons eenvoudige doel sal ons slegs die harde ysterafwyking kalibreer. Dit moet uitgevoer word aangesien die sensor in die finale posisie is, aangesien dit afhang van magnetiese veldstoornisse.

Ons teken m_x en m_y aan terwyl ons die robot om die z-as draai. Ons teken die m_x vs m_y in 'n XY -grafiek. Die gevolg is 'n ellips soos op die foto getoon. Die ellips moet op die oorsprong gesentreer word. Hier kyk ons na die maksimum en minimum waardes van m_x en m_y om die offset in beide rigtings te kry. Uiteindelik kyk ons na die kalibrasie en sien dat die ellips nou gesentreer is.

Kalibrasie van sagte yster sou beteken dat ons die prentjie van 'n ellips na 'n sirkel verander. Dit kan gemaak word deur 'n faktor op elke senorwaarde toe te voeg.

'N Toetsroetine kan nou gekodeer word om weer te kalibreer, of om ten minste te kontroleer of die sensors nog gekalibreer is.

Die kompas koers

Die magnetometer -data sal nou gebruik word om die kompasopskrif te bereken. Hiervoor moet ons die m_x en m_y seine in 'n hoek omskakel. Python bied direk die math.atan2 -funksie wat hierdie doel het. Die volledige berekening word gedefinieer in die mpu9250_i2c.py -lêer ("calcHeading (mx, my, mz)").

Stap 7: Alternatiewe ontwerpe

Alternatiewe ontwerpe
Alternatiewe ontwerpe
Alternatiewe ontwerpe
Alternatiewe ontwerpe
Alternatiewe ontwerpe
Alternatiewe ontwerpe

Die projek het baie tyd geneem, aangesien die ontwerp heeltemal oop was. Vir elke komponent het ek 'n prototipe -implementering gemaak en die perke van die stelsel ervaar.

Die mees komplekse onderwerp was die wielkodeerder. Ek het 3 verskillende opsies getoets voordat ek die optiese encoder wat tans gebruik word, gevind het. Ek dink dat die afgebroke oplossings ook baie interessant is in so 'n projek. Dit gaan oor die dele waar ek die meeste geleer het.

Deurlopende rotasieservo gekoppel aan pca 9695

Om 'n ekstra H-brug vir 'n GS-motor te vermy, begin ek eers met deurlopende rotasieservo's. Dit is aangedryf deur die reeds bestaande pca 9695 servobestuurder. Alle aandrywingstegnieke en die korrespondentelektronika was baie eenvoudiger. Hierdie ontwerp het twee nadele:

  • Die swak bedieningsreeks van die servo's.
  • Die ontbrekende plek vir die enkodeerder

Die servo's begin met 50% pwm beweeg en het 'n volspoed van ongeveer 55%. Dit is 'n baie swak beheer reeks.

Sonder 'n encoder -houer, was dit baie moeilik om 'n gereed -vir -encoder te vind. Ek het 3 verskillende reflektansie -enkodeerders getoets wat op die onderstel gemonteer is. Ek het 'n selfgemaakte encoder -wiel aan die buitekant van die wiel vasgemaak met swart en wit gedeeltes. Ek het die QTR-1RC-sensors gebruik wat baie seinverwerking benodig om die regte sein te kry. Die Raspberry Pi kon nie hierdie soort real -time verwerking uitvoer nie. Daarom het ek besluit om 'n NodeMCU D1 mini as 'n intydse beheerder by die robot te voeg. Dit is deur die seriële UART aan die framboos Pi gekoppel om die verwerkte sensordata te lewer. Die NodeMCU was ook besig om die HC-SR04-sensor te bestuur. Die meganika was moeilik en nie baie robuust nie, die reekslyn het geraas gekry van die I2C-lyn en die motors, so uiteindelik het ek die tweede weergawe van die onderstel gebou met eenvoudige ratkas-dieselmotors. 'n H-brug. Hierdie motors het 'n sekondêre uitsetas om 'n optiese encoder te plaas.

Stap 8: Beeldverwerking

Beeldverwerking
Beeldverwerking
Beeldverwerking
Beeldverwerking
Beeldverwerking
Beeldverwerking
Beeldverwerking
Beeldverwerking

Om die outonome bestuur te verbeter, kan ons beeldverwerking doen.

Die opencv -biblioteek is 'n verwysing daarvoor. Dit kan deur Python gebruik word om hindernisopsporing vinnig te implementeer.

Ons neem 'n beeld en pas 'n paar beeldverwerkingstake toe:

Eerste toetse is gedoen met Canny en Sobel transformasies. Canny kan 'n goeie kandidaat wees, maar is nie verstandig genoeg nie. Sobel is te verstandig (te veel voorwerpe word opgespoor).

Uiteindelik het ek my eie filter gemaak om al die horisontale en vertikale gradiënte (meubels op te spoor) te meng:

  • Omskep die kleurbeeld na 'n grysvlakbeeld
  • Maak die beeld vervaag om klein geraas te verwyder
  • Beperk die beeld tot 'n swart en wit beeld
  • Nou bespeur ons horisontale en vertikale hellingen om voorwerpe as mure en meubels op te spoor
  • Ons filter slegs die groot oorblywende kontoere (sien gekleurde kontoere in die prentjie)

Nou kan ons hierdie nuwe inligting gebruik om hindernisse op te spoor …

Stap 9: Volgende stappe …

Volgende stappe…
Volgende stappe…
Volgende stappe…
Volgende stappe…

Nou het ons 'n eenvoudige robotplatform met sensors, aandrywers en 'n kamera. My doel is om outonoom te beweeg en terug te gaan na die stasie sonder om verdere sensors by te voeg. Hiervoor benodig ek die volgende stappe:

  • Sensorversmelting van gierige en magnetiese opskrifseine
  • Kamerabeeldverwerking (slegs 'n lae SVE beskikbaar)
  • Botsingsopsporing (ultrasoniese afstand en kamera)
  • Kaartbou of oriëntasie

Skep nou u eie uitdagings of teikens …

Aanbeveel: