视觉SLAM十四讲第三章学习与疑问与课后题

视觉SLAM十四讲第三章

主要内容有旋转矩阵,旋转向量(轴角),欧拉角,四元数。从原理到实践。四元数没理解的可以看这个

个人疑问:

1.外积表示旋转,但角度为45度和135度时,外积大小和方向都相等,是否有问题?还是说可以表示旋转但允许不同旋转同外积。

2.程序中有如下内容

// 特征值
// 实对称矩阵可以保证对角化成功
Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> eigen_solver (matrix33.transpose()*matrix33 ); 
cout << "Eigen values = \n" << eigen_solver.eigenvalues() << endl;
cout << "Eigen vectors = \n" << eigen_solver.eigenvectors() << endl;

计算得到的特征值和特征向量和手算不一致。

T1

由于旋转矩阵的转置矩阵和其本身相乘为单位矩阵,故旋转矩阵的转置矩阵和其逆矩阵相等,所以旋转矩阵为正交矩阵。之所以旋转矩阵的转置矩阵和其本身相乘为单位矩阵,是因为相乘后对角线上都是e_{n}\times e_{n} 的形式,单位向量方向相同乘积为1,非对角线相乘均为方向垂直的单位向量,得数为0。

T3

答案在这里。我在计算时,在一开始就把虚部展开,所以运算就很复杂,提取完可能为实部构成的因子后,整理就比较简单了。

T4

书上都有,也可以看这里

T5

#include <iostream>
#include <cmath>
using namespace std;

#include <Eigen/Core>
// Eigen 几何模块
#include <Eigen/Geometry>
int main(int argc, char **argv) {
    Eigen::Matrix<float, 10, 10> matrix_test;        //声明一个10*10的float矩阵  
    matrix_test=Eigen::Matrix<float, 10, 10>::Random(); 
    cout << "one:\n" << endl;
    cout << matrix_test << endl;
    for(int i=0;i<3;i++){
	for(int j=0;j<3;j++){
	  if(i==j){matrix_test(i,j)=1;}
	  else    {matrix_test(i,j)=0;}
      }
    }
    cout << "then\n" << endl;
    cout << matrix_test << endl;
    return 0;
}

T7

#include <iostream>
#include <cmath>

// Eigen 部分
#include <Eigen/Core>
// 稠密矩阵的代数运算(逆,特征值等)
#include <Eigen/Dense>
//Eigen 几何模块
#include <Eigen/Geometry>

using namespace std;


int main(int argc, char **argv) {
    Eigen::Quaterniond q1(0.35, 0.2, 0.3, 0.1);
    Eigen::Quaterniond q2(-0.5, 0.4, -0.1, 0.2);
    Eigen::Vector3d t1(0.3, 0.1, 0.1);
    Eigen::Vector3d t2(-0.1, 0.5, 0.3);
    Eigen::Vector3d p1(0.5, 0, 0.2);
    
    Eigen::Quaterniond q1_one = q1.normalized();
    Eigen::Quaterniond q2_one = q2.normalized();
    
    //way1
    
    Eigen::Vector3d v = q1_one.inverse() * (p1 - t1);
    Eigen::Vector3d v2 = q2_one * v + t2;
    cout << "way1 v2 = " << endl << v2 << endl;
  
    //way2  
  
    Eigen::Matrix3d R1 = Eigen::Matrix3d(q1_one);
    Eigen::Matrix3d R2 = Eigen::Matrix3d(q2_one);
    Eigen::Vector3d v_2 = R1.inverse() * (p1 - t1);
    Eigen::Vector3d v_2_2 = R2 * v_2 + t2;
    cout << "way2 v2= " << endl << v_2_2 << endl; 
    return 0;
}

猜你喜欢

转载自blog.csdn.net/unlimitedai/article/details/86257890
今日推荐