Eigen知识点3:Eigen旋转矩阵、旋转向量、四元素、欧拉角间的相互转换

这篇博客详细介绍了如何使用Eigen库在旋转矩阵、旋转向量、欧拉角和四元素之间进行转换。内容包括绕X、Y、Z轴的旋转,以及各种转换的示例和实验结果。此外,还涉及到四元素在物体转向中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考资料
旋转矩阵到欧拉角
Eigen旋转矩阵,旋转向量,欧拉角,四元数互相转换的示例

1 绕X、Y、Z轴旋转时的旋转向量为:

注意:
vector中放置的旋转轴分别为x、y、z

Eigen::AngleAxisd rotation_vector(alpha,Vector3d(x,y,z))

初始化旋转向量,绕X、Y、Z轴逆时针旋转pi

cout<<"绕z轴的旋转矩阵为:"<<endl;
    Eigen::AngleAxisd Rotation_vector(M_PI, Eigen::Vector3d(0,0,1));
    cout<<Rotation_vector.matrix()<<endl;
    cout<< " "<<endl;
    Eigen::AngleAxisf Rotation_vector_1(M_PI,Eigen::Vector3f::UnitZ());
      cout<<Rotation_vector_1.matrix()<<endl;
    cout<< " "<<endl;

    cout<<"绕y轴的旋转矩阵为:"<<endl;
    Eigen::AngleAxisd Rotation_vector1(M_PI, Eigen::Vector3d(0,1,0));
    cout<<Rotation_vector1.matrix()<<endl;
    cout<< " "<<endl;
    Eigen::AngleAxisd Rotation_vector1_1(M_PI, Eigen::Vector3d::UnitY());
     cout<<Rotation_vector1_1.matrix()<<endl;
    cout<< " "<<endl;
    

    cout<<"绕x轴的旋转矩阵为:"<<endl;
    Eigen::AngleAxisd Rotation_vector2(M_PI, Eigen::Vector3d(1,0,0));
    cout<<Rotation_vector2.matrix()<<endl;
    cout<< " "<<endl;
    Eigen::AngleAxisd Rotation_vector2_1(M_PI, Eigen::Vector3d::UnitX());
     cout<<Rotation_vector2_1.matrix()<<endl;
    cout<< " "<<endl;

实验结果:
请添加图片描述

1.1 将1中的旋转向量转换为旋转矩阵形式

将上面绕x轴旋转pi的旋转向量转换为旋转矩阵形式,用罗德里格斯公式

// 将旋转向量转换为旋转矩阵
Eigen::Matrix3d Rotation_matrix=Rotation_vector2_1.matrix();
cout<<"旋转矩阵为"<<endl;
cout<<Rotation_matrix<<endl;

实验结果
请添加图片描述

1.1.1 将1.1中的旋转矩阵转旋转向量

  cout<<"绕z轴的旋转向量为:"<<endl;
    Eigen::AngleAxisd Rotation_vector(M_PI, Eigen::Vector3d(0,0,1));
     // // 将旋转向量转换为旋转矩阵
    Eigen::Matrix3d Rotation_matrix=Rotation_vector.matrix();
 // 将旋转矩阵转换为旋转向量
    Eigen::AngleAxisd R_vector(Rotation_matrix);
    cout<<"旋转向量为:"<<endl;
    cout<<R_vector.matrix()<<endl;

1.2 将1中的旋转向量转换为四元素形式

   // 将旋转向量转换为四元素形式
cout<<"z轴旋转向量转换为四元素形式"<<endl;
Eigen::Quaterniond q_z(Rotation_vector);
cout<<q_z.x()<<" "<<q_z.y()<<" "<<q_z.z()<<" "<<q_z.w()<<endl;

cout<<"y轴旋转向量转换为四元素形式"<<endl;
Eigen::Quaterniond q_y(Rotation_vector1);
cout<<q_y.x()<<" "<<q_y.y()<<" "<<q_y.z()<<" "<<q_y.w()<<endl;


  cout<<"x轴旋转向量转换为四元素形式"<<endl;
Eigen::Quaterniond q_x(Rotation_vector2);
cout<<q_x.x()<<" "<<q_x.y()<<" "<<q_x.z()<<" "<<q_x.w()<<endl;

请添加图片描述

1.2.1 将1.1中的旋转矩阵转换为四元素形式

cout<<"旋转矩阵转换为四元素2"<<endl;
Eigen::Quaterniond q2(Rotation_matrix);
cout<<q2.x()<<" "<<q2.y()<<" "<<q2.z()<<" "<<q2.w()<<endl;

1.3 将1中的旋转向量转换为欧拉角形式

注意:xyz分别对应RPY(0,1,2)
下边0,1,2只不过是这三个角的显示顺序不同而已
旋转向量转为欧拉角,顺序为y-z-x,也即yaw pitch roll

        // 旋转向量转换为欧拉角
    cout<<"y_旋转向量转换为欧拉角为:"<<endl ;
  
    // cout<<Rotation_vector_1.matrix().eulerAngles(2,1,0)<<endl;
    cout<<" "<<endl;
cout<<Rotation_vector1.matrix().eulerAngles(1,2,0)<<endl;

等价于

rotation_matrix = AngleAxisd(euler_angles[0], Vector3f::UnitY())
     * AngleAxisd(euler_angles[1], Vector3f::UnitZ())
     * AngleAxisd(euler_angles[2], Vector3f::UnitX()); 

其表示先绕X轴旋转,再绕Z轴旋转,再绕Y轴旋转

注意:坐标轴方向
X轴朝前;Y轴朝左,Z轴朝右

1.3.1 将1.1中的旋转矩阵转换为欧拉角形式

代码同1.3

1.4 初始化旋转矩阵

// 初始化旋转矩阵
    Eigen::Matrix3d rotation_matrix;
    rotation_matrix<<1,2,4,4,5,6,7,8,9;
    cout<<rotation_matrix<<endl;

请添加图片描述

1.5 欧拉角

1.5.1 初始化欧拉角

 // 初始化欧拉角
        double roll=M_PI/4,pitch=M_PI/4,yaw=M_PI/4;
        Eigen::Vector3d eulerAngle(roll,pitch,yaw);

1.5.2 欧拉角转旋转向量

        Eigen::AngleAxisd rollAngle(Eigen::AngleAxisd(eulerAngle(0), Eigen::Vector3d(1,0,0)));
        Eigen::AngleAxisd pitchAngle(Eigen::AngleAxisd(eulerAngle(0), Eigen::Vector3d(0,0,1)));
        Eigen::AngleAxisd yawAngle(Eigen::AngleAxisd(eulerAngle(0), Eigen::Vector3d(0,1,0)));
        Eigen::AngleAxisd rotation_vector;
        rotation_vector=yawAngle*pitchAngle*rollAngle;

实验结果:
请添加图片描述

1.5.3 欧拉角转旋转矩阵

        Eigen::Matrix3d rotation_matrix;
        rotation_matrix=yawAngle*pitchAngle*rollAngle;
         cout<<rotation_matrix<<endl;

1.5.4 欧拉角转四元素

quaternion=yawAngle*pitchAngle*rollAngle;
        cout<<"欧拉角转四元素"<<endl;
        cout<<quaternion.x()<<endl;
        cout<<quaternion.y()<<endl;
        cout<<quaternion.z()<<endl;
        cout<<quaternion.w()<<endl;

1.6 四元素

1.6.1 四元素转欧拉角

  cout<<"四元素转欧拉角"<<endl ;
    Eigen::Vector3d eulerAngle1=quaternion.matrix().eulerAngles(1,0,2);
    cout<<eulerAngle1.matrix()<<endl;

发现实验结果有问题:
输入的姿态角

double roll=M_PI/4,pitch=M_PI/4,yaw=M_PI/4;

姿态角转四元素

0.191342
0.46194
0.191342
0.844623

2 四元素知识点

实现的功能:1个物体以一定的速度转向目标物体

Quaternion.Slerp(Quaternion from ,Quaternion to, float t)叫球面线形插值

@param from 为起始方向

@param to 为终止方向

@ param t = 0.1 可以理解为速度,通常取值为0< t <= 1

3 资料参考

使用Eigen实现四元数、欧拉角、旋转矩阵、旋转向量之间的转换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星辰和大海都需要门票

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值