İçindekiler:

İvmeölçer ve Gyro Eğitimi: 3 Adım
İvmeölçer ve Gyro Eğitimi: 3 Adım

Video: İvmeölçer ve Gyro Eğitimi: 3 Adım

Video: İvmeölçer ve Gyro Eğitimi: 3 Adım
Video: MPU6050 İvme (Gyro) sensörü ile Step Motor Kontrolü 2024, Temmuz
Anonim
İvmeölçer ve Gyro Eğitimi
İvmeölçer ve Gyro Eğitimi

Tanıtım

Bu kılavuz, elektronik projelerinde İvmeölçerler ve Jiroskopların yanı sıra kombinasyon IMU cihazlarını (Atalet Ölçüm Birimi) kullanmakla ilgilenen herkese yöneliktir.

Şunları ele alacağız:

  • Bir ivmeölçer neyi ölçer?
  • Bir jiroskop (aka jiroskop) neyi ölçer?
  • Bu sensörlerden elde ettiğiniz analogdan dijitale (ADC) okumaları fiziksel birimlere dönüştürme (bunlar ivmeölçer için g, jiroskop için derece/s olacaktır)
  • Cihazınızın yer düzlemine göre eğimi hakkında doğru bilgi elde etmek için ivmeölçer ve jiroskop okumaları nasıl birleştirilir

Makale boyunca matematiği minimumda tutmaya çalışacağım. Sinüs/Kosinüs/Tanjant'ın ne olduğunu biliyorsanız, hangi platformu kullanırsanız kullanın şu fikirleri anlayabilir ve projenizde kullanabilirsiniz: Arduino, Pervane, Temel Damga, Atmel yongaları, Mikroçip PIC, vb.

Bir IMU biriminden (karmaşık FIR veya IIR filtreleri, örneğin Kalman filtreleri, Parks-McClellan filtreleri, vb.) yararlanmak için karmaşık matematiğe ihtiyacınız olduğuna inanan insanlar var. Tüm bunları araştırabilir ve harika ama karmaşık sonuçlar elde edebilirsiniz. Bir şeyleri açıklama şeklim sadece temel matematik gerektiriyor. Ben sadeliğe çok inanan biriyim. Basit bir sistemin kontrol edilmesi ve izlenmesi daha kolay olduğunu düşünüyorum, ayrıca birçok gömülü cihazın matris hesaplamaları gerektiren karmaşık algoritmaları uygulayacak gücü ve kaynakları yok.

Örnek olarak yeni bir IMU birimi olan Acc_Gyro Accelerometer + Gyro IMU'yu kullanacağım. Aşağıdaki örneklerimizde bu cihazın parametrelerini kullanacağız. Bu ünite, 2 cihazdan oluştuğu için başlamak için iyi bir cihazdır:

- LIS331AL (veri sayfası) - üç eksenli 2G ivmeölçer - LPR550AL (veri sayfası) - çift eksenli eğim ve yuvarlanma, 500 derece/sn jiroskop

Birlikte, 5 Serbestlik Dereceli Atalet Ölçüm Birimi'ni temsil ederler. Şimdi bu süslü bir isim! Bununla birlikte, süslü ismin arkasında, bu kılavuzda ele alacağımız ve ayrıntılı olarak açıklayacağımız çok kullanışlı bir kombinasyon cihazı var.

Adım 1: İvmeölçer

İvmeölçer
İvmeölçer

Bu birimi anlamak için ivmeölçer ile başlayacağız. İvmeölçerler hakkında düşünürken, içinde bir top bulunan küp şeklindeki bir kutuyu hayal etmek genellikle yararlıdır. Kurabiye veya çörek gibi başka bir şey hayal edebilirsiniz, ama ben bir top hayal edeceğim:

ivmeölçer modeli
ivmeölçer modeli

Bu kutuyu yerçekimi alanı olmayan veya bu nedenle topun konumunu etkileyebilecek başka alanların olmadığı bir yere alırsak, top kutunun ortasında yüzer. Kutunun uzayda herhangi bir kozmik cisimden çok uzakta olduğunu hayal edebilirsiniz veya böyle bir yer bulmak zorsa, en azından her şeyin ağırlıksız durumda olduğu gezegenin etrafında dönen bir uzay aracı hayal edin. Yukarıdaki resimden her eksene bir çift duvar atadığımızı görebilirsiniz (kutunun içine bakabilmemiz için Y+ duvarını kaldırdık). Her duvarın basınca duyarlı olduğunu hayal edin. Kutuyu aniden sola hareket ettirirsek (1g = 9.8m/s^2 ivmesiyle hızlandırırız), top X- duvarına çarpacaktır. Daha sonra topun duvara uyguladığı basınç kuvvetini ölçüyoruz ve X ekseninde -1g değerini çıkarıyoruz.

ivmeölçer modeli
ivmeölçer modeli

İvmeölçerin aslında ivme vektöründen ters yönde yönlendirilen bir kuvveti algılayacağını lütfen unutmayın. Bu kuvvete genellikle Atalet Kuvveti veya Hayali Kuvvet denir. Bundan öğrenmeniz gereken bir şey, bir ivmeölçerin, duvarlarından birine uygulanan bir kuvvet aracılığıyla ivmeyi dolaylı olarak ölçmesidir (modelimize göre, gerçek hayattaki ivmeölçerlerde bir yay veya başka bir şey olabilir). Bu kuvvet ivmeden kaynaklanabilir, ancak sonraki örnekte göreceğimiz gibi her zaman ivmeden kaynaklanmaz.

Modelimizi alıp Dünya'ya koyarsak, top Z-duvarına düşecek ve aşağıdaki resimde gösterildiği gibi alt duvara 1g'lık bir kuvvet uygulayacaktır:

ivmeölçer modeli
ivmeölçer modeli

Bu durumda kutu hareket etmiyor ama yine de Z ekseninde -1g okuması alıyoruz. Topun duvara uyguladığı basınca bir yerçekimi kuvveti neden oldu. Teorik olarak, farklı bir kuvvet türü olabilir - örneğin, topumuzun metalik olduğunu hayal ederseniz, kutunun yanına bir mıknatıs yerleştirmek, topu başka bir duvara çarpacak şekilde hareket ettirebilir. Bu sadece, özünde ivmeölçerin ivmeyi değil kuvveti ölçtüğünü kanıtlamak için söylendi. Sadece hızlanma, ivmeölçerin kuvvet algılama mekanizması tarafından yakalanan bir atalet kuvvetine neden olur.

Bu model tam olarak bir MEMS sensörünün nasıl yapılandırıldığı olmasa da, genellikle ivmeölçer ile ilgili problemlerin çözümünde faydalıdır. Aslında içinde metal bilyeler olan benzer sensörler vardır, bunlara eğim anahtarı denir, ancak bunlar daha ilkeldir ve genellikle cihazın eğim derecesini değil, belirli bir aralıkta eğimli olup olmadığını söyleyebilirler.

Şimdiye kadar ivme ölçer çıktısını tek bir eksende analiz ettik ve tek eksenli ivmeölçer ile elde edeceğiniz tek şey bu. Üç eksenli ivmeölçerlerin gerçek değeri, üç eksende de atalet kuvvetlerini algılayabilmelerinden gelir. Kutu modelimize geri dönelim ve kutuyu 45 derece sağa çevirelim. Top şimdi 2 duvara temas edecek: Z- ve X- aşağıdaki resimde gösterildiği gibi:

ivmeölçer modeli
ivmeölçer modeli

0.71 değerleri keyfi değildir, aslında SQRT(1/2) için bir yaklaşımdır. İvmeölçer için bir sonraki modelimizi tanıttığımızda bu daha açık hale gelecektir.

Bir önceki modelde yerçekimi kuvvetini sabitlemiş ve hayali kutumuzu döndürmüştük. Son 2 örnekte, kuvvet vektörü sabit kalırken çıktıyı 2 farklı kutu pozisyonunda analiz ettik. Bu, ivmeölçerin dış kuvvetlerle nasıl etkileştiğini anlamada faydalı olsa da, koordinat sistemini ivmeölçerin eksenlerine sabitlersek ve kuvvet vektörünün etrafımızda döndüğünü hayal edersek hesaplamalar yapmak daha pratik olur.

ivmeölçer modeli
ivmeölçer modeli

Lütfen yukarıdaki modele bir göz atın, önceki modelden yenisine zihinsel bir geçiş yapabilmeniz için eksenlerin renklerini korudum. Yeni modeldeki her eksenin, önceki modeldeki kutunun ilgili yüzlerine dik olduğunu hayal edin. R vektörü, ivmeölçerin ölçtüğü kuvvet vektörüdür (yukarıdaki örneklerden yerçekimi kuvveti veya atalet kuvveti veya her ikisinin bir kombinasyonu olabilir). Rx, Ry, Rz, R vektörünün X, Y, Z eksenleri üzerindeki izdüşümüdür. Lütfen aşağıdaki ilişkiye dikkat edin:

R^2 = Rx^2 + Ry^2 + Rz^2 (Eşi. 1)

bu temelde Pisagor teoreminin 3B'deki karşılığıdır.

Biraz önce size SQRT(1/2) ~ 0.71 değerlerinin rastgele olmadığını söylediğimi hatırlayın. Bunları yukarıdaki formüle eklerseniz, yerçekimi kuvvetimizin 1 g olduğunu hatırladıktan sonra şunu doğrulayabiliriz:

1^2 = (-SQRT(1/2))^2 + 0 ^2 + (-SQRT(1/2))^2

basitçe Denk.1'de R=1, Rx = -SQRT(1/2), Ry = 0, Rz = -SQRT(1/2) ile değiştirerek

Uzun bir teori önsözünden sonra, gerçek ivmeölçerlere yaklaşıyoruz. Rx, Ry, Rz değerleri, gerçek hayattaki ivmeölçerinizin vereceği ve çeşitli hesaplamalar yapmak için kullanabileceğiniz değerlerle aslında doğrusal olarak ilişkilidir.

