Eigen库要点「建议收藏」

Eigen库要点「建议收藏」旋转矩阵,旋转向量,四元数关系如下:另外,初始化(赋值)变换矩阵T的方式为:Isometry3dTcw(rotation);//rotation可以是旋转矩阵,可以是四元数,可以是旋转向量Tcw.pretranslate(t);//添加平移向量//或者:Isometry3dTcw=Isometry3d::Identity()//如果没有直接初始化,先设为单位阵Tcw.pre…

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

Jetbrains全系列IDE稳定放心使用

 旋转矩阵,旋转向量,四元数关系如下:

Eigen库要点「建议收藏」另外,初始化(赋值)变换矩阵T的方式为:

Isometry3d Tcw(rotation);//rotation可以是旋转矩阵,可以是四元数,可以是旋转向量
Tcw.pretranslate(t);//添加平移向量
//或者:
Isometry3d Tcw=Isometry3d::Identity()//如果没有直接初始化,先设为单位阵
Tcw.prerotate(rotation1);//然后添加旋转矩阵,或者向量,或者四元数
Tcw1.pretranslate(t1);//添加平移向量

 从变换矩阵获取旋转矩阵和平移矩阵:

Tcw.rotation();//返回旋转矩阵
Tcw.translation();//返回旋转矩阵

实例

设有小萝卜一号和小萝卜二号位于世界坐标系中,小萝卜一号的位姿为:q1=[0.35,0.2,0.3,0.1],
t2=[0.3,0.1,0.1]^T (q的第一项为实部。请你把q归一化后在进行计算)。这里的q和t的表达的是Tcw,也就是世界到相机的变换关系。小萝卜二号的位姿为q2=[-0.5,0.4,-0.1,0.2],t=[-0.1,0.5,0.3]^T.现在,小萝卜一号看到某个点在自身的坐标系下,坐标为p=[0.5,0,0.2]^T ,求该向量在小萝卜二号坐标系下的坐标,请编程实现此事。

方法一:直接用四元数

    Quaterniond q1={0.35,0.2,0.3,0.1},q2={-0.5,0.4,-0.1,0.2};
    Vector3d t1={0.3,0.1,0.1},t2={-0.1,0.5,0.3},p={0.5,0,0.2};
    Vector3d world,cam2;
    q1=q1.normalized();
    q2=q2.normalized();
    world=q1.inverse()*(p-t1);
    cam2=q2*world+t2;
    cout<<cam2<<endl;

方法二:使用旋转矩阵

    Matrix3d rotation1=q1.toRotationMatrix();
    Matrix3d rotation2=q2.toRotationMatrix();
    Matrix3d R1,R1_inv,R2;
    world=rotation1.inverse()*(p-t1);
    cam2=rotation2*world+t2;
    cout<<cam2<<endl;

方法三:使用变换矩阵(直接)

  Isometry3d Tcw1(rotation1),Twc1,Tcw2(rotation2),Twc2;//直接初始化,不需要设定单位阵
    Tcw1.pretranslate(t1);
    Tcw2.pretranslate(t2);
    //cout<<Tcw1.matrix()<<endl;
    Twc1=Tcw1.inverse();
    //cout<<Twc1.matrix()<<endl;
    world=Twc1*p;    cout<<rotation1<<endl;
    cam2=Tcw2*world;
    cout<<cam2<<endl;
    return 0;

方法三:使用变换矩阵(直接)

    Isometry3d Tcw1=Isometry3d::Identity(),Twc1,Tcw2=Isometry3d::Identity();//如果没有直接初始化,先设为单位阵
    Tcw1.prerotate(rotation1);
    Tcw2.prerotate(rotation2);
    Tcw1.pretranslate(t1);
    Tcw2.pretranslate(t2);
    //cout<<Tcw1.matrix()<<endl;
    Twc1=Tcw1.inverse();
    //cout<<Twc1.matrix()<<endl;
    world=Twc1*p;
    cam2=Tcw2*world;
    cout<<cam2<<endl;
    return 0;

方法四:间接使用变换矩阵(间接)

    Isometry3d Tcw1=Isometry3d::Identity(),Twc1,Tcw2=Isometry3d::Identity();//如果没有直接初始化,先设为单位阵
    Tcw1.prerotate(rotation1);
    Tcw2.prerotate(rotation2);
    Tcw1.pretranslate(t1);
    Tcw2.pretranslate(t2);
    world=Tcw1.rotation().inverse()*(p-Tcw1.translation());
    cam2=Tcw2.rotation()*world+Tcw2.translation();
    cout<<cam2<<endl;
    return 0;

C++数组和矩阵转换

使用Map函数,可以实现Eigen的矩阵和c++中的数组直接转换:

Map类用于通过C++中普通的连续指针或者数组 (raw C/C++ arrays)来构造Eigen里的Matrix类,这就好比Eigen里的Matrix类的数据和raw C++array 共享了一片地址,也就是引用。

数组转静态矩阵:

int i;
double *aMat = new double[20];
for(i =0;i<20;i++)
{
  aMat[i] = rand()%11;
}
Eigen:Map<Matrix<double,4,5> > staMat(aMat);
virtual void oplusImpl(const double* update) override
{
     Eigen::VectorXd::ConstMapType v(update,VectexCameraBAL::Dimension);
     _estimate+=v;
}

数组转动态矩阵:

int i;
double *aMat = new double[20];
for(i =0;i<20;i++)
{
  aMat[i] = rand()%11;
}
Eigen::Map<MatrixXd> dymMat(aMat,4,5);
virtual void oplusImpl(const double* update) override
{
     Eigen::Vector3d::ConstMapType v(update);
     _estimate+=v;
}

 

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

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

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


相关推荐

  • linux rsyslogd cpu占用率高问题「建议收藏」

    linux rsyslogd cpu占用率高问题「建议收藏」最近有几次,linuxcentos7服务停了后,重启,再起一些应用后,查看top后,rsyslogdcpu占用率高问题,先说我这块怀疑导致的原因吧。原因很有可能是当前机器的系统盘挂载出现问题,或者系统盘有磁道坏了,导致,在启动某个软件时,一直在记录日志。现象top命令看下一:解决发现rsyslog可以理解为增强版的syslog,可以支持输出日志到各种数据库,使用RELP+TCP实现数据的传输,对目前的服务器服务而言,可以关闭该进程。#第一步:重启rsyslog服务,

    2022年8月15日
    13
  • 字符串长度函数strlen()。。字符串函数头文件string.h「建议收藏」

    百度知道看到的string.h头文件里常用的函数有:strlen求字符串长度。strcmp比较2个字符串是否一样。strcat字符串连接操作。strcpy字符串拷贝操作。strncat字符串连接操作(前n个字符)。strncpy字符串拷贝操作(前n个字符)。strchr查询字串。strstr查询子串。string.h是C语言里面关于字符数组的函数定义的头文件,更详细的可以到i…

    2022年4月8日
    47
  • jwt单点登录流程设计

    jwt单点登录流程设计如不了解jwt,请戳:程序猿DD,什么是jwt下面我给出一个jwt实现单点登录的流程: 

    2022年5月21日
    37
  • 一般人到底要不要学Python_Python值得学吗

    一般人到底要不要学Python_Python值得学吗前言本人纯屌丝一枚,在学python之前对电脑的认知也就只限于上个网,玩个办公软件。这里不能跑题,我为啥说自学python,一般人我还是劝你算了吧。因为我就是那个一般人。基础真的很简单,是个人稍微认点真都能懂,这就是好多人说的python简单、易懂、好学,然后就是一顿浮夸的言论,误导那些小白,再然后那些小白也就跟着浮夸。这里我就给那些轻浮的人泼一桶冷水,懂跟学会是一码事吗?先来说哈python这个就业哈,我现在生活在祖国的肚皮上–成都,(嗯,有想了解川西迷你小环线的在下面留言哦),下面亲身经历,我喃,

    2022年9月3日
    2
  • 黑客初学者刷屏技巧_初学者,这些技巧将加速您的编码

    黑客初学者刷屏技巧_初学者,这些技巧将加速您的编码黑客初学者刷屏技巧Whenyoujuststartoutyourprogrammingjourney,therearesomanyshinytoolsandtechnologiestoexplore,youalmostdon’tknowwheretostart.Fortunately,therearenumerousguidesonho…

    2022年5月2日
    49
  • 大数据技术,Spark核心技术之运行原理

    大数据技术,Spark核心技术之运行原理

    2021年6月29日
    74

发表回复

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

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