Manyetometre ∞ şekilli kalibrasyon


15

Cep telefonlarında ve 3 eksenli elektronik pusula kullanan diğer cihazlarda, manyetometreyi bu videolarda gösterildiği gibi kalibre etmek için ∞ / 8 / S şekilli bir hareket kullanılır .

Bu hareket neden yapılır, teori nedir ve herkes onu uygulamak için bazı örnek C kodu verebilir mi?

Daha fazla bilgi içeren başka bir benzer sorumdan geçmelisiniz.


Bu soru için bazı ek bilgiler: Platform, AVR Studio 5 kullanan 8 bitlik AtMega32'dir.

Şimdiye kadar denedim: Ortalamayı şekil veren Magnetometrenin vektör değerlerinin 2'sine bölmeyi denedim . Düşünme, ofsetlerin hesaplanmasında yardımcı olabilir. Şeklin iki özdeş bölümünün / kenarının dünyanın manyetik alanını nasıl iptal ettiğini ve ofset değerlerini verdiğini düşünüyorum. Yanlış olabilirim. Ama özellikle şekle dayalı kalibrasyon için şu anda buradayım. Kalibrasyonun bu şekilde çalıştığını düşünüyorum. Fikir, bunun bu şekilde işe yaradığını öğrenmek mi?


Ofsetleri hesaplayabileceğim kodu tamamlayın ve daha sonra sadece Ham manyetik 3B vektöründen çıkartın. Tamamen yanlış olabilirim ve nasıl çalıştığına dair bir fikrim yok. Video ve kürenin üzerine çizilen verilerden sonra, bir şekilde düşüncemi hızlandırdım ve bu düşünceyi denklem formunda kullandım. B)

Kod:

Read_accl();Ve Read_magnato(1);işlevleri sensör verileri okuyor. Umarım kod kendi kendini açıklar. Bilge ppl umut kesinlikle çok daha iyi şekillerde kullanıyor olacak. : \

void InfinityShapedCallibration()
{
    unsigned char ProcessStarted = 0;
    unsigned long cnt = 0; 

    while (1)
    {

            Read_accl();

            // Keep reading Acc data
            // Detect Horizontal position
            // Detect Upside down position
            // Then detect the Horizontal position again.
            // Meanwhile an infinity shaped movement will be created.
            // Sum up all the data, divide by the count, divide by 2 .
            // !We've offsets.          

                if (ProcessStarted!=3)
                {
                //
                    //USART_Transmit_String("\r");
                    //rprintfFloat(4, g_structAccelerometerData.accx_RAW);
                    //USART_Transmit_String(",");
                    //rprintfFloat(4, g_structAccelerometerData.accy_RAW);
                    //USART_Transmit_String(",");
                    //rprintfFloat(4, g_structAccelerometerData.accz_RAW);

                }


            if (
             abs( g_structAccelerometerData.accx_RAW) < 100 
            && abs(g_structAccelerometerData.accy_RAW) < 100 
            && g_structAccelerometerData.accz_RAW < -350 
            && ProcessStarted != 2 && ProcessStarted != 3 && ProcessStarted != 1 )
            {
                ProcessStarted = 1; 
            }   

            if (ProcessStarted==1)
            { 

            Read_magnato(1);

                structMagnetometerOffsetDataToEEPROM.Off_X += g_structMegnetometerData.magx_RAW;
                structMagnetometerOffsetDataToEEPROM.Off_Y += g_structMegnetometerData.magy_RAW;
                structMagnetometerOffsetDataToEEPROM.Off_Z += g_structMegnetometerData.magz_RAW;

                cnt++;

            }               
                if ( g_structAccelerometerData.accz_RAW > 350 
                && ProcessStarted==1)
                {
                    ProcessStarted = 2; 
                }

                if ( g_structAccelerometerData.accz_RAW < -350 
                && ProcessStarted == 2 )
                {
                    ProcessStarted=3; 
                    structMagnetometerOffsetDataToEEPROM.Off_X /= cnt;
                    structMagnetometerOffsetDataToEEPROM.Off_X /= 2;

                    structMagnetometerOffsetDataToEEPROM.Off_Y /= cnt;
                    structMagnetometerOffsetDataToEEPROM.Off_Y /= 2;

                    structMagnetometerOffsetDataToEEPROM.Off_Z /= cnt;
                    structMagnetometerOffsetDataToEEPROM.Off_Z /= 2;  

                    UpdateOFFSETDATAinEEPROM();  

                    break;

                } 
    }   
} 

