Нормализован ли кватернион, который Eigen извлекает из матрицы вращения Affine3d 3x3?

здесь https://docs.ros.org/kinetic/api/eigen_conversions/html/eigen__msg_8cpp_source.html#l00093

Я совершенно не понимаю синтаксис этой строки: Eigen::Quaterniond q = (Eigen::Quaterniond)e.linear();

Но в любом случае, если предположить, что e имеет тип Eigen::Affine3d (матрица вращения 3x3), где я могу выяснить, как конструируется кватернион из матрицы вращения в библиотеке Eigen, пожалуйста? Я не видел в документе никакого метода, кроме https://eigen.tuxfamily.org /dox/classEigenEigen::Quaterniond q = (Eigen::Quaterniond)e.linear();1QuaternionBase.html#title25 но я настоящий нуб в С++, поэтому даже этого не понимаю...

Я надеюсь, что он делает что-то вроде этого https://arc.aiaa.org/doi/abs/10.2514/2.4654?journalCode=jgcd, потому что мне нужно нормализовать извлеченный кватернион, и я хотел бы это обеспечить.


person tehdodk    schedule 07.11.2018    source источник
comment
Фактическая реализация здесь, который включает ссылку на базовый алгоритм. Код будет генерировать единичные кватернионы, если входная матрица на самом деле является матрицей вращения (конечно, все подвержено шуму).   -  person chtz    schedule 07.11.2018
comment
Приведение (Eigen::Quaterniond) не обязательно, кстати.   -  person chtz    schedule 07.11.2018
comment
Обратите внимание, что вы должны удерживать ортонормированную матрицу вращения, а кватернион нормализован сам по себе, в случае большого количества преобразований одного объекта (например, камеры)   -  person minorlogic    schedule 08.11.2018


Ответы (1)


Вы можете убедиться, что ваш Eigen::Quaterniond нормализован, вызвав его метод normalize().

Рассматриваемая строка явно преобразует все, что возвращает e.linear(), в Eigen::Quaterniond.

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

person Caleth    schedule 07.11.2018
comment
Спасибо, сэр, дело в том, что я недостаточно уверен/квалифицирован для временного изменения docs.ros.org/kinetic/api/eigen_conversions/html/ для печати нормы построенного кватерниона, поэтому я хотел бы убедиться в этом, прочитав только исходный код. Также статья, на которую я дал ссылку, взята из ссылок Википедии, но, к сожалению, этой связки алгебры нет в URL-адресе, который вы указали en.wikipedia.org/wiki/, и нужно заглянуть в документ через некоторые сторонние веб-сайты для разблокировки. - person tehdodk; 07.11.2018
comment
Если вы не уверены в своем понимании C++, то, скорее всего, вы не сможете определить из исходного кода, правильна ли реализация Eigen. Вместо этого я бы поискал тестовые методы, демонстрирующие интересующие вас свойства. - person Caleth; 07.11.2018