eigen 构造变换矩阵(Eigen::Isometry3d或者Eigen::Matrix4d)的几种方式

0.写在前面

更新
2020_09_17 增加了用Eigen::Matrix4d构造变换矩阵的方式.


1.Eigen::Isometry3d构造变换矩阵

1.1.对各个元素赋值

Eigen::Isometry3d T1=Eigen::Isometry3d::Identity();
T1(0,0) = 1.000000e+00, T1(0,1) = 1.197624e-11, T1(0,2) = 1.704639e-10, T1(0,3) = 3.214096e-14;
T1(1,0) = 1.197625e-11, T1(1,1) = 1.197625e-11, T1(1,2) = 3.562503e-10, T1(1,3) = -1.998401e-15;
T1(2,0) = 1.704639e-10, T1(2,1) = 3.562503e-10, T1(2,2) = 1.000000e+00, T1(2,3) = -4.041212e-14;
T1(3,0) =            0, T1(3,1) =            0, T1(3,2) =            0, T1(3,3) =             1;

1.2.通过旋转矩阵和平移向量

Eigen::Matrix3d rotation_matrix1 = Eigen::Matrix3d::Identity();
rotation_matrix1 << 1.000000e+00, 1.197624e-11, 1.704639e-10,
                    1.197625e-11, 1.000000e+00, 3.562503e-10,
                    1.704639e-10, 3.562503e-10, 1.000000e+00;
Eigen::Vector3d t1;
t1 <<  3.214096e-14, -1.998401e-15, -4.041212e-14;
    
T1=Eigen::Isometry3d::Identity();
T1.rotate ( rotation_matrix1 );
T1.pretranslate ( t1 );

注意不能直接变换矩阵赋值,像这样子会报错

T1<< 1.000000e+00, 1.197624e-11, 1.704639e-10, 3.214096e-14,
     1.197625e-11, 1.197625e-11, 3.562503e-10, -1.998401e-15,
     1.704639e-10, 3.562503e-10, 1.000000e+00, -4.041212e-14,
                0,            0,            0,              1;

2.Eigen::Matrix4d构造变换矩阵

对每一个元素赋值的方法是可行的的,我这里采用的是按矩阵块赋值

// ----3.eigen::matrix4d----
Eigen::Matrix4d T2;
T2.setIdentity();
T2.block<3,3>(0,0) = rotation_matrix1;
T2.topRightCorner(3, 1) = t1;
//T2.topRightCorner<3, 1>() = t1;

3.代码实验

#include <iostream>
#include <cmath>
#include <Eigen/Core>
// Eigen 几何模块
#include <Eigen/Geometry>
using namespace std;

int main()
{
    // 欧氏变换矩阵使用 Eigen::Isometry
    Eigen::Isometry3d T1=Eigen::Isometry3d::Identity();                // 虽然称为3d,实质上是4*4的矩阵
    //不能直接赋值
//    T1<< 1.000000e+00, 1.197624e-11, 1.704639e-10, 3.214096e-14,
//            1.197625e-11, 1.197625e-11, 3.562503e-10, -1.998401e-15,
//            1.704639e-10, 3.562503e-10, 1.000000e+00, -4.041212e-14,
//                       0,            0,            0,              1;

    //----1.对各个元素赋值----
    T1(0,0) = 1.000000e+00, T1(0,1) = 1.197624e-11, T1(0,2) = 1.704639e-10, T1(0,3) = 3.214096e-14;
    T1(1,0) = 1.197625e-11, T1(1,1) = 1.197625e-11, T1(1,2) = 3.562503e-10, T1(1,3) = -1.998401e-15;
    T1(2,0) = 1.704639e-10, T1(2,1) = 3.562503e-10, T1(2,2) = 1.000000e+00, T1(2,3) = -4.041212e-14;
    T1(3,0) =            0, T1(3,1) =            0, T1(3,2) =            0, T1(3,3) =             1;
    cout<<"T1 from element assign:\n"<<T1.matrix()<<endl;

    //---2.通过旋转矩阵和平移向量赋值---
    Eigen::Matrix3d rotation_matrix1 = Eigen::Matrix3d::Identity();
    rotation_matrix1 << 1.000000e+00, 1.197624e-11, 1.704639e-10,
                        1.197625e-11, 1.000000e+00, 3.562503e-10,
                        1.704639e-10, 3.562503e-10, 1.000000e+00;

    Eigen::Vector3d t1;
    t1 <<  3.214096e-14, -1.998401e-15, -4.041212e-14;

    T1=Eigen::Isometry3d::Identity();
    T1.rotate ( rotation_matrix1 );
    T1.pretranslate ( t1 );

    cout<<"T1 from r,t:\n"<<T1.matrix()<<endl;


    // ----3.eigen::matrix4d----
    Eigen::Matrix4d T2;
    T2.setIdentity();
    T2.block<3,3>(0,0) = rotation_matrix1;
    T2.topRightCorner<3, 1>() = t1;
    cout<<"eigen::matrix4d T2 :\n"<<T2<<endl;

    return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)

project(cal_trans)
# 添加Eigen头文件
include_directories( "/usr/include/eigen3" )

add_executable(cal_T "main.cpp")

在这里插入图片描述

可以看到,这几种方式对于变换矩阵的构造的结果是一样的

  • 29
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值