Bu ofsetleri aldıktan sonra bunları aşağıdaki gibi kullandım:

void main()
{
...

Read_magnato(1);
        g_structMegnetometerData.magx_RAW -= structMagnetometerOffsetDataToEEPROM.Off_X ;
        g_structMegnetometerData.magy_RAW -= structMagnetometerOffsetDataToEEPROM.Off_Y ;
        g_structMegnetometerData.magz_RAW -= structMagnetometerOffsetDataToEEPROM.Off_Z ;
...
}

Bahsettiğim gibi.


2
Bu sorunun çok yardıma ihtiyacı var. Programlama konusunda yardıma mı ihtiyacınız var? Manyetometreler hakkında teori? Hangi platform? Ne denediniz veya baktınız?
Kellenjb

şekil 8 sadece kalibrasyonu başlatmak için bir jest değil midir?
geometrikal

1
Ppl'in neden robotmuş gibi davrandığını bilmiyorum. Aynı iş için bir link verdim. Bu konuda çok çalıştım ve sadece bilmeden, sadece oy verin. Belirsiz sorum yüzünden sorum düştüğünde nefret ediyorum. Lütfen oylamadan hemen önce neyin gerekli olduğunu sorun. Gerçekten çıktı almak için ölüyorum ve ppl oy vermeden önce bile düşünmüyorum. Kötü hissettiriyor ve beni doğru yönde çalışmaya yönlendirmeye çalışıyor. Lütfen, oyların her iki tarafında da yardıma ihtiyacım yok.
Rick2047

1
@Kellenjb: Basit bir 8 bitlik atmega32 kullanarak IMU üzerinde çalışıyorum. Üzerinde çalışmayı ve 32bit uC'nin iğne yerine kılıç kullanmak gibi bir sonuca vardığını denedim. (Bilmem için özür dilerim :)) Manyetometrenin tüm RAW değerlerini toplamaya çalıştım. Sonra girişlerin hiçbirine bölün. Düşünme, ofseti hesaplamada yardımcı olabilir. Şeklin iki özdeş kısmının / kenarlarının, dünyanın manyetik alanını iptal etmenin ve ofset değerlerinin verilmesinin bir kısmı olduğunu düşünüyorum. Yanlış olabilirim. Ama özellikle şekle dayalı kalibrasyon için şu anda buradayım. Sanırım ...
Rick2047

1
Sorun soru ile değil, bu sitedeki soruları basitçe düşürecek olan kişi sayısıyla ilgili. Eğer bilmiyorsanız, yalnız bırakın!
Chris Stratton

Yanıtlar:


21

8 / S şeklindeki desen, cep telefonlarındaki ve diğer cihazlardaki manyetometreleri kalibre etmek için kullanılır.

Arka fon

Tipik cep telefonu dönemi manyetometreleri üç dikey eksen boyunca manyetik alan gücünü ölçer, örneğin:

m=mxben^+myȷ^+mzk^

Tarafından verilen alanın büyüklüğü ile,

m=mx2+my2+mz2

ve her eksenden dönme açısı

θk=marul-1mkm, nerede k[x,y,z]

ayarlama

mxmymz

İdeal olarak şöyle görünmelidir:

küre

Bununla birlikte, sert ve yumuşak demir etkileri ve diğer bozulmalar nedeniyle, deforme olmuş bir küreye benziyor:

deforme

Bunun nedeni, sensör tarafından ölçülen manyetik alanın büyüklüğünün oryantasyonla değişmesidir. Sonuç, yukarıdaki formüllere göre hesaplandığında manyetik alanın yönünün gerçek yönden farklı olmasıdır.

Kalibrasyon, üç eksenli okumaların her birini, büyüklük yönüne bakılmaksızın sabit olacak şekilde ayarlamak için yapılmalıdır - deforme olmuş kürenin mükemmel bir küre şeklinde bükülmesi gerektiğini düşünebilirsiniz. LSM303 uygulama notu bu nasıl gerçekleştirileceği ayrıntıları talimatlar çok vardır.

Peki ya şekil 8 modeli !?

