3D视觉(三)刚体运动及matlab实现

刚体运动(rigid motion):在三维空间中, 几何体作旋转和平移运动,称为刚体运动。
刚体运动可以理解为保持长度、角度、面积等特征不变的仿射变换,即内积和度量不变;具有物理意义的量,如梯度,散度和旋度都保持不变。从坐标变换上看, 旋转矩阵为正交矩阵。从群的角度看,刚体变换全体构成一个群。

(一)补一下数学知识:

正交矩阵

(1)正交矩阵每一列都是单位矩阵,并且两两正交。最简单的正交矩阵就是单位阵。
(2)正交矩阵的逆(inverse)等于正交矩阵的转置(transpose)。同时可以推论出正交矩阵的行列式的值为正负1。

李代数and李群

(1)李代数(Lie algebra)是一类重要的非结合代数,最初是由19世纪挪威数学家索菲斯·李创立李群时引进的一个数学概念。假设L是域F上的向量空间。如果L上有一个运算L×L→L,(x,y)→[x,y]满足以下三个条件,则称L是一个李代数。
(1)这个运算是双线性的,即 [ax+by,cz+dw]=ac[x,z]+cb[y,z]+ad[x,w]+bd[y,w]。
(2)[x,x]=0,对L中任意元素x∈L。
(3)[x,[y,z]]+[y,[z,x]]+[z,[x,y]]=0,对所有L中元素x,y,z∈L。
(2)群(Group)是一种集合加上一种运算的代数结构,记作 。其中 代表集合, 是定义在该集合上的二元运算。那么,如果这个运算满足以下几个条件,则称 为群。对于矩阵,可以找到一些常见的矩阵群,例如:


李群 是指具有连续性质的群。一般连续群上的运算是无限可微,并解析的(解析比无限可微更强,它还要求任意点邻域的泰勒展开都收敛)。李群,指实数空间上的连续群。常见的李群包括上边提到的GL(n),SO(n),SE(n)以及酉群U(n)等。

(二)旋转矩阵:

关于旋转,在http://blog.csdn.net/piaoxuezhong/article/details/78447822中有关于旋转的表示方法介绍,这里描述下旋转矩阵的性质(百科):
M 是任何维的一般旋转矩阵: 
 

(1)两个向量的点积(内积)在它们都被一个旋转矩阵操作之后保持不变: 


(2)从而得出旋转矩阵的逆矩阵是它的转置矩阵:

 
    这里的    
  
    是单位矩阵。
(3)一个矩阵是旋转矩阵,当且仅当它是正交矩阵并且它的行列式是单位一。正交矩阵的行列式是 ±1;如果行列式是 −1,则它包含了一个反射而不是真旋转矩阵。
(4)旋转矩阵是正交矩阵,如果其列向量形成    的一个正交基,即在任何两个列向量之间的标量积是零(正交性)而每个列向量的大小是单位一。
(5)任何旋转向量可以表示为斜对称矩阵A的指数:
这里的指数是以泰勒级数定义的,而    是以矩阵乘法定义的。A矩阵叫做旋转的“生成元”。旋转矩阵的李代数是它的生成元的代数,它就是斜对称矩阵的代数。生成元可以通过 M 的矩阵对数来找到。

(三)Rodrigues' Rotation Matrix(罗德里格旋转矩阵)

3D旋转可以归结成按照某个单位向量进行某个角度的旋转。已知某个旋转时,可以推导出对应的旋转矩阵。该过程用罗德里格公式求出。
1.旋转角度
旋转前向量为P, 旋转后变为Q。根据点积定义: 
image
可推出P,Q之间的夹角:


image

matlab实例:

%假设P,Q为两个向量
P=norm(P); %归一化 
Q=norm(Q);
costheta=P*Q'
2. 旋转轴
旋转角所在的平面为向量P和Q所构成的平面,而旋转轴垂直该平面。假定旋转前向量为a(a1, a2, a3), 旋转后向量为b(b1, b2, b3)。由叉乘定义得旋转轴c(c1, c2, c3)为:

image
matlab实例:
%假设P,Q为两个向量,他们的平面法向量为:  
normal=cross(P,Q);  
%归一化  
normal=norm(normal);  
3. 罗德里格旋转公式(Rodrigues' rotation formula)
设v是一个三维空间向量,k是旋转轴的单位向量,则v在右手螺旋定则意义下绕旋转轴k旋转角度θ得到的向量可以由三个不共面的向量v, k和k×v构成的标架表示:

具体推导参见:https://en.wikipedia.org/wiki/Rodrigues'_rotation_formula

matlab实例:

%参照上面的实例;  
theta=acos(costheta);  
Matrix_Rot=makehgtform('axisrotate',normal,theta); 
参考:
https://en.wikipedia.org/wiki/Rotation_matrix
https://www.cnblogs.com/xpvincent/archive/2013/02/15/2912836.html
http://www.cnblogs.com/gaoxiang12/p/5113334.html
http://www.cnblogs.com/gaoxiang12/p/5137454.html (包含An Invitation to 3D vision章节的翻译)

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MATLAB中,可以使用旋转矩阵来实现维空间的刚体运动。旋转矩阵是一种正交矩阵,它可以保持长度、角度、面积等特征不变的仿射变换,即内积和度量不变。旋转矩阵的逆等于它的转置,同时行列式的值为正负1。 在MATLAB中,可以使用makehgtform函数来创建旋转矩阵。例如,如果给定一个单位向量normal和旋转角度theta,可以使用下面的代码创建旋转矩阵Matrix_Rot: theta=acos(costheta); Matrix_Rot=makehgtform('axisrotate',normal,theta); 其中,normal是旋转轴的单位向量,theta是旋转角度。这样,Matrix_Rot就是表示刚体运动的旋转矩阵。 更多关于旋转矩阵的信息,可以参考维基百科的页面和博客文章。关于MATLAB中的刚体运动和旋转矩阵的应用,还可以参考博客文章。 总结起来,MATLAB中的维空间刚体运动可以通过旋转矩阵来实现,旋转矩阵是一种正交矩阵,它可以保持长度、角度、面积等特征不变的仿射变换。在MATLAB中,可以使用makehgtform函数来创建旋转矩阵。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [3D视觉刚体运动matlab实现](https://blog.csdn.net/piaoxuezhong/article/details/78524498)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值