Spec-Zone.ru › Eigen3

Eigen::EulerAngles

шаблон<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 для использования, представляющий оси вращения.
Inheritance graph
тип AngleAxis< Scalar > AngleAxisType
тип Matrix< Scalar, 3, 3 > Matrix3
тип Quaternion< Scalar > QuaternionType
тип _Scalar Scalar
тип _System System
тип Matrix< Scalar, 3, 1 > Vector3
Числовой тип & alpha ()
Числовой тип alpha () const
Вектор3 & angles ()
const Вектор3 & angles () const
Числовой тип & beta ()
Числовой тип beta () const
template<typename NewScalarType >
EulerAngles< NewScalarType, Система > cast () const
EulerAngles ()
template<typename Derived >
EulerAngles (const MatrixBase< Derived > &other)
template<typename Derived >
EulerAngles (const RotationBase< Derived, 3 > &rot)
EulerAngles (const Числовой тип &alpha, const Числовой тип &beta, const Числовой тип &gamma)
EulerAngles (const Числовой тип *data)
Числовой тип & gamma ()
Числовой тип gamma () const
EulerAngles inverse () const
bool isApprox (const EulerAngles &other, const RealScalar &prec=NumTraits< Числовой тип >::dummy_precision()) const
operator QuaternionType () const
EulerAngles operator- () const
template<class Derived >
EulerAngles & operator= (const MatrixBase< Derived > &other)
template<typename Derived >
EulerAngles & operator= (const RotationBase< Derived, 3 > &rot)
Матрица3 toRotationMatrix () const
static Вектор3 AlphaAxisVector ()
static Вектор3 BetaAxisVector ()
static Вектор3 GammaAxisVector ()

AngleAxisType

template<typename _Scalar , class _System >
typedef AngleAxis<Числовой тип> Eigen::EulerAngles< _Scalar, _System >::AngleAxisType

эквивалентный тип angle-axis

Матрица3

template<typename _Scalar , class _System >
typedef Matrix<Числовой тип,3,3> Eigen::EulerAngles< _Scalar, _System >::Матрица3

эквивалентный тип матрицы вращения

QuaternionType

template<typename _Scalar , class _System >
typedef Quaternion<Числовой тип> Eigen::EulerAngles< _Scalar, _System >::QuaternionType

эквивалентный тип кватерниона

Числовой тип

template<typename _Scalar , class _System >
typedef _Scalar Eigen::EulerAngles< _Scalar, _System >::Числовой тип

тип числовых значений углов

Система

template<typename _Scalar , class _System >
typedef _System Eigen::EulerAngles< _Scalar, _System >::Система

Используемая EulerSystem для определения осей вращения.

Вектор3

template<typename _Scalar , class _System >
typedef Matrix<Числовой тип,3,1> Eigen::EulerAngles< _Scalar, _System >::Вектор3

эквивалентный тип 3-мерного вектора

EulerAngles() [1/5]

template<typename _Scalar , class _System >
Eigen::EulerAngles< _Scalar, _System >::EulerAngles ( )
inline

Конструктор по умолчанию без инициализации.

EulerAngles() [2/5]

template<typename _Scalar , class _System >
Eigen::EulerAngles< _Scalar, _System >::EulerAngles ( const Scalar & alpha,
const Scalar & beta,
const Scalar & gamma
)
inline

Создаёт и инициализирует EulerAngles (alpha, beta, gamma).

EulerAngles() [3/5]

template<typename _Scalar , class _System >
Eigen::EulerAngles< _Scalar, _System >::EulerAngles ( const Scalar * data )
inlineexplicit

Создаёт и инициализирует EulerAngles из массива данных {alpha, beta, gamma}

EulerAngles() [4/5]

template<typename _Scalar , class _System >
template<typename Derived >
Eigen::EulerAngles< _Scalar, _System >::EulerAngles ( const MatrixBase< Derived > & other )
inlineexplicit

Создаёт и инициализирует EulerAngles из:

  • выражения матрицы вращения 3x3 (т.е. чистой ортогональной матрицы с определителем +1),
  • выражения вектора 3D, представляющего углы Эйлера.
Примечание
Если other — это матрица вращения 3x3, правила диапазона углов будут следующими:
Углы Alpha и gamma будут в диапазоне [-PI, PI].
Что касается угла Beta:
  • Если система — Tait-Bryan, угол beta будет в диапазоне [-PI/2, PI/2].
  • в противном случае:
    • Если ось beta положительна, угол beta будет в диапазоне [0, PI]
    • Если ось beta отрицательна, угол beta будет в диапазоне [-PI, 0]

EulerAngles() [5/5]

template<typename _Scalar , class _System >
template<typename Derived >
Eigen::EulerAngles< _Scalar, _System >::EulerAngles ( const RotationBase< Derived, 3 > & rot )
inline

Создаёт и инициализирует углы Эйлера из вращения rot.

Примечание
Если rot — это EulerAngles (даже если он явно представлен как RotationBase), диапазоны углов неопределены. В противном случае углы alpha и gamma будут в диапазоне [-PI, PI].
Что касается угла Beta:
  • Если система — Tait-Bryan, угол beta будет в диапазоне [-PI/2, PI/2].
  • в противном случае:
    • Если ось beta положительна, угол beta будет в диапазоне [0, PI]
    • Если ось beta отрицательна, угол beta будет в диапазоне [-PI, 0]

alpha() [1/2]

template<typename _Scalar , class _System >
Scalar& Eigen::EulerAngles< _Scalar, _System >::alpha ( )
inline
Возвращает
Ссылка с возможностью записи на угол первого угла.

alpha() [2/2]

template<typename _Scalar , class _System >
Scalar Eigen::EulerAngles< _Scalar, _System >::alpha ( ) const
inline
Возвращает
Значение первого угла.

AlphaAxisVector()

template<typename _Scalar , class _System >
static Vector3 Eigen::EulerAngles< _Scalar, _System >::AlphaAxisVector ( )
inlinestatic
Возвращает
вектор оси первого (альфа) вращения

angles() [1/2]

template<typename _Scalar , class _System >
Vector3& Eigen::EulerAngles< _Scalar, _System >::angles ( )
inline
Возвращает
Ссылка с возможностью записи на значения углов, хранящиеся в векторе (alpha, beta, gamma).

angles() [2/2]

template<typename _Scalar , class _System >
const Vector3& Eigen::EulerAngles< _Scalar, _System >::angles ( ) const
inline
Возвращает
Значения углов, хранящиеся в векторе (alpha, beta, gamma).

beta() [1/2]

template<typename _Scalar , class _System >
Scalar& Eigen::EulerAngles< _Scalar, _System >::beta ( )
inline
Возвращает
Ссылка с возможностью записи на угол второго угла.

beta() [2/2]

template<typename _Scalar , class _System >
Scalar Eigen::EulerAngles< _Scalar, _System >::beta ( ) const
inline
Возвращает
Значение второго угла.

BetaAxisVector()

template<typename _Scalar , class _System >
static Vector3 Eigen::EulerAngles< _Scalar, _System >::BetaAxisVector ( )
inlinestatic
Возвращает
вектор оси второго (бета) вращения

cast()

template<typename _Scalar , class _System >
template<typename NewScalarType >
EulerAngles<NewScalarType, System> Eigen::EulerAngles< _Scalar, _System >::cast ( ) const
inline
Возвращает
*this с типом скаляра, преобразованным в NewScalarType

gamma() [1/2]

template<typename _Scalar , class _System >
Scalar& Eigen::EulerAngles< _Scalar, _System >::gamma ( )
inline
Возвращает
Ссылка с возможностью записи на угол третьего угла.

gamma() [2/2]

template<typename _Scalar , class _System >
Scalar Eigen::EulerAngles< _Scalar, _System >::gamma ( ) const
inline
Возвращает
Значение третьего угла.

GammaAxisVector()

шаблон<typename _Scalar , class _System >
static Vector3 Eigen::EulerAngles< _Scalar, _System >::GammaAxisVector ( )
inlinestatic
Возвращает
вектор оси третьего (гамма) вращения

обратная()

шаблон<typename _Scalar , class _System >
EulerAngles Eigen::EulerAngles< _Scalar, _System >::обратная ( ) const
inline
Возвращает
Обратное вращение Эйлера (то же, что и отрицательное), (-альфа, -бета, -гамма).

isApprox()

шаблон<typename _Scalar , class _System >
bool Eigen::EulerAngles< _Scalar, _System >::isApprox ( const EulerAngles< _Scalar, _System > & other,
const RealScalar & prec = NumTraits<Scalar>::dummy_precision()
) const
inline
Возвращает
true , если *this приблизительно равно other с точностью, заданной prec.
См. также
MatrixBase::isApprox()

operator QuaternionType()

шаблон<typename _Scalar , class _System >
Eigen::EulerAngles< _Scalar, _System >::operator QuaternionType ( ) const
inline

Преобразовать углы Эйлера в кватернион.

operator-()

шаблон<typename _Scalar , class _System >
EulerAngles Eigen::EulerAngles< _Scalar, _System >::operator- ( ) const
inline
Возвращает
Отрицательное вращение Эйлера (то же, что и обратное), (-альфа, -бета, -гамма).

operator=() [1/2]

шаблон<typename _Scalar , class _System >
шаблон<class Derived >
EulerAngles& Eigen::EulerAngles< _Scalar, _System >::operator= ( const MatrixBase< Derived > & other )
inline

Установить *this из:

  • выражения матрицы вращения 3x3 (т.е. чисто ортогональная матрица с определителем +1),
  • выражения 3D-вектора, представляющего углы Эйлера.

См. EulerAngles(const MatrixBase<Derived, 3>&) для получения дополнительной информации о диапазонах углов вывода.

operator=() [2/2]

шаблон<typename _Scalar , class _System >
шаблон<typename Derived >
EulerAngles& Eigen::EulerAngles< _Scalar, _System >::operator= ( const RotationBase< Derived, 3 > & rot )
inline

Установить *this из вращения.

См. EulerAngles(const RotationBase<Derived, 3>&) для получения дополнительной информации о диапазонах углов вывода.

toRotationMatrix()

шаблон<typename _Scalar , class _System >
Matrix3 Eigen::EulerAngles< _Scalar, _System >::toRotationMatrix ( ) const
inline
Возвращает
эквивалентную матрицу вращения 3x3.

Документация для этого класса была сгенерирована из следующего файла:
  • EulerAngles.h

© Eigen.
Licensed under the MPL2 License.
https://eigen.tuxfamily.org/dox/unsupported/classEigen_1_1EulerAngles.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API