Oraya varmadan önce, ivmeölçerlerin bu bilgiyi bize nasıl ileteceği hakkında biraz konuşalım. Çoğu ivmeölçer iki kategoriye ayrılır: dijital ve analog. Dijital ivmeölçerler size I2C, SPI veya USART gibi bir seri protokol kullanarak bilgi verirken, analog ivmeölçerler bir ADC (analogdan dijitale dönüştürücü) modülü kullanarak dijital bir değere dönüştürmeniz gereken önceden tanımlanmış bir aralık içinde bir voltaj seviyesi verir. Kısmen çok kapsamlı bir konu olduğu ve kısmen bir platformdan diğerine farklı olduğu için ADC'nin nasıl çalıştığı hakkında fazla ayrıntıya girmeyeceğim. Bazı mikrodenetleyicilerde yerleşik ADC modülleri bulunur, bazılarında ise ADC dönüşümlerini gerçekleştirmek için harici bileşenlere ihtiyaç duyulur. Ne tür bir ADC modülü kullanırsanız kullanın, sonunda belirli bir aralıkta bir değer elde edersiniz. Örneğin 10 bitlik bir ADC modülü 0..1023 aralığında bir değer verir, 1023 = 2^10 -1 olduğuna dikkat edin. 12 bitlik bir ADC modülü 0..4095 aralığında bir değer verir, 4095 = 2^12-1 olduğuna dikkat edin.

Basit bir örnek üzerinden devam edelim, 10bit ADC modülümüzün bize üç ivmeölçer kanalı (eksen) için aşağıdaki değerleri verdiğini varsayalım:

AdcRx = 586 AdcRy = 630 AdcRz = 561

Her ADC modülünün bir referans voltajı olacaktır, örneğimizde bunun 3.3V olduğunu varsayalım. 10 bitlik bir adc değerini voltaja dönüştürmek için aşağıdaki formülü kullanırız:

VoltRx = AdcRx * Vref / 1023

Burada kısa bir not: 8bit ADC için son bölücü 255 = 2 ^ 8 -1 ve 12bit ADC için son bölücü 4095 = 2^12 -1 olacaktır.

Bu formülü 3 kanalın tümüne uygulayarak elde ettiğimiz:

VoltsRx = 586 * 3.3V / 1023 =~ 1.89V (tüm sonuçları 2 ondalık basamağa yuvarlarız) VoltsRy = 630 * 3.3V / 1023 =~ 2.03V VoltsRz = 561 * 3.3V / 1023 =~ 1.81V

Her ivmeölçerin sıfır g voltaj seviyesi vardır, bunu teknik özelliklerde bulabilirsiniz, bu 0 g'a karşılık gelen voltajdır. İşaretli bir voltaj değeri elde etmek için bu seviyeden kaymayı hesaplamamız gerekir. Diyelim ki 0g voltaj seviyemiz VzeroG = 1.65V. Sıfır-g geriliminden gerilim kaymalarını şu şekilde hesaplıyoruz:

DeltaVoltsRx = 1,89V - 1,65V = 0,24V DeltaVoltsRy = 2,03V - 1,65V = 0,38V DeltaVoltsRz = 1,81V - 1,65V = 0,16V

Artık ivme ölçer okumalarımızı Volt cinsinden aldık, hala g (9,8 m/s^2) cinsinden değil, son dönüşümü yapmak için genellikle mV/g olarak ifade edilen ivmeölçer hassasiyetini uygularız. Diyelim ki Hassasiyetimiz = 478.5mV/g = 0.4785V/g. Hassasiyet değerleri ivmeölçer spesifikasyonlarında bulunabilir. g ile ifade edilen son kuvvet değerlerini elde etmek için aşağıdaki formülü kullanırız:

Rx = DeltaVoltsRx / Duyarlılık

Rx = 0,24V / 0,4785V/g =~ 0,5g Ry = 0,38V / 0,4785V/g =~ 0,79g Rz = 0,16V / 0,4785V/g =~ 0,33g

Elbette tüm adımları tek bir formülde birleştirebiliriz, ancak ADC okumalarından g ile ifade edilen bir kuvvet vektörü bileşenine nasıl geçeceğinizi netleştirmek için tüm adımları uyguladım.

Rx = (AdcRx * Vref / 1023 - VzeroG) / Hassasiyet (Eq.2) Ry = (AdcRy * Vref / 1023 - VzeroG) / Hassasiyet Rz = (AdcRz * Vref / 1023 - VzeroG) / Hassasiyet

Artık atalet kuvveti vektörümüzü tanımlayan 3 bileşene de sahibiz, eğer cihaz yerçekimi dışında başka kuvvetlere tabi değilse, bunun yerçekimi kuvveti vektörümüzün yönü olduğunu varsayabiliriz. Cihazın zemine göre eğimini hesaplamak isterseniz bu vektör ile Z ekseni arasındaki açıyı hesaplayabilirsiniz. Eksen başına eğim yönü ile de ilgileniyorsanız, bu sonucu 2 bileşene bölebilirsiniz: X ve Y eksenindeki eğim, yerçekimi vektörü ile X / Y eksenleri arasındaki açı olarak hesaplanabilir. Rx, Ry ve Rz değerlerini hesapladığımıza göre, bu açıları hesaplamak düşündüğünüzden daha basit. Son ivmeölçer modelimize geri dönelim ve bazı ek gösterimler yapalım:

resim
resim

İlgilendiğimiz açılar X, Y, Z eksenleri ile kuvvet vektörü R arasındaki açılardır. Bu açıları Axr, Ayr, Azr olarak tanımlayacağız. R ve Rx tarafından oluşturulan dik açılı üçgenden şunu fark edebilirsiniz:

cos(Axr) = Rx / R ve benzer şekilde: cos(Ayr) = Ry / R cos(Azr) = Rz / R

Denklem 1'den R = SQRT(Rx^2 + Ry^2 + Rz^2) olduğunu çıkarabiliriz.

Şimdi açılarımızı arccos() işlevini (ters cos() işlevi) kullanarak bulabiliriz:

Axr = arccos(Rx/R) Ayr = arccos(Ry/R) Azr = arccos(Rz/R)

İvmeölçer modelini açıklamak için uzun bir yol kat ettik, sadece bu formüllere ulaşmak için. Uygulamalarınıza bağlı olarak, türetmiş olduğumuz ara formülleri kullanmak isteyebilirsiniz. Ayrıca jiroskop modelini de yakında tanıtacağız ve daha da doğru eğim tahminleri sağlamak için ivmeölçer ve jiroskop verilerinin nasıl birleştirilebileceğini göreceğiz.

Ama bunu yapmadan önce biraz daha faydalı notasyonlar yapalım:

cosX = cos(Axr) = Rx / R rahat = cos(Ayr) = Ry / R cosZ = cos(Azr) = Rz / R

Bu üçlüye genellikle Yön Kosinüsü denir ve temel olarak R vektörümüzle aynı yöne sahip birim vektörü (1 uzunluğunda vektör) temsil eder. Şunları kolayca doğrulayabilirsiniz:

SQRT(cosX^2 + cosY^2 + cosZ^2) = 1

Bu güzel bir özellik çünkü bizi R vektörünün modülünü(uzunluğunu) izlemekten kurtarıyor. Çoğu zaman eylemsizlik vektörümüzün yönü ile ilgileniyorsak, diğer hesaplamaları basitleştirmek için modülünü normalleştirmek mantıklıdır.

Adım 2: Jiroskop

Jiroskop
Jiroskop

İvmeölçer için yaptığımız gibi jiroskop için herhangi bir eşdeğer kutu modeli sunmayacağız, bunun yerine doğrudan ikinci ivmeölçer modeline atlayacağız ve jiroskopun bu modele göre neyi ölçtüğünü göstereceğiz.

resim
resim

Her bir jiroskop kanalı, eksenlerden birinin etrafındaki dönüşü ölçer. Örneğin, 2 eksenli bir jiroskop, X ve Y eksenleri etrafındaki (veya bazıları "yaklaşık" diyebilir) dönüşü ölçecektir. Bu dönüşü sayılarla ifade etmek için bazı notasyonlar yapalım. Önce tanımlayalım:

Rxz - R atalet kuvveti vektörünün XZ düzlemindeki izdüşümüdür Ryz - R atalet kuvveti vektörünün YZ düzlemindeki izdüşümüdür

Pisagor teoremini kullanarak Rxz ve Rz tarafından oluşturulan dik açılı üçgenden şunu elde ederiz:

Rxz^2 = Rx^2 + Rz^2 ve benzer şekilde: Ryz^2 = Ry^2 + Rz^2

ayrıca şunu unutmayın:

R^2 = Rxz^2 + Ry^2, bu Denk.1 ve üzeri denklemlerden elde edilebilir veya R ve Ryz tarafından oluşturulan dik açılı üçgenden türetilebilir R^2 = Ryz^2 + Rx^2

Bu yazıda bu formülleri kullanmayacağız ama modelimizde bulunan tüm değerler arasındaki ilişkiyi not etmekte fayda var.

Bunun yerine Z ekseni ile Rxz, Ryz vektörleri arasındaki açıyı şu şekilde tanımlayacağız:

Axz - Rxz (R'nin XZ düzleminde izdüşümü) ve Z ekseni arasındaki açıdır Ayz - Ryz (R'nin YZ düzleminde izdüşümü) ve Z ekseni arasındaki açıdır

Şimdi jiroskopun ölçtüğü şeye yaklaşıyoruz. Jiroskop, yukarıda tanımlanan açıların değişim oranını ölçer. Başka bir deyişle, bu açıların değişim hızı ile doğrusal olarak ilişkili bir değer verecektir. Bunu açıklamak için, t0 zamanında Y ekseni etrafındaki dönüş açısını (bu Axz açısı olurdu) ölçtüğümüzü ve bunu Axz0 olarak tanımladığımızı varsayalım, sonra bu açıyı daha sonraki t1 zamanında ölçtük ve Axz1 oldu. Değişim oranı aşağıdaki gibi hesaplanacaktır:

RateAxz = (Axz1 - Axz0) / (t1 - t0).

Axz'yi derece ve zamanı saniye cinsinden ifade edersek, bu değer deg/s cinsinden ifade edilecektir. Bu bir jiroskopun ölçtüğü şeydir.

Pratikte bir jiroskop (özel bir dijital jiroskop olmadığı sürece) size nadiren derece/s olarak ifade edilen bir değer verecektir. İvmeölçer ile aynı şekilde, Denklem'e benzer bir formül kullanarak derece/s'ye dönüştürmeniz gereken bir ADC değeri elde edeceksiniz. İvmeölçer için tanımladığımız 2. Jiroskop için ADC'den derece/s'ye dönüştürme formülünü tanıtalım (10bit ADC modülü kullandığımızı varsayıyoruz, 8bit ADC için 1023'ü 255 ile değiştirin, 12bit ADC için 1023'ü 4095 ile değiştirin).

RateAxz = (AdcGyroXZ * Vref / 1023 - VzeroRate) / Hassasiyet Eq.3 RateAyz = (AdcGyroYZ * Vref / 1023 - VzeroRate) / Hassasiyet

AdcGyroXZ, AdcGyroYZ - adc modülümüzden elde edilir ve R vektörünün izdüşümünün sırasıyla XZ düzlemlerinde YZ düzlemlerinde dönüşünü ölçen kanalları temsil eder, bu da sırasıyla Y ve X eksenleri etrafında dönme yapıldığını söylemeye eşdeğerdir.

Vref - aşağıdaki örnekte 3.3V kullanacağımız ADC referans voltajıdır VzeroRate - sıfır oranlı voltaj, başka bir deyişle jiroskopun herhangi bir dönüşe tabi olmadığında verdiği voltaj, Acc_Gyro kartı için örneğin 1.23V (bu değerleri özelliklerde bulabilirsiniz) Hassasiyet - jiroskopunuzun hassasiyetidir, mV / (derece / s) olarak ifade edilir, genellikle mV/deg/s olarak yazılır, temel olarak size kaç mV olacağını söyler Dönme hızını bir derece/sn artırırsanız, jiroskop çıkışı artar. Acc_Gyro kartının hassasiyeti örneğin 2mV/deg/s veya 0.002V/deg/s'dir.

Bir örnek alalım, ADC modülümüzün aşağıdaki değerleri döndürdüğünü varsayalım:

AdcGyroXZ = 571 AdcGyroXZ = 323

Yukarıdaki formülü kullanarak ve Acc_Gyro kartının özellik parametrelerini kullanarak şunları elde edeceğiz:

RateAxz = (571 * 3,3V / 1023 - 1,23V) / (0,002V/deg/s) =~ 306 derece/s RateAyz = (323 * 3,3V / 1023 - 1,23V) / (0,002V/deg/s) =~ -94 derece/s

Yani cihaz Y ekseni etrafında (veya XZ düzleminde döndüğünü söyleyebiliriz) 306 derece/sn hızla ve X ekseni etrafında (veya YZ düzleminde döndüğünü söyleyebiliriz) - hızıyla dönmektedir. 94 derece/s. Negatif işaretin, cihazın geleneksel pozitif yönden ters yönde döndüğü anlamına geldiğini lütfen unutmayın. Geleneksel olarak, bir dönüş yönü pozitiftir. İyi bir jiroskop teknik özellik sayfası size hangi yönün pozitif olduğunu gösterecektir, aksi takdirde cihazla deneyler yaparak ve hangi dönüş yönünün çıkış pininde artan voltaj ile sonuçlandığını not ederek onu bulmanız gerekecektir. Bu, en iyi şekilde bir osiloskop kullanılarak yapılır, çünkü dönüşü durdurur durdurmaz, voltaj sıfır oranlı seviyeye düşer. Bir multimetre kullanıyorsanız, en az birkaç saniye sabit bir dönüş hızı sağlamanız ve bu dönüş sırasında voltajı not etmeniz ve ardından sıfır oranlı voltajla karşılaştırmanız gerekir. Sıfır oranlı voltajdan büyükse, dönüş yönünün pozitif olduğu anlamına gelir.

Adım 3: İvmeölçer ve Gyro'yu Birleştirme

İvmeölçer ve Gyro'yu Birleştirme
İvmeölçer ve Gyro'yu Birleştirme

Hepsini bir araya getirmek - İvmeölçer ve jiroskop verilerini birleştirmek

Bu makaleyi okuyorsanız, muhtemelen bir IMU cihazı satın aldınız veya almayı planlıyorsunuz veya muhtemelen ayrı ivmeölçer ve jiroskop cihazlarından bir tane oluşturmayı planlıyorsunuz.

Bir ivmeölçer ve bir jiroskopu birleştiren bir kombinasyon IMU cihazı kullanmanın ilk adımı, koordinat sistemlerini hizalamaktır. Bunu yapmanın en kolay yolu, ivmeölçerin koordinat sistemini referans koordinat sisteminiz olarak seçmektir. Çoğu ivmeölçer veri sayfası, fiziksel çip veya cihazın görüntüsüne göre X, Y, Z eksenlerinin yönünü gösterecektir. Örneğin, Acc_Gyro kartının teknik özelliklerinde gösterildiği gibi X, Y, Z eksenlerinin yönleri şunlardır:

acc_gyro eksenleri
acc_gyro eksenleri

Sonraki adımlar şunlardır:

Yukarıda tartışılan RateAxz, RateAyz değerlerine karşılık gelen jiroskop çıkışlarını tanımlayın. Jiroskopun ivmeölçere göre fiziksel konumu nedeniyle bu çıkışların ters çevrilmesi gerekip gerekmediğini belirleyin

Bir jiroskopun X veya Y ile işaretlenmiş bir çıkışı varsa, bu çıkış bir IMU biriminin parçası olsa bile, ivmeölçer koordinat sistemindeki herhangi bir eksene karşılık geleceğini varsaymayın. En iyi yol test etmektir. Jiroskopun konumunu ivmeölçere göre sabitlediğinizi varsayarsak. Gyro ve ivmeölçer sınırlarının birbirine paralel olduğu varsayılır, yani jiroskopu ivmeölçer çipine göre 90 derecelik bir açıyla yerleştiriyorsunuz. Bir IMU yönetim kurulu aldıysanız, muhtemelen bu şekilde hizalanmışlardır. Bu makalede, jiroskopun ivmeölçere göre düzensiz bir açıyla (diyelim ki 45 veya 30 derece) yerleştirildiği modelleri tartışmayacağız, ancak bu bazı uygulamalarda faydalı olabilir.

Burada, jiroskopun hangi çıktısının yukarıda tartışılan RateAxz değerine karşılık geldiğini belirlemek için bir örnek dizi verilmiştir.

- cihazı yatay konuma getirerek başlayın. İvmeölçerin hem X hem de Y çıkışları sıfır g voltajı verir (örneğin Acc_Gyro kartı için bu 1.65V'dir)

- daha sonra cihazı Y ekseni etrafında döndürmeye başlayın, demenin başka bir yolu, cihazı XZ düzleminde döndürmenizdir, böylece X ve Z ivmeölçer çıkışları değişir ve Y çıkışı sabit kalır. - cihazı sabit bir hızda döndürürken hangi jiroskop çıkışının değiştiğini not edin, diğer jiroskop çıkışları sabit kalmalıdır - Y ekseni etrafında dönüş (XZ düzleminde dönüş) sırasında değişen jiroskop çıkışı, AdcGyroXZ için giriş değerini sağlayacaktır, bu değerden RateAxz'yi hesaplıyoruz - son adım, dönüş yönünün modelimize karşılık gelmesini sağlamaktır, bazı durumlarda jiroskopun ivmeölçere göre fiziksel konumu nedeniyle RateAxz değerini ters çevirmeniz gerekebilir - cihazı döndürerek yukarıdaki testi tekrar yapın Y ekseni, bu sefer ivmeölçerin X çıkışını izler (modelimizde AdcRx). AdcRx büyürse (yatay konumdan ilk 90 derecelik dönüş), AdcGyroXZ de büyümelidir. Aksi takdirde RateAxz'yi ters çevirmeniz gerekir, bunu aşağıdaki gibi Denklem 3'e bir işaret faktörü ekleyerek başarabilirsiniz:

RateAxz = InvertAxz * (AdcGyroXZ * Vref / 1023 - VzeroRate) / Hassasiyet, burada InvertAxz 1 veya -1

Aynı test, cihazı X ekseni etrafında döndürerek RateAyz için yapılabilir ve hangi jiroskop çıkışının RateAyz'e karşılık geldiğini ve ters çevrilmesi gerekip gerekmediğini belirleyebilirsiniz. InvertAyz değerine sahip olduğunuzda, RateAyz'i hesaplamak için aşağıdaki formülü kullanmalısınız:

RateAyz = InvertAyz * (AdcGyroYZ * Vref / 1023 - VzeroRate) / Duyarlılık

Bu testleri Acc_Gyro panosunda yaparsanız aşağıdaki sonuçları alırsınız:

- RateAxz için çıkış pini GX4 ve InvertAxz = -1'dir. - RateAyz için çıkış pini GY4 ve InvertAyz = -1

Bu noktadan itibaren, IMU'nuzu Axr, Ayr, Azr (Bölüm 1'de tanımlandığı gibi) ve RateAxz, RateAyz (Bölüm 2'de tanımlandığı gibi) için doğru değerleri hesaplayabileceğiniz şekilde ayarladığınızı düşüneceğiz.). Daha sonra, cihazın yer düzlemine göre eğiminin daha doğru tahminini elde etmede faydalı olan bu değerler arasındaki ilişkileri analiz edeceğiz.

Bu noktada kendinize şu soruyu soruyor olabilirsiniz, eğer ivmeölçer modeli bize zaten Axr, Ayr, Azr'ın eğim açılarını verdiyse, neden jiroskop verileriyle uğraşmak isteyelim ki? Cevap basit: ivmeölçer verilerine her zaman %100 güvenilemez. İvmeölçerin atalet kuvvetini ölçtüğünün birkaç nedeni vardır, böyle bir kuvvete yerçekimi (ve ideal olarak yalnızca yerçekimi) neden olabilir, ancak cihazın hızlanmasından (hareketinden) de kaynaklanabilir. Sonuç olarak, ivmeölçer nispeten kararlı bir durumda olsa bile, genel olarak titreşime ve mekanik gürültüye karşı hala çok hassastır. Çoğu IMU sisteminin herhangi bir ivmeölçer hatasını düzeltmek için bir jiroskop kullanmasının ana nedeni budur. Ama bu nasıl yapılır? Ve jiroskop gürültüsüz mü?

Jiroskop gürültüden muaf değildir, ancak dönüşü ölçtüğü için doğrusal mekanik hareketlere, ivmeölçerin maruz kaldığı gürültü türüne daha az duyarlıdır, ancak jiroskopların örneğin kayma (sıfır oran değerine geri dönmeme) gibi başka sorunları vardır. dönme durduğunda). Bununla birlikte, ivmeölçer ve jiroskoptan gelen verilerin ortalamasını alarak, yalnızca ivmeölçer verilerini kullanarak elde edebileceğimizden görece daha iyi bir mevcut cihaz eğimi tahmini elde edebiliriz.

Sonraki adımlarda Kalman filtresinde kullanılan bazı fikirlerden esinlenen bir algoritma tanıtacağım, ancak gömülü cihazlarda uygulanması çok daha basit ve daha kolay. Önce algoritmamızın neyi hesaplamasını istediğimize bir bakalım. Axr, Ayr, Azr veya cosX, cosY, cosZ gibi diğer değerleri türetebileceğimiz yerçekimi kuvveti vektörü R = [Rx, Ry, Rz] yönü, bize cihazımızın eğimi hakkında bir fikir verecek. yer düzlemine göre, bu değerler arasındaki ilişkiyi Kısım 1'de tartışıyoruz. Biri şöyle diyebilir: Kısım 1'de Denk.2'den Rx, Ry, Rz bu değerlere zaten sahip değil miyiz? Evet, ancak bu değerlerin yalnızca ivmeölçer verilerinden türetildiğini unutmayın, bu nedenle bunları doğrudan uygulamanızda kullanacak olursanız, uygulamanızın tolere edebileceğinden daha fazla gürültü alabilirsiniz. Daha fazla karışıklığı önlemek için ivmeölçer ölçümlerini aşağıdaki gibi yeniden tanımlayalım:

Racc - aşağıdaki bileşenlerden (X, Y, Z eksenlerinde izdüşümler) oluşan, ivmeölçer tarafından ölçülen atalet kuvveti vektörüdür:

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

Şimdiye kadar, tamamen ivmeölçer ADC değerlerinden elde edebileceğimiz bir dizi ölçülen değere sahibiz. Bu veri kümesine "vektör" diyeceğiz ve aşağıdaki gösterimi kullanacağız.

Racc = [RxAcc, RyAcc, RzAcc]

Racc'nin bu bileşenleri ivmeölçer verilerinden elde edilebildiği için, bunu algoritmamıza bir girdi olarak kabul edebiliriz.

Racc yerçekimi kuvvetini ölçtüğü için, aşağıdaki gibi tanımlanan bu vektörün uzunluğunun 1g'ye eşit veya yakın olduğunu varsayarsanız, doğru olacağınızı lütfen unutmayın.

|Racc| = SQRT(RxAcc^2 +RyAcc^2 + RzAcc^2), Ancak bu vektörü aşağıdaki gibi güncellemenin mantıklı olduğundan emin olmak için:

Racc(normalleştirilmiş) = [RxAcc/|Racc|, RyAcc/|Racc|, RzAcc/|Racc|].

Bu, normalleştirilmiş Racc vektörünüzün uzunluğunun her zaman 1 olmasını sağlayacaktır.

Sonra yeni bir vektör tanıtacağız ve onu arayacağız

Dinlenme = [RxEst, RyEst, RzEst]

Bu bizim algoritmamızın çıktısı olacaktır, bunlar jiroskop verilerine ve geçmiş tahmini verilere dayanan düzeltilmiş değerlerdir.

Algoritmamızın yapacağı şey şudur: - ivmeölçer bize şunu söyler: "Şu anda Racc konumundasınız" - "Teşekkür ederim ama bir kontrol edeyim" diyoruz, - sonra bu bilgiyi jiroskop verileriyle ve geçmiş Dinlenme verileriyle düzeltin ve yeni bir tahmini vektör Rest çıktısı alıyoruz. - Cihazın mevcut konumuyla ilgili olarak Rest'i "en iyi bahsimiz" olarak görüyoruz.

Nasıl çalıştırabileceğimize bir bakalım.

İvmeölçerimize güvenerek ve atayarak dizimize başlayacağız:

Dinlenme(0) = Racc(0)

Bu arada, Rest ve Racc'nin vektör olduğunu hatırlayın, bu nedenle yukarıdaki denklem 3 denklem seti yazmanın ve tekrardan kaçınmanın basit bir yoludur:

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

Daha sonra T saniyelik eşit zaman aralıklarında düzenli ölçümler yapacağız ve Racc(1), Racc(2), Racc(3) ve benzeri olarak tanımlayacağımız yeni ölçümler elde edeceğiz. Ayrıca Rest(1), Rest(2), Rest(3) vb. zaman aralıklarında yeni tahminler yayınlayacağız.

Adım n'de olduğumuzu varsayalım. Kullanmak istediğimiz bilinen iki değer grubumuz var:

Rest(n-1) - Rest(0) = Racc(0) Racc(n) ile önceki tahminimiz - mevcut ivmeölçer ölçümümüz

Rest(n) 'yi hesaplamadan önce, jiroskopumuzdan elde edebileceğimiz yeni bir ölçüm değeri ve önceki bir tahmin sunalım.

Buna Rgyro diyeceğiz ve aynı zamanda 3 bileşenden oluşan bir vektördür:

Rgyro = [RxGyro, RyGyro, RzGyro]

Bu vektörü her seferinde bir bileşen hesaplayacağız. RxGyro ile başlayacağız.

cayro modeli
cayro modeli

Jiroskop modelimizde aşağıdaki ilişkiyi gözlemleyerek başlayalım, Rz ve Rxz'nin oluşturduğu dik açılı üçgenden şunu çıkarabiliriz:

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

Atan2 daha önce hiç kullanmadığınız bir işlev olabilir, atan'a benzer, ancak atan tarafından döndürülen (-PI/2, PI/2) yerine (-PI, PI) aralığındaki değerleri döndürmesi ve Bir yerine 2 argüman. Rx, Rz'nin iki değerini 360 derecelik (-PI'den PI'ye) tam aralıktaki açılara dönüştürmemize izin verir. atan2 hakkında daha fazlasını buradan okuyabilirsiniz.

Yani RxEst(n-1) ve RzEst(n-1) 'i bilerek şunları bulabiliriz:

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

Jiroskopun Axz açısının değişim oranını ölçtüğünü unutmayın. Böylece yeni Axz(n) açısını aşağıdaki gibi tahmin edebiliriz:

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

RateAxz'nin jiroskop ADC okumalarımızdan elde edilebileceğini unutmayın. Daha kesin bir formül, aşağıdaki gibi hesaplanan bir ortalama dönüş hızını kullanabilir:

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

Aynı şekilde bulabiliriz:

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

Tamam, şimdi elimizde Axz(n) ve Ayz(n) var. Buradan RxGyro/RyGyro'yu çıkarmak için nereye gideceğiz? Denklem'den 1 Rgyro vektörünün uzunluğunu aşağıdaki gibi yazabiliriz:

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

Ayrıca Racc vektörümüzü normalleştirdiğimiz için uzunluğunun 1 olduğunu ve dönüşten sonra değişmediğini varsayabiliriz, bu nedenle yazmak nispeten güvenlidir:

|Rgyro| = 1

Aşağıdaki hesaplamalar için geçici olarak daha kısa bir gösterim kabul edelim:

x =RxGyro, y=RyGyro, z=RzGyro

Yukarıdaki bağıntıları kullanarak şunları yazabiliriz:

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

Kesrin payını ve paydasını SQRT(x^2 + z^2) ile bölelim

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

x / SQRT(x^2 + z^2) = sin(Axz) olduğuna dikkat edin, yani:

x = günah(Axz) / SQRT (1 + y^2 / (x^2 + z^2))

Şimdi SQRT içindeki kesrin payını ve paydasını z^2 ile çarpın

x = günah(Axz) / SQRT (1 + y^2 * z ^2 / (z^2 * (x^2 + z^2)))

z / SQRT(x^2 + z^2) = cos(Axz) ve y / z = tan(Ayz) olduğuna dikkat edin, son olarak:

x = günah(Axz) / SQRT (1 + cos(Axz)^2 * tan(Ayz)^2)

Notasyonumuza geri dönersek, şunu elde ederiz:

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

aynı şekilde onu buluyoruz

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

Şimdi, nihayet bulabiliriz:

RzGyro = İşaret(RzGyro)*SQRT(1 - RxGyro^2 - RyGyro^2).

RzGyro>=0 olduğunda Sign(RzGyro) = 1 ve RzGyro<0 olduğunda Sign(RzGyro) = -1 olduğunda.

Bunu tahmin etmenin basit bir yolu şudur:

İşaret(RzGyro) = İşaret(RzEst(n-1))

Pratikte RzEst(n-1) 0'a yakın olduğunda dikkatli olun. Bu durumda gyro aşamasını tamamen atlayabilir ve atayabilirsiniz: Rgyro = Rest(n-1). Rz, Axz ve Ayz açılarının hesaplanmasında referans olarak kullanılır ve 0'a yakın olduğunda değerler taşabilir ve kötü sonuçları tetikleyebilir. tan() / atan() işlev uygulamalarının hassasiyetten yoksun olabileceği büyük kayan noktalı sayıların etki alanında olacaksınız.

Şimdi elimizdekileri özetleyelim, algoritmamızın n adımındayız ve aşağıdaki değerleri hesapladık:

Racc - Rgyro ivmeölçerimizden elde edilen akım okumaları - Rest(n-1) ve akım jiroskop okumalarından elde edilir

Güncellenen Rest(n) tahminini hesaplamak için hangi değerleri kullanıyoruz? Muhtemelen ikisini de kullanacağımızı tahmin etmişsinizdir. Ağırlıklı bir ortalama kullanacağız, böylece:

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

Bu formülü, kesrin hem payını hem de paydasını w1'e bölerek sadeleştirebiliriz.

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

ve w2/w1 = wGyro değiştirdikten sonra şunu elde ederiz:

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

Yukarıdaki forumda wGyro, ivme ölçerimize kıyasla jiroskopumuza ne kadar güvendiğimizi anlatıyor. Bu değer deneysel olarak seçilebilir, genellikle 5..20 arasındaki değerler iyi sonuçları tetikleyecektir.

Bu algoritmanın Kalman filtresinden temel farkı, bu ağırlığın nispeten sabit olmasıdır, oysa Kalman filtresinde ağırlıklar, ivmeölçer okumalarının ölçülen gürültüsüne göre kalıcı olarak güncellenir. Kalman filtresi size "en iyi" teorik sonuçları vermeye odaklanırken, bu algoritma pratik uygulamanız için "yeterince iyi" sonuçlar verebilir. Ölçtüğünüz bazı gürültü faktörlerine bağlı olarak wGyro'yu ayarlayan bir algoritma uygulayabilirsiniz, ancak sabit değerler çoğu uygulama için iyi sonuç verecektir.

Güncellenmiş tahmini değerlerimizi almaktan bir adım uzaktayız:

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

Şimdi bu vektörü tekrar normalleştirelim:

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

Ve tekrar döngüyü tekrarlamaya hazırız.

Bu kılavuz başlangıçta starlino.com'da yayınlandı, birkaç hafif düzenleme yaptım ve izin alarak yeniden yayınladım. Teşekkürler Starlino!

Önerilen: