Правильный способ расчета рулона животного с использованием 3D-ускорения? - PullRequest
0 голосов
/ 11 февраля 2020

Я установил акселерометр для нескольких рыб в полевом эксперименте, чтобы понять их поведение. То, что я получил, было значениями сырого ускорения (X, Y, Z) рыб. Это необработанное ускорение раскладывается на часть, которая является stati c (из-за силы тяжести. Я называю это rmX, rmY и rmZ) и часть Dynami c (из-за движения фи sh. Я называю это diX, diY и diZ). Я хотел бы рассчитать крен моих рыб в различных обстоятельствах (во время плавания, отдыха и т. Д. c), поскольку эта информация может быть актуальной с экологической точки зрения.

Самый сложный аспект в Мой случай заключается в том, что акселерометры не остаются идеально выровненными со всем ускорением силы тяжести на оси Y и имеют значения X и Z = 0. Я всегда устанавливал акселерометр с одинаковой ориентацией, но ускорение stati c отличается среди рыбы из-за невозможности размещения акселерометра точно одинаково у всех рыб. Для всех людей, в их естественном положении (живот вниз и спинной плавник вверх), ускорение силы тяжести находится на всех 3 осях. enter image description here

То, что я сделал для вычисления roll, было так:

FR <- 12.0 # Recording frequency. 12 Hz in my case.
RM <- 2 * FR # Running mean (to calculate static and dynamic acceleration)

Individual1$rmX <-runmean(Individual1$X,RM) # To calculate static acceleration
Individual1$rmY <-runmean(Individual1$Y,RM)
Individual1$rmZ <-runmean(Individual1$Z,RM)

Individual1$disurge <- abs(Individual1$X-Individual1$rmX) # To calculate dinamic acceleration
Individual1$diheave <- abs(Individual1$Y-Individual1$rmY)
Individual1$disway <- abs(Individual1$Z-Individual1$rmZ)

Individual1$roll <- (asin(Individual1$rmZ))*180/pi # To calculate Roll!!

summary(Individual1$roll)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
-90.000 -53.953 -42.423 -26.456  -9.004  66.924    2186 

Однако я получил NAs для переменной roll , Я думаю, что это связано с формулой, которую я использую. Если я использую формулу, которая появляется в этом посте в StackOverflow, я получаю следующее:

foo$roll<- atan2(foo$rmY, foo$rmZ) * 180/pi

summary(foo$roll)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
-179.97  100.45  113.13   96.76  143.81  179.97 

Как вы можете видеть, результат существенно отличается между тем, что я делал, и тем, что у меня есть видел, что используется для других коллег. Я думаю, что имеет больше смысла, что я видел в посте (foo$roll<- atan2(foo$rmY, foo$rmZ) * 180/pi), поскольку диапазон значений для броска -180 / +180. Я видел, что формула, которую я использовал, учитывает только Z-axis, но формула, упомянутая в посте, использует также значение Y-axis для расчета броска.

Кто-нибудь знает, как действовать в моем конкретном случае? Какая формула требует больше сенте?

1 Ответ

1 голос
/ 13 февраля 2020

эта ссылка имеет хорошее объяснение того, как совместно вычислять высоту, рыскание и крен: http://students.iitk.ac.in/roboclub/2017/12/21/Beginners-Guide-to-IMU.html

В вашем случае, крен будет:

roll = 180 * atan2(accelY, sqrt(accelX*accelX + accelZ*accelZ))/PI;

На практике я обнаружил, что этого недостаточно, поскольку данные акселерометра зашумлены, и, просмотрев несколько статей о создании электронных компасов, я нашел решение, которое я описал здесь

Но если вы застряли поскольку вы получаете противоречивую информацию из разных источников, вы всегда можете проверить формулы в контролируемой среде. Например, поместите свой акселерометр на крен 30 градусов (измерьте угол перед считыванием результатов вашей программы) и посмотрите, какой выход вы получите. Попробуйте это для нескольких значений угла, прежде чем решить, что работает для вас. Рекомендуется выполнить калибровку извне, прежде чем устанавливать устройство в неконтролируемую среду, например, на fi sh, который движется хаотично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...