Magnetometer ∞ kalibrasi berbentuk


15

Pada ponsel dan perangkat lain yang menggunakan kompas elektronik 3-sumbu, gerakan berbentuk ∞ / 8 / S digunakan untuk mengkalibrasi magnetometer seperti yang ditunjukkan dalam video ini .

Mengapa gerakan ini dilakukan, apa teorinya, dan adakah yang bisa memberikan beberapa contoh kode C untuk mengimplementasikannya?

Anda harus melalui pertanyaan serupa saya yang lain yang berisi lebih banyak info.


Beberapa info tambahan untuk pertanyaan khusus ini: Platformnya adalah 8-bit AtMega32, menggunakan AVR Studio 5.

Sampai sekarang saya sudah mencoba: Saya mencoba membagi rata dengan 2 nilai vektor dari Magnetometer membuat bentuk. Berpikir mungkin membantu dalam menghitung offset. Saya pikir beberapa bagaimana dua bagian / sisi identik dari bentuk membatalkan medan magnet bumi dan memberikan nilai offset. Saya mungkin salah. Tetapi khususnya untuk kalibrasi berbasis bentuk, inilah saya saat ini. Saya pikir kalibrasi berhasil dengan cara ini. Idenya adalah untuk mengetahui apakah itu berhasil seperti ini?


Ok kode dimana saya dapat menghitung offset dan kemudian cukup kurangi dari vektor 3D magnetik mentah. Saya mungkin benar-benar salah dan tidak memiliki penjelasan bagaimana cara kerjanya. Melihat setelah video dan data diplot pada bola, entah bagaimana telah mempercepat pemikiran saya dan saya menggunakan pemikiran itu dalam bentuk persamaan. B)

Kode:

Fungsi Read_accl();dan Read_magnato(1);membaca data sensor. Saya harap kode ini cukup jelas. Berharap ppl bijaksana akan menggunakan ini dengan cara yang jauh lebih baik. : \

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;

                } 
    }   
} 

Setelah mendapatkan offset ini, saya menggunakannya sebagai berikut:

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 ;
...
}

Seperti yang saya sebutkan.


2
Pertanyaan ini membutuhkan banyak bantuan. Apakah Anda memerlukan bantuan pemrograman? Teori tentang magnetometer? Platform apa? Apa yang sudah Anda coba atau lihat?
Kellenjb

bukankah angka 8 hanyalah isyarat untuk memulai kalibrasi?
geometrikal

1
Saya tidak tahu mengapa ppl berperilaku seolah-olah mereka adalah robot. Saya telah memberikan tautan untuk pekerjaan yang sama. Saya banyak bekerja pada hal itu dan ppl tanpa tahu, cukup memilih itu. Saya benci ketika pertanyaan saya turun karena pertanyaan saya tidak jelas. Tolong tanyakan apa yang dibutuhkan sebelum memilih. Saya benar-benar ingin mendapatkan hasil dan bahkan tidak berpikir sebelum memilihnya. Rasanya tidak enak dan mencoba mengalihkan saya dari bekerja ke arah yang benar. Tolong, saya butuh bantuan untuk tidak memilih salah satu pihak.
Rick2047

1
@Kellenjb: Saya sedang mengerjakan IMU menggunakan atmega32 8-bit sederhana. Saya mencoba mengerjakannya dan menyimpulkan bahwa 32bit uC seperti menggunakan pedang sebagai ganti jarum. (Maaf untuk teka-teki saya :)) Saya mencoba menjumlahkan semua nilai RAW dari Magnetometer yang membuat bentuk. Kemudian bagi dengan tidak ada input. Berpikir dapat membantu menghitung offset. Saya pikir beberapa bagaimana dua bagian / sisi bentuk yang identik adalah bagaimana membatalkan medan magnet bumi dan memberikan nilai offset. Saya mungkin salah. Tetapi khususnya untuk kalibrasi berbasis bentuk, inilah saya saat ini. Saya pikir ...
Rick2047

1
Masalahnya bukan dengan pertanyaan, tetapi dengan jumlah orang di situs ini yang akan menurunkan pertanyaan hanya karena mereka tidak cukup akrab dengan materi pelajaran untuk memahami apa yang telah ditanyakan. Jika Anda tidak tahu, biarkan saja!
Chris Stratton

Jawaban:


21

Pola berbentuk 8 / S digunakan untuk mengkalibrasi magnetometer di ponsel dan perangkat lain.

Latar Belakang

Magnetometer era ponsel yang khas mengukur kekuatan medan magnet di sepanjang tiga sumbu ortogonal, misalnya:

m=mxsaya^+myȷ^+mzk^

Dengan besarnya bidang yang diberikan oleh,

m=mx2+my2+mz2

dan sudut rotasi dari setiap sumbu sebagai

θk=cos-1mkm, dimana k[x,y,z]

Kalibrasi

