Versnellingsmeter & Gyro Tutorial (3 / 3 stap)

Stap 3: Het combineren van de versnellingsmeter en de Gyro


Zet het allemaal samen - versnellingsmeter en gyroscoop gegevens combineren.

Als je dit artikel leest u waarschijnlijk verworven of van plan bent om het verwerven van een IMU apparaat, of waarschijnlijk u van plan bent om een van de afzonderlijke versnellingsmeter en gyroscoop apparaten te bouwen.

De eerste stap bij het gebruik van een combinatie IMU apparaat dat een versnellingsmeter en een gyroscoop combineert is om uit te lijnen hun coördinatenstelsels. De eenvoudigste manier om dit te doen is te kiezen van het coördinatensysteem van de versnellingsmeter als uw referentie-coördinatenstelsel. Meeste versnellingsmeter gegevensbladen wordt de richting van X, Y, Z-as ten opzichte van het imago van de fysieke chip of het apparaat weergegeven. Bijvoorbeeld zijn hier de richtingen van X, Y, Z-as zoals in de specificaties voor het Acc_Gyro -board:

Volgende stappen zijn:

  • Het identificeren van de gyroscoop uitgangen die overeenkomen met RateAxz, RateAyz waarden hierboven besproken. Bepaal of deze uitgangen moeten worden omgekeerd als gevolg van fysieke positie van de gyroscoop ten opzichte van de versnellingsmeter

Ga er niet van dat, als een gyroscoop heeft een output gemarkeerd X of Y, het zal overeenkomen met elke willekeurige as in het coördinatensysteem van de versnellingsmeter, zelfs als deze uitgang deel van een eenheid voor IMU is. De beste manier is om het te testen. Ervan uitgaande dat u de positie van de gyroscoop ten opzichte van de versnellingsmeter hebben vastgesteld. Er wordt van uitgegaan dat de gyro en versnellingsmeter grenzen zijn parallel aan elkaar, d.w.z. u plaatst de gyro onder een hoek veelvoud van 90deg ten opzichte van de versnellingsmeterspaander. Indien u een IMU board kansen zijn verkregen dat ze al op deze manier zijn uitgelijnd. We not gonna bespreken in dit artikel modellen waar de gyroscoop in een onregelmatige hoek ten opzichte van de versnellingsmeter wordt geplaatst (laten we zeggen 45 of 30 graden), hoewel dit nuttig zijn in sommige toepassingen wellicht.

Hier is een opeenvolging van de steekproef om te bepalen welke uitgang van de gyroscoop komt overeen met RateAxz waarde hierboven besproken.

-starten vanaf het apparaat in horizontale positie te plaatsen. Zowel X- en Y-uitgangen van de versnellingsmeter zou uitgangsspanning de zero-g (voor voorbeeld voor Acc_Gyro aan boord van dit 1.65V)

-de volgende keer start het apparaat rond de Y-as draaien, een andere manier om het te zeggen is dat u het apparaat in XZ-vlak, zodat de X en Z versnellingsmeter uitgangen wijzigen en Y-uitgang blijft constant draaien.

-terwijl het draaien van het apparaat op een opmerking van de constante snelheid welke gyroscoop uitgang wijzigingen, de andere uitgangen van de gyroscoop constant moeten blijven

-de gyroscoop uitvoer die tijdens de draaihoek om de Y-as (rotatie in XZ-vlak) gewijzigd zorgt de invoerwaarde voor AdcGyroXZ, waaruit wij RateAxz berekenen

-de laatste stap is om ervoor te zorgen de draairichting correspondeert met ons model, in sommige gevallen wellicht moet het omkeren van de waarde van de RateAxz als gevolg van fysieke positie van de gyroscoop ten opzichte van de versnellingsmeter

-opnieuw uitvoeren van de bovenstaande test, het apparaat rond de Y-as draaien, ditmaal controleren de output van de X van de versnellingsmeter (AdcRx in ons model). Als AdcRx groeit (de eerste 90 graden voor rotatie van horizontale positie), moet dan AdcGyroXZ ook groeien. Anders moet u omkeren RateAxz, u kunt dit bereiken door de invoering van een teken factor in Eq.3, als volgt:

RateAxz = InvertAxz * (AdcGyroXZ * Vref / 1023 - VzeroRate) / gevoeligheid, waar InvertAxz 1 of -1 is

dezelfde test suikerriet worden gedaan voor RateAyz, door het draaien van het apparaat rond de X-as, en kunt u identificeren welke gyroscoop uitgang komt overeen met RateAyz, en als het moet worden omgekeerd. Zodra u de waarde voor InvertAyz hebt, moet u de volgende formule voor het berekenen van RateAyz:

RateAyz = InvertAyz * (AdcGyroYZ * Vref / 1023 - VzeroRate) / gevoeligheid

Als u deze tests aan boord van de Acc_Gyro zou doen u zou krijgen op de volgende resultaten:

-de pin van de output voor RateAxz is GX4 en InvertAxz = -1.
-de pin van de output voor RateAyz is GY4 en InvertAyz = -1

Vanaf dit punt overwegen we dat u ingesteld uw IMU op zodanige wijze hebt dat u juiste waarden voor Axr, Ayr, Azr (zoals gedefinieerde deel 1 berekenen kunt. Versnellingsmeter) en RateAxz, RateAyz (zoals gedefinieerd in deel 2. Gyroscoop). Vervolgens zullen we de betrekkingen tussen deze waarden die nuttig zijn blijken bij het verkrijgen van meer accurate schatting van de hellingshoek van het apparaat ten opzichte van de massaplaat analyseren.

U zou kunnen vragen jezelf bij dit punt, als versnellingsmeter model al gaf ons neiging hoeken van Axr, Ayr, Azr, waarom zouden we willen met de gegevens van de gyroscoop de moeite? Het antwoord is simpel: versnellingsmeter-gegevens niet altijd kunnen worden vertrouwd 100%. Er zijn verschillende redenen, vergeet niet dat versnellingsmeter maatregelen inertial kracht, dergelijke macht kan worden veroorzaakt door de zwaartekracht (en idealiter alleen door zwaartekracht), maar het kan ook worden veroorzaakt door versnelling (verkeer) van het apparaat. Dientengevolge zelfs als versnellingsmeter in een relatief stabiele staat, is het nog steeds zeer gevoelig voor trillingen en mechanische lawaai in het algemeen. Dit is de belangrijkste reden waarom meeste IMU systemen een gyroscoop gebruiken voor het gladstrijken van eventuele fouten van de versnellingsmeter. Maar hoe is dit gedaan? En is de gyroscoop vrij van ruis?

De gyroscoop is niet vrij van ruis maar omdat het rotatie meet minder is gevoelig voor lineaire mechanische bewegingen, het soort lawaai dat versnellingsmeter lijdt, maar gyrokompassen hebben andere soorten problemen zoals bijvoorbeeld drift (niet terugkomen nader waarde wanneer rotatie stopt). Toch kunnen we een relatief beter inschatten van de huidige apparaat helling dan wij verkrijgen zouden door het gebruik van de versnellingsmeter-gegevens alleen door het gemiddelde van de gegevens die afkomstig zijn van de versnellingsmeter en gyroscoop te kunnen verkrijgen.

In de volgende stappen die ik zal voorstellen een algoritme dat werd geïnspireerd door enkele ideeën in Kalman-filter gebruikt, is het echter veel eenvoudiger en gemakkelijker te implementeren op ingesloten apparaten. Daarvoor laten we eerst zien wat we willen ons algoritme voor het berekenen van. Nou, het is de richting van de zwaartekracht kracht vector R = [Rx, Ry, Rz] die we kunnen ontlenen andere waarden als Axr, Ayr, Azr of cosX, gezellige, cosZ, dat ons een idee over de helling van onze apparaat ten opzichte van het grondvlak geeft, we bespreken de relatie tussen deze waarden in deel 1. Men zou kunnen zeggen - niet we hebben al deze waarden Rx, Ry, Rz van Eq.2 in deel 1? Nou ja, maar vergeet niet dat deze waarden zijn afgeleid van versnellingsmeter-gegevens alleen, dus als je zou ze rechtstreeks in uw toepassing te gebruiken kan je meer ruis dan uw toepassing kan tolereren. Om te voorkomen dat verdere verwarring laten we opnieuw de versnellingsmeter metingen te definiëren als volgt:

Racc - is de vector van de traagheids kracht zoals gemeten door de versnellingsmeter, die uit de volgende onderdelen bestaat (projecties op de X, Y, Z-assen):

RxAcc = (AdcRx * Vref / 1023 - VzeroG) / gevoeligheid
RyAcc = (AdcRy * Vref / 1023 - VzeroG) / gevoeligheid
RzAcc = (AdcRz * Vref / 1023 - VzeroG) / gevoeligheid

Tot nu toe hebben we een aantal gemeten waarden die wij puur vanaf versnellingsmeter ADC waarden kunnen downloaden. We noemen deze set van gegevens een "vector" en we zullen de volgende notatie gebruiken.

Racc = [RxAcc, RyAcc, RzAcc]

Omdat deze onderdelen voor Racc kunnen versnellingsmeter-gegevens worden verkregen, kunnen we het een bijdrage aan ons algoritme overwegen.

Houd er rekening mee dat omdat Racc de kracht van de zwaartekracht zult u correct meet als u aannemen dat de lengte van deze vector als volgt gedefinieerd gelijk is of bijna 1 g.

| Racc| = SQRT(RxAcc^2 +RyAcc^2 + RzAcc^2),

Maar om zeker te zijn is het zinvol om deze vector als volgt bijwerken:

Racc(Normalized) = [RxAcc / | Racc| , RyAcc / | Racc| , RzAcc / | Racc|].

Hierdoor zal dat de lengte van uw genormaliseerde Racc vector is altijd 1.

Vervolgens zal introduceren wij een nieuwe vector en we noemen het

Rest = [RxEst, RyEst, RzEst]

Dit zal de output van ons algoritme, dit zijn de gecorrigeerde waarden op basis van gegevens van de gyroscoop en gebaseerd op afgelopen geschatte gegevens.

Hier is wat ons algoritme zal doen:
-versnellingsmeter vertelt ons: "Gij zijt nu op positie Racc"
-we zeggen "Dank u, maar laat me check",
-Corrigeer vervolgens deze informatie met gegevens van de gyroscoop en afgelopen Rest gegevens en we een nieuwe geschatte vector Rest output.
-Wij Rest als onze "beste weddenschap" over de huidige positie van het apparaat.

Laten we eens kijken hoe we kunnen werken.

We beginnen onze reeks door te vertrouwen onze versnellingsmeter en toewijzen:

Rest(0) = Racc(0)

Door de manier herinneren en Racc zijn vectoren, zodat de bovenstaande vergelijking is enkel een eenvoudige manier om te schrijven 3 sets van vergelijkingen, en voorkomen van herhaling:

RxEst(0) = RxAcc(0)
RyEst(0) = RyAcc(0)
RzEst(0) = RzAcc(0)

Volgende wij regelmatige metingen doen op gelijke tijdsintervallen van T seconden, en we zullen krijgen nieuwe metingen die we als Racc(1), Racc(2), Racc(3), enzovoort definiëren zullen. We zullen ook afgifte van nieuwe ramingen op elke tijdsintervallen Rest(1), Rest(2), Rest(3), enzovoort.

Stel dat we je op de stap van n. We hebben twee bekende sets met waarden die wij zou willen gebruiken:

Rest(n-1) - onze eerdere raming, met Rest(0) = Racc(0)
Racc(n) - onze Stroommeting versnellingsmeter

Voordat we Rest(n) berekenen kunnen, laten we even een nieuwe gemeten waarde, die we vanaf onze gyroscoop en een eerdere raming kunnen downloaden.

We noemen het Rgyro, en het is ook een vector bestaande uit 3 onderdelen:

Rgyro = [RxGyro, RyGyro, RzGyro]

We zullen dit één component van de vector berekenen op een moment. We beginnen met RxGyro.

Laten we beginnen door te kijken naar de volgende relatie in onze gyroscoop model, uit de rechte hoek driehoek gevormd door Rz en Rxz we kunnen afleiden dat:

Tan(Axz) = Rx/Rz = > Axz = atan2(Rx,Rz)

ATAN2 misschien wel een functie die u nooit gebruikt voor, het is vergelijkbaar met atan, behalve binnen het bereik van waarden geretourneerd (-PI, PI) in tegenstelling tot (-PI/2, PI/2) zoals die wordt geretourneerd door atan, en het neemt 2 argumenten in plaats van één. Het laat ons toe om de twee waarden van Rx, Rz draaien in het volledige bereik van 360 graden converteren (-PI tot PI). U kunt meer lezen over atan2 hier.

Zo weten RxEst(n-1) en RzEst(n-1) vinden we:

Axz(n-1) = atan2 (RxEst(n-1), RzEst(n-1)).

Vergeet niet dat gyroscoop meet de snelheid van verandering van de hoek van de Axz. Zo kunnen we schatten de nieuwe hoek Axz(n) als volgt:

Axz(n) = Axz(n-1) + RateAxz(n) * T

Vergeet niet dat RateAxz kan worden verkregen bij onze gyroscoop ADC lezingen. Een meer nauwkeurige formule kunt een percentage van de gemiddelde rotatie als volgt berekend:

RateAxzAvg = (RateAxz(n) + RateAxz(n-1)) / 2
Axz(n) = Axz(n-1) + RateAxzAvg * T

Dezelfde manier we vinden:

Ayz(n) = Ayz(n-1) + RateAyz(n) * T

OK dus nu hebben we Axz(n) en Ayz(n). Waar gaan we vanaf hier op aftrek van de RxGyro/RyGyro? Van Eq. 1 kunnen we de lengte van de vector Rgyro als volgt schrijven:

| Rgyro| = SQRT(RxGyro^2 + RyGyro^2 + RzGyro^2)

Ook omdat we onze Racc vector genormaliseerd, mogen we aannemen dat het lengte 1 is en het is niet veranderd na de rotatie, dus het is relatief veilig om te schrijven:

| Rgyro| = 1

Laten we vast een tijdelijke kortere notatie voor de berekeningen hieronder:

x = RxGyro, y = RyGyro, z = RzGyro

Met de betrekkingen boven we kunt schrijven:

x = x / 1 = x / SQRT(x^2+y^2+z^2)

Laten we het verdelen van teller en noemer van de breuk door SQRT (x ^ 2 + z ^ 2)

x = (x / SQRT (x ^ 2 + z ^ 2)) / SQRT ((x ^ 2 + y ^ 2 + z ^ 2) / (x ^ 2 + z ^ 2))

Merk op dat x / SQRT (x ^ 2 + z ^ 2) = sin(Axz), dus:

x = sin(Axz) / SQRT (1 + y ^ 2 / (x ^ 2 + z ^ 2))

Nu vermenigvuldig de teller en noemer van de breuk binnen SQRT door z ^ 2

x = sin(Axz) / SQRT (1 + y ^ 2 * z ^ 2 / (z ^ 2 * (x ^ 2 + z ^ 2)))

Merk op dat z / SQRT (x ^ 2 + z ^ 2) = cos(Axz) en y / z = tan(Ayz), dus uiteindelijk:

x = sin(Axz) / SQRT (1 + cos (Axz) ^ 2 * tan (Ayz) ^ 2)

Terug te gaan naar onze notatie krijgen we:

RxGyro = sin(Axz(n)) / SQRT (1 + cos(Axz(n)) ^ 2 * tan(Ayz(n)) ^ 2)

dezelfde manier vinden we dat

RyGyro = sin(Ayz(n)) / SQRT (1 + cos(Ayz(n)) ^ 2 * tan(Axz(n)) ^ 2)

Nu, eindelijk kan vinden we:

RzGyro = teken (RzGyro) * SQRT (1 - RxGyro ^ 2 - RyGyro ^ 2).

Waar Sign(RzGyro) = 1 als RzGyro > = 0, en Sign(RzGyro)-1 wanneer = RzGyro < 0.

Een eenvoudige manier om te schatten dit is om te nemen:

Sign(RzGyro) = Sign(RzEst(n-1))

In de praktijk wees voorzichtig wanneer RzEst(n-1) dicht bij 0 is. U kunt overslaan de gyro fase helemaal in dit geval en toewijzen: Rgyro = Rest(n-1). RZ wordt gebruikt als referentie voor de berekening van de Axz en de Ayz hoeken en wanneer het is dicht bij 0, waarden kunnen oveflow en trigger slechte resultaten. U zult in domein van grote drijvende punt nummers waar tan() / atan() functie implementaties kunnen gebrek aan precisie.

