视觉SLAM十四讲笔记-- 第三讲

第三讲课后题

1、验证旋转矩阵是正交矩阵。

(1)正交矩阵
定义:设A为n阶方阵,如果 A T A = I A^TA=I ATA=I 或者 A A T = I AA^T=I AAT=I,就称A为正交矩阵
性质

  • 正交矩阵的每一个列向量都是单位向量,且向量之间两两正交。
  • 正交矩阵的行列式为1 或者 -1
  • A − 1 = A T A^{-1}=A^T A1=AT(充要条件)

(2)旋转矩阵
旋转矩阵描述了坐标系之间的旋转变换,由3 × 3 的矩阵描述。

验证思路是利用 正交矩阵的充要条件 ( A − 1 = A T A^{-1}=A^T A1=AT)来验证。

根据书中的例子设单位正交基( e 1 , e 2 , e 3 e_1, e_2,e_3 e1,e2,e3)经过一次旋转变成了( e 1 ′ , e 2 ′ , e 3 ′ e^{'}_1, e^{'}_2,e^{'}_3 e1,e2,e3),因为同一向量 a 在两个坐标系下分别为( a 1 , a 2 , a 3 a_1, a_2,a_3 a1,a2,a3),( a 1 ′ , a 2 ′ , a 3 ′ a^{'}_1, a^{'}_2,a^{'}_3 a1,a2,a3),没有发生变化,根据坐标定义,因此有:
[ e 1 e 2 e 3 ] [ a 1 a 2 a 3 ] = [ e 1 ′ e 2 ′ e 3 ′ ] [ a 1 ′ a 2 ′ a 3 ′ ] ( 式 子 1.1 ) \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} \color{red}(式子1.1) [e1e2e3]a1a2a3=[e1e2e3]a1a2a31.1

两边同时左乘 [ e 1 T e 2 T e 3 T ] \begin{bmatrix} e^T_1\\\\e^T_2\\\\e^T_3\end{bmatrix} e1Te2Te3T,就变成了如下:
[ e 1 T e 2 T e 3 T ] [ e 1 e 2 e 3 ] [ a 1 a 2 a 3 ] = [ e 1 T e 2 T e 3 T ] [ e 1 ′ e 2 ′ e 3 ′ ] [ a 1 ′ a 2 ′ a 3 ′ ] \begin{bmatrix} e^T_1\\\\e^T_2\\\\e^T_3\end{bmatrix} \begin{bmatrix} e_1&e_2&e_3\end{bmatrix} \begin{bmatrix} a_1\\\\a_2\\\\a_3\end{bmatrix} = \begin{bmatrix} e^T_1\\\\e^T_2\\\\e^T_3\end{bmatrix} \begin{bmatrix} e^{'}_1& e^{'}_2&e^{'}_3\end{bmatrix} \begin{bmatrix} a^{'}_1\\\\a^{'}_2\\\\a^{'}_3\end{bmatrix} e1Te2Te3T[e1e2e3]a1a2a3=e1Te2Te3T[e1e2e3]a1a2a3
左式由于基向量正交所以得到单位阵,所以式子化简如下:
a = [ a 1 a 2 a 3 ] = [ e 1 T e 1 ′ e 1 T e 2 ′ e 1 T e 3 ′ e 2 T e 1 ′ e 2 T e 2 ′ e 2 T e 3 ′ e 3 T e 1 ′ e 3 T e 2 ′ e 3 T e 3 ′ ] [ a 1 ′ a 2 ′ a 3 ′ ] = R a ′ ( 式 子 1.2 ) a=\begin{bmatrix} a_1\\\\a_2\\\\a_3\end{bmatrix} =\begin{bmatrix} e^T_1e^{'}_1 & e^T_1e^{'}_2 & e^T_1e^{'}_3 \\\\ e^T_2e^{'}_1 & e^T_2e^{'}_2 & e^T_2e^{'}_3 \\\\ e^T_3e^{'}_1 & e^T_3e^{'}_2 & e^T_3e^{'}_3 \end{bmatrix} \begin{bmatrix} a^{'}_1\\\\a^{'}_2\\\\a^{'}_3\end{bmatrix} = Ra^{'} \color{red}(式子1.2) a=a1a2a3=e1Te1e2Te1e3Te1e1Te2e2Te2e3Te2e1Te3e2Te3e3Te3a1a2a3=Ra1.2
同理,式子1.1 两边同时左乘 [ e 1 ′ T e 2 ′ T e 3 ′ T ] \begin{bmatrix} e^{'T}_1\\\\e^{'T}_2\\\\e^{'T}_3\end{bmatrix} e1Te2Te3T,就变成了如下:
[ e 1 ′ T e 2 ′ T e 3 ′ T ] [ e 1 e 2 e 3 ] [ a 1 a 2 a 3 ] = [ e 1 ′ T e 2 ′ T e 3 ′ T ] [ e 1 ′ e 2 ′ e 3 ′ ] [ a 1 ′ a 2 ′ a 3 ′ ] \begin{bmatrix} e^{'T}_1\\\\e^{'T}_2\\\\e^{'T}_3\end{bmatrix} \begin{bmatrix} e_1&e_2&e_3\end{bmatrix} \begin{bmatrix} a_1\\\\a_2\\\\a_3\end{bmatrix} = \begin{bmatrix} e^{'T}_1\\\\e^{'T}_2\\\\e^{'T}_3\end{bmatrix} \begin{bmatrix} e^{'}_1& e^{'}_2&e^{'}_3\end{bmatrix} \begin{bmatrix} a^{'}_1\\\\a^{'}_2\\\\a^{'}_3\end{bmatrix} e1Te2Te3T[e1e2e3]a1a2a3=e1Te2Te3T[e1e2e3]a1a2a3
右式由于基向量正交所以得到单位阵,所以式子化简如下:
R T = [ e 1 ′ T e 1 e 1 ′ T e 2 e 1 ′ T e 3 e 2 ′ T e 1 e 2 ′ T e 2 e 2 ′ T e 3 e 3 ′ T e 1 e 3 ′ T e 2 e 3 ′ T e 3 ] [ a 1 a 2 a 3 ] = [ a 1 ′ a 2 ′ a 3 ′ ] = a ′ R^T= \begin{bmatrix} e^{'T}_1e_1& e^{'T}_1e_2&e^{'T}_1e_3\\\\ e^{'T}_2e_1&e^{'T}_2e_2&e^{'T}_2e_3\\\\ e^{'T}_3e_1&e^{'T}_3e_2&e^{'T}_3e_3\end{bmatrix} \begin{bmatrix} a_1\\\\a_2\\\\a_3\end{bmatrix} = \begin{bmatrix} a^{'}_1\\\\a^{'}_2\\\\a^{'}_3\end{bmatrix} = a^{'} RT=e1Te1e2Te1e3Te1e1Te2e2Te2e3Te2e1Te3e2Te3e3Te3a1a2a3=a1a2a3=a
所以由 式子1.2 R T = R − 1 R^T =R^{-1} RT=R1
由正交矩阵充要条件 A − 1 = A T A^{-1}=A^T A1=AT可得,旋转矩阵就是正交矩阵。

2.*寻找罗德里格斯公式的推导过程并加以理解。

答:个人理解,就是旋转向量到旋转矩阵的转换公式。
可以参考这个博客:https://blog.csdn.net/q583956932/article/details/78933245

3.验证四元数旋转某个点后,结果是一个虚四元数(实部为零),所以仍然对应到一个三维空间点,见式(3.33)。

答:
设空间中某个虚四元数 p = [ 0 , v ] p=\begin{bmatrix} 0, v\\ \end{bmatrix} p=[0,v] ,旋转 q = [ s a , v a ] q=\begin{bmatrix} s_a, v_a\\ \end{bmatrix} q=[sa,va],由书中的各种公式:
(1)旋转公式: p ′ = q p q − 1 p^{'}=qpq^{-1} p=qpq1
(2)求逆公式: q − 1 = q ∗ / ∣ ∣ q ∣ ∣ 2 q^{-1}=q^*/||q||^2 q1=q/q2
(3)共轭公式: q ∗ = [ s , − v ] T q*=[s, -v]^T q=[s,v]T
(4)乘法法则: q a q b = [ s a s b − v a T v b , s a v b + s b v a + v a × v b ] T q_aq_b=[s_as_b-v^T_av_b, s_av_b + s_bv_a + v_a × v_b ]^T qaqb=[sasbvaTvb,savb+sbva+va×vb]T
第一步计算 : q p = [ − v a T v , s a v b + v a × v ] T qp=[-v^T_av,s_av_b + v_a × v ]^T qp=[vaTv,savb+va×v]T
第二步计算: q p q − 1 = q p q ∗ / ∣ ∣ q ∣ ∣ 2 qpq^{-1}=qpq^*/||q||^2 qpq1=qpq/q2 ,完全计算比较麻烦,现在就可以转换成计算 q p q ∗ qpq^* qpq的实部
q p q ∗ = [ − v a T v , s a v b + v a × v ] T [ s a , − v a ] T qpq^*=[-v^T_av,s_av_b + v_a × v ]^T [s_a, -v_a]^T qpq=[vaTv,savb+va×v]T[sa,va]T
实部为: − v a T v s a − [ s a v b + v a × v ] T ( − v a ) = − v a T v s a + v a T v s a + ( v a × v ) T v a = ( v a × v ) T v a -v^T_avs_a-[s_av_b + v_a × v ]^T(-v_a)=-v^T_avs_a+v^T_avs_a+(v_a × v )^Tv_a=(v_a × v)^Tv_a vaTvsa[savb+va×v]T(va)=vaTvsa+vaTvsa+(va×v)Tva=(va×v)Tva
因为 v a × v v_a × v va×v v a v_a va 垂直,因此 q p q − 1 qpq^{-1} qpq1的实部为0,为纯虚四元数。

4.画表总结旋转矩阵、轴角、欧拉角、四元数的转换关系。

答:如下表格:

旋转矩阵轴角四元数
旋转矩阵 θ = arccos ⁡ ( t r ( R ) − 1 2 ) \theta=\arccos\bigg(\tfrac{tr(R)-1}{2}\bigg) θ=arccos(2tr(R)1) 转轴n是
矩阵R特征值1对应的特征向量
q 0 = t r ( R ) + 1 2 q_0=\tfrac{\sqrt{\smash[b]{tr(R)+1}}}{2} q0=2tr(R)+1

q 1 = m 23 − m 32 4 q 0 q_1=\tfrac{m_{23} - m{32}}{4q_0} q1=4q0m23m32

q 2 = m 31 − m 13 4 q 0 q_2=\tfrac{m_{31} - m{13}}{4q_0} q2=4q0m31m13

q 3 = m 12 − m 21 4 q 0 q_3=\tfrac{m_{12} - m{21}}{4q_0} q3=4q0m12m21
轴角 R = cos ⁡ θ I + ( 1 − cos ⁡ θ ) n n T + sin ⁡ θ n ∧ R=\cos\theta\boldsymbol I+(1-\cos\theta)nn^T+\sin\theta\boldsymbol n^{\land} R=cosθI+(1cosθ)nnT+sinθn逆变换即可
四元数 R = v v T + s 2 I + 2 s v ∧ + ( v ∧ ) 2 R=vv^T+s^2I+2sv^{\land}+(v^{\land})^2 R=vvT+s2I+2sv+(v)2 θ = 2 arccos ⁡ q 0 \theta=2\arccos{q_0} θ=2arccosq0

[ n x , n y , n z ] T = [ q 1 , q 2 , q 3 ] T / sin ⁡ θ 2 [n_x, n_y, n_z]^T=[q_1, q_2, q_3]^T/\sin{ \theta \over 2 } [nx,ny,nz]T=[q1,q2,q3]T/sin2θ

5.假设有一个大的Eigen矩阵,想把它的左上角3×3的块取出来,然后赋值为 I 3 × 3 \boldsymbol I_{3 × 3} I3×3 ,请编程实现。

答:代码如下

// Eigen 几何模块
#include <Eigen/Dense>
#include <iostream>

#define Matrix_size 50

using namespace std;
using namespace Eigen;

int main ( int argc, char** argv )
{
        MatrixXd matrix_x;

        matrix_x=MatrixXd::Random(Matrix_size,Matrix_size);

        cout<<"matrix_x=\n"<<matrix_x<<endl;
        
        //方法1:直接取左上角的矩阵
        Matrix3d m;
        m=matrix_x.topLeftCorner(3,3);
        cout<<"方法1:\n"<<m<<endl;
        m=Matrix3d::Identity(3,3);
        cout<<"Matrix3d::Identity(3,3)=\n"<<m<<endl;
        //方法2:待定
        matrix_x.block<3,3>(0,0);
        cout<<"matrix_x.block=\n"<<matrix_x.block<3,3>(0,0).Identity()<<endl;
        return 0;
}

6.*一般线性方程 An =b有哪几种做法?你能在 Eigen中实现吗?

答:代码如下

#include <iostream>
#include <Eigen/Core>
#include <Eigen/Dense>

using namespace Eigen;
using namespace std;

#define Matrix_size 10


int main ( int argc, char** argv )
{
        // 动态维度的矩阵
        MatrixXd A=MatrixXd::Random(Matrix_size,Matrix_size);
        MatrixXd b=MatrixXd::Random(Matrix_size,1);
//         cout<<"A=\n"<<A<<endl;
//         cout<<"b=\n"<<b<<endl;
        
        //1:直接求逆
        Matrix<double,Matrix_size,1> x=A.inverse()*b;
        cout<<"直接求逆=\n"<<x.transpose()<<endl<<endl;

        //2:QR分解
        x=A.colPivHouseholderQr().solve(b);
        cout<<"QR分解=\n"<<x.transpose()<<endl<<endl;

        //3:LLT分解
//        x=A.llt().solve(b);//要求矩阵正定
//        cout<<x.transpose()<<endl<<endl;

        //4: LDLT分解法
//        x=A.ldlt().solve(b);//要求矩阵正或负半定
//        cout<<x.transpose()<<endl<<endl;

        //5:
        x=A.fullPivHouseholderQr().solve(b);
        cout<<"fullPivHouseholderQr=\n"<<x.transpose()<<endl<<endl;

        //6:LU分解法
        x=A.householderQr().solve(b);
        cout<<"householderQr=\n"<<x.transpose()<<endl<<endl;

        //7:partialPivLu
        x=A.partialPivLu().solve(b);
        cout<<"partialPivLu=\n"<<x.transpose()<<endl<<endl;


        return 0;
}

参考文献:
[1]. https://www.cnblogs.com/cc111/p/9240545.html
[2]. https://katex.org/docs/supported.html
[3]. https://www.cnblogs.com/cc111/p/9354924.html
[4]. https://zhuanlan.zhihu.com/p/338322663

### 回答1: 《视觉SLAM十四第三章主要介绍了视觉SLAM中的关键技术——特征提取和描述子。本章首先介绍了特征点的概念和特征点的选择原则。特征点即图像中具有鲁棒性和区分度的点,可以通过对其进行检测和描述来进行特征匹配和跟踪。在进行特征提取时,作者介绍了常见的特征检测算法,如Harris角点检测、SIFT和SURF算法等,并对其进行了比较和分析。 接着,本章详细阐述了特征描述子的概念和作用。特征描述子是对特征点周围区域的图像信息进行编码,以实现特征匹配和跟踪。常见的特征描述子包括SIFT、SURF和ORB等。作者从描述子的表示形式、计算方式和匹配方法等方面进行了介绍,并对它们进行了比较和评价。同时,还提到了基于二进制描述子的方法,如BRIEF、BRISK和FREAK等。 在特征匹配方面,本章介绍了特征描述子匹配的基本原理和流程。以基于特征点的视觉SLAM为例,作者详细解释了特征点的匹配过程,包括特征点的选择、特征点描述子匹配和筛选等步骤。并介绍了如何通过验证特征点的三角化和PnP求解来估计相机的位姿。 此外,本章还介绍了一些特定场景下的特征点选择和提取策略,如动态环境下的特征点追踪和关键帧选择等。 综上所述,《视觉SLAM十四第三章主要介绍了特征提取和描述子在视觉SLAM中的重要性和应用。通过对特征点的检测和描述,可以实现特征匹配和跟踪,为后续的相机位姿估计和建图提供基础。该章内容详细且通俗易懂,对于学习和理解视觉SLAM有着重要的指导作用。 ### 回答2: 《视觉SLAM十四-Ch3》主要介绍了视觉SLAM(同时定位与建图)技术的基本原理和实现方法。本章主要涵盖了三维几何表示和变换、相机模型和相机姿态以及特征提取与匹配等内容。 首先,本章介绍了三维几何表示和变换的概念。通过介绍欧氏空间中的点、向量和坐标变换,深入解释了相机在三维空间中的位置和朝向的表示方式。同时,引入了齐次坐标和投影矩阵的概念,为后续的相机模型和姿态估计打下了基础。 其次,本章详细解了相机模型和相机姿态的原理与应用。其中,介绍了针孔相机模型,分析了图像坐标和相机坐标之间的映射关系。通过投影矩阵的推导,给出了透视投影和仿射投影的公式,并解释了相机焦距和主点的含义。此外,还介绍了如何通过计算相机的外参矩阵来估计相机的姿态,以及如何将图像坐标转换为相机坐标。 最后,本章介绍了特征提取与匹配的技术。首先,介绍了角点和边缘点的概念,以及如何利用差分和梯度计算来检测图像中的角点和边缘点。然后,介绍了如何通过特征描述符来表示图像中的特征点,并通过特征匹配算法找到两幅图像之间的对应关系。特征提取与匹配是视觉SLAM中非常重要的步骤,对于后续的相机定位和建图至关重要。 综上所述,《视觉SLAM十四-Ch3》通过系统地介绍了视觉SLAM技术的基本概念和实现方法,包括三维几何表示和变换、相机模型和相机姿态的原理与应用,以及特征提取与匹配的技术。这些内容为读者深入理解和掌握SLAM技术提供了很好的基础。 ### 回答3: 视觉SLAM(Simultaneous Localization and Mapping)是一种通过计算机视觉技术,实现机器智能的同时实时定位和地图构建的方法。在《视觉SLAM十四第三中,主要介绍了视觉SLAM的基本概念和关键技术。 首先,解了视觉SLAM的理论基础,包括自我运动估计和地图构建两个部分。自我运动估计是通过相邻帧之间的视觉信息,计算相机在三维空间中的运动,从而实现机器的实时定位;地图构建是通过对场景中特征点的观测和跟踪,建立起一个三维空间中的地图。这两个过程相互影响,通过不断迭代优化,实现高精度的定位和地图构建。 接着,解了基于特征的视觉SLAM算法。特征提取与描述是建立视觉SLAM系统的关键步骤,通过提取场景中的特征点,并为其生成描述子,来实现特征点的匹配和跟踪。同时,还介绍了一些常用的特征点提取和匹配算法,如FAST、SIFT等。 在SLAM框架方面,本节还介绍了基于视觉的前端和后端优化。前端主要负责实时的特征跟踪和估计相机运动,后端则是通过优化技术,对前端输出的轨迹和地图进行优化求解,从而提高系统的精度和鲁棒性。 最后,本节提到了几个视觉SLAM的应用场景,如自主导航、增强现实等。这些应用对于实时高精度的定位和地图建立都有着很高的要求,因此,视觉SLAM的技术在这些领域有着广泛的应用前景。 总的来说,《视觉SLAM十四第三视觉SLAM的基本概念和关键技术进行了系统的介绍。理论基础、特征提取与描述、SLAM框架和应用场景等方面的内容都给出了详细的解释和案例,有助于读者更好地理解和应用视觉SLAM技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炼丹狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值