Karena medan magenetik bumi relatif konstan, besarnya medan as yang diukur oleh magnetometer juga harus konstan, terlepas dari orientasi sensor. yaitu jika seseorang memutar sensor sekitar dan memplot , , dan dalam 3D, jalur harus memplot permukaan sphere dengan jari-jari konstan.m y m zmxmymz

Idealnya akan terlihat seperti ini:

bola

Namun karena efek besi keras dan lunak dan distorsi lainnya, akhirnya tampak seperti bola yang cacat:

cacat

Ini karena besarnya medan magnet yang diukur oleh sensor berubah dengan orientasi. Hasilnya adalah bahwa arah medan magnet ketika dihitung sesuai dengan rumus di atas berbeda dari arah yang benar.

Kalibrasi harus dilakukan untuk menyesuaikan masing-masing dari tiga pembacaan sumbu sehingga besarnya konstan terlepas dari orientasi - Anda dapat menganggapnya sebagai bola yang terdeformasi harus dilengkungkan ke dalam bola yang sempurna. The LSM303 aplikasi catatan memiliki banyak petunjuk rinci tentang cara melakukan ini.

Jadi bagaimana dengan pola angka 8 !?

Melakukan pola gambar 8 'jejak' bagian dari bola cacat di atas. Dari koordinat yang diperoleh, deformasi bola dapat diperkirakan, dan koefisien kalibrasi diperoleh. Pola yang baik adalah pola yang menelusuri rentang orientasi terbesar dan oleh karena itu memperkirakan penyimpangan terbesar dari besaran konstan yang sebenarnya.

Untuk memperkirakan bentuk bola yang dideformasi, paling sedikit kotak elips dapat digunakan. Catatan aplikasi LSM303 juga memiliki informasi tentang ini.

Metode sederhana untuk kalibrasi dasar

Menurut catatan aplikasi jika Anda menganggap tidak ada distorsi soft-iron, bola yang cacat tidak akan dimiringkan. Oleh karena itu, metode sederhana untuk kalibrasi dasar dimungkinkan:

  • Temukan nilai maksimum dan minimum untuk setiap sumbu, dan dapatkan rentang 1/2 dan titik nol

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

zk=maks(mk)-rk

  • Geser dan skala setiap pengukuran sumbu

mk=mk-zkrk

  • Hitung nilai seperti sebelumnya kecuali menggunakanmk

Ini didasarkan dari kode yang ditemukan di sini.

Memecahkan menggunakan kuadrat terkecil

Kode MATLAB untuk menyelesaikan menggunakan kuadrat terkecil ditunjukkan di bawah ini. Kode mengasumsikan variabel di magmana kolom adalah nilai xyz.

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

Untuk melakukan kalibrasi angka 8 dinamis, Anda bisa menjalankan kuadrat terkecil rutin dengan setiap pembacaan baru dan berakhir ketika faktor offset dan skala telah stabil.

Medan Magnet Bumi

Catatan, medan magnet bumi biasanya tidak sejajar dengan permukaan dan mungkin ada komponen turun yang besar.


Hai, Itu adalah upaya yang cukup besar yang telah Anda lakukan untuk membersihkan jalan untuk masalah pola angka 8. Sekarang saya dapat menghubungkan beberapa pekerjaan saya sebelumnya dengan pekerjaan saat ini. Saya memang melihat beberapa perbaikan tetapi tidak sampai ke sasaran. Seperti yang saya jelaskan sebelumnya dalam pertanyaan saja; BERITA ditampilkan dengan benar menggunakan data output setelah membuat bentuk 8, kemudian mendapatkan setengah dari rata-rata semua vektor. Anehnya itu bekerja untuk rencana horizontal (kebetulan). Jadi sekali lagi saya di tempat yang sama dari di mana saya mulai bekerja pada bentuk 8 juga. Saya akan kembali setelah "Least Square". Namun saya tidak dapat memahami kebetulan.
Rick2047

... Tampaknya dalam kasus saya juga bola berubah bentuk pada sumbu Z. Perlu diketahui bahwa saya mengetahui efek Hard dan Soft Iron pada bidang 3D yang diplot. Saya akan mencoba merencanakannya pada 3D lagi. Biarkan melihat.
Rick2047

@ Rahul2047 Yah saya hanya berharap itu benar, tetapi masuk akal bagi saya. Saya harus melakukan kalibrasi serupa untuk instrumen yang sedang saya bangun, tetapi saya belum cukup menerapkan kode.
geometrikal

Saya ingin tahu bahwa untuk ponsel yang biasanya hanya tertarik pada arah pada bidang horizontal, gerakan sederhana mencakup semua poin yang diperlukan. Apakah Anda menggunakan matlab? Sangat mudah untuk melakukan fit di sana. Kuadrat terkecil mengacu pada metode pengukuran kesalahan.
geometrikal

1
Beberapa tautan gambar dalam artikel ini rusak - dapatkah Anda menambahkan kembali gambar? SE sekarang memiliki fungsi yang mengunggah gambar dan menyimpannya secara lokal, untuk mencegah kerusakan di masa mendatang. Terima kasih!
New Alexandria
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.