Я пытаюсь получить угол поворота Z-GY-521 (MPU 6050), но угол нарастает статически, даже если я не перемещаю датчик. Есть ли способ «отфильтровать» угол, который он подходит для моего случая?
Код:
float accel_z = accel_t_gyro.value.z_accel;
float accel_angle_z = 0;
float gyro_angle_z = gyro_z*dt + get_last_z_angle();
float unfiltered_gyro_angle_z = gyro_z*dt + get_last_gyro_z_angle();
float alpha = 0.96;
float angle_z = alpha*gyro_angle_z + (1.0 - alpha)*accel_angle_z;
выход, когда датчик не перемещается:
х = угол поворота х
z = z-roatation- ангел
x z
8.37 4.24
8.35 4.22
8.33 4.21
8.32 4.19
8.31 4.18
8.29 4.17
8.28 4.15
8.26 4.14
8.25 4.12
8.23 4.12
8.22 4.10
8.21 4.09
8.19 4.07
8.18 4.05
Тимо, я видел, что вы нашли частичное решение вашей проблемы (цитата: «нет гравитации, которая удерживает гироскоп в правильном положении»). Я хотел бы уточнить, потому что есть способы получить достаточно хорошие результаты только с помощью гироскопа. Я не знаю, будет ли это достаточно хорошо для вашего приложения. Вот результаты, которые я получил, используя то же оборудование, что и вы: http://robokitchen.tumblr.com/post/68625623585/imu-with-gyroscope-only-i-tested-the-three-axes. В этом видео я не использую акселерометр вообще.
Есть два момента, которые могут помочь вам добиться лучших результатов:
1) Если ваш датчик не остается полностью горизонтальным, вы не можете получить вращение оси Z, используя эту формулу:
float gyro_angle_z = gyro_z*dt + get_last_z_angle();
Чтобы объяснить причину, представьте себе следующее: если ваш гироскоп повернут на 90 градусов вокруг оси x, а затем на 90 градусов вокруг оси z, вы не получите тот же результат, как если бы он повернулся только на 90 градусов вокруг оси z. Это означает, что Вы должны вычислить вращение вокруг всех осей, а затем извлечь вращение оси Z. Если вы не используете оси X и Y, ваши результаты будут неправильными (если ваш датчик не остается полностью горизонтальным).
Одним из эффективных способов вычисления вращения вокруг всех осей является использование кватернионов. Многое можно сказать о кватернионах, поэтому я позволю вам провести собственное исследование и задать дополнительные вопросы, если потребуется.
2) После использования всех 3-х осей все равно будет статический дрейф. Это потому, что гироскоп не будет читать идеальный 0, даже когда он не двигается. Чтобы улучшить ситуацию, вы можете откалибровать гироскоп. Простой способ калибровки — это прочитать большое количество (более 100) значений, когда гироскоп не движется, рассчитать средний дрейф и вычесть его из ваших измерений, когда гироскоп движется. После этого все еще будет небольшой дрейф, но не такой плохой, как сейчас.
Вот лучшие результаты, которые я получил, используя гироскоп MPU-6050 и акселерометр: http://robokitchen.tumblr.com/post/68626551378/imu-with-gyroscope-and-accelerometer-i-ran-the. Как вы уже знаете, акселерометр помогает стабилизировать оси x и y, но не ось z. Однако дрейф оси Z является низким и остается пригодным для многих применений. Например, есть несколько квадрокоптеров, которые не используют магнитометр и страдают от дрейфа оси z, но остаются пригодными для использования.
Других решений пока нет …