2015-11-24 2 views
0

Предположим, что у меня 3-мерная рамка с поворотным валом = 0, шаг = 0 и yaw = 0 вокруг x, y и z соответственно.Об EulerAngles Преобразование из собственной библиотеки C++

Я хочу, чтобы рамка вращалась вокруг оси x для 3.14159 (Pi) или roll = Pi.

Ниже приведен код указанной ситуации.

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

Вместо рулона = Pi результат равен roll = 0, pitch = pi и yaw = pi.

Я думаю, что набор инструментов RVC от Peter Corke на Matlab дает правильный ответ.

Возможно, что-то не так с моей программой или eulerAngles в Eigen работает по-другому? Пожалуйста помоги.

Код:

#include <iostream> 
#include <Eigen/Dense> 

const double PI = 3.14159265359; 

int main() 
{ 
    using ::Eigen::AngleAxisd; 
    using ::Eigen::Matrix3d; 
    using ::Eigen::Vector3d; 
    using ::std::cout; 
    using ::std::endl; 

    Matrix3d R,Rx; 

    R = AngleAxisd(PI, Vector3d::UnitX()) 
     * AngleAxisd(0, Vector3d::UnitY()) 
     * AngleAxisd(0, Vector3d::UnitZ()); 
    Rx = AngleAxisd(PI, Vector3d::UnitX()); 

    cout << R << endl << endl; 
    cout << Rx << endl << endl; 

    Vector3d ea = R.eulerAngles(0,1,2); 
    Vector3d eax = Rx.eulerAngles(0,1,2); 

    cout << ea << endl << endl; 
    cout << eax << endl << endl; 

    std::cin.ignore(); 
    return 0; 
} 

вывода (I округлять числа, которые слишком малы нулю):

1 0 0 
0 -1 0 
0 0 -1 

1 0 0 
0 -1 0 
0 0 -1 

0 
3.14159 
3.14159 

0 
3.14159 
3.14159 

ответ

1

Обратитесь к documentation от Eigen:eulerAngles. Подробная информация о различных соглашениях углов Эйлера хорошо документирована в Wikipedia и MathWorld.

Edit:

  1. вы получите точные результаты, если вы используете M_PI, который внутренне определен, а не усеченного значения PI.

  2. Представление угла Эйлера имеет особенность. Тестовый пример, который вы пытаетесь сравнить, - это особое положение.

  3. Возможно, вы захотите использовать кватернионы или представление по оси, если хотите преодолеть особенности.

+0

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

+0

Извините! Я должен был попробовать код. Я отредактировал ответ соответственно. – Saurav

+0

Спасибо, ваше предложение работает! –

1

углы Эйлера не являются уникальными. В вашем соглашении XYZ оба (0, pi, pi) и (pi,0,0) представляют одно и то же вращение, и оба они являются правильными. Метод Eigen::eulerAngles последовательно выбирает минимизацию первых углов.

+0

Понятно.Yup, подтвердил это при использовании (0, pi, pi) и дал примерно такую ​​же матрицу поворота с (pi, 0,0). Существует ли какое-либо обходное решение для этого, чтобы Eigen :: eulerAngles не сворачивали первые углы? –

-1

Различные углы порядка Euler (roll1, pitch1, yaw1 или pitch2, yaw2, roll2, ...) может привести к одной и той же матрицы поворота.

Собственно, документ Eigen дал ответ. Прочтите объявление функции Eigen document более тщательно, и вы получите ответ. Matrix< typename MatrixBase< Derived >::Scalar, 3, 1 > Eigen::MatrixBase< Derived >::eulerAngles ( Index a0, Index a1, Index a2 ) const Каждый из трех параметров a0, a1, a2 представляет соответствующую ось вращения в виде целого числа в {0,1,2}. Так, например, в:

Vector3f ea = mat.eulerAngles(2, 0, 2);

"2" представляет ось г и "0" ось х, и т.д.