1. 基础知识
需要复习现代和矩阵论的知识。
- 特征值,特征向量有啥用?
有了特征值能求特征向量,有了特征向量就能够得到基础解系,就能够解齐次/非齐次方程。
2. 矩阵论基础
关于最小二乘法求解列满秩超定方程组的最小二乘解的推导见这里,讲的很详细,有关于矩阵求偏导的部分:快速求导法:分子布局,向量后置求导,系数不变;向量前置求导,系数前置并转置。
最小二乘法的几何意义:解决了最小二乘法的几何意义的解释。
最小二乘法的矩阵解法:这篇相当综合,综合了最小二乘法,Cholesky分解求线性最小二乘解,QR分解求线性最小二乘解,SVD分解求亏秩最小二乘解,超定齐次方程组的线性最小二乘解法,欠定行满秩方程组的线性最小二乘解法。
3. 计算坐标变换
#include <iostream>
using namespace std;
#include <Eigen/Core>
#include <Eigen/Geometry>
using namespace Eigen;
int main(int argc, char ** argv)
{
Quaterniond q_BL(0.3, 0.5,0, 20.1 ), q_BC(0.8, 0.2, 0.1,0.1);
q_BC.normalize();
q_BL.normalize();
Vector3d t_BL(0.4, 0, 0.5), t_BC(0.5, 0.1, 0.5);
Vector3d p_C(0.3, 0.2, 1.2);
Isometry3d T_BL(q_BL), T_BC(q_BC);
T_BL.pretranslate(t_BL);
T_BC.pretranslate(t_BC);
Vector3d p_L = T_BL.inverse() * T_BC * p_C;
cout << "这个点在激光系下的坐标:" << p_L.transpose() << endl;
Quaterniond q_WR(0.55, 0.3, 0.2,0.2), q_RB(0.99, 0, 0,0.01);
q_WR.normalize();
q_RB.normalize();
Vector3d t_WR(0.1, 0.2, 0.3), t_RB(0.05, 0, 0.5);
Isometry3d T_WR(q_WR), T_RB(q_RB);
T_WR.pretranslate(t_WR);
T_RB.pretranslate(t_RB);
Vector3d p_W = T_WR * T_RB * T_BC * p_C;
cout << "这个点在世界系下的坐标" << p_W.transpose() << endl;
return 0;
}
参考博客和《视觉SLAM十四讲》P64-64 求变换矩阵时平移量也要参与逆的运算,不能直接反向。
4. 代填的坑
1. Eigen的官方讲解还没看
2. 矩阵论里面各种分解不知道有什么用,看这篇好好理解下:
最小二乘法的几何意义 最小二乘法的矩阵解法
3. 使用四元数计算偏移矩阵那里需要再看看书,试试那个运算。
4. 记住旋转矩阵是正交矩阵,det=1即可
5. 罗德里格斯公式的证明那里不是很理解,而且证明正交的运算还有些不理解,
看的这篇博客的
6. 四元数性质的验证
不理解这个 然后,我知道
ε
+
ε
=
ε
×
ε
=
0
\varepsilon^+\varepsilon=\varepsilon\times\varepsilon=0
ε+ε=ε×ε=0,因为他俩平行,但是还是觉得上面的推导有些不对。
|