Kalibrasi dinamis magnetometer

19

Saya sedang mengerjakan Magnetometer AK8975 yang menjadi bagian dari IMU. Yang sepertinya sangat rumit bagi saya. Chip ini memberikan vektor 3D sebagai output yang menggambarkan medan magnet bumi di setiap tempat di bumi atau di dekatnya.

Saya mencoba dua jenis algoritma perhitungan tajuk: Satu sederhana arctan(-y/x)dan satu lagi kecenderungan (pitch) dan bank (roll) membatalkan matematika seperti disebutkan di bawah ini. Baik pada kecenderungan dan bank memberikan output yang salah.

Saya bisa mendapatkan heading yang benar di bumi (menggunakan sumber belajar terbuka sederhana yang tersedia) ketika diputar menjaga horizontal pada rencana tanah menggunakan salah satu dari dua algo.

Saya mencoba kalibrasi untuk kesalahan lunak dan keras. Saya bisa memplotnya dalam 3D dan menunjukkan sphere 3D yang sempurna. Masih tidak bekerja pada kecenderungan atau deklinasi.

Setiap pointer akan sangat membantu.

Kode dan implementasinya adalah sebagai berikut:

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

}

Di mana magnetom_x, #_ydan #_zmerupakan komponen vektor 3D yang sebenarnya adalah nilai RAW dari Magnetometer. roll and pitch berasal dari output Kalman-filter misterius dari onboard accelerometer dan gyroscope. Ketiga sensor ini berada di ATAVRSBIN1 . Roll and pitch tidak apa-apa sampai tahap ini.

Sekarang perhitungan heading sederhana sesuai dengan journal_of_sensors_renaudin et al_2010c.pdf seharusnya MAG_Heading = atan2(-magnetom_y, magnetom_x) ;dan dengan kompensasi seperti di atas.

Kode keseluruhan hanya dari OPEN AHRS .


Data dalam format Roll, Pitch dan Yaw. Saya memutar perangkat hanya dengan tangan saya. Tiga pertama telah terkonsentrasi hanya pada Roll, Pitch dan Yaw masing-masing. Sisa dua yang pertama diputar perangkat sekitar 45 derajat sepanjang X (Rolled) kemudian diputar bersama Z lokal Magnetometer. Kemudian sama telah diulang dengan sekitar 45 Derajat rotasi sepanjang Y (bernada) kemudian diputar bersama Z lokal Magnetometer.

Grafik diplot dalam kisaran -180 hingga 180 derajat.

Gulungan Sudut dalam derajat dalam file Karakteristik YAW pada Roll.

Nada Sudut dalam derajat dalam file Karakteristik YAW pada Pitch.

Mengoleng Sudut dalam derajat dalam file Karakteristik YAW pada Yaw itu sendiri.

Yaw wrt 45 derajat miring (digulung) Sudut dalam derajat dalam file Karakteristik YAW di Yaw dengan 45 derajat digulung.

Yaw wrt 45 derajat dibelokkan (bernada) Sudut dalam derajat dalam file Karakteristik YAW di Yaw dengan 45 derajat bernada.

Catatan: Untuk 2 gambar terakhir: Pertama disimpan di posisi rumah, itu sama untuk semua (lihat file txt). Kemudian Rolled 45 derajat kemudian menggunakan perangkat pesawat (dengan magnetometer) telah diputar sepanjang sumbu Z Magnetometer.

Demikian pula untuk gambar terakhir perangkat telah dinaikkan 45 derajat kemudian di sepanjang sumbu Z Magnetometer.

Saya harap ini akan membantu menyelesaikan masalah saya.


Perkembangan baru adalah sebagai berikut:

Saya mengerjakan beberapa di Pos. Saya mendapat hasil berikut. Gulungan csv

Nada csv

Mengoleng csv


Rick2047
sumber
belum ada jawaban !!
4
Saya pikir Anda akan mendapatkan lebih banyak respons jika Anda menunjukkan matematika yang Anda coba implementasikan dan kode yang Anda gunakan untuk mengimplementasikannya. Ada sangat sedikit bagi kita untuk melanjutkan selain dari "itu tidak berhasil, tolong" - begitulah pertanyaan Anda dibaca. Maaf!
Martin Thompson
Penggunaan magnetometer adalah bidang yang sangat khusus yang relatif sedikit orang akan memiliki keahlian. Membaca pertanyaan Anda beberapa kali, saya masih tidak yakin apa yang salah. Anda mengatakan itu memberikan "output yang salah" tapi itu cukup samar. Mungkin beberapa contoh numerik?
Jason R
1
Apakah ini pertanyaan tentang bagaimana menginterpretasikan output sensor atau bagaimana menghitung langkah-langkah yang bermanfaat secara navigasi dari vektor x, y, z yang disediakan oleh sensor? Apakah pengukuran Anda dapat diulang dengan contoh lain dari sensor yang sama?
vicatcu
1
@Rahul - Saya terkejut bahwa ini tidak mendapatkan perhatian lebih!
Kevin Vermeer

Jawaban:

8

Saya suka grafik Anda. Mereka dengan jelas menunjukkan bahwa roll, pitch, dan yaw tampaknya berfungsi. Selamat! Itu sudah lebih banyak kemajuan daripada yang dicapai kebanyakan orang.

