Indholdsfortegnelse:

Rpibot - Om læringsrobotik: 9 trin
Rpibot - Om læringsrobotik: 9 trin

Video: Rpibot - Om læringsrobotik: 9 trin

Video: Rpibot - Om læringsrobotik: 9 trin
Video: Rpi Bot 2024, Juli
Anonim
Rpibot - Om læringsrobotik
Rpibot - Om læringsrobotik

Jeg er en integreret softwareingeniør i et tysk bilfirma. Jeg startede dette projekt som en læringsplatform for integrerede systemer. Projektet blev aflyst tidligt, men jeg nød det så meget, at jeg fortsatte i min fritid. Dette er resultatet…

Jeg havde følgende krav:

  • Enkel hardware (fokus er softwaren)
  • Billig hardware (ca. 100 €)
  • Kan udvides (nogle muligheder er allerede en del af beskrivelsen)
  • Forsyningsspænding til alle komponenter fra en enkelt 5V kilde (powerbank)

Der var egentlig ikke et mål bortset fra læring. Platformen kan bruges til læring, overvågning, robotkonkurrencer, …

Det er ikke en begynderundervisning. Du har brug for noget grundlæggende viden om:

  • Programmering (Python)
  • Grundlæggende elektronik (til at forbinde moduler sammen med den rigtige spænding)
  • Grundlæggende kontrolteori (PID)

Endelig vil du sandsynligvis stå over for problemer, som jeg gjorde. Med en vis nysgerrighed og udholdenhed vil du gå igennem projektet og løse udfordringerne. Min kode er så enkel som muligt, og de kritiske kodelinjer kommenteres for at give tip.

Den komplette kildekode og filer er tilgængelige her:

Tilbehør:

Mekanik

  • 1x krydsfinerplade (A4 -størrelse, 4 mm tyk)
  • 3x M4 x 80 Skrue og møtrik
  • 2x gearmotorer med sekundær udgangsaksel til encoder. Hjul.
  • 1x gratis hjul

1x Pan og tilt kamera montering (valgfrit)

Elektronik

  • 1x Raspberry Pi Zero med header og kamera
  • 1x PCA 9685 servostyring
  • 2x Optisk encoderhjul og kredsløb
  • 1x kvindelige jumper ledninger
  • 1x USB powerbank
  • 1x DRV8833 dobbeltmotor driver
  • 2x Micro servoer SG90 til kamerapanel og vippe (valgfrit)
  • 1x MPU9250 IMU (valgfrit)
  • 1x ultralydsafstandssensor HC-SR04 (valgfri)
  • 1x perforeret plade og lodningstråd, overskrifter, …

Trin 1: Byg chassiset

Byg chassiset
Byg chassiset
Byg chassiset
Byg chassiset
Byg chassiset
Byg chassiset

Jeg er ikke en god mekaniker. Projektets mål er ikke at bruge for meget tid i chassiset. Under alle omstændigheder definerede jeg følgende krav:

  • Billige materialer
  • Hurtig montering og demontering
  • Kan udvides (f.eks. Plads til ekstra sensorer)
  • Lette materialer for at spare energi til elektronikken

Et let og billigt chassis kan laves af krydsfiner. Det er let at bearbejde med en fretsaw og en håndboremaskine. Du kan lime små trædele til at skabe holdninger til sensorer og motorer.

Tænk på udskiftning af defekte komponenter eller elektrisk fejlfinding. Hoveddelene skal fastgøres med skruer, så de kan udskiftes. En varm limpistol er måske enkel, men sandsynligvis ikke den bedste måde at bygge et chassis på … Jeg havde brug for meget tid til at tænke over et let koncept for let at adskille delene. 3D -print er et godt alternativ, men kan være ret dyrt eller tidskrævende.

Det frie hjul er endelig meget let og let at montere. Alternativene var alle tunge eller fulde af friktion (jeg prøvede et par af dem, før jeg fandt det sidste). Jeg måtte kun skære et træafstandsstykke for at udjævne det halefrie hjul efter montering af hovedhjulene.

Hjulegenskaber (til softwareberegninger)

Omkreds: 21, 5 cmPulser: 20 pulser/omdrejningstal Opløsning: 1, 075 cm (endelig er 1 puls cirka 1 cm, hvilket er let til softwareberegninger)

Trin 2: Elektronik og ledninger

