視覺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;
}