视觉SLAM十四讲第3讲习题解答

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

解法一:


解法二:
在这里插入图片描述

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

简单易懂的罗德里格斯公式推导

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

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

  • 旋转矩阵:参数冗余,没有奇异性,自身存在约束(正交矩阵),不直观
  • 旋转向量:又称轴角。紧凑,存在奇异性,不存在自身约束,不直观
    旋转矩阵与旋转向量之间转换:罗德里格斯公式
  • 欧拉角:直观,紧凑,存在奇异性(万向锁)
  • 四元数:既紧凑,又没有奇异性,不直观,运算稍复杂
    四元数与旋转矩阵之间转换见书中公式推导

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

#include <iostream>

using namespace std;

#include <Eigen/Core>

using namespace Eigen;

#define MATRIX_SIZE 5

int main(){   
     MatrixXf M=Matrix<float,MATRIX_SIZE,MATRIX_SIZE>::Random();
     Matrix3f I;

     cout<<"The large matrix:"<<endl<<M<<endl;

     for(int i=0;i<3;i++){
          for(int j=0;j<3;j++){
               I(i,j)=M(i,j);
          }
     }
     
     cout<<"----------------I-----------------"<<endl<<I<<endl;
}

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

一般线性方程Ax=b的求解可以采用以下几种方法:

  1. 直接求逆求解方程。
  2. 直接法:包括高斯消元法、LU分解、Cholesky分解等。这些方法通过消元或分解矩阵A,将线性方程组转化为更简单的形式,从而求解出未知变量x。可以使用高斯消元法进行直接求解。
  3. D迭代法:包括雅可比迭代法、高斯-赛德尔迭代法、共轭梯度法等。这些方法通过迭代计算,逐步逼近线性方程的解。可以使用共轭梯度法进行迭代求解。

几种求解方法的代码如下

#include <iostream>

using namespace std;

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

using namespace Eigen;

int main(){
    Matrix3f A;
    Vector3f x,b;

    A << 2,5,2,
        1,7,9,
        5,4,0;

    b << 3,4,5;

    // 直接求逆
    x=A.inverse()*b;
    cout<<"直接求逆:"<<endl<<x<<endl;

    // 直接法QR分解
    x=A.colPivHouseholderQr().solve(b);
    cout<<"QR分解:"<<endl<<x<<endl;

    // 直接法LU分解
    x=A.lu().solve(b);
    cout<<"LU分解:"<<endl<<x<<endl;

    // 迭代法(共轭梯度)
    int maxIterations = 100;    //最大迭代次数
    float tolerance = 1e-4;     //容差值

    ConjugateGradient<Matrix3f> cg;     //共轭梯度求解器
    cg.setMaxIterations(maxIterations);
    cg.setTolerance(tolerance);
    cg.compute(A);
    x = cg.solve(b);
    cout<<"共轭梯度迭代法:"<<endl<<x<<endl;
    // cout << "iterations:      " << cg.iterations() << endl;
    // cout << "estimated error: " << cg.error() << endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值