Dus laten we recapituleren wat we hebben tot nu toe, we zijn bij stap n van ons algoritme en we hebben de volgende waarden berekend:

Racc - huidige lezingen van onze versnellingsmeter
Rgyro - Rest(n-1) en huidige gyroscoop lezingen verkregen

Welke waarden gebruiken we voor het berekenen van de geactualiseerde raming Rest(n)? U waarschijnlijk geraden dat we beide zullen gebruiken. We zullen gebruik maken van een gewogen gemiddelde, zodat:

Rest(n) = (Racc * w1 + Rgyro * w2) / (w1 + w2)

We kunnen deze formule vereenvoudigen door zowel de teller en de noemer van de breuk delen door w1.

Rest(n) = (Racc * w1/w1 + Rgyro * w2/w1) / (w1/w1 + w2/w1)

en na vervanging van w2/w1 = wGyro die we krijgen:

Rest(n) = (Racc + Rgyro * wGyro) / (1 + wGyro)

In de bovenstaande Formula vertelt wGyro ons hoeveel wij vertrouwen erop dat onze gyro dat ten opzichte van onze versnellingsmeter. Deze waarde kan meestal experimenteel worden gekozen waarden tussen 5..20 zal leiden tot goede resultaten.

Het belangrijkste verschil van dit algoritme van Kalman-filter is dat dit gewicht relatief vast is, terwijl in Kalman filter die de gewichten worden permanent bijgewerkt op basis van het gemeten geluid van de lezingen van de versnellingsmeter. Kalman-filter is gericht op het geven van u "het beste" theoretische resultaten, terwijl dit algoritme u resultaten "good enough" voor uw praktische toepassing geven kan. U kunt het implementeren van een algoritme dat wGyro afhankelijk van enkele factoren ruis die u meten past, maar vaste waarden zal goed werken voor de meeste toepassingen.

Wij zijn een stap verwijderd van onze bijgewerkte geschatte waarden krijgen:

RxEst(n) = (RxAcc + RxGyro * wGyro) / (1 + wGyro)
RyEst(n) = (RyAcc + RyGyro * wGyro) / (1 + wGyro)
RzEst(n) = (RzAcc + RzGyro * wGyro) / (1 + wGyro)

Nu laten we weer normaliseren deze vector:

R = SQRT(RxEst(n) ^ 2 + RyEst (n) ^ 2 + RzEst (n) ^ 2)

RxEst(n) = RxEst (n) / r
RyEst(n) = RyEst (n) / r
RzEst(n) = RzEst (n) / r

En we zijn klaar voor onze lus te herhalen.

Deze handleiding oorspronkelijk verscheen op starlino.com, ik heb een paar lichte bewerkingen gemaakt en opnieuw gepost met toestemming. Bedankt Starlino!

Gerelateerde Artikelen

MPU6050: Arduino 6 Axis versnellingsmeter + Gyro - GY 521 Test & 3D-simulatie

MPU6050: Arduino 6 Axis versnellingsmeter + Gyro - GY 521 Test & 3D-simulatie

Bent u op zoek naar uw eigen quadcopter drone of RC vliegtuig met Arduino maar weet niet hoe om de gyro werkend te krijgen? Misschien u al gekocht sommige modules 6 as MPU6050 (op de GY-521 breakout boards) alleen om uit te vinden dat ze niet zo eenv
Raspberry Pi - ADXL345 3-Axis versnellingsmeter Python Tutorial

Raspberry Pi - ADXL345 3-Axis versnellingsmeter Python Tutorial

De ADXL345 is een kleine, dunne, ultralow macht, 3-axis versnellingsmeter met hoge resolutie (13-bits) meting bij tot ±16 g. digitale uitgang gegevens is opgemaakt als aanvulling van de 16-bits tweeën en is toegankelijk via I2 C digitale interface. I
Hoe gebruik ik de RFduino met een 6 Axis versnellingsmeter

Hoe gebruik ik de RFduino met een 6 Axis versnellingsmeter

Bekijk de RFduino van vinger-tip formaat, Arduino compatibele, draadloze ingeschakelde micro controller:http://www.rfduino.com/product/rfd90101-rfduino-2p...Dit instructable zal laten zien hoe je interface naar de versnellingsmeter/Gyro met de RFduin
Gyro Camera voor motorfiets

Gyro Camera voor motorfiets

zoals gezien in de MotoGP Race, de ruiter wordt gezien door hoeken rijden terwijl zijn fiets naar links en rechts opzij te leggen. Maar er een interessant moment wanneer de motor kijkt is naar boven, samenvouwen de front standpunten horizontaal blijv
Gebruik een versnellingsmeter en de gyroscoop met Arduino

Gebruik een versnellingsmeter en de gyroscoop met Arduino

ik kocht onlangs een combinatie 3 axis versnellingsmeter en 2 as gyroscoop van Sparkfun en ik wilde na een aantal van de code die ik gebruikt om het up and running.  Ik ben van plan gebruik ervan in een Arduino-gebaseerde MIDI controller die ik binne
Hoe maak je vuist pompen met LED animatie

Hoe maak je vuist pompen met LED animatie

het is om een vuist pompen LED controller. Wat is het? Heb je jezelf vuist pompen naar de muziek op een feest of een club? Dat is precies daarvoor. U zou een band dragen met een versnellingsmeter/gyro gemonteerd. Als u uw hand rond de lucht bewegen,
Sugarcube MIDI Controller

Sugarcube MIDI Controller

Dit project is een draagbare, Arduino aangedreven, grid-gebaseerde MIDI controller die zelfstart opwaarts in allerlei apps te doen veel dingen met geluid. Het heeft 16 verlichte knoppen, gebruikt als zowel in- en uitgangen te geven van de controller
Self balancing one wheeled electric skateboard

Self balancing one wheeled electric skateboard

NOTE:Mei 2011: Dit instructable is nu vrij oud (relatief) en ik kan nu bouwen dit project eenvoudiger met een Arduino als de controller.Ik ben momenteel bezig met een eenwieler met dezelfde OSMC motor controller en een Arduino. Wanneer ik dat aan het
Multi-Functional Star Wars Astromech Droid

Multi-Functional Star Wars Astromech Droid

E4-B4Astromech droid voor het huis.Video links voor mobiele apparaten die de videominiaturen bovenstaande animatie wordt niet afgespeeld:Het maken van E4-B4 Astromech Droid VideoE4-B4: Showcase Video, deel 1E4-B4: Rocket Man VideoE4-B4: Zin in een dr
Eenvoudige zelfbalancerende Robot w / Galileo Gen 2

Eenvoudige zelfbalancerende Robot w / Galileo Gen 2

Na vrijwilligerswerk bij de lokale mini Maker Faire, en het krijgen van een kans om te spelen met de Intel Galileo Gen 2 Arduino board, was ik gemotiveerd om het vinden van een maker-project voor mezelf. Na een snel overzicht van de opties en mijn in
Eenvoudige handleiding Magnetometer kalibratie

Eenvoudige handleiding Magnetometer kalibratie

Er zijn verschillende soorten goedkope magnetometer nu beschikbaar, die u gebruiken kunt om het gevoel van een kompas richting, maar alle van hen (voor zover ik weet) moeten kalibratie alvorens u goede resultaten kunt krijgen. In dit Instructable, ik
Rideable Segway kloon - goedkope en gemakkelijk te bouwen

Rideable Segway kloon - goedkope en gemakkelijk te bouwen

Dit Instructable zal u tonen hoe te bouwen van een rit-baar Segway-kloon. Hier zijn de kenmerken:Gemakkelijk op te bouwen met geen lassen, geen ingewikkelde besturing van koppeling en minimale solderen.Gebruikt een beschikbaar $3 digitale MPU6050 ver
Aangepaste Arduino Micro Quadcopter Concept

Aangepaste Arduino Micro Quadcopter Concept

14 APRIL bewerken: Sorry jongens voor de late inschrijving. leven sinds laatste tijd voor mij echt hectisch moesten we ter vervanging van een pijp van de riolering in de betonplaat die ons huis zit op begraven. Maar we hebben enige vooruitgang geboek
Chappie-zelftest-Balancing robot

Chappie-zelftest-Balancing robot

Na het krijgen van zo veel gefrustreerd over het afstemmen van de PID van de quadcopter, heb ik besloten om eerst meester van PID op sommige basisproject en dit project. Zelfbalancerende robot lijkt een inactief keuze. Aangezien er geen nieuwe en nog