Мне нужно извлечь углы наклона тангажа крена из матрицы вращения, и я хочу быть уверенным, что то, что я делаю, правильно.
Eigen::Matrix< simFloat, 3, 1> rpy = orientation.toRotationMatrix().eulerAngles(0,1,2);
const double r = ((double)rpy(0));
const double p = ((double)rpy(1));
const double y = ((double)rpy(2));
Это верно? Потому что я читал здесь:
http://eigen.tuxfamily.org/dox/group__Geometry__Module.html#gad118fececd448d7485ffea4858775e5a
И я был немного смущен, когда в конце описания говорится, в каких интервалах определены углы.
Я думаю, это то, что вы ищете. В зависимости от того, как мы используем
m.eulerAngles (0, 1, 2);
вот оно, получить Rotx, Roty, Rotz, который реконструирован с помощью RotxROTYROTZ
Matrix3f m;
m = AngleAxisf(0.25*M_PI, Vector3f::UnitX())
* AngleAxisf(0.5*M_PI, Vector3f::UnitY())
* AngleAxisf(0.33*M_PI, Vector3f::UnitZ());
cout << "original rotation:" << endl;
cout << m << endl << endl;
Vector3f ea = m.eulerAngles(0, 1, 2);
cout << "to Euler angles:" << endl;
cout << ea << endl << endl;
Matrix3f n;
n = AngleAxisf(ea[0], Vector3f::UnitX())
*AngleAxisf(ea[1], Vector3f::UnitY())
*AngleAxisf(ea[2], Vector3f::UnitZ());
cout << "recalc original rotation:" << endl;
cout << n << endl;
Спасибо за вашу ссылку! Я также в первую очередь использую Eigen. Это просто сэкономит много работы!
Ответ Шона Ле правильный, но я думаю, что строка должна быть
Vector3f ea = m.eulerAngles(2, 1, 0);
затем ea
будет удерживать значение тангажа и крена в этом порядке. Угол поворота эйлера ZYX эквивалентен вращению с фиксированной осью XYZ, которое представляет собой не что иное, как шаг крена и рыскание.