Eigen::Isometry3d入门

本文为入门笔记,详细请看大佬文章,写的非常具体。
关于矩阵的左乘右乘详情请看知乎大佬-Lpip Sam,和知乎大佬-小兔纸的大魔王很详细。

欧式变换也称为等距变换(Isometry Transform),可以看作是维持任意两点距离不变的仿射变换。
( R o t a t e t r a n s l a t i o n 0 T 1 ) \left( \begin{matrix} Rotate &translation \\ 0^T & 1 \\ \end{matrix} \right) (Rotate0Ttranslation1)

0.初始化

共两种方法,第一种使用较为频繁。

	//设置旋转向量V
	Eigen::AngleAxisd V(3.1415926 / 4, Eigen::Vector3d(1, 0, 1).normalized());
	//设置平移向量
	Eigen::Vector3d translation(1, 3, 4);
	
	//将T初始化为单位阵,再做其他操作。
	//虽然称为3D,实质上为4*4矩阵。
	Eigen::Isometry3d T= Isometry3d::Identity();

1.两种求欧式变换矩阵

	//设置欧式变换矩阵——方式1
	//此种方式和下一种方式输出相同。
	//a.translate(b)等价于aXb,描述的是在世界坐标系下的平移(虽然b在设置时为只含有3个元素列向量,猜想内部可能会有操作时其为下面这种形式)。
	//形式为 0	0	0	1
	//      0	0	0	3
	//      0	0	0	4
	//      0	0	0	0
	//此操作相当于将translation中的数值放入欧式变换矩阵translation位置(注意!!!此种效果的前提T为单位矩阵)
	//结果为 1	0	0	1
	//      0	1	0	3
	//      0	0	1	4
	//      0	0	0	1
	T.translate(translation);
	//a.rotate(b)等价于aXb,描述的是在世界坐标系下的旋转。
	T.rotate(V);
	//结果为 0.853553	 -0.5	0.146447		1
	//           0.5	0.707	    -0.5		3
	//      0.146447	  0.5	0.853553		4
	//      	   0	    0	       0		1
	//matrix()返回变换对应的矩阵,T输出时用此函数。
	std::cout << T.matrix() << std::endl;

/*----------------------------------------------------------------------

------------------------------------------------------------------------*/

	//设置欧式变换矩阵——方式2
	//凡是前面带pre的函数,相当于右乘。
	//a.rotate(b)等价于aXb,描述的是在世界坐标系下的旋转。
	//结果为 0.853553	 -0.5	0.146447		0
	//           0.5	0.707	    -0.5		0
	//      0.146447	  0.5	0.853553		0
	//      	   0	    0	       0		1
	T.rotate(V);
	//我们的目的是为了形成文章开头欧式变换的矩阵,
	//变换顺序必须是先平移,再旋转,也就是单位矩阵E X 平移矩阵T X 旋转矩阵R。
	//按照R右乘T也就是T X R,实际和方式1相同T左乘R(T X R)这样理解就可以,
	//但是根据查看源码,只有在mode==Projective时为右乘,否则为T+translation,
	//然而translation为含有3个元素的列向量,这也印证了之前的猜想,有内部机制使translation转换成下面的形式
	//形式为 0	0	0	1
	//      0	0	0	3
	//      0	0	0	4
	//      0	0	0	0
	T.pretranslate(translation);
	//结果为 0.853553	 -0.5	0.146447		1
	//           0.5	0.707	    -0.5		3
	//      0.146447	  0.5	0.853553		4
	//      	   0	    0	       0		1
	//matrix()返回变换对应的矩阵,T输出时用此函数。
	std::cout << T.matrix() << std::endl;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值