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

 更新时间:2022年12月15日 10:00:32   作者:后厂村路蔡徐坤  
这篇文章主要介绍了C++之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/include 下
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);
//旋转矩阵定义四元素
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/Core>
#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 quaternion;
    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

欧式变换矩阵(其次坐标包含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);

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

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

总结

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

相关文章

  • C++ std::copy与memcpy区别小结

    C++ std::copy与memcpy区别小结

    本文主要介绍了C++ std::copy与memcpy区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • OpenCV使用邻居访问扫描图像的操作方法

    OpenCV使用邻居访问扫描图像的操作方法

    在图像处理中,有时需要根据某个像素的相邻像素的值计算该像素位置的值,当这个邻域包括上一行和下一行的像素时,就需要同时扫描图像的多行像素,本节中我们将介绍如何通过邻居访问扫描图像,感兴趣的朋友一起看看吧
    2023-01-01
  • 解析C/C++ Capstone 引擎源码编译问题

    解析C/C++ Capstone 引擎源码编译问题

    Capstone的编译非常简单只需要一步即可轻松得到对应的Lib库文件,如下将介绍该引擎如何被编译,以及简单的测试编译,这篇文章主要介绍了C/C++ Capstone 引擎源码编译,需要的朋友可以参考下
    2022-09-09
  • C++的数据共享与保护你了解吗

    C++的数据共享与保护你了解吗

    这篇文章主要为大家详细介绍了C语言零基础入门的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 简单聊聊C++中线程的原理与实现

    简单聊聊C++中线程的原理与实现

    C++11 引入了多线程支持,提供了一套基本的线程库,包括线程、互斥量(mutex)、条件变量(condition_variable)等。这些组件可以帮助你在 C++ 程序中实现并发和多线程编程,本文就来和大家简单聊聊吧
    2023-03-03
  • C++万能库头文件在vs中的安装步骤(图文)

    C++万能库头文件在vs中的安装步骤(图文)

    这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • 基于C语言实现简易扫雷游戏

    基于C语言实现简易扫雷游戏

    这篇文章主要为大家详细介绍了基于C语言实现简易扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下<BR>
    2022-01-01
  • Qt自定义实现一个等待提示Ui控件

    Qt自定义实现一个等待提示Ui控件

    等待样式控件是我们在做UI时出场率还挺高的控件之一,所以这篇文章主要为大家介绍了Qt如何自定义一个好看的等待提示Ui控件,感兴趣的可以了解下
    2024-01-01
  • C++实现String类的方法详解

    C++实现String类的方法详解

    在C语言中,没有专门用来表示字符串的类型。虽然C语言为字符串提供了一系列的库函数,但这些函数与字符串这个类型是分开的。所以在C++中封装了一个string类,来帮助我们操作字符串,本文就为大家提供了实现String类的方法,需要的可以参考一下
    2022-08-08
  • C++实现寻找最低公共父节点的方法

    C++实现寻找最低公共父节点的方法

    这篇文章主要介绍了C++实现寻找最低公共父节点的方法,是数据结构中二叉树的一个经典算法,有一定的借鉴价值,需要的朋友可以参考下
    2014-09-09

最新评论