Значения кватерниона из 9-осевого щита движения Arduino кажутся очень неправильными

accelerometer gyroscope magnetometer

В настоящее время я использую датчик BNO055, установленный на девятиосном датчике движения Arduino, для измерения высоты и периода океанских волн. Для этого я хотел бы использовать предоставленные кватернионы, однако у меня есть небольшая проблема. Кватернион должен быть <cos(theta/2), Xsin(theta/2), Ysin(theta/2), Z*sin(theta/2)>, где X, Y и Z — координаты единичного вектора, а тета — угол поворота вокруг этого вектора. Поэтому я ожидаю, что все три будут хуже одного.

Однако, когда я запускаю простой код для просмотра необработанных данных, значение W, выдаваемое моим датчиком на столе, равно 16 375, а значения X, Y и Z находятся в диапазоне сотен...

Это дает мне высоту волны в сотни тысяч километров :slightly_smiling_face:

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

О, и я заранее откалибровал датчик

Заранее спасибо за помощь

, 👍1


1 ответ


Лучший ответ:

1

Я не знаком с этим датчиком, поэтому могу только предположить.

Скорее всего, датчик выдает вам числа с фиксированной точкой. Судя по действительная часть, скорее всего, 14 бит справа от неявной точка основания. Если это так, фактический кватернион может быть вычислен как:

float w = raw_w / 16384.0;
float x = raw_x / 16384.0;
float y = raw_y / 16384.0;
float z = raw_z / 16384.0;

Вы можете проверить, разумно ли это, вычислив норму, которая должно быть очень близко к единице.

,

Большое спасибо, я не понял объяснения, но ваше решение сработало!, @Kajitrim