四元数,欧拉角,旋转矩阵相互转换

#include <TransForms3d/TransForms.h>

/*---------------------------------------角度弧度转换----------------------------------------*/
/**
     * @description: 角度转为弧度
     * @param {double} angle 角度值
     * @return 返回对应弧度值,一般在-3.14~3.14之间
     */
double TransForms::Degrees(double angle)
{
    return angle / 180 * M_PI;
}

/**
     * @description: 弧度转为角度
     * @param {double} degrees 弧度值
     * @return 返回对应的角度值,一般在-180~180之间
     */
double TransForms::Angle(double degrees)
{
    return degrees / M_PI * 180;
}

/*---------------------------------------欧拉角部分---------------------------*/
/**
     * @description: 角度制欧拉角转旋转矩阵,此函数默认的旋转顺序是x-y-z.
     * @param {double} rx 绕x轴的旋转.
     * @param {double} ry 绕y轴的旋转.
     * @param {double} rz 绕z轴的旋转.
     * @return {Matrix3d}  返回3✖3的旋转矩阵.
     */
Matrix3d TransForms::EulerAngle2Mat(double rx, double ry, double rz)
{
    rx = Degrees(rx);
    ry = Degrees(ry);
    rz = Degrees(rz);
    AngleAxisd rollAngle(AngleAxisd(rx, Vector3d::UnitX()));
    AngleAxisd pitchAngle(AngleAxisd(ry, Vector3d::UnitY()));
    AngleAxisd yawAngle(AngleAxisd(rz, Vector3d::UnitZ()));
    Matrix3d rotation_matrix;
    rotation_matrix = yawAngle * pitchAngle * rollAngle;
    return rotation_matrix;
}
/**
     * @description: 欧拉角转旋转矩阵
     * @param {Vector3d} eular 欧拉角rx,ry,rz 
     * @return {Matrix3d} 返回3✖3的旋转矩阵.
     */
Matrix3d TransForms::Euler2Mat(double rx, double ry, double rz)
{
    AngleAxisd rollAngle(AngleAxisd(rx, Vector3d::UnitX()));
    AngleAxisd pitchAngle(AngleAxisd(ry, Vector3d::UnitY()));
    AngleAxisd yawAngle(AngleAxisd(rz, Vector3d::UnitZ()));
    Matrix3d rotation_matrix;
    rotation_matrix = yawAngle * pitchAngle * rollAngle;
    return rotation_matrix;
}

/**
     * @description:欧拉角转四元数
     * @param {double} rx 绕x轴的旋转
     * @param {double} ry 绕y轴的旋转
     * @param {double} rz 绕z轴的旋转
     * @return {Quaterniond} 返回对应的四元数
     */
Quaterniond TransForms::Euler2Quat(double rx, double ry, double rz)
{
    return Eigen::AngleAxisd(rx, ::Eigen::Vector3d::UnitX()) *
           Eigen::AngleAxisd(ry, ::Eigen::Vector3d::UnitY()) *
           Eigen::AngleAxisd(rz, ::Eigen::Vector3d::UnitZ());
}

/**
     * @description: 角度制欧拉角转四元数
     * @param {double} rx 绕x轴的旋转
     * @param {double} ry 绕y轴的旋转
     * @param {double} rz 绕z轴的旋转
     * @return {Quaterniond} 返回对应的四元数
     */
Quaterniond TransForms::EulerAngle2Quat(double rx, double ry, double rz)
{
    rx = Degrees(rx);
    ry = Degrees(ry);
    rz = Degrees(rz);
    return Eigen::AngleAxisd(rx, ::Eigen::Vector3d::UnitX()) *
           Eigen::AngleAxisd(ry, ::Eigen::Vector3d::UnitY()) *
           Eigen::AngleAxisd(rz, ::Eigen::Vector3d::UnitZ());
}
/**
     * @description: 旋转矩阵转欧拉角(弧度制)
     * @param {Matrix3d} 3✖3的旋转矩阵
     * @return {Vector3d} 欧拉角
     */
Vector3d TransForms::Mat2Euler(Matrix3d mat)
{
    return mat.eulerAngles(2, 1, 0);
}

