Обчислення нахилу, посіву та кочення за даними mag, acc та gyro


18

У мене є дошка Arduino з датчиком свободи на 9 градусів, з якої я повинен визначати крок, позіхання та нахил дошки.

Ось приклад одного набору даних з датчика 9-DOF:

Акселерометр (м / с)

  • AccX = -5,85
  • AccY = 1,46
  • AccZ = 17,98

Гіроскоп (RPM)

  • GyrX = 35,14
  • GyrY = -40,22
  • GyrZ = -9,86

Магнітометр (Гаус)

  • MagX = 0,18
  • MagY = -0,04
  • MagZ = -0,15

Як я можу обчислити крок, позіхання та скочування за цими даними?


1
Основний принцип: з виявлення сили тяжіння у вашому акселерометрі ви знаєте, який шлях вниз; з виявлення магнітного поля Землі у вашому магнітометрі ви знаєте, яким шляхом знаходиться Північ. Виходячи з цього і якщо не мати інших значних прискорень чи сильних магнітних полів, ви можете визначити своє власне ставлення.
welf

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

1
також посилаються на кальманові фільтри, оскільки статичні номери потрібно обробляти досить багато, щоб дати достовірні оцінки нахилу і похиту. Також врахуйте, що важливим є положення датчика (його потрібно врахувати).
Gürkan Çetin

Відповіді:


15

Похил, кочення та похитування визначаються як обертання навколо осі X, Y та Z. Нижче як малюнок для ілюстрації визначення.

Скрутіть нахил і потяг

У попередньому проекті я використовував акселерометр ADXL345 від Analog Devices для обчислення рулону та нахилу. Нижче наведені рівняння, які використовуються для обчислення рулону та нахилу. Я зробив деякі вихідні коди доступними для громадського використання.

accelerationX = (signed int)(((signed int)rawData_X) * 3.9);
accelerationY = (signed int)(((signed int)rawData_Y) * 3.9);
accelerationZ = (signed int)(((signed int)rawData_Z) * 3.9);
pitch = 180 * atan (accelerationX/sqrt(accelerationY*accelerationY + accelerationZ*accelerationZ))/M_PI;
roll = 180 * atan (accelerationY/sqrt(accelerationX*accelerationX + accelerationZ*accelerationZ))/M_PI;

Повний вихідний код можна знайти тут .

Спирайтеся на вищезазначені визначення

yaw = 180 * atan (accelerationZ/sqrt(accelerationX*accelerationX + accelerationZ*accelerationZ))/M_PI;

Примітка: M_PI = 3.14159265358979323846 це постійне значення, визначене в математиці

Нижче наведено декілька посилань, включаючи базовий вихідний код Arduino, який може вам допомогти.


Список літератури:


2
Хороша відповідь, варто додати, що положення та орієнтація датчика в транспортному засобі були б важливими, і що дані потрібно обробляти далі, щоб дати достовірні результати. (відфільтровано або сплавлено з більш надійними низькочастотними даними, такими як GPS)
Gürkan Çetin

(@Zubair) "yaw = 180 * atan (прискоренняZ / sqrt (прискоренняXcecelerationX + прискоренняZaccelerationZ)) / M_PI;" що це "M_PI" ??
Васабі

@Wasabi M_PI = 3.14159265358979323846. Він постійний, визначений у математиці.
Mahendra Gunawardena

8

Отже, моя довша відповідь нижче передбачає, що плата зазнає прискорення, і протягом цього часу вам все одно потрібно мати можливість вимірювати свій крок, котитись і позіхати протягом короткого проміжку часу. Якщо дошка буде нерухомою для всіх вимірювань, то відповідь Махендри Гунавардени буде чудово працювати для вас. Якщо це збирається в такий пристрій, як сегвей, модельний літак або мультитор, або все, що рухається, ви можете продовжити читання. У цій публікації йдеться про те, як використовувати всі три датчики, хоча метод, який називається сенсорним синтезом. Сплавлення датчиків дозволяє отримати сильні сторони кожного датчика і мінімізувати наслідки слабкості кожного датчика.

Характеристики та сенсор датчиків

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

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

З трьох датчиків гіроскоп є найбезпечнішим, і вони, як правило, дуже добре вимірюють швидкість обертання. На нього не впливають такі речі, як джерела заліза, а прискорення в основному не впливають на їх здатність вимірювати швидкість обертання. Вони дуже добре допомагають повідомляти про швидкість, з якою обертається пристрій, однак, оскільки ви шукаєте абсолютний кут, вам потрібно інтегрувати швидкість, щоб отримати позицію. Це додасть помилку останнього вимірювання до помилки нових вимірювань, оскільки інтеграція - це в основному сума значень за діапазон, навіть якщо похибка одного вимірювання становить лише 0,01 градуса в секунду, у 100 вимірюваннях ваше положення можна вимкнути на 1 градус, на 1000 вимірювань, можна на 10 градусів. Якщо ви здійснюєте сотні вимірювань в секунду, Ви можете бачити, що це викликає проблеми. Це зазвичай називають гіроскопом.

Злиття датчика

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

Об'єднання даних цих трьох датчиків можна зробити більш ніж одним способом, я розповім про використання додаткового фільтра, оскільки його набагато простіше, ніж фільтр калмана та кальманові фільтри будуть витрачати набагато більше ресурсів на вбудованих системах. Часто допоміжний фільтр достатньо хороший, простіший у застосуванні (якщо ви не використовуєте попередньо вбудовану бібліотеку) і дозволяє швидше обробляти дані.

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

filteredData = (1-weight)*filteredData + weight*newData

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

fusedData = (1-weight)*gyroData + weight*accelMagData

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

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


3

З даних датчика прискорювача ви можете обчислити лише крок та нахил. Нижній документ із Freescale пояснює, що вам потрібно:

AN3461 - Зондування нахилу за допомогою тривісного акселерометра

На основі висловлювань документа

tanϕxyz=GpyGpz

tanθxyz=GpxGpysinϕ+Gpzcosϕ=GpxGpy2+Gpz2

що прирівнюється до:

roll = atan2(accelerationY, accelerationZ)

pitch = atan2(-accelerationX, sqrt(accelerationY*accelerationY + accelerationZ*accelerationZ))

Звичайно, результат такий лише тоді, коли обертання відбуваються в певному порядку (Rxyz):

  1. Оберніть навколо осі x за кутомϕ
  2. Помістіть навколо осі у під кутомθ
  3. Нахил навколо осі z за кутомψ

Залежно від порядку обертання ви отримуєте різні рівняння. Для порядку обертання ви не можете знайти кут для осі z навколо навколо осі z.Rxyzψ


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