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

### SLAM姿与相机外参的关系 在SLAM(Simultaneous Localization and Mapping)系统中,**姿**通常指的是传感器(如摄像头或激光雷达)相对于全局坐标系的置和方向描述。具体来说,它由一个平移向量 \(T\) 和一个旋转矩阵 \(R\) 组成[^1]。 对于单目或多目视觉SLAM而言,**相机外参**是指相机相对于世界坐标系或其他参考帧的姿态参数,也即其置和朝向。因此,在大多数情况下,SLAM中的**姿**确实可以被看作是相机的**外参**的一部分[^2]。这是因为: - **相机外参**定义了相机自身的几何关系,包括它的置(平移分量)和方向(旋转分量),这正好对应于SLAM系统的姿估计。 - 在SLAM算法运行过程中,通过优化方法得到的是每一时刻相机的姿变化轨迹,这些轨迹实际上就是一系列时间戳下的相机外参集合。 然而需要注意的一点区别在于语境上的不同: 当提到“姿”时,更多是从整体运动学角度出发;而提及“相机外参”,则更强调摄像设备本身的属性及其与其他参照物之间的空间联系。 另外值得注意的是,在实际编程实现比如ORB-SLAM3这样的开源项目里,尽管概念上两者一致,但由于程序设计需求可能会存在变量命名差异等问题,但这并不影响它们本质上相同的事实。 ```python import numpy as np def pose_to_extrinsic(R, t): """ 将姿转换为相机外参形式 参数: R (numpy.ndarray): 3x3 的旋转矩阵. t (numpy.ndarray): 平移向量. 返回: extrinsic_matrix (numpy.ndarray): 4x4 外参矩阵. """ # 构建齐次变换矩阵作为外参表示 extrinsic_matrix = np.eye(4) extrinsic_matrix[:3, :3] = R extrinsic_matrix[:3, 3] = t.flatten() return extrinsic_matrix ``` 上述代码展示了如何把从SLAM计算出来的姿数据转化为标准计算机视觉领域使用的相机外参形式——也就是一个\(4 \times 4\)大小的齐次变换矩阵
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值