шаблон<typename _Scalar, class _System>
класс Eigen::EulerAngles< _Scalar, _System >
Представляет вращение в трёхмерном пространстве как три Эйлеровых угла.
Вращение Эйлера — это набор из трёх вращений вокруг трёх фиксированных осей, определённых системой Эйлера EulerSystem, заданной в качестве шаблона.
Вот как работают внутренние углы Эйлера:
- сначала поверните систему координат вокруг оси альфа на угол альфа
- затем поверните систему координат вокруг оси бета (которая была повернута на первом этапе) на угол бета
- затем поверните систему координат вокруг оси гамма (которая была повернута на двух предыдущих этапах) на угол гамма
- Примечание
- Этот класс поддерживает только внутренние углы Эйлера для простоты, см. EulerSystem, как легко обойти это для внешних систем.
Представление вращения и преобразования
Было доказано (см. ссылку на Википедию ниже), что любое вращение можно представить в виде углов Эйлера, но нет единого представления (в отличие от матриц вращения). Поэтому вы можете преобразовывать вращения из Eigen в углы Эйлера и обратно (включая матрицы вращения, которые в дизайне Eigen не называются "вращениями").
Углы Эйлера обычно используются для:
- удобного человеко-ориентированного представления вращения, особенно в интерактивных графических интерфейсах.
- систем с карданами и робототехники
- эффективного кодирования (т.е. только 3 числа с плавающей запятой) вращения для сетевых протоколов.
Однако углы Эйлера медленнее по сравнению с кватернионами или матрицами, из-за их неестественного математического определения, хотя оно и просто для человека. Для преодоления этого класс предоставляет лёгкий переход от математически удобного представления к человеко-ориентированному и наоборот.
Всё, что пользователю нужно сделать, — это безопасное простое преобразование типов C++, и этот класс позаботится о математике. Кроме того, некоторые вычисления, связанные с осями, выполняются во время компиляции.
Диапазоны углов Эйлера при преобразованиях
Представления вращений как EulerAngles не являются единственными (в отличие от матриц), и даже имеют бесконечное множество представлений EulerAngles.
Например, добавление или вычитание 2*PI из любого угла EulerAngles даст то же самое вращение. Это общая причина бесконечного представления, но это не единственная общая причина отсутствия единственного представления.
При преобразовании вращения в EulerAngles, этот класс преобразует его в определённые диапазоны. При преобразовании некоторого вращения в EulerAngles, правила для диапазонов следующие:
- Если вращение, из которого мы преобразуем, является EulerAngles (даже если оно явно представлено как RotationBase), диапазоны углов являются неопределёнными.
- в противном случае, углы альфа и гамма будут в диапазоне [-PI, PI].
Что касается угла бета: - Если система является Таит-Брайана, угол бета будет в диапазоне [-PI/2, PI/2].
- в противном случае:
- Если ось бета положительна, угол бета будет в диапазоне [0, PI]
- Если ось бета отрицательна, угол бета будет в диапазоне [-PI, 0]
- См. также
-
EulerAngles(const MatrixBase<Derived>&)
- EulerAngles(const RotationBase<Derived, 3>&)
Удобные пользовательские псевдонимы типов
Удобные псевдонимы типов для EulerAngles существуют для float и double скаляров, в форме EulerAngles{A}{B}{C}{скаляр}, например, EulerAnglesXYZd, EulerAnglesZYZf.
Только для систем Эйлера с положительными осями {+x,+y,+z} существуют удобные псевдонимы. Если вам нужны отрицательные оси {-x,-y,-z}, рекомендуется создать свои собственные псевдонимы с словом, описывающим вашу потребность.
Пример
#include <unsupported/Eigen/EulerAngles>
#include <iostream>
using namespace Eigen;
int main()
{
// A common Euler system by many armies around the world,
// where the first one is the azimuth(the angle from the north -
// the same angle that is show in compass)
// and the second one is elevation(the angle from the horizon)
// and the third one is roll(the angle between the horizontal body
// direction and the plane ground surface)
// Keep remembering we're using radian angles here!
typedef EulerSystem<-EULER_Z, EULER_Y, EULER_X> MyArmySystem;
typedef EulerAngles<double, MyArmySystem> MyArmyAngles;
MyArmyAngles vehicleAngles(
3.14/*PI*/ / 2, /* heading to east, notice that this angle is counter-clockwise */
-0.3, /* going down from a mountain */
0.1); /* slightly rolled to the right */
// Some Euler angles representation that our plane use.
EulerAnglesZYZd planeAngles(0.78474, 0.5271, -0.513794);
MyArmyAngles planeAnglesInMyArmyAngles(planeAngles);
std::cout << "vehicle angles(MyArmy): " << vehicleAngles << std::endl;
std::cout << "plane angles(ZYZ): " << planeAngles << std::endl;
std::cout << "plane angles(MyArmy): " << planeAnglesInMyArmyAngles << std::endl;
// Now lets rotate the plane a little bit
std::cout << "==========================================================\n";
std::cout << "rotating plane now!\n";
std::cout << "==========================================================\n";
Quaterniond planeRotated = AngleAxisd(-0.342, Vector3d::UnitY()) * planeAngles;
planeAngles = planeRotated;
planeAnglesInMyArmyAngles = planeRotated;
std::cout << "new plane angles(ZYZ): " << planeAngles << std::endl;
std::cout << "new plane angles(MyArmy): " << planeAnglesInMyArmyAngles << std::endl;
return 0;
}
Вывод:
vehicle angles(MyArmy): 1.57 -0.3 0.1
plane angles(ZYZ): 0.78474 0.5271 -0.513794
plane angles(MyArmy): -0.206273 0.453463 -0.278617
==========================================================
rotating plane now!
==========================================================
new plane angles(ZYZ): 1.44358 0.366507 -1.23637
new plane angles(MyArmy): -0.18648 0.117896 -0.347841
Дополнительное чтение
Если вы хотите узнать больше о том, как работают системы Эйлера в Eigen, см. EulerSystem.
Дополнительная информация об углах Эйлера: https://en.wikipedia.org/wiki/Euler_angles
- Шаблонные параметры
-
| _Scalar |
тип скаляра, т.е. тип углов. |
| _System |
EulerSystem для использования, представляющий оси вращения. |