Jump to content
    

Помогите разобраться с кватернионами

Сделал для себя стенд с двумя IMU датчиками MPU6500. Один датчик закреплён по осям тестовой платформы, другой нет.

Я хочу преобразовать данные акселерометра датчиков к системе координат тестовой платформы.

Я собрал доступные мне данные по кватернионам, нашёл библиотеку для микроконтроллера, поддерживающую кватернионы.

Последовательность моих действий:
1) устанавливаю платформу в исходное положение, ось z вертикальна. Калибрую датчики по оси z - 
есть калибровочный вектор положения zero_g {0.0.1} и вектор текущего положения по данным акселерометров current_g {x, y, z}. Я вычисляю кватернион поворота от текущего вектора к калибровочному вектору - calibration_z {x, y, z, w}. Затем я его нормирую.
Как я понял, при применении этого вектора поворота к данным гироскопа или акселерометра я получу совмещение осей z датчиков с осью z платформы, но, поскольку этот поворот минимален, то оси x и y в общем случае совмещены не будут.
2) Вторым этапом получения кватерниона поворота является получение поворота данных датчиков относительно оси z. Для этого я устанавливаю платформу осью y вниз, и калибрую датчики по двумерному вектору zero {0, 1} и вектору текущего положения по данным акселерометров {x, y, z}. Я  получаю кватернион положения current_g {x, y, z, 0}, нормализую его, применяю к нему кватернион поворота к оси z: calibration_z * current_g * calibration_z^-1
Из полученного кватерниона положения выделяю двумерный вектор current_z {x, y}, и вручную определяю синусы и косинусы половинного угла поворота current_z к zero, получая кватернион поворота относительно оси z для совмещения осей y датчика и платформы calibration_y {0, 0, sin(a/2), cos(a/2)}. 

Теперь, если перемножить слева calibration_y calibration_z, я должен получить кватернион поворота датчиков к системе координат платформы.

Для данных акселерометров вроде бы так и происходит, но для данных гироскопов это не так. 

Если кто-нибудь может мне подсказать, что я делаю не так, буду благодарен.

Share this post


Link to post
Share on other sites

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

 

Edited by Zeal0t

Share this post


Link to post
Share on other sites

Спасибо за предложение, но у меня другая задача. Мне нужно не определять положение объекта, а привести данные произвольно расположенного сенсора к координатам объекта.

Share this post


Link to post
Share on other sites

1 hour ago, Garmin said:

Спасибо за предложение, но у меня другая задача. Мне нужно не определять положение объекта, а привести данные произвольно расположенного сенсора к координатам объекта.

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

Share this post


Link to post
Share on other sites

В данном примере показания акселерометра используются лишь однажды при калибровке для определения положения сенсора в пространстве. Я бы очень хотел обойтись только переходом из одной системы координат в другую.

Share this post


Link to post
Share on other sites

В 28.09.2025 в 11:30, Garmin сказал:

Для данных акселерометров вроде бы так и происходит, но для данных гироскопов это не так. 

Непонятно: откуда вдруг взялись гироскопы? Вы акселерометры заменили гироскопами? Или датчики тестовой платформы? Акселерометр и гироскоп приборы разного принципа действия: акселерометр "привязан" к вектору ускорения свободного падения, гироскоп - не "привязан" ни к чему. Почему методика для акселерометров должна давать тот же результат для гироскопов?

Share this post


Link to post
Share on other sites

Датчики MPU6500 имеют на борту три акселерометра и три гироскопа. Они расположены по осям x, y, z. Соответственно, когда сенсор расположен горизонтально, то его акселерометр z будет показывать 1g, и гироскоп z будет показывать вращение относительно оси z. 

В случае, когда гироскоп установлен не по осям тестовой платформы, я хочу преобразовать вращение относительно локальных осей гироскопа к вращению относительно осей тестовой платформы. 

Для определения положения датчика я фиксирую платформу в заранее известном положении, и вектор ускорения свободного падения в сенсорах акселерометра покажет реальное положение датчика.

Спасибо, такие вопросы позволяют мне самому лучше разобраться в теме.

Share this post


Link to post
Share on other sites

Это слишком грубый гироскоп - вращение Земли им не измерить. Так что гирокомпас не получится.

Единственное - поставить на платформу и потом во включенном состояние за короткое время повернуть.

Share this post


Link to post
Share on other sites

По акселрометрам можно откалибровать взаимное расположение в нескольких положениях. Но методику я не очень понял, или вопрос шире и нужно предложить методику? В общем случае надо записывать уравнения в каждом положении и потом решать всю систему, предварительно убедившись в достаточной обусловленности. По гироскопам тоже можно, согласованием векторов угловой скорости или счислением ориентации от одного положения к другому, но надо помнить про вращение Земли для методической точности.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...