【课程体验官系列】从零开始一起学习SLAM

本文是一篇关于SLAM(同时定位与建图)的系列学习笔记,涵盖SLAM的重要综述论文、应用场景、所需前置知识,以及如何处理序列图像、四元数与旋转矩阵的转换等核心概念。适合计算机视觉和自动驾驶领域的初学者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Day1:从零开始一起学习SLAM | 为什么要学SLAM?

1、请列举几篇最近几年SLAM领域经典的综述论文。

最典型的的一篇综述为
C. Cadena et al., “Past, Present, and Future of Simultaneous Localization and Mapping: Toward the Robust-Perception Age,” in IEEE Transactions on Robotics, vol. 32, no. 6, pp. 1309-1332, Dec. 2016, doi: 10.1109/TRO.2016.2624754.

从文章摘要中得知这篇论文的写作结构为
(1)调查SLAM现状,新的研究方向,现在的业界标准是什么
(2)回顾SLAM近些年的前沿
(3)定性本篇文章为意见文件与指导意义

基于单目视觉的同时定位与地图构建方法综述(章国峰)
偏向计算机视觉邻域的 SFM,多视图几何

G. Bresson, Z. Alsayed, L. Yu and S. Glaser, “Simultaneous Localization and Mapping: A Survey of Current Trends in Autonomous Driving,” in IEEE Transactions on Intelligent Vehicles, vol. 2, no. 3, pp. 194-220, Sept. 2017, doi: 10.1109/TIV.2017.2749181.
自动驾驶领域的一篇SLAM综述

2、阅读综述,并列举至少三个SLAM的具体应用场景。

  • 外太空星球探索
  • 智能机器人如无人机,室内扫地机器人,餐饮服务类机器人
  • 自动驾驶
  • 虚拟现实增强现实

【学习摘抄】

🎁 学习SLAM需要前期知识铺垫(三维空间刚体变换)、(相机成像模型)、(特征点提取与匹配)、(多视图几何)、(捆集调整bundle adjustment)等
其中bundle adjustment不熟悉,有待进一步学习

🎁 SLAM技术需求公司

  • 互联网公司如百度、腾讯、阿里、京东等,
  • 计算机视觉算法公司如旷世、虹软、商汤等,
  • 自动驾驶创业公司如图森、momenta、景驰、驭势、滴滴及各大汽车厂商等,
  • 无人机/机器人公司如大疆、思岚、高仙等,
  • AR移动终端应用相关公司如三星、华为、悉见等。

Day2:从零开始一起学习SLAM | 学习SLAM到底需要学什么?

我们用到的主流数据集有:

1、SLAM是处理序列图像的,有时候需要格式化的图像名字用作输入。

参考糖糖大大的博客做微小修改:利用python对大量图片进行重命名
用python3生成一个0001,0002,0003~9998,9999组成的txt文件,不足四位的自动加0补足

# -*- coding:utf8 -*-

import os

class BatchRename():
    '''
    批量重命名文件夹中的图片文件

    '''
    def __init__(self):
        self.path = r'/home/warmtree/picture'  #表示需要命名处理的文件夹

    def rename(self):
        #os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。这个列表以字母顺序
        filelist = os.listdir(self.path)
        total_num = len(filelist) #获取文件夹内所有文件个数
        i = 1  #表示文件的命名是从1开始的
        for item in filelist:
            if item.endswith('.jpg'):
            #初始的图片的格式为jpg格式的(或者源文件是png格式及其他格式,后面的转换格式就可以调整为自己需要的即可)
                src = os.path.join(os.path.abspath(self.path), item)
                #dst = os.path.join(os.path.abspath(self.path),str(i) + '.png')
                #处理后的格式也为jpg格式的,当然这里可以改成png格式
                #dst = os.path.join(os.path.abspath(self.path), '0000' + format(str(i), '0>3s') + '.jpg')
                #这种情况下的命名格式为0000000.jpg形式,可以自主定义想要的格式
                dst = os.path.join(os.path.abspath(self.path),'%04d'%i + '.png')
                #生成一个0001,0002,0003~9998,9999
                try:
                    os.rename(src, dst)
                    print ('converting %s to %s ...' % (src, dst))
                    i = i + 1
                except:
                    continue
        print ('total %d to rename & converted %d pngs' % (total_num, i))

if __name__ == '__main__':
    demo = BatchRename()
    demo.rename()

在这里插入图片描述这里有一个问题是我们在批量换名时改变了图片的顺序。

2、已知相机的位姿用四元数表示为q=[0.35,0.2,0.3,0.1],顺序为x,y,z,w,请编程实现:输出四元数对应的旋转矩阵、旋转矩阵的转置,旋转矩阵的逆矩阵,旋转矩阵乘以自身的转置,验证旋转矩阵的正交性。

Python 3.7.3 (default, Mar 27 2019, 22:11:17) 
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from scipy.spatial.transform import Rotation as R
>>> r = R.from_quat([0.35, 0.2, 0.3,0.1])
>>> r.as_matrix() #输出四元数对应的旋转矩阵
array([[ 0.00952381,  0.3047619 ,  0.95238095],
       [ 0.76190476, -0.61904762,  0.19047619],
       [ 0.64761905,  0.72380952, -0.23809524]])
>>> import numpy as np
>>> r_array = np.asarray(r.as_matrix())
>>> r_array
array([[ 0.00952381,  0.3047619 ,  0.95238095],
       [ 0.76190476, -0.61904762,  0.19047619],
       [ 0.64761905,  0.72380952, -0.23809524]])
>>> r_array.T # 旋转矩阵的转置
array([[ 0.00952381,  0.76190476,  0.64761905],
       [ 0.3047619 , -0.61904762,  0.72380952],
       [ 0.95238095,  0.19047619, -0.23809524]])
>>> np.linalg.inv(r_array) #旋转矩阵的逆
array([[ 0.00952381,  0.76190476,  0.64761905],
       [ 0.3047619 , -0.61904762,  0.72380952],
       [ 0.95238095,  0.19047619, -0.23809524]])
>>> r_array@r_array.T # 验证旋转矩阵的正交性
array([[ 1.00000000e+00, -8.93716947e-17,  9.71759836e-17],
       [-8.93716947e-17,  1.00000000e+00, -2.62293336e-17],
       [ 9.71759836e-17, -2.62293336e-17,  1.00000000e+00]])
       
       

四元数相关扩展

i 2 = j 2 = k 2 = i j k = − 1 \mathbf i^{2} = \mathbf j^{2} = \mathbf k^{2} = \mathbf i \mathbf j \mathbf k = -1 i2=j2=k2=ijk=1
四元数来源于复数,对一个复数乘以i,这个复数就在复数平面上旋转了90度。
我们随机地在复数平面上取一个点:

p = 2 + i p = 2 + \mathbf i p=2+i

p乘以i后得到q: q = p i = ( 2 + i ) i = 2 i + i 2 = − 1 + 2 i q = p\mathbf i = (2+\mathbf i)\mathbf i = 2\mathbf i + \mathbf i^{2} = -1 + 2\mathbf i q=pi=(2+i)i=2i+i2=1+2i

q乘以i后得到r: r = q i = ( − 1 + 2 i ) i = − i + 2 i 2 = − 2 − i r = q\mathbf i = (-1 + 2\mathbf i)\mathbf i = -\mathbf i + 2\mathbf i^{2} = -2 -\mathbf i r=qi=(1+2i)i=i+2i2=2i

r乘以i后得到s: s = r i = ( − 2 − i ) i = − 2 i − i 2 = 1 − 2 i s = r\mathbf i = (-2 - \mathbf i)\mathbf i = -2\mathbf i-\mathbf i^{2} = 1 - 2\mathbf i s=ri=(2i)i=2ii2=12i

s乘以i后得到t: t = s i = ( 1 − 2 i ) i = i − 2 i 2 = 2 + i t = s\mathbf i = (1-2\mathbf i)\mathbf i = \mathbf i - 2\mathbf i^{2} = 2 + \mathbf i t=si=(12i)i=i2i2=2+i

【疑惑】 额外增加2个虚数到我们的复数系统,从而把这些概念拓展到3维空间?

四元数来源于复数 a + b i a+bi

学习SLAM(Simultaneous Localization and Mapping)是一个相对复杂的过程,但是你可以按照以下步骤开始学习: 1. 学习基础知识:首先,你需要了解机器人感知、运动控制和地图构建的基本概念。熟悉概率和统计的基本概念也是非常有帮助的,因为SLAM中经常使用到这些方法。 2. 学习传感器:了解常用的传感器,如激光雷达、摄像头和惯性测量单元(IMU),以及它们的工作原理、数据处理方法和误差模型。 3. 学习SLAM算法:掌握常见的SLAM算法,如扩展卡尔曼滤波(EKF)、粒子滤波(PF)和图优化。理解这些算法的原理和实现方式是非常重要的。 4. 编程实践:选择一种编程语言(如C++或Python)并开始实践编写SLAM算法的代码。使用开源库,如ROS(Robot Operating System)或PCL(Point Cloud Library)可以加速你的学习过程。 5. 实验和调试:通过实验和调试来验证你的SLAM算法。使用模拟器或真实的机器人进行实验,分析结果并调整算法参数以优化性能。 6. 阅读论文和参考资料:定期阅读与SLAM相关的最新研究论文和参考资料,了解最新的算法和技术发展。 7. 实际项目:最终,尝试应用你所学的知识到实际项目中。参与开源项目或者参加机器人比赛等活动,将帮助你更深入地理解和实践SLAM技术。 需要注意的是,SLAM是一个广泛而复杂的领域,需要持续学习和实践才能真正掌握。所以,耐心和持之以恒的学习态度是非常重要的。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肥鼠路易

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值