视觉slam十四讲 学习笔记-2

目录

向量相乘:

旋转矩阵:

旋转向量:

欧拉角

四元数

eigen使用笔记:

----------作业----------


向量相乘:

旋转矩阵:

运用:在一个坐标系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、\Theta)和旋转矩阵之间的关系

欧拉角

slam中不怎么会去用这个,但是有的领域的习惯会去使用这个 ,多用于人机交互

四元数

 这里不是很懂:之后有时间看看这个四元数的可视化_哔哩哔哩_bilibili

eigen使用笔记:

Search Results

Eigen学习与使用笔记1

----------作业----------

编程实现 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;
}

四元数:

四元数学习笔记_echo_gou的博客-CSDN博客

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值