布局转模型无法生成新图形_三维数组初始化

布局转模型无法生成新图形_三维数组初始化本系列文章为原创,转载请注明出处。作者:DongdongBai邮箱:baidongdong@nudt.edu.cn若您觉得本博文对您有帮助,请您为我点赞并关注我,以鼓励我写出更优秀的博文。谢谢!Eigen:C++开源矩阵计算工具——Eigen的简单用法Eigen库是一个开源的C++线性代数库,它提供了快速的有关矩阵的线性代数运算,还包括解方程等功能。Eigen

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

Jetbrains全系列IDE稳定放心使用

本系列文章为原创,转载请注明出处。
作者:Dongdong Bai
邮箱: baidongdong@nudt.edu.cn

若您觉得本博文对您有帮助,请您为我点赞并关注我,以鼓励我写出更优秀的博文。谢谢!

Eigen: C++开源矩阵计算工具——Eigen的简单用法


Eigen库是一个开源的C++线性代数库,它提供了快速的有关矩阵的线性代数运算,还包括解方程等功能。Eigen是一个用纯头文件搭建起来的库,这意味这你只要能找到它的头文件,就能使用它。Eigen头文件的默认位置是“/usr/include/eigen3”.

由于Eigen库相较于OpenCV中的Mat等库而言更加高效,许多上层的软件库也使用Eigen进行矩阵运算,比如SLAM中常用的g2o,Sophus等。此外Eigen库还被被用于Caffe,Tensorflow等许多深度学习相关的框架中。

  1. 刚体运动中的旋转通常可以由旋转矩阵,旋转向量和四元数等多种方式表示(具体的转换公式请参见这篇博客),在Eigen库中也有其对应的实现。本文主要介绍刚体运动时旋转矩阵,旋转向量和四元数的初始化以及相互转换在Eigen中的实现方式。

Eigen库中各种形式的表示如下:

旋转矩阵(3X3:Eigen::Matrix3d
旋转向量(3X1:Eigen::AngleAxisd
四元数(4X1:Eigen::Quaterniond
平移向量(3X1:Eigen::Vector3d
变换矩阵(4X4:Eigen::Isometry3d

以下是具体的实现代码eigen_geometry.cpp:

#include <iostream>
#include <Eigen/Dense>


using namespace std;
using namespace Eigen;

int main(int argc, char **argv) {



    //下面三个变量作为下面演示的中间变量

    AngleAxisd t_V(M_PI / 4, Vector3d(0, 0, 1));
    Matrix3d t_R = t_V.matrix();
    Quaterniond t_Q(t_V);


    //对旋转向量(轴角)赋值的三大种方法

    //1.使用旋转的角度和旋转轴向量(此向量为单位向量)来初始化角轴
    AngleAxisd V1(M_PI / 4, Vector3d(0, 0, 1));//以(0,0,1)为旋转轴,旋转45度
    cout << "Rotation_vector1" << endl << V1.matrix() << endl;

    //2.使用旋转矩阵转旋转向量的方式

    //2.1 使用旋转向量的fromRotationMatrix()函数来对旋转向量赋值(注意此方法为旋转向量独有,四元数没有)
    AngleAxisd V2;
    V2.fromRotationMatrix(t_R);
    cout << "Rotation_vector2" << endl << V2.matrix() << endl;

    //2.2 直接使用旋转矩阵来对旋转向量赋值
    AngleAxisd V3;
    V3 = t_R;
    cout << "Rotation_vector3" << endl << V3.matrix() << endl;

    //2.3 使用旋转矩阵来对旋转向量进行初始化
    AngleAxisd V4(t_R);
    cout << "Rotation_vector4" << endl << V4.matrix() << endl;

    //3. 使用四元数来对旋转向量进行赋值

    //3.1 直接使用四元数来对旋转向量赋值
    AngleAxisd V5;
    V5 = t_Q;
    cout << "Rotation_vector5" << endl << V5.matrix() << endl;

    //3.2 使用四元数来对旋转向量进行初始化
    AngleAxisd V6(t_Q);
    cout << "Rotation_vector6" << endl << V6.matrix() << endl;


//------------------------------------------------------

    //对四元数赋值的三大种方法(注意Eigen库中的四元数前三维是虚部,最后一维是实部)

    //1.使用旋转的角度和旋转轴向量(此向量为单位向量)来初始化四元数,即使用q=[cos(A/2),n_x*sin(A/2),n_y*sin(A/2),n_z*sin(A/2)]
    Quaterniond Q1(cos((M_PI / 4) / 2), 0 * sin((M_PI / 4) / 2), 0 * sin((M_PI / 4) / 2), 1 * sin((M_PI / 4) / 2));//以(0,0,1)为旋转轴,旋转45度
    //第一种输出四元数的方式
    cout << "Quaternion1" << endl << Q1.coeffs() << endl;

    //第二种输出四元数的方式
    cout << Q1.x() << endl << endl;
    cout << Q1.y() << endl << endl;
    cout << Q1.z() << endl << endl;
    cout << Q1.w() << endl << endl;

    //2. 使用旋转矩阵转四元數的方式

    //2.1 直接使用旋转矩阵来对旋转向量赋值
    Quaterniond Q2;
    Q2 = t_R;
    cout << "Quaternion2" << endl << Q2.coeffs() << endl;


    //2.2 使用旋转矩阵来对四元數进行初始化
    Quaterniond Q3(t_R);
    cout << "Quaternion3" << endl << Q3.coeffs() << endl;

    //3. 使用旋转向量对四元数来进行赋值

    //3.1 直接使用旋转向量对四元数来赋值
    Quaterniond Q4;
    Q4 = t_V;
    cout << "Quaternion4" << endl << Q4.coeffs() << endl;

    //3.2 使用旋转向量来对四元数进行初始化
    Quaterniond Q5(t_V);
    cout << "Quaternion5" << endl << Q5.coeffs() << endl;



//----------------------------------------------------

    //对旋转矩阵赋值的三大种方法

    //1.使用旋转矩阵的函数来初始化旋转矩阵
    Matrix3d R1=Matrix3d::Identity();
    cout << "Rotation_matrix1" << endl << R1 << endl;

    //2. 使用旋转向量转旋转矩阵来对旋转矩阵赋值

    //2.1 使用旋转向量的成员函数matrix()来对旋转矩阵赋值
    Matrix3d R2;
    R2 = t_V.matrix();
    cout << "Rotation_matrix2" << endl << R2 << endl;

    //2.2 使用旋转向量的成员函数toRotationMatrix()来对旋转矩阵赋值
    Matrix3d R3;
    R3 = t_V.toRotationMatrix();
    cout << "Rotation_matrix3" << endl << R3 << endl;

    //3. 使用四元数转旋转矩阵来对旋转矩阵赋值

    //3.1 使用四元数的成员函数matrix()来对旋转矩阵赋值
    Matrix3d R4;
    R4 = t_Q.matrix();
    cout << "Rotation_matrix4" << endl << R4 << endl;

    //3.2 使用四元数的成员函数toRotationMatrix()来对旋转矩阵赋值
    Matrix3d R5;
    R5 = t_Q.toRotationMatrix();
    cout << "Rotation_matrix5" << endl << R5 << endl;

    return 0;


}

上述代码对应的CMakeLists.txt为:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
project(useGeometry)
include_directories("/usr/include/eigen3")
add_executable(eigen_geometry eigen_geometry.cpp)
  1. 旋转矩阵(R),旋转向量(V)和四元数(Q)在Eigen中转换关系的总结:

 旋转矩阵(R),旋转向量(V)和四元数(Q)在Eigen中转换关系图示

  1. 旋转矩阵(R),旋转向量(V)和四元数(Q)分别通过自身初始化自己的方式,也就是第一分部分代码对旋转矩阵(R),旋转向量(V)和四元数(Q)赋值的第一种方式。

    • R通过自身初始化的方法:
//1.使用旋转矩阵的函数来初始化旋转矩阵
Matrix3d R1=Matrix3d::Identity();
cout << "Rotation_matrix1" << endl << R1 << endl;
  • V通过自身初始化的方法:
//1.使用旋转的角度和旋转轴向量(此向量为单位向量)来初始化角轴
AngleAxisd V1(M_PI / 4, Vector3d(0, 0, 1));//以(0,0,1)为旋转轴,旋转45度

cout << "Rotation_vector1" << endl << V1.matrix() << endl;
  • Q通过自身初始化的方法:
//1.使用旋转的角度和旋转轴向量(此向量为单位向量)来初始化四元数,即使用q=[cos(A/2),n_x*sin(A/2),n_y*sin(A/2),n_z*sin(A/2)]

Quaterniond Q1(cos((M_PI / 4) / 2), 0 * sin((M_PI / 4) / 2), 0 * sin((M_PI / 4) / 2), 1 * sin((M_PI / 4) / 2));//以(0,0,1)为旋转轴,旋转45度

cout << "Quaternion1" << endl << Q1.coeffs() << endl;

相关博客:
* C++矩阵库 Eigen 快速入门
* Eigen: C++开源矩阵计算工具——Eigen的简单用法


本系列文章为原创,转载请注明出处。
作者:Dongdong Bai
邮箱: baidongdong@nudt.edu

若您觉得本博文对您有帮助,请您为我点赞并关注我,以鼓励我写出更优秀的博文。谢谢!

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm双击打不开_pycharm社区版双击没反应

    pycharm双击打不开_pycharm社区版双击没反应方法一:出现这个问题应该是想永久使用pycharm然后修改了pycharm的Help”->“EditCustomVMOptions文件,导致打不开pycharm,无论怎么下载重新下载还是打不开,原因就是我们所修改的文件,在最后一行添加路径的时候出现了错误。打开C盘用户名下的文件夹,按图中步骤找到pycharm,打开.vmoptions文件,删除最下面这一行自己添加的语句,。然后重启pycharm就可以了。方法二:我们可以在Windows10系统的开始菜单上,单击

    2022年8月27日
    5
  • pycharm安装教程CSDN_java遇到解决不了的问题

    pycharm安装教程CSDN_java遇到解决不了的问题第三周开始接触python了,结果第一步装pycharm时就遇到了坑,正常安装完成后点运行时出现错误——NoJVMinstallationfound。助教说这是缺少jdk(java程序支持包),需要在网上找个最新的安装并配置下path路径。唉,编程小白,完全不知道这都是些啥o(╥﹏╥)o,于是开始了百度解决问题之路……运行pycharm错误——NoJVMinstallationfoun…

    2022年8月26日
    12
  • c++入门教程–1选择编译器,进行第一段代码

    c++入门教程–1选择编译器,进行第一段代码

    2021年3月12日
    171
  • RapeLay(电车之狼R)的结局介绍 (隐藏结局攻略)

    RapeLay(电车之狼R)的结局介绍 (隐藏结局攻略)

    2021年11月28日
    92
  • 铸博皇御:贵金属技术分析基础入门知识「建议收藏」

    铸博皇御:贵金属技术分析基础入门知识「建议收藏」 在贵金属投资市场上,或许有很多投资者表示贵金属技术分析很难理解。特别是刚入门的新手,可能一开始对其并不容易理解,其实这可以理性地看待。贵金属技术分析是根据历史数据,以及开盘价、收盘价、最高价、最低价,利用数学统计的方法来进行综合统计计算。  一般进行分析时需要抛弃主观观念,客观地去分析价格的走向。虽然它不能够左右价格走向,但是可以由价格决定它的趋势走向。所以能不能学好贵金属技术分析,是多方面作用的结果。但需要提醒大家的是:用贵金属技术分析法,只能分析它的趋势,意味着不能完全依赖技术分析来行情作为决策重

    2022年5月28日
    37
  • ensp实验DHCP配置与原理[通俗易懂]

    DHCP报文类型DHCP客户端初次接入网络时,会发送DHCP报文(DHCPDiscover),用于查找和定位DHCP服务器DHCP服务器在收到DHCP发现报文后,会发送DHCP请求报文(DHCPOffer)此报文包含IP地址等配置信息在DHCP客户端收到服务器发送的DHCP提供报文后,会发送DHCP请求报文(DHCPRequest)另外在DHCP客户端获取IP地址并重启后,同…

    2022年4月7日
    397

发表回复

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

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