Динамічне калібрування магнітометра


19

Я працюю над магнітометром AK8975, будучи частиною IMU. Що здається мені дуже складним. Цей чіп дає тривимірний вектор як вихід, що описує магнітне поле Землі в будь-якому місці Землі або біля нього.

Я спробував два типи алгоритмів обчислення заголовків: один простий, arctan(-y/x)а інший - математика нахилу (крок) та скасування банку (рулон), як зазначено нижче. Як за нахилом, так і банки дають неправильний вихід.

Я в змозі отримати правильний заголовок wrt земля (використовуючи прості доступні відкриті ресурси дослідження), коли він повертається, зберігаючи горизонтальний wrt план за допомогою будь-якого з двох альгів.

Я спробував калібрування для м'яких і твердих помилок заліза. Я міг би побудувати його в 3D і показує ідеальну 3D-сферу. Все ще не працює на нахилі чи нахилі.

Будь-який вказівник буде корисним.

Код та його реалізація наведені нижче:

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

}

Там , де magnetom_x, #_yі #_zє компонентами 3D вектора , який на самому справі є значенням RAW від магнитометра. рулон і крок - це таємничий вихід фільтра Кальмана з бортового акселерометра та гіроскопа. Ці три датчики знаходяться в ATAVRSBIN1 . До цього етапу рулон і крок нормальні.

Тепер простий розрахунок заголовка відповідно до journal_of_sensors_renaudin et al_2010c.pdf повинен був бути MAG_Heading = atan2(-magnetom_y, magnetom_x) ;і з компенсацією, як зазначено вище.

Загальний код просто від OPEN AHRS .


Дані у форматі Roll, Pitch та Jow. Я обертав пристрій лише рукою. Перші три були зосереджені відповідно лише на Roll, Pitch та Yaw. Решта два спочатку обертають пристрій приблизно на 45 градусів уздовж Х (прокату), потім обертають уздовж локального магнітометра Z. Потім те саме повторюють з обертанням близько 45 градусів уздовж Y (нахилене), потім обертають уздовж локального Z магнітометра.

Графіки побудовані в межах від -180 до 180 градусів.

Рулон Кути в градусах у файлі Характеристики YAW на Roll.

Крок Кути в градусах у файлі Характеристики YAW на Pitch.

Зів Кути в градусах у файлі YAW характеристики для самого Yaw.

Нахил wrt 45 градусів нахилений (прокат) Кути в градусах у файлі Властивості YAW на навантаженні з накидом на 45 градусів.

Зниження на 45 градусів Кути в градусах у файлі ЯМК характеристики на Яу з 45 градусами.

Примітка. Для останніх 2 фотографій: спочатку зберігається в домашньому положенні, тобто однаково для всіх (див. Файли txt). Потім прокатували на 45 градусів, потім за допомогою площинного пристрою (з магнітометром) обертали по осі Z магнітометра.

Аналогічно для останнього зображення пристрій було розміщено на 45 градусів, а потім по осі Z магнітометра.

Сподіваюсь, це допоможе вирішити мою проблему.


Нові розробки такі:

Я працював над заголовком. Я отримав наступний результат. Рулон csv

Крок csv

Зів csv



відповіді ще немає !!

4
Я думаю, ви отримаєте більше відповідей, якщо покажете математику, яку ви намагаєтеся реалізувати, та код, який ви використали для її реалізації. У нас дуже мало, щоб продовжувати інакше, ніж "це не працює, допоможи" - саме так читається ваше запитання. Вибачте!
Мартін Томпсон

Використання магнітометра - це дуже спеціалізована область, з якою порівняно мало людей мають досвід. Прочитавши кілька разів ваше запитання, я все ще не впевнений, що саме не так. Ви кажете, що це дає "неправильний вихід", але це досить невиразно. Можливо, численні приклади?
Джейсон R

1
Це питання про те, як інтерпретувати виходи датчика чи як обчислити корисні для навігації заходи з вектора x, y, z, який надає датчик? Чи повторюються ваші вимірювання з іншим примірником того ж датчика?
vicatcu

1
@Rahul - Я здивований, що це не привертає більше уваги!
Кевін Вермер

Відповіді:


8

