【视觉SLAM入门】1. 基础知识,运动观测,旋转(旋转矩阵,轴角,欧拉角,四元数)和eigen库基础

news2024/10/7 4:24:11

"山薮藏疾"

    • 1. 运动与观测
      • 1.1 通用运动方程
      • 1.2 通用观测方程
      • 1.3 对SLAM的认识
    • 2. 三维运动
      • 2.1 旋转与平移
      • 2.2 变换矩阵
      • 2.3 矩阵知识补充
      • 2.4 旋转向量
      • 2.5 欧拉角
      • 2.6 四元数
      • 2.7 其他变换
    • 3. 编程基础
      • 3.1 链接库说明
      • 3.2 eigen库

注: 以后的方程中如未说明,x表示机器人自身位置,y表示路标(地图中的点),观测数据用z表示,将这个过程看做离散的,则时间从1到…
轨迹:由x构成的集合;

1. 运动与观测

1.1 通用运动方程

x k = f ( x k − 1 , u k , w k ) \qquad\qquad\qquad x_k = f(x_{k-1}, u_k, w_k) xk=f(xk1,uk,wk)

  • 上式表示 x k − 1 到 x k x_{k-1}到x_k xk1xk的过程, f f f是通用的, u k u_k uk表示输入(运动传感器的读数):例如机器人自身的轮速计等, w k w_k wk表示误差

参数化举例:
设机器人在二维平面中运动,则位姿可以由x,y,和转角来描述,即 x k = [ x , y , θ ] k T x_k = [x, y, \theta]_k^T xk=[x,y,θ]kT,同时机器人身上的编码器等传感器可得 u k = [ Δ x , Δ y , Δ θ ] k T u_k = [\Delta x, \Delta y, \Delta \theta]_k^T uk=[Δx,Δy,Δθ]kT,则带入上述运动方程可得:

[ x y θ ] k = [ x y θ ] k − 1 + [ Δ x Δ y Δ θ ] k + w k \begin{bmatrix} x\\y\\ \theta \end{bmatrix}_k= \begin{bmatrix} x\\y\\ \theta \end{bmatrix}_{k-1} + \begin{bmatrix} \Delta x\\\Delta y\\\Delta \theta \end{bmatrix}_k + w_k xyθ k= xyθ k1+ ΔxΔyΔθ k+wk

1.2 通用观测方程

z k , j = h ( y j , x k , v k , j ) \qquad\qquad\qquad z_{k,j} = h(y_j, x_k, v_{k, j}) zk,j=h(yj,xk,vk,j)

  • 上式表示在    x k \;x_k xk 上看到路标    y j \;y_j yj 产生了观测数据    z k , j \;z_{k,j} zk,j    v k , j \;v_{k,j} vk,j表示误差

参数化举例:

设机器人装有一个2D激光雷达,能读到距离    r \;r r 和 夹角    θ \; \theta θ 两个值,在2D世界中,记一个landmark(路标点)为    y = [ p x , p y ] T \;y = [p_x, p_y]^T y=[px,py]T 观测数据为    z = [ r , ϕ ] T \; z = [r, \phi]^T z=[r,ϕ]T, 则观测方程可如下:
[ r ϕ ] = [ ( p x − x ) 2 + ( p y − y ) 2 arctan ⁡ ( p y − y p x − x ) ] + v \begin{bmatrix} r\\ \phi \end{bmatrix} = \begin{bmatrix} \sqrt{(p_x - x)^2 + (p_y - y)^2} \\ \arctan(\frac{p_y - y}{p_x-x}) \end{bmatrix} + v [rϕ]=[(pxx)2+(pyy)2 arctan(pxxpyy)]+v
对视觉SLAM而言,观测方程就是 “对路标点拍摄后,得到了图
像的(具体是图像中的像素)”
的过程

1.3 对SLAM的认识

知道运动测量的数据    u \;u u,传感器的数据    z \; z z ,求解定位    x \; x x 和建图    y \; y y 的问题
⇓ ⇓ ⇓ \qquad \qquad \qquad \qquad \qquad \Downarrow \Downarrow \Downarrow ⇓⇓⇓

状态估计问题:带有噪声的数据    ⟹    \; \Longrightarrow\; 内部隐藏的状态变量

噪声: 分为 G u a s s i a n Guassian Guassian N o n − G u a s s i a n Non-Guassian NonGuassian
两个方程: 分为 L i n e a r Linear Linear N o n − L i n e a r Non-Linear NonLinear
**线性高斯系统(LG)**是无偏的(样本均值近似等于总体均值),可以用KF求解;
非线性非高斯(NLNG)系统,现在主要用EKF->粒子滤波器->图优化(时间顺序),图优化占资源,且效果明显好,优先选择。

2. 三维运动

2.1 旋转与平移

a 和 a ‘ a和a` aa分别是两个坐标系下的同一个点,它们在各自空间用坐标和基底表示如下:

[ e 1 e 2 e 3 ] [ a 1 a 2 a 3 ] = [ e 1 ‘ e 2 ‘ e 3 ‘ ] [ a 1 ‘ a 2 ‘ a 3 ‘ ] \begin{bmatrix} e_1&e_2&e_3 \end{bmatrix}\begin{bmatrix} a_1\\a_2\\a_3 \end{bmatrix}= \begin{bmatrix} e_1^`&e_2^`&e_3^`\end{bmatrix}\begin{bmatrix} a_1^`\\a_2^`\\a_3^`\end{bmatrix} [e1e2e3] a1a2a3 =[e1e2e3] a1a2a3
变换如下:
在这里插入图片描述

中间的    R \;R R 称为旋转矩阵,是行列式为1的正交阵,定义    R \;R R 如下:
S O ( n ) \qquad \qquad \qquad SO(n) SO(n) = { R ∈ R n x n ∣ R R T = I , d e t ( R ) = 1 R \in \R^{nxn} | RR^T=I, det(R)=1 RRnxnRRT=I,det(R)=1}

解释: S O ( n ) SO(n) SO(n)是特殊正交群(Special Orthogonal Group)。

则带上平移量的变换为:
a ′ = R a + t a'=Ra + t a=Ra+t 相反旋转为: a = R T a ′ − t = R − 1 a ′ − t a = R^T a' -t= R^{-1}a'-t a=RTat=R1at

2.2 变换矩阵

T T T(Transform matrix)

避免如上表示多次变换的形式过长,引入变换矩阵T,如 b = T 1 a c = T 2 b ⟹ c = T 2 T 1 a \quad b=T_1a\quad c=T_2b \Longrightarrow c=T_2T_1a b=T1ac=T2bc=T2T1a

它可以定义如下(引入齐次坐标后):

S E ( 3 ) \qquad \qquad \qquad SE(3) SE(3) = { T = [ R t 0 T 1 ] ∈ R 4 x 4 ∣ R ∈ S O ( 3 ) , t ∈ R 3 T= \begin{bmatrix} \quad R&t&\\\quad0^T&1 \end{bmatrix} \in \R^{4x4} | R \in SO(3), t \in \R^3 T=[R0Tt1]R4x4RSO(3),tR3}

同样 T − 1 \quad T^{-1} \quad T1 表示一个反向的变换,不区分齐次坐标    a ~    \;\tilde{a}\; a~和非齐次坐标    a    \;a\; a的区别,默认是符合我们运算的那种。

2.3 矩阵知识补充

  • 正交矩阵的转置 = = =它的逆
  • 转置性质    ( A B ) T = B T A T \; (AB)^T = B^TA^T (AB)T=BTAT
  • 反对称矩阵 A = − A T A=-A^T A=AT
  • 实矩阵乘以它的转置得到的矩阵是实对称矩阵
  • 矩阵可以用来解方程,直接求逆: A x = b ⟹ x = b A − 1 Ax=b \Longrightarrow x = b A^{-1} Ax=bx=bA1 (费时间)
  • 用QR分解: A x = b ⇒ A = Q R ⇒ Q R x = b ⇒ R x = Q T b Ax=b \Rightarrow A=QR \Rightarrow QRx=b \Rightarrow Rx=Q^Tb Ax=bA=QRQRx=bRx=QTb (Q是N阶正交阵,R是上三角)(省一半时间)

2.4 旋转向量

S O ( 3 ) SO(3) SO(3)用9个量表示旋转,正交且 d e t ( R ) det(R) det(R)为1是它的约束, S E ( 3 ) SE(3) SE(3)也是一样的。因此不够紧凑、约束条件对求解的限制等都成为了它的问题。

旋转向量: 一个三维向量,用一个旋转轴    n \; n n 和 旋转角    θ \; \theta θ 表示.
变换矩阵        \;\;\; 在这种表示下 一个旋转向量+一个平移向量就可以表示。
转换关系:      \;\; 通过罗德里格斯(Rodrigues’s Formula)公式

\qquad \qquad \qquad\qquad \qquad 旋转向量 ⟹ \Longrightarrow 旋转矩阵

  1. 设一旋转轴    n \;n n,角度    θ \;\theta θ 的旋转表示为    n θ \; n\theta nθ,和旋转矩阵 R R R 表示转换如下:

R = cos ⁡ θ ⋅ I + ( 1 − cos ⁡ θ ) n n T + sin ⁡ θ ⋅ n \qquad \qquad \qquad R = \cos\theta \cdot I + (1-\cos\theta)nn^T+\sin\theta \cdot n R=cosθI+(1cosθ)nnT+sinθn^

  • 其中^表示向量的反对称运算,参考视觉SLAM14讲中外积的表示

\qquad \qquad \qquad\qquad \qquad 旋转矩阵 ⟹ \Longrightarrow 旋转向量

  1. 如下:
    θ = arccos ⁡ ( t r ( R ) − 1 2 ) \qquad\qquad\qquad\qquad\theta = \arccos(\frac{tr(R)-1}{2}) θ=arccos(2tr(R)1)
    R n = n \qquad\qquad\qquad\qquad \qquad Rn = n Rn=n
  • 转轴在旋转前后不发生变化。转轴 n 是矩阵 R 特征值 1 对应的特征向量。求解此方程,再归一化,就得到了旋转轴。

2.5 欧拉角

\qquad 直观,但是有奇异性—“万向锁”(Gimbal Lock),调试观察时可转为欧拉角,一般不用于计算,以下旋转是有先后顺序的,以一种为例(Z-Y-X),表示如下:

y a w yaw yaw - 偏航角 - 绕 Z Z Z 轴转
p i t c h pitch pitch - 俯仰角 - 绕旋转之后的 Y Y Y 轴转
r o l l roll roll - 偏航角 - 绕旋转之后的 X X X 轴转

2.6 四元数

Quaternion,消除欧拉角的奇异性且紧凑的表示法。以地球纬度 ± 9 0 o \pm 90^o ±90o为例,仅用两个坐标无法表示。四元数用四个数表示旋转。一个实部,三个虚部(或向量)。
q = q 0 + q 1 i + q 2 j + q 3 k \qquad \qquad\qquad \qquad\qquad \qquad\qquad q=q_0 +q_1i+q_2j+q_3k q=q0+q1i+q2j+q3k
满足
f ( x ) = { i 2 = j 2 = k 2 = − 1 i j = k , j i = − k j k = i , k j = − i k i = j , i k = − j f(x)= \begin{cases} i^2=j^2=k^2=-1 \\ij=k,ji=-k \\jk=i,kj=-i \\ki=j,ik=-j \end{cases} f(x)= i2=j2=k2=1ij=k,ji=kjk=i,kj=iki=j,ik=j

用四元数表示旋转
\qquad 假设某个旋转是绕单位向量    n = [ n x , n y , n z ] T \;n = [nx , ny , nz ]^T n=[nx,ny,nz]T 进行了角度为    θ \;\theta θ 的旋转,那么这个旋转的四元数形式为:
q = [ cos ⁡ θ 2 , n x sin ⁡ θ 2 , n y sin ⁡ θ 2 , n z sin ⁡ θ 2 ] ( 1 ) \qquad\qquad\qquad\qquad q=\begin{bmatrix}\cos {\frac{\theta}{2}}, n_x\sin {\frac{\theta}{2}}, n_y\sin {\frac{\theta}{2}}, n_z\sin {\frac{\theta}{2}}\end{bmatrix} \qquad\qquad(1) q=[cos2θ,nxsin2θ,nysin2θ,nzsin2θ](1)

\qquad 要对点 p = [ x , y , z ] p=[x,y,z] p=[x,y,z]进行旋转,轴角法 n , θ n, \theta n,θ,表示这个旋转过程如下:

  1. 首先用式1表述这个点(三个虚轴)
    p = [ 0 , x , y , z ] \qquad\qquad\qquad\qquad p=[0,x,y,z] p=[0,x,y,z]
  2. 旋转后的点    p ′ \;p' p
    p ′ = q p q − 1 \qquad\qquad\qquad\qquad p'=qpq^{-1} p=qpq1
  • 计算结果实部为0,故是纯虚四元数,虚部三个分量表示旋转后的3D点的坐标。
  • 同理,四元数 ⟺ \Longleftrightarrow 旋转向量 ⟺ \Longleftrightarrow 旋转矩阵 也可相互转化,较为容易。

2.7 其他变换

以上都是欧式变换,除此之外还存在如下几种SLAM中可能用到的变换

  1. **相似变换:**允许物体均匀缩放;
  2. 仿射变换;
  3. **射影变换;**等
    在这里插入图片描述

3. 编程基础

3.1 链接库说明

静态库.a和动态库.so:所有库都是一些函数打包后的集合,差别在于静态库每次被调用都会生成一个副本,而共享库则只有一个副本,更省空间。

库+头文件的意义: 库文件是一个压缩包,里头带有编译好的二进制函数。为了让别人(或
者自己)使用这个库,我们需要提供一个头文件,基本是这个库的使用说明啦。因此,对于库
的使用者,只要拿到了头文件和库文件,就可以调用这个库。

构建动态库:在CMakeLists.txt中,动态库的编译如下:参数1是名称,3是要被编译成的文件

add_library( slam_shared SHARED SLAM.cpp )

使用该库:如下:

add_executable(useHello useHello.cpp)
target_link_libraries(useHello slam_shared)

3.2 eigen库

是一个很有意思的库,纯用头文件编写,没有.so,.a等库,所以调用的时候只要保证头文件的路径正确即可。在很多资料中头文件包含是这样的<Eigen/xxxxx>,实际上这个路径不在我们的搜索路径中,三种解决办法:

  1. /usr/include/eigen3/Eigen/下eigen3改名为Eigen,且将原Eigen的文件全部上移一层到Eigen
  2. 将该路径加入头文件搜索路径中,在VSCODE中很容易实现;或在CmakeLists.txt中加入include_directories( "/usr/include/eigen3" )
  3. 改一个头文件包含方式,前边<eigen3/Eigen/xxxxxx>即可

如果eigen有关的编译报错,直接找报错信息的大写部分就大概能知道。
用eigen库表示一般的几种表示旋转的函数
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/720549.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面试官:一千万的数据,要怎么查?

一个老生常谈的问题&#xff0c;SELECT *和SELECT具体字段那个快&#xff1f;在数据量少的时候可能没什么差别&#xff0c;但是数据量达到千万级&#xff0c;差距就显现出来。废话不多说&#xff0c;往下看 ↓。 SELECT * 和 SELECT 具体字段的区别 在 MySQL 中&#xff0c;SE…

批量规范化

✨✨✨ 感谢优秀的你打开了小白的文章 “希望在看文章的你今天又进步了一点点&#xff0c;生活更加美好&#xff01;”&#x1f308;&#x1f308;&#x1f308; 目录 1.批量规范化基本原理 2.批量规范化的使用 2.1对于全连接层 2.2对于卷积层 3.代码实现 3.1方式一 …

26488-24-4,Cyclo(D-Phe-L-Pro),具有良好的生物相容性

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ 【产品描述】 Cyclo(D-Phe-L-Pro)环(D-苯丙氨酸-L-脯氨酸)&#xff0c;环二肽是由两个氨基酸通过肽键环合形成&#xff0c;是自然界中小的环状肽。由于其存在两个酰胺键即四个可以形成氢键的位点&#xff0c;环二肽可以在氢…

商业海外社交媒体营销10步指南 [2023]

如今&#xff0c;社交媒体是任何成功商业战略的重要组成部分。这不是奢侈品&#xff0c;而是必需品。全球有超过 36 亿人使用社交媒体&#xff0c;它是企业展示其产品和服务、建立品牌知名度以及与客户联系的数字游乐场。 但这不仅仅是娱乐和游戏。要在社交媒体上取得成功&…

Golang每日一练(leetDay0114) 矩阵中的最长递增路径、按要求补齐数组

目录 329. 矩阵中的最长递增路径 Longest Increasing Path In A Matrix &#x1f31f;&#x1f31f; 330. 按要求补齐数组 Patching Array &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日…

数据结构--二叉树的性质

数据结构–二叉树的性质 二叉树常考性质 常见考点1: 设非空二叉树中度为0、1和2的结点个数分别为 n 0 、 n 1 和 n 2 &#xff0c;则 n 0 n 2 1 n_0、n_1和n_2&#xff0c;则n_0 n_2 1 n0​、n1​和n2​&#xff0c;则n0​n2​1 n 0 n 2 1 \color{red}n_0 n_2 1 n0​n2​…

图层中大型数据集的分块处理思路

图层中大型数据集的分块处理思路 为改善要素叠加工具&#xff08;如联合和相交&#xff09;的性能和可伸缩性&#xff0c;软件采用了称为自适应细分处理的运算逻辑。当可用的物理内存不足以对数据进行处理时&#xff0c;就会触发系统使用此逻辑。由于保持在物理内存的可用范围…

助力企业完成等保2.0的重要工具

在当今数字化时代&#xff0c;企业面临着越来越多的网络安全威胁和数据泄露风险。为了保护敏感信息和维护业务的连续性&#xff0c;许多企业正在积极采取措施来实施等保2.0标准。在这一过程中&#xff0c;EventLog Analyzer作为一种全面的安全信息与事件管理解决方案&#xff0…

swagger2word使用(将swagger2转化为word)

开源项目地址 https://github.com/JMCuixy/swagger2word 项目使用 1、项目拉下来以后先修改application.xml配置文件红框内容&#xff0c;将其修改为要换为自己swagger文档的地址 2、运行项目后输入地址http://127.0.0.1:8080/toWord 即可下载word文档

结构体和数据结构--共用体

共用体&#xff0c;也称联合&#xff08;Union&#xff09;&#xff0c;是将不同类型的数据组织在一起共同占用同一段内存的一种构造数据类型。共用体与结构体的类型声明方法类似&#xff0c;只是关键字变为了Union。 例题&#xff1a;演示共用体所占内存字节数的计算方法 #i…

如何用手机制作3D人物模型素材

3D人物模型素材是现代3D游戏和电影制作中必不可少的一部分。它们是数字艺术家和设计师们用来创造逼真世界的关键。3D人物模型素材是用计算机程序制作的虚拟人物&#xff0c;可以被用于电影、电视、游戏和虚拟现实应用中。它们可以被用来代替实际演员&#xff0c;也可以被用来创…

小程序蓝牙通信

蓝牙通信能力封装 一开始是根据uniapp提供的蓝牙api写的蓝牙方法&#xff0c;之后发现复用性&#xff0c;以及一些状态的监听存在缺陷&#xff0c;之后整理成了类。这样复用性以及状态监听的问题就解决了。 蓝牙组件 创建蓝牙组件的类 单例模式是为了保证蓝牙长连接&#xff0…

前端(一)——前端开发遇到的普遍问题以及解决策略

&#x1f604;博主&#xff1a;小猫娃来啦 &#x1f604;文章核心&#xff1a;前端开发遇到的普遍问题以及解决策略 前端十万个为什么&#xff1f; 有人说vue框架是基于mvvm实现的&#xff1f;这种说法对吗&#xff1f; mvc和mvvm的区别是什么&#xff1f; mvvm是否是mvc的升…

内容文本生成二维码用excel表格导出(java)

内容文本生成二维码用excel表格导出(java) //若有问题可留言 效果如下: import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map;import org.apache.po…

大厂股权就是这么“坑”,150万股票到账前被优化,损失惨重

某网友发文称&#xff1a;“自己还有47天就可以解锁股权&#xff0c;到时就有150万的股票到账&#xff0c;结果接到公司裁员通知&#xff0c;实在是淌血&#xff0c;我能反抗吗&#xff1f;” 对这我只能说&#xff0c;公司卡的就是这个点。所以大家在找工作的时候&#xff0c;…

SparkJDBC性能优化指南

前言 本文以Mysql为例。Spark作为一种强大且广泛应用于大数据处理的分布式计算框架,有着出色的性能和可伸缩性。在使用Spark处理大规模数据时,往往需要与关系型数据库MySQL进行交互。然而,由于MySQL和Spark本身的特性之间存在一些差异,直接使用Spark读写MySQL的默认配置可…

SQL 查找重复的电子邮箱

SQL 182 查找重复的电子邮箱 SQL架构 表: Person -------------------- | Column Name | Type | -------------------- | id | int | | email | varchar | -------------------- id 是该表的主键列。 此表的每一行都包含一封电子邮件。电子邮件不包含大写字母。 编写一个 SQ…

线性DP-入门篇

目录 数字三角形&#xff1a; 最长上升子序列&#xff1a; 魔族密码&#xff1a; 编辑距离&#xff1a; 线性动态规划的主要特点是状态转移的推导是按照问题规模 从小到大依次推导&#xff0c;较大规模的问题的解依赖较小规模的问题的解。 数字三角形&#xff1a; [USA…

大模型是什么

在计算机领域&#xff0c;大模型’是一个近年来备受关注的词汇。这篇文章旨在带你遨游大模型的世界&#xff0c;了解它们的特点、优缺点&#xff0c;以及需如何有效地利用它们。我们还会探讨一些具体的大模型实例&#xff0c;并分析其对人类社会的影响。 首先&#xff0c;我们…

Android Studio实现内容丰富的安卓博客发布平台

如需源码可以添加q-------3290510686&#xff0c;也有演示视频演示具体功能&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动。 项目编号078 1.开发环境 android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看博客列表…