Как я могу сделать вращения x и y независимыми с помощью IMU

#arduino #rotation #imu

Вопрос:

Я пытаюсь использовать значения акселерометра из IMU, чтобы получить вращение вокруг оси. У меня возникли трудности с разделением поворотов между осями в среде IDE Arduino. Используя приведенный ниже код, мне удается получить полный диапазон между 0-360 при вращении вокруг оси x, и он отлично работает при вращении вокруг оси x. Однако, когда я поворачиваюсь на 90 градусов вокруг оси y и на 0 градусов вокруг оси x, он показывает поворот на 180 градусов по оси x. Я знаю, что проблема возникает из-за того, что функция atan2 думает, что она находится во 2-м квадранте, но как я могу это исправить. x z и y — показания ускорения в соответствующих направлениях.

 if( z < 0){
  accXangle = (atan2(y, -sqrt( pow(x,2)   pow(z,2)) ) * 180 /PI)   xErr;
}
if(z > 0){
  accXangle = (atan2(y, sqrt( pow(x,2)   pow(z,2))) *180/PI) - xErr;
}