Saya menduga bahwa kode yang Anda tampilkan menghitung nilai MAG_Heading "salah", berbeda dari nilai MAG_Heading yang Anda harapkan.

Akan jauh lebih mudah bagi kami untuk membantu Anda jika Anda memberi kami: (Ini adalah bagian "jelaskan gejala" dari "Cara Mengajukan Pertanyaan dengan Cara Cerdas" )

  • yang AK8975 magnetometer nilai-nilai output m_x, m_y, dan m_z di beberapa titik waktu.
  • Nilai pitch and roll pada saat yang sama
  • nilai output yang diduga salah MAG_Heading dihitung dari nilai-nilai tersebut
  • apa yang Anda harapkan sebagai MAG_Heading yang benar

Jadi saya berspekulasi bahwa mungkin Anda mengalami masalah yang sama yang saya buat untuk diri saya sendiri :-).

  • Format sudut apa yang diharapkan dari fungsi dosa () dan cos () dan atan2 () Anda? Apakah Anda perlu melakukan semacam konversi antara format pitch and roll yang disimpan ke format itu? Apakah Anda perlu mengonversi dari format itu ke yang Anda butuhkan MAG_heading? (brads, derajat, atau radian? floating-point atau fixed-point?)
  • Apakah ada offset dalam nilai m_x, m_y, m_z mentah yang perlu dikurangi?
  • Apakah semua bagian berbaris sesuai asumsi kode? Secara khusus, apakah sumbu pitch and roll berbaris dengan sumbu magnetometer? (Apakah m_x seharusnya mengarah ke depan, di sepanjang sumbu gulungan? Apakah m_y seharusnya mengarah ke kanan, di sepanjang sumbu pitch?)
  • Mungkin beberapa nilai sensor atau lainnya - mungkin m_z - perlu dinegasikan sebelum dimasukkan ke dalam kode ini?
  • Apakah mungkin kode ini diinterupsi oleh satu interupsi atau yang lain yang merusak nilai internalnya? Kuingat proyek yang berbeda itu, setelah seseorang menempatkan "membagi" dalam rutin interupsi, setiap trigonometri perhitungan fungsi di tempat lain dalam program ini akan sering memberikan hasil yang salah.
  • Apakah mungkin interupsi pemecatan begitu sering sehingga kode ini tidak pernah benar-benar selesai berjalan?

Tampaknya ada orang lain yang membahas kode yang sangat mirip di tempat lain: 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!!!-Baru-IMU !!! ; http://www.rcgroups.com/forums/showthread.php?t=1436742&page=6 ; http://aeroquad.com/showthread.php?691-Hold-your-heading-with-HMC5843-Magnetometer ; dll.

davidcary
sumber
Saya melihatnya sekarang .. Saya akan kembali.
Rick2047
\ 1 / Saya membuat file csv untuk [Roll, pitch, yaw and (Mx, My, Mz)]. \ 2 / Saya berharap bahwa MAG_Heading tidak boleh berubah dengan perubahan roll and pitch setidaknya sampai dua kuadran berturut-turut. Tajuk berarti, jika menuju NE maka harus terus menunjuk NE sampai melintasi 90 derajat dari horizon pada arah rotasi naik atau turun untuk kemiringan dan harus sama dalam kasus perbankan atau kombinasi.
Rick2047
\ 3 / Semua perhitungan internal telah dilakukan dalam radian dan semua fungsi konsine hanya mengharapkan radian. Untuk tampilan hanya nilai yang disalin dan dikonversi ke derajat. \ 4 / Titik mengambang. \ 5 / Semua sensor disejajarkan dan juga semua kemungkinan kombinasi yang relevan telah dicoba untuk penyelarasan menggunakan SENSOR_SIGN [9]. \ 6 / Saya melakukannya dalam polling sehingga mengganggu berdasarkan semua masalah tidak akan ada di sini.
Rick2047
Untuk poin saya \ 1 / di sini untuk semua grafik saya juga telah melampirkan file csv yang sesuai. Atau Anda meminta sesuatu yang lain. Terima kasih atas tanggapan yang baik ini. :) Saya akan menerapkan "Cara Mengajukan Pertanyaan dengan Cara Cerdas" sebanyak usaha dan waktu saya mengizinkan. :)
Rick2047
\ 1 / Saya akan bekerja untuk [Roll, pitch, yaw dan (Mx, My, Mz) (heading, declination)] sebagai gantinya.
Rick2047
1

Catatan aplikasi untuk LSM303 memiliki panduan yang berguna untuk mengkalibrasi kompas dengan kompensasi miring yang berlaku untuk masalah Anda. Ini cukup rinci, kalau tidak saya akan menulis ulang perhitungan di sini. Perhatikan bahwa nilai akselerometer diperlukan untuk perhitungan pitch, roll, dan yaw penuh karena rotasi di sekitar sumbu garis medan magnet tidak menghasilkan perubahan nilai magnetometer. Begitu juga untuk gravitasi dengan accelerometer.

geometrikal
sumber
Tautan menunjukkan tanda berbeda dalam persamaan yang sama. Saya akan mencoba semua kombinasi lainnya.
Rick2047