Elektronik og ledninger
Elektronik og ledninger
Elektronik og ledninger
Elektronik og ledninger
Elektronik og ledninger
Elektronik og ledninger

Projektet bruger forskellige moduler som vist på diagrammet.

Raspberry Pi Zero er hovedcontrolleren. Det læser sensorerne og styrer motorerne med et PWM -signal. Den er forbundet til en fjern -pc via wifi.

DRV8833 er en dobbeltmotor H-bro. Det leverer tilstrækkelig strøm til motorerne (hvilket Raspberry Pi ikke kan gøre, da output kun kan levere noget mA).

Den optiske encoder leverer et firkantet signal hver gang lyset går gennem encoderhjulene. Vi vil bruge HW -afbrydelser af Raspberry Pi til at få informationen hver gang signalet skifter.

Pca9695 er et servokontrolkort. Den kommunikerer med en I2C seriel bus. Dette kort leverer PWM -signaler og forsyningsspænding, der styrer servoerne til panorering og vippe af knasten.

MPU9265 er en 3-akset acceleration, 3-akset vinkelrotationshastighed og 3-akset magnetisk fluxsensor. Vi vil hovedsageligt bruge det til at få kompasset på vej.

De forskellige moduler er alle forbundet med jumper wire. Et brødbræt fungerer som en sender og leverer forsyningsspændinger (5V og 3.3V) og jord. Forbindelserne er alle beskrevet i tilslutningstabellen (se vedhæftet fil). Tilslutning af 5V til en 3.3V indgang vil sandsynligvis ødelægge din chip. Vær forsigtig og tjek alle dine ledninger to gange før levering (her skal specielt encoderen tages i betragtning). Du bør måle hovedforsyningsspændingerne på forsendelseskortet med et multimeter, før du tilslutter alle kortene. Modulerne blev fastgjort med nylonskruer i chassiset. Også her var jeg glad for at få dem rettet, men også kunne fjernes i tilfælde af fejl.

Den eneste lodning var endelig motorerne og brødbrættet og skæreborde. For at være ærlig kan jeg godt lide jumpertrådene, men de kan føre til løs forbindelse. I nogle situationer understøtter nogle softwareovervågninger dig muligvis i analysen af forbindelserne.

Trin 3: Softwareinfrastruktur

Softwareinfrastruktur
Softwareinfrastruktur
Softwareinfrastruktur
Softwareinfrastruktur

Efter at have opnået mekanikken, vil vi oprette noget softwareinfrastruktur for at have behagelige udviklingsbetingelser.

Git

Dette er et gratis og open source versionskontrolsystem. Det bruges til at styre store projekter som Linux, men kan også let bruges til små projekter (se Github og Bitbucket).

Projektændringerne kan spores lokalt og også skubbes til en fjernserver for at dele software med fællesskabet.

De vigtigste kommandoer er:

git -klon https://github.com/makerobotics/RPIbot.git [Hent kildekoden og git -konfigurationen]

git pull origin master [få det nyeste fra fjernlageret]

git status [få status for det lokale lager. Er der nogen filer ændret?] Git log [få listen over forpligtelser] git add. [tilføj alle ændrede filer til scenen, der skal overvejes til den næste forpligtelse] git commit -m "comment for commit" [foretag ændringerne til det lokale lager] git push origin master [skub alle forpligtelserne til fjernlageret]

Logning

Python leverer nogle indbyggede logfunktioner. Softwarestrukturen bør allerede definere alle logningsrammerne, inden den videre udvikling påbegyndes.

Loggeren kan konfigureres til at logge med et defineret format i terminalen eller i en logfil. I vores eksempel er loggeren konfigureret af webserverklassen, men vi kunne også gøre det på egen hånd. Her indstiller vi kun logningsniveauet til DEBUG:

logger = logging.getLogger (_ navn_)

logger.setLevel (logging. DEBUG)

Måling og plotting

For at analysere signaler over tid er det bedste at plotte dem i et diagram. Da Raspberry Pi kun har en konsolterminal, sporer vi dataene i en semikolonsepareret csv -fil og plotter dem fra den eksterne pc.

Den semikolonseparerede sporfil genereres af vores hovedpythonkode og skal have overskrifter som denne:

tidsstempel; 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;

Den første kolonne indeholder tidsstemplet. Følgende kolonner er gratis. Plotningsscriptet kaldes med en liste over kolonner, der skal plottes:

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

