Существует ли алгоритм для преобразования вращений кватерниона к Euler угловым вращениям?

Это не будет самым чистым решением, но вы могли бы определить представление «Основной базы данных» (если ваши отдельные базы данных не будут оставаться постоянными), которое включает в себя данные из отдельных баз данных и позволяет вам выполнять запросы из одного источника.

Например ...

CREATE VIEW vCombinedRecords AS
SELECT * FROM DB1.dbo.MyTable
UNION ALL
SELECT * FROM DB2.dbo.MyTable

Что позволяет делать ...

SELECT * FROM vCombinedRecords WHERE....

Когда ваши базы данных меняются, вы просто обновляете определение представления, чтобы включить новые таблицы.

27
задан Will Baker 5 April 2010 в 23:10
поделиться

6 ответов

Это похоже на классический случай упущения старых технологий - мне удалось выкопать копию Graphics Gems IV из гаража, и похоже, что у Кена Шумейка есть не только алгоритм преобразования из Углы Эйлера произвольного порядка вращения , но также отвечает на большинство других моих вопросов по этой теме. Ура книгам. Если бы я только мог проголосовать за ответ г-на Шумейка и наградить его очками репутации.

Я полагаю, что рекомендация, согласно которой любой, кто работает с углами Эйлера, должен получить копию Graphics Gems IV из своей местной библиотеки и прочитать начальную страницу раздела 222, будет нужно сделать. Это должно быть самое ясное и краткое объяснение проблемы, которое я читал.


Вот полезная ссылка, которую я нашел с тех пор - http: //www.cgafaq. info / wiki / Euler_angles_from_matrix - следует той же системе, что и Shoemake; 24 различных перестановки порядка вращения закодированы как четыре отдельных параметра - внутренняя ось, четность, повторение и кадр - что затем позволяет сократить алгоритм с 24 случаев до 2. В целом это может быть полезной вики - я не пришел

Похоже, что старая ссылка не работает здесь - это еще одна копия «Вычисления углов Эйлера из матрицы вращения. ".

13
ответ дан 28 November 2019 в 05:19
поделиться

Я решаю это так:

шаг 1: Убедитесь, какая конвенция для вращения Эйлера вам нужна, скажем, zyx.

шаг 2 : Рассчитайте аналитическую матрицу вращения для вращения. Например, если вы хотите, чтобы R(zyx),

**R***zyx* = **R***x*( phi) * **R***y*( theta) * **R***z*( psi), где элементы становятся

R11 =  cos(theta)*cos(psi)
R12 = -cos(theta)*sin(psi)
R13 =  sin(theta)
R21 =  sin(psi)*cos(phi) + sin(theta)*cos(psi)*sin(phi)
R22 =  cos(psi)*cos(phi) - sin(theta)*sin(psi)*sin(phi)
R23 = -cos(theta)*sin(phi)
R31 =  sin(psi)*sin(phi) - sin(theta)*cos(psi)*cos(phi)
R32 =  cos(psi)sin(phi) + sin(theta)*sin(psi)*cos(phi)
R33 =  cos(theta)*cos(phi) 

этапом 3: Посредством проверки можно найти грех или загар для трех углов с помощью элементов, указанных выше. В этом примере

tan(phi) = -R23/R33

sin(theta) = -R13

tan(psi) = -R12/R11

шаг 4: Рассчитайте матрицу вращения из своего кватерниона (см. wikipedia), для элементов, которые вам нужно вычислить углы, как в пункте 3) выше.

Другие соглашения могут быть вычислены с помощью той же процедуры.

3
ответ дан 28 November 2019 в 05:19
поделиться

In a right-handed Cartesian coordinate system with Z axis pointing up, do this:

struct Quaternion
{
    double w, x, y, z;
};

void GetEulerAngles(Quaternion q, double& yaw, double& pitch, double& roll)
{
    const double w2 = q.w*q.w;
    const double x2 = q.x*q.x;
    const double y2 = q.y*q.y;
    const double z2 = q.z*q.z;
    const double unitLength = w2 + x2 + y2 + z2;    // Normalised == 1, otherwise correction divisor.
    const double abcd = q.w*q.x + q.y*q.z;
    const double eps = 1e-7;    // TODO: pick from your math lib instead of hardcoding.
    const double pi = 3.14159265358979323846;   // TODO: pick from your math lib instead of hardcoding.
    if (abcd > (0.5-eps)*unitLength)
    {
        yaw = 2 * atan2(q.y, q.w);
        pitch = pi;
        roll = 0;
    }
    else if (abcd < (-0.5+eps)*unitLength)
    {
        yaw = -2 * ::atan2(q.y, q.w);
        pitch = -pi;
        roll = 0;
    }
    else
    {
        const double adbc = q.w*q.z - q.x*q.y;
        const double acbd = q.w*q.y - q.x*q.z;
        yaw = ::atan2(2*adbc, 1 - 2*(z2+x2));
        pitch = ::asin(2*abcd/unitLength);
        roll = ::atan2(2*acbd, 1 - 2*(y2+x2));
    }
}
10
ответ дан 28 November 2019 в 05:19
поделиться

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

2
ответ дан 28 November 2019 в 05:19
поделиться

Я разместил свою статью под названием «Преобразование кватерниона в угол Эйлера для произвольной последовательности вращения с использованием геометрических методов» на моем веб-сайте noelhughes.net. У меня также есть алгоритмы для преобразования любого набора углов Эйлера в кватернион и кватернион в / из матрицы направляющих косинусов, которые я опубликую на этих выходных. Они также есть на сайте Мартина Бейкера, хотя их немного сложно найти. Погуглите мое имя, Ноэль Хьюз и кватернионы, и вы должны его найти.

3
ответ дан 28 November 2019 в 05:19
поделиться

Вот статья, которую я написал о преобразовании кватернионов в углы Эйлера.

Ссылка 1

В этом месте я также разместил ряд документов, в которых обсуждаются различные аспекты кватернионов, углов Эйлера и матриц вращения (DCM).

Ссылка 2

3
ответ дан 28 November 2019 в 05:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: