视觉SLAM ch3—三维空间的刚体运动

         如果对于某些线性代数的知识不太牢固,可以看一下我的另一篇博客,写了一些基础知识并推荐了一些视频。

旋转矩阵 单元所需的线代基础知识icon-default.png?t=N7T8https://blog.youkuaiyun.com/Johaden/article/details/141023668

 一、旋转矩阵     

1.点、向量、坐标系

        在数学中,特别是在线性代数领域,一个三维空间中的坐标可以被视为一个向量与线性空间基的乘积,这是因为线性空间的基提供了一种方式来表示该空间中的所有向量。为了理解这一点,首先需要明确什么是线性空间的基。

        线性空间的基是一组向量,这组向量满足两个条件:第一,它们线性无关,即没有向量可以通过其他向量的线性组合来表示;第二,它们能够生成整个线性空间(向量的数量不能少于空间的维数、秩与维数相等),即线性空间中的任何向量都可以通过这组基向量的线性组合来唯一表示。在三维空间中,基通常由三个线性无关的向量组成,这三个向量分别对应于空间中的三个坐标轴。若三个向量两两垂直就是一个标准正交基(下面的就是),组成如下的矩阵为正交矩阵(A’A=E)(两个基矩阵各自是正交矩阵,相乘后仍是正交矩阵)。

        已知正交矩阵后,可以推出转置=逆,即A'=A^{-1}。        

        坐标的取值与向量本身有关也与坐标系(线性空间的基)选取有关。

        机器人中有很多种坐标系:①世界系/惯性系(World)    ②机体系(body)    ③传感器参考系(Sensor)。不同坐标系存在变换关系。传感器捕获的数据都在Sensor系里,但是分析位姿时不关注传感器的移动,更多关注机体的移动,所以需要进行Sensor=>body=>world的变换。第一个变换我们已知(机器人在制作过程中就已知了,人为给定。以及制作时传感器相对于机体的位置也已知,可以进行转换)。第二个translate需要估计,需要在运动过程中估计机器人在世界的位置和姿态(SLAM本质)。

运算:

内积定义:

外积定义(在几何代数中,“∧”符号表示把向量变为矩阵,形式为反对称矩阵):

计算用到了行列式的拆分知识(注意,i,j,k都为单位向量,模为1)。写成相乘的格式利于后面的编程和推导。

几何意义:方向满足右手定则,大小为|a||b|\sin \theta,为平行四边形的有向面积。

坐标:

        当我们说一个三维空间中的坐标是一个向量乘以线性空间的基时,实际上是在说任何一个点(或向量)在这个三维空间中的位置都可以通过其在三个基向量方向上的分量(即坐标)来唯一确定。换句话说,如果我们用v表示一个向量,用e_{1},e_{2},e_{3}表示三维空间的一组基,那么该向量可以表示为:

        其中,x,y,z是该向量相对于基e_{1},e_{2},e_{3}坐标。这种表示方法说明了向量与基之间的关系,即向量可以看作是其坐标与基向量的线性组合。

2.位姿变换和旋转矩阵

(1)位姿变换:
旋转变换

        坐标系(e1,e2,e3)发生一次旋转变为(e1',e2',e3')

        对于一个固定向量a,它的坐标如何变化?

        坐标关系:

        [e_{1},e_{2},e_{3}]\begin{bmatrix} a_{1}\\ a_{2} \\ a_{3} \end{bmatrix}=[e_{1}',e_{2}',e_{3}']\begin{bmatrix} a_{1}'\\ a_{2}' \\ a_{3}' \end{bmatrix}

        左乘\begin{bmatrix} e_{1}^{T}\\ e_{2}^{T} \\ e_{3}^{T} \end{bmatrix}得:

        我们把这样一个3×3的矩阵R称为旋转矩阵。

        旋转矩阵有以下两个特性:①正交矩阵     ②行列式为+1(充要)

        。 n为3时为三维空间的旋转,特殊正交群可以看作一个集合。

同理,a'=R^{-1}a=R^{T}a(R为正交矩阵,转置就是逆,出于复杂性考虑,常用转置) 

        示例,从1位置以R_{12}为旋转矩阵旋转到2位置(R12表示把姿态由2系对齐到1系的旋转矩阵 ): 

a_{1}=R_{12}a_{2}

a_{2}=R_{21}a_{1}

R_{21}=R_{12}^{-1}=R_{12}^{T}

        进一步,可以有三个坐标系的递推:

        

 欧式变换

a_{1}=R_{12}a_{2}+t_{12}t_{12}表示把2系的坐标原点对齐到1系的平移量)

        在多层坐标系的变换时,不得不写成

c=R_{2}(R_{1}a+t_{1})+t_{2}

        直观来看就是:①旋转     ②平移 

a'=Ra+t

 3.变换矩阵与齐次坐标

        上面的形式在变换多次之后会过于复杂。因此,我们要引入齐次坐标和变换矩阵重写
式。
        

中间红框的矩阵称为变换矩阵T。记\widetilde{a}=\begin{bmatrix} a\\1 \end{bmatrix}为齐次坐标(四维)。

这样变换利于连续坐标系转换,如:

特殊欧式群(旋转+平移):

        此处不是简单的取反,需要排除旋转的影响,因为是先旋转后平移,平移量受旋转量影响。 类比y=kx+b,左右移动时不是直接调整b的值,而是调整y=k(x+b/k)中b/k的值。

        若世界坐标系为T_{w},机器人坐标系为T_{R},一个点的世界坐标为P_{w},机器人坐标系下为P_{R},那么满足:        P_{R}=T_{Rw}P_{w}(注意T的下标与R的下标一致,“就近原则”)

        其中的T_{Rw}意思就是从w到R进行平移,如果把T_{Rw}后面乘一个0向量(与T一样,三个0一个1),结果就是矩阵的平移t(很容易,直接稍微算一下,把R全消掉了,只剩t了),T_{Rw}是世界坐标系原点在机器人坐标系下的表示,反之,可以自己思考一下。 

4.旋转向量(角轴)

        旋转向量由一个方向向量和一个标量组成,其中方向向量定义了旋转的轴,而标量则定义了绕该轴旋转的角度。旋转向量的长度等于旋转角度的弧度值。

        旋转向量可以用一个三维向量r=[\Theta _{x},\Theta _{y},\Theta _{z}]^{T} 来表示,其中 θx, θy, 和 θz​ 分别是绕 x, y, z 轴旋转的弧度数。但是,实际上旋转向量的表示是规范化的,即它的方向表示旋转轴的方向,而它的模长表示旋转角度。所以一个旋转向量 r 可以表示为:

        其中,θ 是旋转角度(以弧度为单位),\widehat{u} 是单位向量,指向旋转轴的方向。 

转化:       

        旋转向量到旋转矩阵的过程由罗德里格斯公式Rodrigues’s Formula )表明

        符号 是向量到反对称的转换符 

        旋转矩阵到旋转向量的转换:

        在三维空间中,任何非平凡的旋转矩阵 R(即不是恒等矩阵的旋转)都有一个特殊的属性:存在至少一个方向(向量),当这个向量被 R 作用时,它仅仅可能改变长度,但不会改变方向。这个方向就是旋转轴,而旋转轴上的向量是旋转矩阵的一个特征向量,对应于特征值 1。 

二、实践部分-EIGEN

1.安装eigen(通过eigen在C++中进行矩阵运算)

eigen安装在如下图路径中(eigen的头文件库)

 2. E

### SLAM 中三维刚体运动模型 在同步定位地图构建(SLAM)领域,三维刚体运动模型用于描述不同坐标系间的转换关系。具体来说,在SLAM框架下,涉及多个重要的坐标系,包括但不限于世界坐标系、机器人坐标系以及相机坐标系等[^5]。 #### 刚体运动特性 对于任意给定的向量而言,在经历刚体运动前后其长度和方向余弦均保持不变。这意味着当物体仅发生旋转和平移操作而不伴随形变时,则认为该过程遵循着严格的刚体运动规律。这种性质保证了即使是在不同的参照体系间切换观察视角,对象本身的几何特征也不会受到影响。 #### 数学表达方式 为了精确刻画上述提到的空间变换行为,可以采用齐次坐标表示法来简化计算流程并提高效率。设\( T \in SE(3)\)(特殊欧氏群),代表从源坐标系到目标坐标系的一个欧式变换矩阵: \[ T=\left[\begin{array}{cc} R & t \\ \mathbf{0}^{T} & 1 \end{array}\right], R \in SO(3),t \in \mathbb{R}^{3} \] 其中 \(R\) 表示绕原点发生的纯旋转变换部分;而 \(t\) 是沿三个轴方向上的平移分量。利用这样的结构化定义能够方便地实现对复杂场景中多姿态变化的有效管理。 #### 应用实例 考虑到实际应用场景的需求,比如移动机器人自主导航任务里,就需要不断地更新自身相对于周围环境的位置信息。此时借助于激光雷达或者摄像头获取外部感知数据,并结合IMU惯导装置提供的内部状态反馈共同完成实时定位功能。在此基础上进一步开展路径规划等工作就变得可行起来。 ```python import numpy as np def se3_to_SE3(xi): """Converts a vector xi in the Lie algebra of SE(3) to its corresponding transformation matrix.""" omega = xi[:3] v = xi[3:] skew_omega = np.array([[ 0, -omega[2], omega[1]], [ omega[2], 0, -omega[0]], [-omega[1], omega[0], 0]]) theta = np.linalg.norm(omega) if abs(theta)<np.finfo(float).eps: R = np.eye(3) V = np.eye(3) else: axis = omega / theta sin_theta = np.sin(theta) cos_theta = np.cos(theta) R = (cos_theta * np.eye(3)) + ((1-cos_theta)*np.outer(axis,axis))+(sin_theta*skew_omega) A = (1-np.cos(theta))/(theta**2) B = (theta-sin_theta)/(theta**3) V = np.eye(3)+(A*skew_omega)+(B*np.dot(skew_omega,skew_omega)) p = np.dot(V,v) T = np.block([ [R , p.reshape(-1,1)], [np.zeros((1,3)), [[1]] ] ]) return T ``` 此代码片段展示了如何基于李代数se(3)中的六维向量ξ构造对应的SE(3)变换矩阵T。这有助于理解底层理论的同时也为具体的工程实践提供了工具支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值