Plotscriptet er tilgængeligt i værktøjsmappen:

Plotteren bruger mathplotlib i Python. Du skal kopiere det til din pc.

For mere komfort kaldes python -scriptet af et bash -script (plot.sh), der bruges til at kopiere Raspberry Pi -sporingsfilen til den eksterne pc og kalde plotteren med et signalvalg. Bash -scriptet "plot.sh" spørger hvis filen skal kopieres. Dette var mere bekvemt for mig i stedet for at kopiere manuelt hver gang. "sshpass" bruges til at kopiere filen fra Raspberry Pi til den eksterne pc via scp. Det er i stand til at kopiere en fil uden at bede om adgangskoden (den sendes som en parameter).

Endelig åbnes et vindue med plottet som vist på billedet.

Fjernkommunikation

Udviklingsgrænsefladen til Raspberry Pi er SSH. Filer kan redigeres direkte på målet eller kopieres af scp.

For at styre robotten kører en webserver på Pi'en, der giver kontrol via Websockets. Denne grænseflade er beskrevet i det næste trin.

Opsæt Raspberry Pi

Der er en fil, der beskriver opsætningen af Raspberry Pi i "doc" -mappen i kildekoden (setup_rpi.txt). Der er ikke mange forklaringer, men mange nyttige kommandoer og links.

Trin 4: Brugergrænsefladen

Brugergrænsefladen
Brugergrænsefladen

Vi bruger den lette Tornado -webserver til at være vært for brugergrænsefladen. Det er et Python -modul, som vi kalder, når vi starter robotstyringssoftwaren.

Software arkitektur

Brugergrænsefladen er opbygget af følgende filer: gui.html [Beskrivelse af webstedets kontroller og layout] gui.js [Indeholder javascript -koden til at håndtere kontrollerne og åbne en websocket -forbindelse til vores robot] gui.css [Indeholder stilarterne for html -kontrollerne. Kontrolpositionerne er defineret her]

Websocket -kommunikationen

Brugergrænsefladen er ikke den sejeste, men den gør jobbet. Jeg fokuserede her på teknologier, der var nye for mig som Websockets.

Webstedet kommunikerer med robotwebserveren af Websockets. Dette er en tovejskommunikationskanal, som forbliver åben, når forbindelsen blev initieret. Vi sender robotens kommandoer via Websocket til Raspberry Pi og får information (hastighed, position, kamerastrøm) tilbage til visning.

Interfacelayoutet

Brugergrænsefladen har en manuel input til kommandoerne. Dette blev brugt i begyndelsen til at sende kommandoer til robotten. Et afkrydsningsfelt tænder og slukker kamerastrømmen. De to skydere styrer kamerapanelet og vipper. Den øverste højre del af brugergrænsefladen styrer robotternes bevægelse. Du kan styre hastigheden og målafstanden. Den grundlæggende telemetriinformation vises på robottegningen.

Trin 5: Programmering af robotplatformen

Programmering af robotplatformen
Programmering af robotplatformen
Programmering af robotplatformen
Programmering af robotplatformen
Programmering af robotplatformen
Programmering af robotplatformen

Denne del var projektets hovedmål. Jeg refaktorerede meget af softwaren, da jeg introducerede det nye chassis med DC -motorerne. Jeg brugte Python som programmeringssprog af forskellige årsager:

  • Det er Raspberry Pi hovedsprog
  • Det er et sprog på højt niveau med mange indbyggede funktioner og udvidelser
  • Det er objektorienteret, men kan også bruges til sekventiel programmering
  • Ingen kompilering eller værktøjskæde nødvendig. Rediger koden og kør den.

Hovedsoftware arkitektur

Softwaren er objektorienteret, opdelt i et par objekter. Min idé var at dele koden i 3 funktionelle blokke:

Sense Think Actuate

Sense.py

Hovedsensoropsamling og -behandling. Dataene gemmes i en ordbog, der skal bruges i det følgende trin.

Control.py

En aktiveringsunderklasse styrer motorerne og servoerne efter en vis abstraktion. Hovedkontrolobjektet håndterer kommandoer på højt niveau og også kontrolalgoritmerne (PID) for motoren.

rpibot.py

Dette hovedformål er styring af Tornado -webserveren og instantiation af sense- og kontrolklasser i separate tråde.

Hvert modul kan køres alene eller som en del af hele projektet. Du kan kun registrere og udskrive sensoroplysningerne for at kontrollere, at sensorer er tilsluttet korrekt og leverer de rigtige oplysninger.

PID -kontrollen

Første opgave er at finde ud af, hvad vi vil kontrollere. Jeg startede med at prøve at kontrollere positionen, som var meget kompleks og ikke hjalp meget.

Endelig vil vi kontrollere hvert hjulhastighed og også robotretningen. For at gøre det skal vi kaskade to kontrollogikker.

For at øge kompleksiteten trin for trin skal robotten styres:

åben sløjfe (med konstant effekt)

pwm = K

tilføj derefter algoritmen til tæt sløjfe

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

og tilføj endelig retningskontrollen som et sidste trin.

Til hastighedskontrollen brugte jeg en "PI" -kontrol og "P" kun til yaw. Jeg indstillede parametrene manuelt ved at eksperimentere. Sandsynligvis kunne meget bedre parametre bruges her. Mit mål var bare en lige linje, og jeg fik det næsten. Jeg oprettede en grænseflade i softwaren til at skrive nogle variabler af brugergrænsefladen. Indstilling af parameteren Kp til 1.0 kræver følgende kommando i brugergrænsefladen:

SÆT; Kp; 1,0

Jeg kunne indstille P -parameteren lige lav nok til at undgå overskud. Den resterende fejl rettes med I -parameteren (integreret fejl)

Det var svært for mig at finde ud af, hvordan jeg skulle kaskade begge kontroller. Løsningen er enkel, men jeg prøvede mange andre måder før … Så endelig ændrede jeg hjulenes hastighedsmål for at dreje i den ene eller den anden retning. Direkte ændring af hastighedskontroloutput var en fejl, da hastighedskontrollen forsøgte at fjerne denne forstyrrelse.

Det brugte kontroldiagram er vedhæftet. Det viser kun venstre side af robotstyringen.

Trin 6: Sensorens kalibreringer

Sensorens kalibreringer
Sensorens kalibreringer
Sensorens kalibreringer
Sensorens kalibreringer
Sensorens kalibreringer
Sensorens kalibreringer

Første ting at overveje er, at hele IMU skal fungere korrekt. Jeg bestilte 3 dele og sendte dem tilbage, indtil jeg havde en fuld fungerende sensor. Hver tidligere sensor havde nogle dele af sensoren, der ikke fungerede korrekt eller slet ikke. Jeg brugte nogle eksempler på scripts til at teste det grundlæggende, før jeg monterede den i robotten.

IMU -sensorsignalerne skal kalibreres, før de bruges. Nogle sensorsignaler afhænger af monteringsvinklen og positionen.

Kalibrering af acceleration og rotation

Den nemmeste kalibrering er for den langsgående acceleration (A_x). Ved stilstand skulle der være omkring 0 m/s². Hvis du roterer sensoren korrekt, kan du måle tyngdekraften (omkring 9, 8 m/s²). For at kalibrere a_x skal du bare montere det korrekt og derefter definere forskydningen for at få 0 m/s² ved stilstand. Nu er A_x kalibreret. Du kan få forskydningerne for rotationshastighederne på samme måde i stilstand.

Magnetometerets kalibrering til kompasset

En mere kompleks kalibrering er nødvendig for magnetfeltsensorerne. Vi vil bruge m_x og m_y til at få magnetfeltet i det vandrette niveau. At have m_x og m_y vil give os mulighed for at beregne en kompasretning.

For vores enkle formål kalibrerer vi kun hård jernafvigelse. Dette skal udføres, da sensoren er i den endelige position, da den afhænger af magnetiske feltforstyrrelser.

Vi registrerer m_x og m_y, mens vi drejer robotten rundt om z-aksen. Vi plotter m_x vs m_y i et XY -diagram. Resultatet i en ellipse som vist på billedet. Ellipsen skal være centreret om oprindelsen. Her overvejer vi maksimums- og minimumsværdierne for m_x og m_y for at få forskydningerne i begge retninger. Endelig kontrollerer vi kalibreringen og ser, at ellipsen nu er centreret.

Kalibrering af blødt jern ville betyde, at vi ændrer billedet fra en ellipse til en cirkel. Dette kan gøres ved at tilføje en faktor på hver senorværdi.

En testrutine kan nu kodes for at kalibrere igen eller i det mindste for at kontrollere, at sensorerne stadig er kalibreret.

Kompasens kurs

Magnetometerdataene vil nu blive brugt til at beregne kompasets kurs. Til dette skal vi konvertere m_x- og m_y -signalerne til en vinkel. Python leverer direkte math.atan2 -funktionen, der har dette mål. Den komplette beregning er defineret i filen mpu9250_i2c.py ("calcHeading (mx, my, mz)").

Trin 7: Alternative designs

Alternative designs
Alternative designs
Alternative designs
Alternative designs
Alternative designs
Alternative designs

Projektet tog meget tid, da designet var helt åbent. For hver komponent lavede jeg en prototypeimplementering og oplevede systemets grænser.

Det mest komplekse emne var hjulkoderen. Jeg testede 3 forskellige muligheder, før jeg fandt den aktuelt anvendte optiske encoder. Jeg synes, at de afbrudte løsninger også er meget interessante i sådan et projekt. Det angår de dele, hvor jeg lærte mest.

Kontinuerlig rotation servo forbundet til pca 9695

For at undgå en ekstra H-bro til en jævnstrømsmotor startede jeg først med servos med kontinuerlig rotation. Disse blev drevet af den allerede eksisterende pca 9695 servodriver. Al fremdriftsmekanik og korrespondentelektronikken var meget enklere. Dette design havde to ulemper:

  • Servoernes dårlige kontrolområde.
  • Den manglende placering af encoder

Servoerne begynder at bevæge sig med 50% pwm og har fuld hastighed på omkring 55%. Dette er et meget dårligt kontrolområde.

Uden en encoder holder, var det meget vanskeligt at finde en klar til at gå encoder. Jeg testede 3 forskellige reflektans encoder, som var monteret på chassiset. Jeg tapede et selvfremstillet encoderhjul på ydersiden af hjulet med sort og hvide sektioner. Jeg brugte QTR-1RC sensorer, som har brug for meget signalbehandling for at få det rigtige signal. Raspberry Pi var ikke i stand til at udføre den form for behandling i realtid. Så jeg besluttede at tilføje en NodeMCU D1 mini som en real -time controller til robotten. Den blev forbundet til hindbær Pi med den serielle UART for at levere de behandlede sensordata. NodeMCU styrede også HC-SR04-sensoren. Mekanikken var vanskelig og ikke særlig robust, serielinjen fik støj fra I2C-linjen og motorerne, så endelig byggede jeg den anden version af chassiset med simple gear DC-motorer drevet af en H-bro. Disse motorer har en sekundær udgangsaksel til placering af en optisk encoder.

Trin 8: Billedbehandling

Billedbehandling
Billedbehandling
Billedbehandling
Billedbehandling
Billedbehandling
Billedbehandling
Billedbehandling
Billedbehandling

For at forbedre den autonome kørsel kan vi lave noget billedbehandling.

Opencv -biblioteket er en reference til det. Det kan bruges af Python til hurtigt at implementere forhindringsdetektering.

Vi tager et billede og anvender nogle billedbehandlingsopgaver:

Første test blev foretaget med Canny og Sobel transformationer. Canny kan være en god kandidat, men er ikke fornuftig nok. Sobel er for fornuftig (der registreres for mange objekter).

Endelig lavede jeg mit eget filter til at blande alle de vandrette og lodrette gradienter (detekter møbler):

  • Transformér farvebilledet til et gråtonebillede
  • Slør billedet for at fjerne lille støj
  • Tærskel for billedet til et sort / hvidt billede
  • Nu registrerer vi vandrette og lodrette forløb for at registrere objekter som vægge og møbler
  • Vi filtrerer kun de store resterende konturer (se farvede konturer på billedet)

Nu kan vi bruge disse nye oplysninger til at opdage forhindringer …

Trin 9: Næste trin …

Næste skridt…
Næste skridt…
Næste skridt…
Næste skridt…

Nu har vi en simpel robotplatform med sensorer, aktuatorer og et kamera. Mit mål er at flytte autonomt og gå tilbage til stationen uden at tilføje yderligere sensorer. Til dette skal jeg bruge følgende trin:

  • Sensorfusion af gab og magnetiske kurssignaler
  • Kamerabilledbehandling (kun lav CPU tilgængelig til det)
  • Kollisionsdetektering (ultralydsafstand og kamera)
  • Kortbygning eller orientering

Gå nu og skab dine egne udfordringer eller mål …

Anbefalede: