Manyetometre dinamik kalibrasyonu


19

IMU'nun bir parçası olan AK8975 manyetometresi üzerinde çalışıyorum. Bu benim için çok zor görünüyor. Bu çip, dünyanın herhangi bir yerinde veya yakınındaki herhangi bir yerde manyetik alanı tanımlayan bir çıktı olarak 3B vektör verir.

İki tür başlık hesaplama algoritması denedim: Biri basit arctan(-y/x)ve diğeri eğim (adım) ve banka (rulo) iptal edilen matematik aşağıda belirtildiği gibi. Hem eğim hem de bankalar yanlış çıktı verir.

İki algosun herhangi birini kullanarak zemin planını yatay olarak tutarak döndürüldüğünde yeryüzünden doğru pozisyonu alabilirim (basit açık çalışma kaynaklarını kullanarak).

Yumuşak ve sert demir hataları için kalibrasyon yapmayı denedim. 3D olarak çizebilir ve mükemmel bir 3D küre gösterir. Hala eğim veya eğim üzerinde çalışmaz.

Herhangi bir işaretçi yardımcı olacaktır.

Kod ve uygulamaları aşağıdaki gibidir:

void Compass_Heading()
{
  double MAG_X;
  double MAG_Y;
  double cos_roll;
  double sin_roll;
  double cos_pitch;
  double sin_pitch;

  cos_roll = cos(roll);
  sin_roll = sin(roll);
  cos_pitch = cos(pitch);
  sin_pitch = sin(pitch); 

  //// Tilt compensated Magnetic filed X:
  MAG_X = magnetom_x*cos_pitch + magnetom_y*sin_roll*sin_pitch + magnetom_z*cos_roll*sin_pitch;
  //// Tilt compensated Magnetic filed Y:
  MAG_Y = magnetom_y*cos_roll-magnetom_z*sin_roll;
  //// Magnetic Heading


  MAG_Heading = atan2(-MAG_Y, MAG_X) ;

}

Nerede magnetom_x, #_yve #_zaslında Magnetometer RAW değerleridir 3D vektörü bileşenleridir. yuvarlanma ve zift , yerleşik ivmeölçer ve jiroskoptan gelen gizemli bir Kalman-filtre çıktısındandır. Bu üç sensör ATAVRSBIN1'de . Rulo ve perde bu aşamaya kadar tamam.

Şimdi journal_of_sensors_renaudin et al_2010c.pdf'ye göre basit bir başlık hesaplaması MAG_Heading = atan2(-magnetom_y, magnetom_x) ;yukarıdaki gibi ve tazminatla yapılmış olmalıdır .

Genel kod sadece AÇIK AHRS'den alınmıştır .


Rulo, Pitch ve Yaw biçimindeki veriler. Cihazı sadece elimle döndürdüm. İlk üçü sırasıyla sadece Roll, Pitch ve Yaw üzerinde yoğunlaşmıştır. Kalan ikisi ilk önce cihazı X boyunca yaklaşık 45 derece döndürür (Haddelenmiş), daha sonra Magnetometrenin yerel Z'si boyunca döndürülür. Daha sonra aynı, Y boyunca yaklaşık 45 Derece dönüşle (eğimli) sonra Magnetometrenin yerel Z'si boyunca döndürülür.

Grafikler -180 ila 180 derece aralığında çizildi.

Rulo Bir dosyadaki derece cinsinden açılar Rulodaki YAW özellikleri.

Saha Bir dosyadaki derece cinsinden açılar Pitch'teki YAW özellikleri.

rotadan çıkmak Bir dosyadaki derece cinsinden açılar Yaw'ın kendisindeki YAW özellikleri.

45 derece eğimli yaw (haddelenmiş) Bir dosyadaki derece cinsinden açılar Yaw'daki YAW özellikleri 45 derece yuvarlanmış.

45 derece yaw witt (perdeli) Bir dosyadaki derece cinsinden açılar 45 derece eğimli yaw üzerindeki YAW özellikleri.

Not: Son 2 resim için: İlk önce ev konumunda tutulur, bu herkes için aynıdır (txt dosyalarına bakın). Sonra 45 derece yuvarlandıktan sonra düzlem cihazı (manyetometre ile) kullanılarak Manyetometrenin Z ekseni boyunca döndürülmüştür.

Benzer şekilde, son görüntü için cihaz, Manyetometrenin Z ekseni boyunca 45 derece eğimlidir.

Umarım bunlar sorunumu çözmemize yardımcı olur.


Yeni gelişmeler şöyle:

Başlıkta biraz çalıştım. Aşağıdaki çıktıyı aldım. Rulo cSV

Saha cSV

rotadan çıkmak cSV



henüz cevap yok !!

4
Uygulamaya çalıştığınız matematiği ve bunu uygulamak için kullandığınız kodu gösterirseniz daha fazla yanıt alacağınızı düşünüyorum. "İşe yaramıyor, yardım etmekten" başka türlü devam etmemiz için çok az şey var - sorunuz bu şekilde okuyor. Afedersiniz!
Martin Thompson

Manyetometre kullanımı, nispeten az sayıda insanın uzmanlık kazanacağı çok özel bir alandır. Sorunuzu birkaç kez okurken, neyin yanlış olduğundan hala emin değilim. "Yanlış çıktı" verdiğini söylüyorsunuz ama bu oldukça belirsiz. Belki bazı sayısal örnekler?
Jason R

1
Bu, sensör çıkışlarının nasıl yorumlanacağı veya sensörün sağladığı x, y, z vektöründen navigasyon açısından faydalı önlemlerin nasıl hesaplanacağıyla ilgili bir soru mu? Ölçümleriniz aynı sensörün başka bir örneğiyle tekrarlanabilir mi?
vicatcu

1
@Rahul - Bunun daha fazla dikkat çekmemesine şaşırdım!
Kevin Vermeer

Yanıtlar:


8

Grafiklerini beğendim. Rulo, zift ve yalpalamanın işe yaradığını açıkça gösteriyorlar. Tebrikler! Bu zaten çoğu insanın kaydettiğinden daha fazla ilerleme.

Sunulan kod beklediğiniz MAG_Heading değeri farklı "yanlış" MAG_Heading değeri hesaplıyor olduğunu tahmin ediyorum.

Bize verdiyseniz size yardımcı olmak çok daha kolay olurdu: (Bu, " Soruları Akıllı Şekilde Nasıl Sorulur" bölümünün " belirtileri tanımlayın" bölümüdür )

  • AK8975 zaman içinde bir tek bir noktada çıkış değerleri m_x manyetometresi, m_y ve m_z.
  • Aynı anda eğim ve yuvarlanma değerleri
  • bu değerlerden hesaplandığı iddia edilen yanlış MAG_Heading çıktı değeri
  • doğru MAG_Heading'in olmasını beklediğiniz

Bu yüzden belki de kendim için yarattığım aynı problemlerle karşılaştığınızı düşünmeye devam ediyorum :-).

  • Sin () ve cos () ve atan2 () işlevleriniz hangi açı biçimini bekliyor? Biçim aralığı ve rulo arasında bu biçime depolanan bir tür dönüştürme yapmanız mı gerekiyor? Bu formattan MAG_heading'e ihtiyacınız olana dönüştürmeniz mi gerekiyor? (sütyen, derece veya radyan? kayan nokta veya sabit nokta?)
  • Ham m_x, m_y, m_z değerlerinde çıkarılması gereken bir denge var mı?
  • Tüm parçalar kodun varsaydığı şekilde dizilmiş mi? Özellikle, eğim ve yuvarlanma ekseni manyetometre ekseni ile hizalanmış mı? (M_x'in rulo ekseni boyunca ileriye dönük olması gerekiyor mu? M_y, eğim ekseni boyunca sağa dönük olmalıdır?)
  • Belki bu koda girmeden önce bir sensör değeri veya başka bir - belki m_z - reddedilmelidir?
  • Belki de bu kod, iç değerlerini bozan bir kesme veya başka bir kesme tarafından kesiliyor mu? Birisinin bir kesme rutinine "bölme" yaptıktan sonra, programın diğer her yerinde her trig fonksiyon hesaplamasının sıklıkla yanlış sonuç vereceği farklı bir projeyi hatırlıyorum.
  • Belki bu kadar sık ​​aralıklarla tetikleme kesintileri bu kod aslında hiç bitmiyor?

Başka yerlerde çok benzer kodu tartışan başka insanlar var gibi görünüyor: http://diydrones.com/forum/topics/heading-from-3d-magnetometer ; http://diydrones.ning.com/profiles/blogs/dcm-imu-theory-first-draft ; http://aeroquad.com/showthread.php?1138-REVOLUTION!!!-New-IMU !!! ; http://www.rcgroups.com/forums/showthread.php?t=1436742&page=6 ; http://aeroquad.com/showthread.php?691-Hold-your-heading-with-HMC5843-Magnetometer ; vb.


Şimdi gördüm .. Geri döneceğim.
Rick2047

\ 1 / [Roll, pitch, yaw ve (Mx, My, Mz)] için bir csv dosyası oluşturuyorum. \ 2 / MAG_Heading'in en az iki ardışık çeyreğe kadar yuvarlanma ve eğim değişikliği ile değişmemesi bekleniyor. Başlık, eğer NE istikametinde ise, eğer eğim için yukarı veya aşağı dönüş yönlerinde ufuktan 90 dereceyi geçinceye kadar NE'yi göstermeye devam etmeli ve bankacılık veya kombinasyon durumunda aynı olmalıdır.
Rick2047

\ 3 / Tüm dahili hesaplamalar radyan cinsinden yapılmıştır ve tüm consine işlevleri yalnızca radyan beklemektedir. Görüntüleme için sadece değerler kopyalanır ve dereceye dönüştürülür. \ 4 / Kayan nokta. \ 5 / Tüm sensörler hizalanmış ve SENSOR_SIGN [9] kullanarak hizalama için tüm olası ilgili kombinasyonlar denenmiştir.
Rick2047

Burada tüm grafikler için \ 1 / burada karşılık gelen csv dosyaları ekledim. Yoksa başka bir şey istedin. Bu iyi yanıt için teşekkürler. :) Çaba ve zamanımın izin verdiği ölçüde "Akıllı Yolda Sorular Nasıl Sorulur" ifadesini uygulayacağım. :)
Rick2047

\ 1 / Bunun yerine [Roll, pitch, yaw ve (Mx, My, Mz) (başlık, sapma)] için çalışacağım.
Rick2047

1

Uygulama notu LSM303 için sorununuza uygulanabilir eğim karşılamalı pusula kalibre için yararlı bir rehber vardır. Oldukça ayrıntılı, aksi takdirde burada hesaplamaları tekrar yazardım. Manyetik alan çizgilerinin ekseni etrafında bir dönüş olarak ivmeölçer değerlerinin tam adım, yuvarlanma ve sapma hesaplamaları için gerekli olduğunu unutmayın. Manyetometre değerlerinde değişiklik olmaz. Aynı şekilde ivmeölçerle yerçekimi için.


Bağlantı aynı denklemde farklı işaretler gösteriyor. Diğer tüm kombinasyonları deneyeceğim.
Rick2047
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.