目录
向量相乘:
旋转矩阵:
运用:在一个坐标系e下的的向量通过乘以e到e'之间的旋转矩阵可以变换成e'下的向量
a=Ra',其中R就是旋转矩阵。图中a和a'分别表示一个任意向量p分别在e和e;坐标系下的向量坐标。
旋转矩阵和他的性质之间是可以互推的关系
这样两个坐标系之间的运动就可以用R和t来完全描述(R是旋转矩阵,t是平移)
简化书写形式(齐次的坐标):
变换矩阵的集合称为特殊欧式群
旋转向量:
现在有两个旋转向量a(1,1,0) b(2,2,0),两个旋转向量表示的就是饶同一个轴旋转不同的角度,因为两个向量指向的是同一个方向,但是两者的模长不一样(因为模长表示的是旋转的角度),所以角度不一样。
罗德里格斯公式描述了旋转向量的(n、)和旋转矩阵之间的关系
欧拉角
slam中不怎么会去用这个,但是有的领域的习惯会去使用这个 ,多用于人机交互
四元数
这里不是很懂:之后有时间看看这个四元数的可视化_哔哩哔哩_bilibili
eigen使用笔记:
----------作业----------
编程实现 A 为 100 × 100 随机矩阵时,用 QR 和 Cholesky 分解求 x 的程序。你可以参考本次课
用到的 useEigen 例程。
#include "iostream"
#include "Eigen/Dense"
#include "Eigen/Core"
using namespace std;
using namespace Eigen;
int main( int argc, char** argv )
{
//Ax=b
Matrix<double,100,100> matrix_A;
Matrix<double,100,1> matrix_x;
Matrix<double,100,1> matrix_x1;
Matrix<double,100,1> matrix_x2;
Matrix<double,100,1> matrix_B;
matrix_A=matrix_A.Random(); //给AB随机赋值
matrix_A=matrix_A*matrix_A.transpose(); //将A转化为一个半正定矩阵,Cholesky分解才可使用
matrix_x=matrix_x.Random(); //
matrix_B= matrix_A * matrix_x;
matrix_x1=matrix_A.colPivHouseholderQr().solve(matrix_B);// 利用QR分解来求解方程Ax=b中的x的值
matrix_x2=matrix_A.llt().solve(matrix_B);
cout<<"ground truth is :\n"<<matrix_x.transpose()<<endl;
cout<<"QR is :\n"<<matrix_x1.transpose()<<endl;
cout<<"LLT is :\n"<<matrix_x2.transpose()<<endl;
return 0;
}
小萝卜:
位姿表示的是世界坐标系变换到相机坐标系下的变换矩阵
其中q1(四元数)表示的是旋转,而t1表示的是平移,具体参照:a'=Ra+t(参照旋转矩阵第四个图),T1表示的是图中齐次形式的变换矩阵。所以使用T1去乘就表示了平移加旋转的两种形式。
#include <iostream>
#include "Eigen/Dense"
using namespace std;
using namespace Eigen;
int main(){
//声明一些数据,q表示四元数,t表示萝卜在这个坐标系下的坐标
//萝卜一号
Quaterniond q1(0.55,0.3,0.2,0.2); //初始化萝卜一号的四元数
Matrix<double,3,1> t1(0.7, 1.1, 0.2);
q1.normalize(); //对四元数一定要进行归一化,一定要归一化
Isometry3d T1(q1);
T1.pretranslate(t1);
//萝卜2号
Quaterniond q2(-0.1, 0.3, -0.7, 0.2); //初始化萝卜2号的四元数
Matrix<double,3,1> t2(-0.1, 0.4, 0.8);
q2.normalize();
Isometry3d T2(q2);
T2.pretranslate(t2);
//萝卜1号看p点
Matrix<double,3,1> p1(0.5, -0.1, 0.2);
Matrix<double,3,1> p2;
//p1=T1*P
//p2=T2*P
//联立上面两个方程的得:
p2=T2*T1.inverse()*p1;
cout<<"P在2中的坐标:\n"<<p2.transpose()<<endl;
return 0;
}
四元数: