Применил фильтр Калмана к трем осям. На выходе с интервалом в 1 сек.:
X:178 Y:180 Z:5
X:179 Y:180 Z:14
X:178 Y:179 Z:23
X:178 Y:180 Z:5
X:179 Y:180 Z:10
X:179 Y:180 Z:6
X:179 Y:180 Z:357
X:179 Y:180 Z:18
X:179 Y:180 Z:4
X:179 Y:180 Z:12
X:179 Y:180 Z:354
X:178 Y:180 Z:6
X:179 Y:180 Z:13
X:179 Y:180 Z:15
Техника
Гироскоп - акселерометр MPU6050. Как избавиться от дрейфа по оси Z?
Никак принципиально.
Берем гироскоп.
На самом деле это не гироскоп, а всего лишь устройство, измеряющее величину силы тяжести по осям X,Y, Z.
Сила тяжести у нас центральная, направление - вертикально вниз.
По осям Х и Y отклонение - это отклонение от вертикали. И шумы можно путем фильтрации убрать.
Отклонение по оси Z - это вращение вокруг вертикальной оси. Т. е. значение этого отклонения, если ты не отклоняешь сою плату от вертикали, а только вращаешь - не меняется.
Поэтому мы при помощи гироскопа мы это перемещение отслеживать не можем. Но можем как то отследить вращение вокруг этой оси используя данные с акселерометра и используя их уже как то корректировать отклонения гироскопа по оси Z.
Т. е. без хорошей математики, просто жонглируя данными, получаемыми с датчика, дрейф не убрать.
Более-менее приличный результат можно получить, добавив магнитометр (его еще называют магнитным компасом... неправомерно).
Алгоритм такой. Мы знаем ориентацию вектора магнитного поля в твоей конкретной местности. Гироскоп дает нам приличные отклонения по осям x и Y. Используя их и показания магнитометра, мы вычисляем условно говоря направление на север. (На магнитный полюс.)
Вот это направление будет уже довольно объективной (шум естественно будет - куда без него то... ).
Но магнитометр это тоже не панацея. Реагирует на все железяки и прочие флуктуации магнитного поля.
Теоретически мы можем использовать еще и GPS... но это уже так далеко от первоначальной простоты, что мама не горюй.
Тем более, что в условиях, когда спутники не видны, например в квартире уже и этот прибор работать откажется.
Берем гироскоп.
На самом деле это не гироскоп, а всего лишь устройство, измеряющее величину силы тяжести по осям X,Y, Z.
Сила тяжести у нас центральная, направление - вертикально вниз.
По осям Х и Y отклонение - это отклонение от вертикали. И шумы можно путем фильтрации убрать.
Отклонение по оси Z - это вращение вокруг вертикальной оси. Т. е. значение этого отклонения, если ты не отклоняешь сою плату от вертикали, а только вращаешь - не меняется.
Поэтому мы при помощи гироскопа мы это перемещение отслеживать не можем. Но можем как то отследить вращение вокруг этой оси используя данные с акселерометра и используя их уже как то корректировать отклонения гироскопа по оси Z.
Т. е. без хорошей математики, просто жонглируя данными, получаемыми с датчика, дрейф не убрать.
Более-менее приличный результат можно получить, добавив магнитометр (его еще называют магнитным компасом... неправомерно).
Алгоритм такой. Мы знаем ориентацию вектора магнитного поля в твоей конкретной местности. Гироскоп дает нам приличные отклонения по осям x и Y. Используя их и показания магнитометра, мы вычисляем условно говоря направление на север. (На магнитный полюс.)
Вот это направление будет уже довольно объективной (шум естественно будет - куда без него то... ).
Но магнитометр это тоже не панацея. Реагирует на все железяки и прочие флуктуации магнитного поля.
Теоретически мы можем использовать еще и GPS... но это уже так далеко от первоначальной простоты, что мама не горюй.
Тем более, что в условиях, когда спутники не видны, например в квартире уже и этот прибор работать откажется.
Валентина Алисейко
Есть у меня магнитометр. Пока не подключил, решив, что ангуляции по оси Z с MPU6050 мне пока хватит. Видимо, я ошибся, решив, что это проще. Не знаете, где взять скетч обработки данных с гироскопа-акселерометра и магнитометра для получения теперь уже азимута для Ардуино?
вычислять среднее, не трясти руками
Валентина Алисейко
Устро
Валентина Алисейко
Устройство лежит на поверхности. Почему оси X и Y не дрейфуют, а Z дрейфует? К ней какой-то особый подход нужен? Я её обработал так же, как и X и Y:
accX = ((data[0] << 8) | data[1]);
accY = ((data[2] << 8) | data[3]);
accZ = ((data[4] << 8) | data[5]);
tempRaw = ((data[6] << 8) | data[7]);
gyroX = ((data[8] << 8) | data[9]);
gyroY = ((data[10] << 8) | data[11]);
gyroZ = ((data[12] << 8) | data[13]);
/* Calculate the angls based on the different sensors and algorithm */
accYangle = (atan2(accX,accZ)+PI)*RAD_TO_DEG;
accXangle = (atan2(accY,accZ)+PI)*RAD_TO_DEG;
accZangle = (atan2(accX,accY)+PI)*RAD_TO_DEG;
double gyroXrate = (double)gyroX/131.0;
double gyroYrate = -((double)gyroY/131.0);
double gyroZrate = -((double)gyroZ/131.0);
gyroXangle += kalmanX.getRate()*((double)(micros()-timer)/
accX = ((data[0] << 8) | data[1]);
accY = ((data[2] << 8) | data[3]);
accZ = ((data[4] << 8) | data[5]);
tempRaw = ((data[6] << 8) | data[7]);
gyroX = ((data[8] << 8) | data[9]);
gyroY = ((data[10] << 8) | data[11]);
gyroZ = ((data[12] << 8) | data[13]);
/* Calculate the angls based on the different sensors and algorithm */
accYangle = (atan2(accX,accZ)+PI)*RAD_TO_DEG;
accXangle = (atan2(accY,accZ)+PI)*RAD_TO_DEG;
accZangle = (atan2(accX,accY)+PI)*RAD_TO_DEG;
double gyroXrate = (double)gyroX/131.0;
double gyroYrate = -((double)gyroY/131.0);
double gyroZrate = -((double)gyroZ/131.0);
gyroXangle += kalmanX.getRate()*((double)(micros()-timer)/
Забить х уй
Похожие вопросы
- Можно ли как-то с помощью гироскопа акселерометра (или другими способами) отслеживать перемещение объекта в пространстве
- чем отличается акселерометр от гироскопа?
- Если планета земля вращается подобно гироскопу, то почему ее ось вращения не сохраняет положение в пространстве ?
- Какую меру использует акселерометр?
- Что такое герметический интегрирующий гироскоп?
- Какая твердость по Роквеллу (HRA) должна быть у оси велосипедного колеса?
- шестерёнка сползает с оси моторчика. Что делать ?..
- Как вернуть самокату тихий ход? Что-то шелестит в оси или подшипнике.
- Вопрос про ось вращения
- Что такое "акселерометр"?