在 Visual Studio 中配置 Eigen库

在 Visual Studio 中配置 Eigen库VisualStudio配置Eigen库

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

Eigen是一个开源的C++库,主要用来支持线性代数,矩阵和矢量运算,数值分析及其相关的算法。Eigen 目前(2022-04-17)最新的版本是3.4.0(发布于2021-08-18),除了C++标准库以外,不需要任何其他的依赖包。Eigen库的下载地址为:https://gitlab.com/libeigen/eigen/-/archive/3.4.0/eigen-3.4.0.zip在 Visual Studio 中配置 Eigen库https://gitlab.com/libeigen/eigen/-/archive/3.4.0/eigen-3.4.0.zip1. 如果在Windows平台上运行,请下载.zip压缩包文件,如:

在 Visual Studio 中配置 Eigen库

 下载好以后,将压缩包重命名为Eigen3,并解压,存放于指定位置,如:E:\Codes_Program\Eigen3。

2. 在Visual Studio(VS)中新建一个项目,并输入测试代码:

#include <iostream>
#include <Eigen/Core>
#include <Eigen/Geometry>

using namespace std;

Eigen::Matrix3d eulerAnglesToRotationMatrix(Eigen::Vector3d& theta);
bool isRotationMatirx(Eigen::Matrix3d R);
Eigen::Vector3d rotationMatrixToEulerAngles(Eigen::Matrix3d& R);

const double ARC_TO_DEG = 57.29577951308238;
const double DEG_TO_ARC = 0.0174532925199433;

int main()
{
    // 设定车体欧拉角(角度),绕固定轴
    double roll_deg = 0.5;      // 绕X轴
    double pitch_deg = 0.8;     // 绕Y轴
    double yaw_deg = 108.5;     // 绕Z轴

    // 转化为弧度
    double roll_arc = roll_deg * DEG_TO_ARC;    // 绕X轴
    double pitch_arc = pitch_deg * DEG_TO_ARC;  // 绕Y轴
    double yaw_arc = yaw_deg * DEG_TO_ARC;      // 绕Z轴

    cout << endl;
    cout << "roll_arc = " << roll_arc << endl;
    cout << "pitch_arc = " << pitch_arc << endl;
    cout << "yaw_arc = " << yaw_arc << endl;

    // 初始化欧拉角(rpy),对应绕x轴,绕y轴,绕z轴的旋转角度
    Eigen::Vector3d euler_angle(roll_arc, pitch_arc, yaw_arc);

    // 使用Eigen库将欧拉角转换为旋转矩阵
    Eigen::Matrix3d rotation_matrix1, rotation_matrix2;
    rotation_matrix1 = Eigen::AngleAxisd(euler_angle[2], Eigen::Vector3d::UnitZ()) *
        Eigen::AngleAxisd(euler_angle[1], Eigen::Vector3d::UnitY()) *
        Eigen::AngleAxisd(euler_angle[0], Eigen::Vector3d::UnitX());
    cout << "nrotation matrix1 =n" << rotation_matrix1 << endl << endl;

    // 使用自定义函数将欧拉角转换为旋转矩阵
    rotation_matrix2 = eulerAnglesToRotationMatrix(euler_angle);
    cout << "rotation matrix2 =n" << rotation_matrix2 << endl << endl;

    // 使用Eigen将旋转矩阵转换为欧拉角
    Eigen::Vector3d eulerAngle1 = rotation_matrix1.eulerAngles(2, 1, 0); // ZYX顺序,yaw,pitch,roll
    cout << "roll_1 pitch_1 yaw_1 = " << eulerAngle1[2] << " " << eulerAngle1[1]
        << " " << eulerAngle1[0] << endl << endl;

    // 使用自定义函数将旋转矩阵转换为欧拉角
    Eigen::Vector3d eulerAngle2 = rotationMatrixToEulerAngles(rotation_matrix1); // roll,pitch,yaw
    cout << "roll_2 pitch_2 yaw_2 = " << eulerAngle2[0] << " " << eulerAngle2[1]
        << " " << eulerAngle2[2] << endl << endl;

    return 0;
}

Eigen::Matrix3d eulerAnglesToRotationMatrix(Eigen::Vector3d& theta)
{
    Eigen::Matrix3d R_x;    // 计算旋转矩阵的X分量
    R_x <<
        1, 0, 0,
        0, cos(theta[0]), -sin(theta[0]),
        0, sin(theta[0]), cos(theta[0]);

    Eigen::Matrix3d R_y;    // 计算旋转矩阵的Y分量
    R_y <<
        cos(theta[1]), 0, sin(theta[1]),
        0, 1, 0,
        -sin(theta[1]), 0, cos(theta[1]);

    Eigen::Matrix3d R_z;    // 计算旋转矩阵的Z分量
    R_z <<
        cos(theta[2]), -sin(theta[2]), 0,
        sin(theta[2]), cos(theta[2]), 0,
        0, 0, 1;
    Eigen::Matrix3d R = R_z * R_y * R_x;
    return R;
}


