├── 0_书稿概述.pdf ├── 1_SLAM问题的提出与方案.pdf ├── 2.多视图几何基础.pdf ├── code └── chapter 2 │ └── RANSAC.py ├── images └── pipeline_glslam.png └── readme.md /0_书稿概述.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yanyan-li/SLAM-BOOK/b2431525ef9a21ffffa540fe062e5913a8156abf/0_书稿概述.pdf -------------------------------------------------------------------------------- /1_SLAM问题的提出与方案.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yanyan-li/SLAM-BOOK/b2431525ef9a21ffffa540fe062e5913a8156abf/1_SLAM问题的提出与方案.pdf -------------------------------------------------------------------------------- /2.多视图几何基础.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yanyan-li/SLAM-BOOK/b2431525ef9a21ffffa540fe062e5913a8156abf/2.多视图几何基础.pdf -------------------------------------------------------------------------------- /code/chapter 2/RANSAC.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | ## Geometric and Learning Approaches within2SLAM systems 5 | ## based on https://zhuanlan.zhihu.com/p/62238520 6 | 7 | import numpy as np 8 | import matplotlib.pyplot as plt 9 | import random 10 | import math 11 | 12 | # 数据量。 13 | SIZE = 50 14 | # 产生数据。np.linspace 返回一个一维数组,SIZE指定数组长度。 15 | # 数组最小值是0,最大值是10。所有元素间隔相等。 16 | X = np.linspace(0, 10, SIZE) 17 | Y = [] 18 | for i in range(SIZE): 19 | if i <20: 20 | y = 3 * X[i] + 10 21 | else: 22 | y = -3* X[i] -10 23 | Y.append(y) 24 | 25 | fig = plt.figure() 26 | # 画图区域分成1行1列。选择第一块区域。 27 | ax1 = fig.add_subplot(1,1, 1) 28 | # 标题 29 | ax1.set_title("RANSAC") 30 | 31 | 32 | # 让散点图的数据更加随机并且添加一些噪声。 33 | random_x = [] 34 | random_y = [] 35 | # 添加直线随机噪声 36 | for i in range(SIZE): 37 | random_x.append(X[i] + random.uniform(-0.5, 0.5)) 38 | random_y.append(Y[i] + random.uniform(-0.5, 0.5)) 39 | # 添加随机噪声 40 | for i in range(SIZE): 41 | random_x.append(random.uniform(0,10)) 42 | random_y.append(random.uniform(10,40)) 43 | RANDOM_X = np.array(random_x) # 散点图的横轴。 44 | RANDOM_Y = np.array(random_y) # 散点图的纵轴。 45 | 46 | # 画散点图。 47 | ax1.scatter(RANDOM_X, RANDOM_Y) 48 | # 横轴名称。 49 | ax1.set_xlabel("x") 50 | # 纵轴名称。 51 | ax1.set_ylabel("y") 52 | 53 | # 使用RANSAC算法估算模型 54 | # 迭代最大次数,每次得到更好的估计会优化iters的数值 55 | iters = 100000 56 | # 数据和模型之间可接受的差值 57 | sigma = 0.25 58 | # 最好模型的参数估计和内点数目 59 | best_a = 0 60 | best_b = 0 61 | pretotal = 0 62 | # 希望的得到正确模型的概率 63 | P = 0.99 64 | for i in range(iters): 65 | # 随机在数据中选出两个点去求解模型 66 | sample_index = random.sample(range(SIZE * 2),2) 67 | x_1 = RANDOM_X[sample_index[0]] 68 | x_2 = RANDOM_X[sample_index[1]] 69 | y_1 = RANDOM_Y[sample_index[0]] 70 | y_2 = RANDOM_Y[sample_index[1]] 71 | 72 | # y = ax + b 求解出a,b 73 | a = (y_2 - y_1) / (x_2 - x_1) 74 | b = y_1 - a * x_1 75 | 76 | # 算出内点数目 77 | total_inlier = 0 78 | for index in range(SIZE * 2): 79 | y_estimate = a * RANDOM_X[index] + b 80 | if abs(y_estimate - RANDOM_Y[index]) < sigma: 81 | total_inlier = total_inlier + 1 82 | 83 | # 判断当前的模型是否比之前估算的模型好 84 | if total_inlier > pretotal: 85 | #iters = math.log(1 - P) / math.log(1 - pow(total_inlier / (SIZE * 2), 2)) 86 | pretotal = total_inlier 87 | best_a = a 88 | best_b = b 89 | 90 | # 判断是否当前模型已经符合超过一半的点 91 | if total_inlier > SIZE: 92 | break 93 | 94 | # 用我们得到的最佳估计画图 95 | Y = best_a * RANDOM_X + best_b 96 | 97 | # 直线图 98 | ax1.plot(RANDOM_X, Y) 99 | text = "best_a = " + str(best_a) + "\nbest_b = " + str(best_b) 100 | plt.text(5,10, text, 101 | fontdict={'size': 8, 'color': 'r'}) 102 | plt.show() 103 | -------------------------------------------------------------------------------- /images/pipeline_glslam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yanyan-li/SLAM-BOOK/b2431525ef9a21ffffa540fe062e5913a8156abf/images/pipeline_glslam.png -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # SLAM 中的几何与学习方法 2 | 3 | 近年来,深度学习在更高层级的视觉任务中取得瞩目的成绩,如:物体识别,语义分割等。这些课题曾是传统视觉无法或很难解决的任务。深度学习方法的这种能力拓展了我们对视觉任务的想象空间,越来越多的 SLAM 开始在他们的框架中通过融合学习的方法来改进位姿估计的准确程度和环境重建的效果。但是深度学习是一个非常宽广的领域,和 SLAM 相关的课题只是它的一个分支,本书稿将会挑选、聚焦与 SLAM 相关的深度学习任务,希望能通过这本书稿来介绍SLAM 系统中使用的几何和深度学习的方法,帮助读者掌握最新的进展。 4 | 5 | ![pipeline_glslam](images/pipeline_glslam.png) 6 | 7 | ## 更新说明 8 | 9 | | 章节 | 更新内容 | 日期 | 备注 | 10 | | -------------------------------------------------------- | -------- | :------: | ---: | 11 | | | | | | 12 | | [0_书稿概述.pdf](0_书稿概述.pdf) | | 01, July | | 13 | | [1_SLAM问题的提出与方案.pdf](1_SLAM问题的提出与方案.pdf) | | 16, July | | 14 | | [2.多视图几何基础.pdf](2.多视图几何基础.pdf) | | 30, July | | 15 | | | | | | 16 | | | | | | 17 | | | | | | 18 | | | | | | 19 | | | | | | 20 | | | | | | 21 | | | | | | 22 | | | | | | 23 | 24 | 25 | ## 改善书稿质量 26 | 27 | 如果你在阅读材料的过程中发现问题,请在这里提交一个issue,我可以继续修改它。 28 | 29 | 如果你有问题/建议,请给我发邮件:yanyan.li@pku.edu.cn, 主题带有 “GL-SLAM书稿”。 30 | 31 | 32 | 33 | 34 | ## 版权声明 35 | 36 | 本项目遵循 “署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)” 协议。这是一份普通人可以理解的[许可协议](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.zh-Hans)概要 (但不是替代) 。 [免责声明](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh#). 37 | 38 | 您可以自由地: 39 | 40 | - **共享** — 在任何媒介以任何形式复制、发行本作品 41 | - **演绎** — 修改、转换或以本作品为基础进行创作 42 | 43 | 只要你遵守许可协议条款,许可人就无法收回你的这些权利。 惟须遵守下列条件: 44 | 45 | - **署名** — 您必须给出[适当的署名](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh#),提供指向本许可协议的链接,同时[标明是否(对原始作品)作了修改](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh#)。您可以用任何合理的方式来署名,但是不得以任何方式暗示许可人为您或您的使用背书。 46 | - **非商业性使用** — 您不得将本作品用于[商业目的](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh#)。 47 | - **相同方式共享** — 如果您再混合、转换或者基于本作品进行创作,您必须基于[与原先许可协议相同的许可协议](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh#) 分发您贡献的作品。 48 | - **没有附加限制** — 您不得适用法律术语或者 [技术措施](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh#) 从而限制其他人做许可协议允许的事情。 49 | 50 | ## 作者相关论文 51 | 52 | **Bundle adjustment method using sparse BFGS solution**, Remote Sensing Letter 53 | 54 | **Structure-SLAM: Low-Drift Monocular SLAM in Indoor Environments**, Robotics Automation Letter 55 | 56 | **Co-Planar Parametrization for Stereo-SLAM and Visual-Inertial Odometry**, Robotics Automation Letter 57 | 58 | **RGB-D SLAM with Structural Regularities**, ICRA 2021 59 | 60 | **ManhattanSLAM: Robust Planar Tracking and Mapping Leveraging Mixture of Manhattan Frames**, ICRA 2021 61 | 62 | **SRH-Net: Stacked Recurrent Hourglass Network for Stereo Matching**, RA-L 2021 63 | 64 | **E-Graph: E-Graph: Minimal Solution for Rigid Rotation with Extensibility Graphs**, ECCV 2022 65 | 66 | **Tightly-coupled fusion of iGPS measurements in optimization-based visual SLAM**, Optics Express 2023 67 | 68 | **Open-structure: a structural benchmark dataset for slam algorithms**, arXiv 2023 69 | 70 | **ShapeMaker: Self-Supervised Joint Shape Canonicalization, Segmentation, Retrieval and Deformation**, CVPR 2024 71 | 72 | **Geogaussian: Geometry-aware gaussian splatting for scene rendering**, ECCV 2024 73 | --------------------------------------------------------------------------------