Мені подобаються ваші графіки. Вони чітко показують, що нахил, нахил та позіхання, здається, працюють. Вітаємо! Це вже більший прогрес, ніж більшість людей.

Я здогадуюсь, що представлений вами код обчислює "неправильне" значення MAG_Heading, відмінне від очікуваного вами значення MAG_Heading.

Нам було б набагато простіше допомогти вам, якби ви дали нам: (Це розділ "опишіть симптоми" розділу "Як задавати питання розумним шляхом" )

  • AK8975 магнітометр вихідні значення M_X, M_Y і m_z в якій - то один момент часу.
  • Значення висоти та нахилу в той же момент
  • нібито неправильне MAG_Heading вихідне значення, обчислене з цих значень
  • що ви очікували правильного MAG_Heading

Тож мені залишається гадати, що, можливо, ви стикаєтеся з тими ж проблемами, які я створюю собі :-).

  • Якого формату кута очікують ваші функції sin (), cos () та atan2 ()? Чи потрібно робити якесь перетворення між висотою та формою формату, які зберігаються у цьому форматі? Чи потрібно вам перетворити з цього формату в те, що вам потрібно MAG_heading? (бради, градуси чи радіани? з плаваючою або фіксованою точкою?)
  • Чи є зміщення у вихідних значеннях m_x, m_y, m_z, які потрібно відняти?
  • Чи всі частини вишикувані так, як передбачається кодом? Зокрема, чи вісь кроку та кочення вишикується віссю магнітометра? (Чи повинен m_x вказувати вперед, вздовж осі кочення? Чи m_y повинен вказувати праворуч, вздовж осі кроку?)
  • Можливо, якесь значення датчика чи інше - можливо, m_z - потрібно заперечувати перед подачею в цей код?
  • Може, цей код переривається тим чи іншим перериванням, який псує його внутрішні значення? Здається, я пригадую інший проект, що після того, як хтось поставив «поділ» у процедурі переривання, кожен обчислення триггерної функції скрізь у програмі часто давав би неправильний результат.
  • Може бути, перериває стрілянину так часто, що цей код ніколи насправді не закінчується?

Мабуть, є й інші люди, які обговорюють дуже подібний код деінде: 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 ; тощо.


Я бачив це зараз .. Я повернусь назад.
Rick2047

\ 1 / Я створюю файл csv для [Roll, pitch, yaw та (Mx, My, Mz)]. \ 2 / Я очікую, що MAG_Heading не повинен змінюватися зі зміною нахилу і нахилу щонайменше до двох послідовних квадрантів. Заголовок означає, що якщо він заголовок NE, то він повинен продовжувати вказувати NE, поки він не перетне 90 градусів від горизонту вгору або вниз напрямками обертання для нахилу і повинен бути однаковим у випадку банківської справи або комбінації.
Rick2047

\ 3 / Усі внутрішні обчислення зроблені в радіанах, і всі функції консинуа очікують лише радіанів. Для відображення лише значення копіюються та перетворюються в градуси. \ 4 / Плаваюча точка. \ 5 / Всі датчики вирівняні, а також всі можливі відповідні комбінації були випробувані для вирівнювання за допомогою SENSOR_SIGN [9].
Rick2047

На мою думку \ 1 / тут для всіх графіків я також додав відповідні файли csv. Або ти просив чогось іншого. Дякую за хорошу відповідь. :) Я буду реалізовувати "Як задавати питання розумним шляхом" стільки, скільки дозволяють зусилля та час. :)
Rick2047

\ 1 / Я скоріше працюватиму [Roll, pitch, yaw та (Mx, My, Mz) (заголовок, відхилення)].
Rick2047

1

Додаток до відома для LSM303 має корисне керівництво для калібрування з компенсацією нахилу компаса , який можна застосувати до вашої проблеми. Це досить детально, інакше я б переписав тут свої розрахунки. Зверніть увагу, що значення акселерометра необхідні для розрахунків повного кроку, нахилу та похилення як обертання навколо осі ліній магнітного поля, що не призводить до зміни значень магнітометра. Так само і для сили тяжіння з акселерометром.


Посилання показує різні знаки в одному і тому ж рівнянні. Я спробую всі інші комбінації.
Rick2047
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.