视觉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
由于旋转矩阵的转置矩阵和其本身相乘为单位矩阵,故旋转矩阵的转置矩阵和其逆矩阵相等,所以旋转矩阵为正交矩阵。之所以旋转矩阵的转置矩阵和其本身相乘为单位矩阵,是因为相乘后对角线上都是
的形式,单位向量方向相同乘积为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;
}