开发者

C++之eigen安装与测试方式

开发者 https://www.devze.com 2022-12-16 10:26 出处:网络 作者: 后厂村路蔡徐坤
目录C++eigen安装与测试1、eigen库安装2、查看eigen的版本号C++ eigen使用eigen几何模块的使用方法总结C++eigen安装与测试
目录
  • C++eigen安装与测试
    • 1、eigen库安装
    • 2、查看eigen的版本号
  • C++ eigen使用
    • eigen几何模块的使用方法
  • 总结

    C++eigen安装与测试

    1、eigen库安装

    1)方法一:源码安装(推荐)

    官网下载、或git下载eigen源码

    cd eigen
    mkdir build
    cd build
    cmake ..
    sudo make install
    #安装后,头文件安装在/usr/local/include/eigen3/
    #移动头文件
    sudo cp -r /usr/local/include/eigen3/Eigen /usr/local/include

    2)方法二:直接安装(不推荐)

    这种方法安装eigen库,比较简单,但是eigen不一定是最新版本。

    sudo apt install libeigen3-dev
    //若默认安装的是/usr/local/include/eigen3/Eigen 下,将Eigen文件夹拷贝一份到/usr/local/includjse 下
    sudo cp -r /usr/local/include/eigen3/Eigen /usr/local/include
    sudo cp -r /usr/local/include/eigen3 /usr/include

    2、查看eigen的版本号

    pkg-config --modversion eigen3

    如果可以正确查看版本号,一般说明eigen库安装成功

    C++ eigen使用

    eigen几何模块的使用方法

    旋转向量 R

    利用Eigen::AngleAxisd(参数:角度,轴)得到

    //沿 Z 轴旋转 45 度
    Eigen::AngleAxisd rotation_vector ( M_PI/4, Eigen::Vector3d ( 0,0,1 ) );
    //由角轴得到旋转变量
    Eigen::Matrix3d R = Eigen::AngleAxisd(M_PI/2, Eigen::Vector3d(0,0,1)).toRotationMatrix()

    旋转矩阵 Eigen::Matrix3d

    //在这里插入代码片`旋转向量转换到旋转矩阵
    rotation_vector.toRotationMatrix();

    欧拉角

    //( 2,1,0 )表示ZYX顺序,即roll pitch yaw顺序,将旋转矩阵转换到欧拉角
    Eigen::Vector3d rotation_matrix.eulerAngles ( 2,1,0 )

    四元数

    //定义四元数
    Eigen::Quaterniond q = Eigen::Quaterniond (rotation_vector);
    //旋转矩阵定php义四元素
    q = Eigen::Quaterniond (rotation_matrix);

    欧拉角与四元数相互转换

    // 欧拉角转四元数 R-P-Y
    Eigen::Vector3d eulerAngle(yaw,pitch,roll);
    Eigen::AngleAxisd rollAngle(AngleAxisd(eulerAngle(2),Vector3d::UnitX()));
    Eigen::AngleAxisd pitchAngle(AngleAxisd(eulerAngle(1),Vector3d::UnitY()));
    Eigen::AngleAxisd yawAngle(AngleAxisd(eulerAngle(0),Vector3d::UnitZ()));
    
    Eigen::Quaterniond quaternion;
    quaternion=yawAngle*pitchAngle*rollAngle;
    
    //四元数转欧拉角 R-P-Y
    Eigen::Vector3d eulerAngle=quaternion.matrix().eulerAngles(2,1,0);

    四元数、欧拉角转换实例。

    以下代码在欧拉角出现pi/2时,以及大于pi时会出现问题。

    #include <IOStream>
    #include <cmath>
    #include <eigen3/Eigen/COaSgEjYQdore>
    #include <eigen3/Eigen/Geometry>
    
    using namespace std;
    int main()
    {
      Eigen::Vector3d eulerAngle(M_PI/3,M_PI/5,M_PI/4);
      cout<<"roll(X) pitch(Y) yaw(Z)=\n"<< eulerAngle.transpose()<<endl<<endl;
    
      Eigen::AngleAxisd rollAngle(Eigen::AngleAxisd(eulerAngle(0),Eigen::Vector3d::UnitX()));
      Eigen::AngleAxisd pitchAngle(Eigen::AngleAxisd(eulerAngle(1),Eigen::Vector3d::UnitY()));
      Eigen::AngleAxisd yawAngle(Eigen::AngleAxisd(eulerAngle(2),Eigen::Vector3d::UnitZ()));
    
      Eigen::Quaterniond quat编程客栈ernion;
      quaternion=rollAngle*pitchAngle*yawAngle;
      Eigen::Vector3d eulerAngle_1=quaternion.matrix().eulerAngles(0,1,2);
      cout<<"roll(X) pitch(Y) yaw(Z)=\n"<< eulerAngle_1.transpose()<<endl<<endl;
    
     //Eigen::Vector3d eulerAngle(roll,pitch,yaw);
     //Eigen::AngleAxisd rollAngle(AngleAxisd(eulerAngle(0),Vector3d::UnitX()));
     //Eigen::AngleAxisd pitchAngle(AngleAxisd(eulerAngle(1),Vector3d::UnitY()));
     //Eigen::AngleAxisd yawAngle(AngleAxisd(eulerAngle(2),Vector3d::UnitZ()));
     //Eigen::Quaterniond quaternion;
     //quaternion=yawAngle*pitchAngle*rollAngle;
     //Eigen::Vector3d eulerAngle=quaternion.matrix().eulerAngles(2,1,0);
     
      Eigen::Quaterniond quaternion2(-0.5,0,0,1);
      Eigen::Vector3d eulerAngle_2=quaternion2.matrix().eulerAngles(2,1,0);
      cout<<"yaw(Z) pitch(Y) roll(Z)=\n"<< eulerAngle_2.transpose()<<endl<<endl;                                                         
    
      return 0;
    }

    g++ test.cpp

    tf 实现四元数到欧拉角转换接口使用及测试

    #include <iostream>
    #include <tf/transform_datatypes.h>//转换函数头文件
    #include <nav_msgs/Odometry.h>//里程计信息格式
    
    using namespace std;
    int main ()
    {
      tf::Quaternion quat(0,0,1,-0.5);
      double roll, pitch, yaw;//定义存储r\p\y的容器
    
      tf::Matrix3x3(quat).getRPY(roll, pitch, yaw);//进行转换
      cout << "roll:" << roll << "\npitch:" << pitch << "\nyaw:" << yaw << endl;
      return 0;
    }

    直接编译命令:

    g++ `pkg-config --libs --cflags tf` -ldl tf_test.cpp

    欧式变换矩阵开发者_Python入门(其次坐标包含R,t)

    //虽然称为3d(指3维空间的欧式坐标),实质上是4*4的矩阵, 旋转R + 平移T
    Eigen::Isometry3d T=Eigen::Isometry3d::Identity();
    //按照rotation_vector进行旋转
    T.rotate (rotation_vector);
    //按四元数表示的旋转
    Eigen::Isometry3d T(q);
    //把平移向量设成(1,3,4)
    T.pretranslate (Eigen::Vector3d ( 1,3,4 ));

    Eigen::Map 数组、向量及矩阵的引用。

    double parameters[7] = {0, 0, 0, 1, 0, 0, 0};
    //quaterd为parameters的引用
    Eigen::Map<const Quaterniond> quaterd(parameters[0]);
    //同Eigen::Map<const Quaterniond> quaterd(parameters);
    //quaterd为parameters[4]的引用,由于元素地址连续
    Eigen:编程:Map<const Eigen::Vector3d> trans(parameters[0] + 4);
    //同Eigen::Map<const Eigen::Vector3d> trans(parameters + 4);

    引用:类似于变量的别名,一旦指定,不可改变,与变量值绑定

    指针:指针存放变量的地址。可更改

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号