/**
     * @description: 欧拉角转旋转矩阵
     * @param {double} rx 绕x轴的旋转
     * @param {double} ry 绕y轴的旋转
     * @param {double} rz 绕z轴的旋转
     * @return {*}
     */
Matrix3d TransForms::EulerAngle2Mat(Vector3d eular)
{
    return EulerAngle2Mat(eular.x(), eular.y(), eular.z());
}

/**
     * @description: 旋转矩阵转角度制欧拉角(角度制)
     * @param {Matrix3d} 3✖3的旋转矩阵
     * @return {Vector3d}  欧拉角 
     */
Vector3d TransForms::Mat2EulerAngle(Matrix3d mat)
{
    Vector3d rot = mat.eulerAngles(0, 1, 2);
    rot = rot / M_PI * 180;
    return rot;
}

/*---------------------------------------四元数部分----------------------------------------*/
/**
     * @description: 四元数转旋转矩阵
     * @param {Quaterniond} 四元数
     * @return {Matrix3d} 对应的旋转矩阵
     */
Matrix3d TransForms::Quat2Mat(Quaterniond quat)
{
    return quat.matrix();
}

/**
     * @description: 四元数转欧拉角
     * @param {Quaterniond} 四元数
     * @return {Vector3d} 对应的欧拉角
     */
Vector3d TransForms::Quat2Eular(Quaterniond quat)
{
    return Mat2Euler(quat.matrix());
}

/**
     * @description: 四元数转弧度制欧拉角(角度制)
     * @param {Quaterniond} 四元数
     * @return {Vector3d} 对应的欧拉角
     */
Vector3d TransForms::Quat2EularAngle(Quaterniond quat)
{
    return Mat2EulerAngle(quat.matrix());
}

/**
     * @description: 旋转矩阵转四元数
     * @param {Matrix3d} 3✖3的旋转矩阵
     * @return {Quaterniond} 对应的四元数
     */
Quaterniond TransForms::Mat2Quat(Matrix3d mat)
{
    return Quaterniond(mat);
}

/*---------------------------------------齐次矩阵部分----------------------------------------*/
/**
     * @description: 通过位置和欧拉角合成一个齐次矩阵
     * @param {Vector3d} positon 平移位置
     * @param {Vector3d} rotEular  旋转变换(欧拉角形式)
     * @return {*}
     */
Matrix4d TransForms::Compose(Vector3d positon, Vector3d rotEular)
{
    Matrix3d rot = TransForms::EulerAngle2Mat(rotEular);
    // std::cout<<Mat2EulerAngle(rot);
    Matrix4d t;
    t.setIdentity();
    t.block<3, 3>(0, 0) = rot;
    t.block<3, 1>(0, 3) = positon;
    return t;
}

/**
     * @description: 通过位置和四元数合成一个齐次矩阵
     * @param {Vector3d} positon 平移位置
     * @param {Quaterniond} quat 四元数
     * @return {Matrix4d} 齐次矩阵
     */
Matrix4d TransForms::Compose(Vector3d positon, Quaterniond quat)
{
    return Compose(positon, Quat2Eular(quat));
}

/**
     * @description: 通过三个位置和三个欧拉角合成一个齐次矩阵
     * @param {double} x 沿x轴的平移
     * @param {double} y 沿y轴的平移
     * @param {double} z 沿z轴的平移
     * @param {double} rx 绕x轴的旋转
     * @param {double} ry 绕y轴的旋转
     * @param {double} rz 绕z轴的旋转
     * @return {Matrix4d} 返回4✖4的齐次变换矩阵
     */
Matrix4d TransForms::ComposeEuler(const double x, const double y, const double z, const double rx, const double ry, const double rz)
{
    Eigen::Vector3d rot(rx, ry, rz);
    Eigen::Vector3d pos(x, y, z);
    return TransForms::Compose(pos, rot);
}

/**
     * @description:  将齐次矩阵转换成平移和欧拉角形式,方便理解
     * @param {Matrix4d} 4✖4的齐次变换矩阵
     * @return {VectorXd} x,y,z,rx,ry,rz
     */
VectorXd TransForms::H2EulerAngle(Matrix4d t)
{
    VectorXd pose = VectorXd(6);
    Matrix3d mt = t.block<3, 3>(0, 0);
    Vector3d p3 = t.block<3, 1>(0, 3).col(0);
    pose(0, 0) = p3.x();
    pose(1, 0) = p3.y();
    pose(2, 0) = p3.z();
    Vector3d eular = Mat2EulerAngle(mt);
    pose(3, 0) = eular.x();
    pose(4, 0) = eular.y();
    pose(5, 0) = eular.z();
    return pose;
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 欧拉角四元数旋转矩阵和轴角都是表示三维旋转的不同方式。 欧拉角是由三个轴角组成,按照顺序分别表示绕x轴旋转的角度、绕y轴旋转的角度、绕z轴旋转的角度。 四元数是由四个实数组成,表示旋转的方向和角度。 旋转矩阵是由3*3的实数组成的矩阵,表示旋转的线性变换。 轴角就是由一个单位向量和一个角度组成,表示绕着该单位向量旋转角度的意思。 它们之间可以相互转换。具体方法需要根据需要选择相应的公式进行转换. ### 回答2: 欧拉角四元数旋转矩阵和轴角是用于表示物体在三维空间中旋转的常见方法。它们可以相互之间进行转换。 首先,欧拉角是使用三个旋转角度来描述物体的旋转。通常使用的欧拉角包括俯仰角(pitch angle)、偏航角(yaw angle)和滚转角(roll angle)。欧拉角转换通常涉及将欧拉角转换旋转矩阵四元数,并且转换顺序也很重要。 其次,四元数是一种用于表示旋转的数学工具,可以使用具有四个实数部分的向量进行表示。四元数转换通常涉及将四元数转换旋转矩阵欧拉角,或者将旋转矩阵欧拉角转换四元数旋转矩阵是一个3x3矩阵,用于表示物体的旋转。它是通过将欧拉角四元数转换为矩阵来实现的,也可以将矩阵转换欧拉角四元数。 轴角是用于表示旋转的方法之一。它由一个向量和一个表示旋转角度的标量组成。轴角可以通过将轴角转换旋转矩阵来实现,也可以通过将旋转矩阵转换为轴角来实现。使用轴角进行旋转时,常用的转轴包括x轴、y轴和z轴。 总结起来,欧拉角四元数旋转矩阵和轴角可以相互转换来表示物体的旋转。这些转换过程在计算机图形学、机器人学和游戏开发等领域经常被使用。理解它们之间的转换关系可以帮助我们更好地理解和应用旋转的概念。 ### 回答3: 欧拉角四元数旋转矩阵、轴角都是用于描述物体在三维空间中的旋转变换的方法,它们之间可以相互转换欧拉角是指通过绕着三个坐标轴的旋转来实现的旋转变换。通常使用三个连续的旋转角度来表示,在航空航天领域经常使用俯仰角、偏航角和滚转角来描述。但欧拉角存在万向锁问题,即在某些情况下会导致旋转变换不唯一。 四元数是一种四维复数,可以用一个实部和三个虚部来表示。它们可以直接表示旋转变换,并且不存在万向锁问题。通过四元数的乘法运算可以实现旋转变换的组合。同时,由于四元数是一个四维向量,所以它们的存储空间比旋转矩阵小。 旋转矩阵是一个3x3的矩阵,用于表示旋转变换。在旋转矩阵中,每一列表示一个旋转后的坐标轴方向。旋转矩阵可以通过将三个坐标轴绕着相应的角度进行旋转得到。但旋转矩阵存在正交性约束,即必须是正交矩阵,并且行列式为1,不满足时需要进行正则化处理。 轴角表示旋转轴和旋转角度的方法。它将旋转变换转化为绕着一个轴旋转一定角度的方式来描述。轴角与旋转矩阵之间的转换比较直观,可以通过旋转矩阵的特征向量和特征值得到旋转轴和旋转角度。但轴角存在方向的不唯一性,即旋转轴可以有两个相反的方向与同一个旋转变换对应。 以上是欧拉角四元数旋转矩阵、轴角之间的转换方法及特点的简介。它们在三维空间中描述旋转变换时各有优劣,可以根据具体需求选择合适的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值