bool isRotationMatirx(Eigen::Matrix3d R)
{
    double err = 1e-6;
    Eigen::Matrix3d shouldIdenity;
    shouldIdenity = R * R.transpose();
    Eigen::Matrix3d I = Eigen::Matrix3d::Identity();
    return (shouldIdenity - I).norm() < err;
}

Eigen::Vector3d rotationMatrixToEulerAngles(Eigen::Matrix3d& R)
{
    assert(isRotationMatirx(R));
    double sy = sqrt(R(0, 0) * R(0, 0) + R(1, 0) * R(1, 0));
    bool singular = sy < 1e-6;
    double x, y, z;
    if (!singular)
    {
        x = atan2(R(2, 1), R(2, 2));
        y = atan2(-R(2, 0), sy);
        z = atan2(R(1, 0), R(0, 0));
    }
    else
    {
        x = atan2(-R(1, 2), R(1, 1));
        y = atan2(-R(2, 0), sy);
        z = 0;
    }
    return { x, y, z };
}

3. 依次点击:视图 –> 其他窗口 –> 属性管理器

在 Visual Studio 中配置 Eigen库

4. 依次选择:Debug | x64 -> VC++目录 -> 包含目录,并在包含目录中输入Eigen3文件夹的位置,如: E:\Codes_Program\Eigen3

在 Visual Studio 中配置 Eigen库

5. 在工具栏设置:Debug、x64,即可使用Eigen库。

在 Visual Studio 中配置 Eigen库

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/183932.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月31日 上午8:00
下一篇 2022年8月31日 上午8:00


相关推荐

  • fuser 概述

    fuser 概述fuser 概述 fuser 命令是用来显示所有正在使用着指定的 file filesystem 或者 sockets 的进程信息 例一 fuser m u mnt usb1 nbsp mnt usb1 nbsp 1347c root nbsp 1348c guido nbsp 1349c guido 在例子一中 使用了 m 和 u 选项 用来查找所有正在使用 mnt usb1 的所有进程的 PID 已经该

    2025年12月13日
    6
  • 四元数、欧拉角和方向余弦的定义及关系

    四元数、欧拉角和方向余弦的定义及关系目前 描述两个坐标系之间关系的常用方法主要有欧拉角法 方向余弦矩阵法和四元数法 因此要弄懂这三种方法的定义及关系 我们必须先从坐标系转化开始了解 下面以四旋翼为例 定义两个坐标系 导航坐标系 参考坐标系 n 选取东北天右手直角坐标系作为导航坐标系 n 载体坐标系 机体坐标系 b 选取右手直角坐标系定义 四轴向右为 X 正方向 向前为 Y 轴正方向 向上为 Z 轴正方向 nbsp 欧拉角 欧拉角是一种常用的描述方位

    2026年3月17日
    2
  • 逆波兰表达式_逆波兰表达式gof是什么

    逆波兰表达式_逆波兰表达式gof是什么逆波兰表达式表达式一般由操作数(Operand)、运算符(Operator)组成,例如算术表达式中,通常把运算符放在两个操作数的中间,这称为中缀表达式(InfixExpression),如A+B。波

    2022年8月6日
    9
  • Neutron中的Service类

    Neutron中的Service类

    2021年11月30日
    62
  • Python OpenCV findContours()函数与drawContours()函数用法

    Python OpenCV findContours()函数与drawContours()函数用法我用的Python3.6,OpenCV3.4。Python3.x与2.x语法不一样,OpenCV2.x与3.x也不一样。看之前得清楚自己用的啥。本文说白了就是个简单的查找轮廓,并且绘制轮廓。简单说一下这俩个函数用法。函数cv2.findContours()有三个参数。第一个是输入图像,第二个是轮廓检索模式,第三个是轮廓近似方法。而返回值根据OpenCV版本不同也不一样,但这俩个版本都会返回…

    2025年7月25日
    25
  • 2021年计算机保研-假211真双非三无的失败保研经历(武大/复旦/计算所/华科/同济/上交)

    2021年计算机保研-假211真双非三无的失败保研经历(武大/复旦/计算所/华科/同济/上交)从知乎@孤芳倚花红转过来啦~一、个人情况学校:华中地区211,计算机科学与技术(感觉华中211CS水平都差不多)。英语:CET4-534,预推免CET6-447。夏令营的时候没有六级真的太伤了,第一次裸考没过,第二次忘了报名,幸亏第三次考过了预推免可以用上。成绩:专业排名3/140,预推免2/147。211只有rk1和非rk1,非rk1≈没学上。科研:国家级、省级大创各一项,均是负责人,前者OD,后者SOD。没有论文,但是有一定CV和DL的基础,不惧面试。竞赛:省一及以上数学建模、数学竞赛奖项

    2022年7月25日
    70

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号