/*****************************************************************************/ /** * @file eulerangles.h * @author FanHao (hao_fan_bit_ee@163.com) * @version 0.0 * @date 2023-05-06 * * @copyright Copyright(c) 2024 Beijing Institute of Technology.\n * Lab of Communication and Network * ******************************************************************************/ /** * @addtogroup LinkLayer * @{ */ /** * @addtogroup LinkLayerGeometry * @{ */ /** * @defgroup LinkLayerGeometry_EulerAngles * @{ */ #ifndef __EULERANGLES_H #define __EULERANGLES_H #define EUL_PI 3.14159265358979323846 #define DEG2RAD(d) ((EUL_PI / 180.0) * (d)) #define RAD2DEG(r) ((180.0 / EUL_PI) * (r)) /** * Orientations are represented by 3D double precision Tait-Bryan (Euler) tuples * called EulerAngles. The angles are in Z, Y', X" order that is often called * intrinsic rotations, they are measured in radians. The default (unrotated) * orientation is along the X axis. Conceptually, the Z axis rotation is heading, * the Y' axis rotation is descending (negative elevation), the X" axis rotation is bank. * For example, positive rotation along the Z axis rotates X into Y (turns left), positive * rotation along the Y axis rotates Z into X (leans forward), positive rotation * along the X axis rotates Y into Z (leans right). */ /** * @struct EULERANGLES * @brief Structure for standard quaternion */ typedef struct { double alpha; // unit rad double beta; // unit rad double gamma; // unit rad } EULERANGLES; typedef enum { EULERANGLES_NONE = 0, EULERANGLES_ZYX = 1, EULERANGLES_ZYZ = 2, EULERANGLES_XYZ = 3, } EULERANGLES_TYPE; extern const EULERANGLES EULERANGLES_ZERO; extern const EULERANGLES EULERANGLES_NIL; /** @brief Add two EulerAngles. */ EULERANGLES EulerAngles_Add(EULERANGLES e1, EULERANGLES e2); /** @brief Subtracts two EulerAngles. */ EULERANGLES EulerAngles_Sub(EULERANGLES e1, EULERANGLES e2); /** @brief Multiplies EulerAngles by a real number. */ void EulerAngles_ScalarMult(EULERANGLES *e, double f); /** @brief Multiplies EulerAngles by a real number. */ EULERANGLES EulerAngles_GetScalarMult(EULERANGLES e, double f); /** @brief Normalize EulerAngles. */ void EulerAngles_Normalize(EULERANGLES *e); /** @brief Normalize EulerAngles. */ EULERANGLES EulerAngles_GetNormalize(EULERANGLES e); #endif /** @} LinkLayerGeometry_EulerAngles */ /** @} LinkLayerGeometry */ /** @} LinkLayer */