Расчет кватернионов по данным гироскопа + акселерометр - PullRequest
4 голосов
/ 27 сентября 2010

У меня есть данные гироскопа + акселерометр в каждый период времени T.

Используя C ++, я хочу каждый раз вычислять вращение объекта - он может вращаться вокруг своих осей. Я читал, что вращение системы удобно представлять в виде кватернионов (не в углах Эйлера).

Как я могу преобразоваться из угловой скорости (из гироскопа) в представление кватернионов? Я думаю, что для этого мне нужно решить дифференциальное уравнение, используя численные методы.

Ответы [ 4 ]

7 голосов
/ 27 сентября 2010

Я не уверен, какой язык вы ищете, но библиотека C ++ Boost имеет рабочий класс Quaternion ( quaternion.hpp ).Я использовал эту библиотеку, чтобы создать простой класс вращения для вычисления результатов или вращения точек вокруг произвольных векторов без особых затруднений.

ОБНОВЛЕНИЕ: Основываясь на вашем комментарии, я недумаю, что вам обязательно нужно использовать библиотеку кватернионов, чтобы выяснить ваше угловое положение в данный момент времени, учитывая либо постоянную угловую скорость, либо угловое ускорение.Все, что вам нужно сделать, это выяснить, что это за угол, а затем использовать класс кватернионов для вычисления положения векторов при повороте вокруг вектора вращения на угол, который вы вычислили.

При условии постоянного углаускорение α, начальная угловая скорость ω (t 0 ) и начальное угловое положение θ (t 0 ) в диапазоне [0, 2π) углового положения в некоторый момент времени t> t 0 , θ (t) определяется как:

&theta;(t) = [&theta;(t<sub>0</sub>) + &omega;(t<sub>0</sub>)*(t-t<sub>0</sub>) + &alpha;*(t-t<sub>0</sub>)<sup>2</sup>/2] mod 2&pi;

Здесь операция mod 2π - это просто остаток при вычитании n2π, где n - целое число, необходимое для обеспечения того, что остаток находится вдиапазон [0, 2π).Для постоянной угловой скорости (то есть α = 0) последний член выпадает.

Тем не менее, все, что вам действительно нужно, это отслеживать угол в течение некоторого интервала времени при постоянном ускорении (или определятьсреднее ускорение за это время, если оно не является постоянным) и обновите угол.Затем вы применяете результирующее вращение вокруг вектора вращения к кватерниону, который вы используете для накопления ваших вращений.Это может быть легко реализовано как класс C ++.

Тем не менее, если вы ищете инструмент с открытым исходным кодом для этого, я ожидаю, что любая из библиотек моделирования игровой физики будет более чем адекватной,Пара открытых источников: Bullet и Open Dynamics Library .

3 голосов
/ 27 сентября 2010

Вы бы говорили о Slerp ? (Сферическая линейная интерполяция)

См. Статью Джонатана Блоу " Понимание Slerp, затем не используя его ", в котором есть пример источника на C ++ ...

http://number -none.com / продукт / Понимание% 20Slerp,% 20Then% 20Not% 20Using% 20It /

2 голосов
/ 28 сентября 2010

Каждый образец из ваших гироскопов представляет небольшое вращение:

rot_x = angV_x * timestep
rot_y = angV_y * timestep
rot_z = angV_z * timestep

Если получающиеся вращения невелики, вы можете преобразовать это непосредственно в кватернион, взяв половину угла поворота:

// for small rotations, quick & dirty quaternion is sufficient
// (note: all angles *must* be in radians!)
float k = timestep * 0.5;
quaternion raw_delta_Q(1.0, angV_x*k, angV_y*k, angV_z*k);  // unnormalized!

// combine rotation for current timestep with orientation state
estimated_orient_Q *= raw_delta_Q;  // multiply by unnormalized delta
estimated_orient_Q *= 1 / norm(estimated_orient_Q);  // then renormalize it!

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

РЕДАКТИРОВАТЬ: Обратите внимание, что в приведенном выше коде предполагается, что * = определено для умножения кватернионов как на кватернионы, так и на реальные скаляры. Некоторая форма этих функций (а также очевидный конструктор) будет присутствовать в любой разумной библиотеке кватернионов.

1 голос
/ 27 сентября 2010

На каком языке? Например. для Python cgkit имеет отличный модуль quat (кватернионы, инициализированные из матрицы вращения, а не "угловой скорости", но предположительно вы можете построить первое из последних?) и euclid.py имеет исходный код Python для класса Quaternion, включая методы класса для его построения из матрицы вращения и другими способами.

...