《视觉SLAM十四讲》课后习题—ch3

1.证明旋转矩阵是正交矩阵

  证明:旋转矩阵R=[e1,e2,e3]T[e'1,e'2,e'3]

     其中[e1,e2,e3]T是单位正交基,[e'1,e'2,e'3]是由[e1,e2,e3]旋转得到的.

     =>RRT=[e1,e2,e3]T[e'1,e'2,e'3][e'1,e'2,e'3]T[e1,e2,e3]=I(单位矩阵)

     =>R-1=RT=>旋转矩阵是正交矩阵


 

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

  根据公式p'=qpq-1,列出经四元数旋转后的p',找出实部计算得0。


 

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

在网上看到的,整理的很好:https://blog.csdn.net/xuehuafeiwu123/article/details/74942989

代码实现见:旋转矩阵、旋转向量(轴角)、四元数、欧拉角之间相互转换的代码实现(利用Eigen实现)


 

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

 1 // Eigen 几何模块
 2 #include <Eigen/Dense>
 3 
 4 #define Matrix_size 50
 5 
 6 int main ( int argc, char** argv )
 7 {
 8         Eigen::MatrixXd matrix_x;
 9         
10         matrix_x=Eigen::MatrixXd::Random(Matrix_size,Matrix_size);
11         
12         //取出左上角3x3的块
13         //方法1
14         Eigen::Matrix3d m;
15         m=matrix_x.topLeftCorner(3,3);
16         cout<<m<<endl<endl;
17         m=Eigen::Matrix3d::Identity(3,3);
18 /       cout<<m<<endl;
19         //方法2:
20         matrix_x.block<3,3>(0,0);
21         cout<<matrix_x.block<3,3>(0,0).Identity()<<endl;
22         return 0;
23 }

 


 

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

 1 #include <iostream>
 2 using namespace std;
 3 
 4 #include <Eigen/Core>
 5 // Eigen 几何模块
 6 #include <Eigen/Dense>
 7 
 8 #define Matrix_size 10
 9 
10 int main ( int argc, char** argv )
11 {
12         Eigen::MatrixXd A=Eigen::MatrixXd::Random(Matrix_size,Matrix_size);
13         Eigen::MatrixXd b=Eigen::MatrixXd::Random(Matrix_size,1);
14         
15         //1:直接求逆
16         Eigen::Matrix<double,Matrix_size,1> x=A.inverse()*b;
17         cout<<x.transpose()<<endl<<endl;
18                 
19         //2:QR分解
20         x=A.colPivHouseholderQr().solve(b);
21         cout<<x.transpose()<<endl<<endl;
22         
23         //3:LLT分解
24 //        x=A.llt().solve(b);//要求矩阵正定
25 //        cout<<x.transpose()<<endl<<endl;
26         
27         //4: LDLT分解法
28 //        x=A.ldlt().solve(b);//要求矩阵正或负半定
29 //        cout<<x.transpose()<<endl<<endl;
30         
31         //5:
32         x=A.fullPivHouseholderQr().solve(b);
33         cout<<x.transpose()<<endl<<endl;
34         
35         //6:
36         x=A.householderQr().solve(b);
37         cout<<x.transpose()<<endl<<endl;
38         
39         //7:LU分解法
40         x=A.householderQr().solve(b);
41         cout<<x.transpose()<<endl<<endl;
42         
43         //8:
44         x=A.partialPivLu().solve(b);
45         cout<<x.transpose()<<endl<<endl;
46         
47         
48         return 0;
49 }


 7.

  主要是公式pc=Tcwpw的应用

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

#include <Eigen/Core>
// Eigen 几何模块
#include <Eigen/Geometry>


int main ( int argc, char** argv )
{
      Eigen::Quaterniond q1(0.2,0.3,0.1,0.35);

       Eigen::Isometry3d T=Eigen::Isometry3d::Identity();
       T.rotate(q1);
       T.pretranslate(Eigen::Vector3d(0.3,0.1,0.1));
//       cout<<"T=\n"<<T.matrix()<<endl;
       Eigen::AngleAxisd v=Eigen::AngleAxisd(q1);
       Eigen::Matrix3d m=v.matrix();
       cout<<"m=\n"<<m<<endl;
      Eigen::Vector3d p_c(0.5,0,0.2);
       Eigen::Vector3d p_w=T.inverse()*p_c;
      cout<<p_w<<endl;
       Eigen::Quaterniond q2(0.4,-0.1,0.2,-0.5);
       Eigen::Isometry3d T2=Eigen::Isometry3d::Identity();
      T2.rotate(q2);
       T2.pretranslate(Eigen::Vector3d(-0.1,0.5,0.3));
       cout<<"T2=\n"<<T2.matrix()<<endl;
       Eigen::Vector3d p=T2*p_w;
      cout .precision(2);
      cout<<"p=\n"<<p<<endl;
        return 0;
}

  

  

 

posted @ 2018-06-28 20:33  Iridescent18  阅读(823)  评论(0编辑  收藏  举报