Şekil 8 modelinin gerçekleştirilmesi, yukarıdaki deforme olmuş kürenin bir kısmını 'izler'. Elde edilen koordinatlardan, kürenin deformasyonu ve elde edilen kalibrasyon katsayıları tahmin edilebilir. İyi bir model, en büyük yönelimleri izleyen ve dolayısıyla gerçek sabit büyüklükten en büyük sapmayı tahmin eden modeldir.

Deforme olmuş kürenin şeklini tahmin etmek için, en küçük kareler elips bağlantı elemanı kullanılabilir. LSM303 uygulama notunda da bu konuda bilgi bulunur.

Temel kalibrasyon için basit bir yöntem

Uygulama notuna göre, herhangi bir yumuşak demir bozulması olmadığını varsayarsanız, deforme olmuş küre eğilmez. Bu nedenle temel bir kalibrasyon için basit bir yöntem mümkün olabilir:

  • Her eksen için maksimum ve minimum değeri bulun ve 1/2 aralığı ve sıfır noktasını alın

rk=12(maksimum(mk)-min(mk))

zk=maksimum(mk)-rk

  • Her eksen ölçümünü kaydırın ve ölçeklendirin

mk'=mk-zkrk

  • hariç değerleri daha önce olduğu gibi hesaplayınmk'

Bu, burada bulunan kodu temel alır .

En küçük kareler kullanarak çözme

En küçük kareleri kullanarak çözmek için MATLAB kodu aşağıda gösterilmiştir. Kod mag, sütunların xyz değerleri olduğu bir değişkeni varsayar .

H = [mag(:,1), mag(:,2), mag(:,3), - mag(:,2).^2, - mag(:,3).^2, ones(size(mag(:,1)))];
w = mag(:,1).^2;
X = (H'*H)\H'*w;
offX = X(1)/2;
offY = X(2)/(2*X(4));
offZ = X(3)/(2*X(5));
temp = X(6) + offX^2 + X(4)*offY^2 + X(5)*offZ^2;
scaleX = sqrt(temp);
scaleY = sqrt(temp / X(4));
scaleZ= sqrt(temp / X(5));

Dinamik bir şekil 8 kalibrasyonu yapmak için, her yeni okumada en küçük kareler rutinini çalıştırabilir ve ofset ve ölçek faktörleri stabil hale geldiğinde sonlanabilir.

Dünya'nın Manyetik Alanı

Dünya'nın manyetik alanı genellikle yüzeye paralel değildir ve büyük bir aşağı bileşen olabilir.


Merhaba, Bu, şekil 8 desen sorununun yolunu temizlemek için yapmış olduğunuz kayda değer bir çaba.Şimdi daha önceki çalışmalarımdan bazılarını mevcut çalışmalara bağlayabilirim. sadece soru; HABERLER 8 şeklini yaptıktan sonra çıkış verilerini kullanarak doğru şekilde gösterilir, daha sonra tüm vektörlerin ortalamasının yarısını alır. Şaşırtıcı bir şekilde yatay plan (fluke ile) için çalışıyor. 8 şekli algo üzerinde çalışmaya başladım. "En Küçük Meydan" dan sonra geri döneceğim.
Rick2047

... Benim durumumda da küre Z ekseni üzerinde deforme olmuş gibi görünüyor. Çizilen 3D küre üzerindeki Sert ve Yumuşak Demir etkisinin farkında olduğumu lütfen unutmayın. 3D'ye tekrar çizmeye çalışacağım. Hadi görelim.
Rick2047

@ Rahul2047 Umarım doğru olur, ama bu benim için anlamlı. Yaptığım bir enstrüman için benzer bir kalibrasyon yapmam gerekiyor, ancak henüz kodu uygulamak için henüz yeterli değilim.
geometrikal

Merak ediyorum, genellikle sadece yatay düzlemde yön ile ilgilenen telefonlar için, basit bir hareket gerekli tüm noktaları kapsar. Matlab kullanıyor musunuz? Uygun olanı orada yapmak kolaydır. En küçük kareler hata ölçüm yöntemini ifade eder.
geometrikal

1
Bu makaledeki resim bağlantılarından bazıları bozuldu - resimleri yeniden ekleyebilir misiniz? SE artık gelecekteki kırılmaları önlemek için görüntüleri yükleyen ve yerel olarak saklayan bir işleve sahiptir. Teşekkürler!
Yeni İskenderiye
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.