slam小单元——位姿矩阵

这个系列是对slam中的一些小概念做理解和简单的测试

位姿矩阵

这个反应的是坐标系和坐标系之间的关系,
作用:

  1. 移动向量
  2. 将一个坐标系下的向量(坐标)表达在另一个坐标系下

如下图所示,在最开始的时候,坐标系xyz和x’y’z’重合。
t1:绕z’轴旋转45°
t2:绕x‘轴旋转90°
t3:沿x’轴运动2,再沿y‘运动1
与之相对应的是:
t4:绕z轴旋转45°
t5:绕x轴旋转90°
t6:沿x轴运动2,再沿y轴运动1
那么:
(1)b2 = t1 * b1
得到的b2矩阵是,坐标系2在坐标系1下的表示,也就是 2 1 T ^1_2T 21T

(2)b3 = t1 * t2 * b1
得到的b3矩阵是,坐标系3在坐标系1下的表示,也就是 3 1 T ^1_3T 31T
注意沿着自身轴的运动,是右乘

(3)b4 = t1 * t2 * t3 * b1
得到的b4矩阵是,坐标系4在坐标系1下的表示,也就是 4 1 T ^1_4T 41T
注意沿着自身轴的运动,是右乘

(4)b5 = t4 * b1
得到的b5矩阵是,坐标系5在坐标系1下的表示,也就是 5 1 T ^1_5T 51T

(5)b6 = t5 * t4 * b1 = t2 * t1 * b1
得到的b6矩阵是,坐标系6在坐标系1下的表示,也就是 6 1 T ^1_6T 61T
注意沿着基坐标系轴的运动,是左乘

(6)b7 = t6 * t5 * t4 * b1 = t3 * t2 * t1 * b1
得到的b7矩阵是,坐标系7在坐标系1下的表示,也就是 7 1 T ^1_7T 71T
注意沿着基坐标系轴的运动,是左乘

总结:
为了寻找两个坐标系之间的关系,需要从基坐标系——1系——出发,沿着自身,或者沿着固定的1系进行运动,得到一个新的2系。此时,可以通过右乘或者左乘的方法,得到 5 1 T ^1_5T 51T.
在这里插入图片描述

测试代码

#include <Eigen/Dense>
#include <iostream>
#include <math.h>
int main(int argc, char** argv)
{
    std::cout << "Hello world"<<std::endl;

    Eigen::Matrix4f b1;
    b1 << 1,0,0,0,
            0,1,0,0,
            0,0,1,0,
            0,0,0,1;
    std::cout << "b1 : " << std::endl<<b1<<std::endl;

    Eigen::Matrix4f t1;
    float theta1 = M_PI/4.0;
    t1 <<   cos(theta1),-sin(theta1),0,0,
            sin(theta1),cos(theta1),0,0,
            0,0,1,0,
            0,0,0,1;
    Eigen::Matrix4f b2;
    b2 = t1 * b1;
    std::cout << "b2 : "<<std::endl<<b2<<std::endl;
    
    Eigen::Matrix4f t2;
    float theta2 = M_PI/2.0;
    t2 <<   1,0,0,0,
            0,cos(theta2),-sin(theta2),0,
            0,sin(theta2),cos(theta2),0,
            0,0,0,1;
    Eigen::Matrix4f b3;
    b3 = t1 * t2 * b1;
    std::cout << "b3 : "<<std::endl<<b3<<std::endl;

    Eigen::Matrix4f t3;
    t3 <<   1,0,0,2,
            0,1,0,1,
            0,0,1,0,
            0,0,0,1;
    Eigen::Matrix4f b4;
    b4 = t1 * t2 * t3 * b1;
    std::cout << "b4 : "<<std::endl<<b4<<std::endl;

    Eigen::Vector4f pb4,pb1;
    pb4 << 1,1,0,1;

    pb1 = b4 * pb4;
    std::cout <<"pb1 : "<<std::endl<<pb1<<std::endl;

/*
    Eigen::Matrix4f t4;
    t4 <<   1,0,0,1.41421,
            0,1,0,1.41421,
            0,0,1,1,
            0,0,0,1;
    b4 = t4 * t1 * t2 * b1;
    std::cout << "b4 : "<<std::endl<<b4<<std::endl;
*/
    
    Eigen::Matrix4f t4=t1,t5=t2,t6=t3;

    Eigen::Matrix4f b5,b6,b7;
    b5 = t4 * b1;
    std::cout << "b5 : "<<std::endl<<b5<<std::endl;

    b6 = t5 * t4 * b1;
    std::cout << "b6 : "<<std::endl<<b6<<std::endl;

    b7 = t6 * t5 * t4 * b1;
    std::cout << "b7 : "<<std::endl<<b7<<std::endl;



    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值