Simon Shi的小站

人工智能,机器学习, 强化学习,大模型,自动驾驶

0%

第九 实践章 设计前端

目标:

  • 设计一个视觉里程计的前端

  • 理解SLAM软件框架是如何搭建

  • 理解在前端设计中容易出现问题的地方,以及修补方式。

1、搭建VO框架

单目视觉相对复杂,RGBD最简单,没有初始化,也没有尺度问题

1
2
3
4
5
6
7
8
-bin    可执行文件
-include/myslam    头文件.h
-src    源代码cpp
-test  测试用文件cpp
-lib
-config
-cmake_modules 三方库的cmake文件
-CmakeList.txt

1.1、数据结构:

路标

配置文件

坐标转换

1
2
3
4
5
6
stateDiagram

Frame --> Camera
Frame --> MapPoint : has many
Map --> MapPoint: has many
Config

1.2、Camera类

  • 存储相机内参和外参

  • 相机坐标系,像素坐标系,世界坐标系的转换

  • 世界坐标系(需要一个相机的内参)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include "myslam/common_include.h"

namespace myslam
{

// Pinhole RGBD camera model
class Camera
{
public:
typedef std::shared_ptr<Camera> Ptr;
float fx_, fy_, cx_, cy_, depth_scale_; // Camera intrinsics

Camera();
Camera ( float fx, float fy, float cx, float cy, float depth_scale=0 ) :
fx_ ( fx ), fy_ ( fy ), cx_ ( cx ), cy_ ( cy ), depth_scale_ ( depth_scale )
{}

// coordinate transform: world, camera, pixel
Vector3d world2camera( const Vector3d& p_w, const SE3& T_c_w );
Vector3d camera2world( const Vector3d& p_c, const SE3& T_c_w );
Vector2d camera2pixel( const Vector3d& p_c );
Vector3d pixel2camera( const Vector2d& p_p, double depth=1 );
Vector3d pixel2world ( const Vector2d& p_p, const SE3& T_c_w, double depth=1 );
Vector2d world2pixel ( const Vector3d& p_w, const SE3& T_c_w );

};

}
#endif // CAMERA_H
  • 智能指针,Camera指针类型,传递参数时候,只需用Camera::Ptr类型即可

  • SE3表达相机的位姿

camera.cpp

  • 相关的原理与第五章讲解的内容一致,坐标转换。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "myslam/camera.h"

namespace myslam
{

Camera::Camera()
{
}

Vector3d Camera::world2camera ( const Vector3d& p_w, const SE3& T_c_w )
{
return T_c_w*p_w;
}

Vector3d Camera::camera2world ( const Vector3d& p_c, const SE3& T_c_w )
{
return T_c_w.inverse() *p_c;
}

Vector2d Camera::camera2pixel ( const Vector3d& p_c )
{
return Vector2d (
fx_ * p_c ( 0,0 ) / p_c ( 2,0 ) + cx_,
fy_ * p_c ( 1,0 ) / p_c ( 2,0 ) + cy_
);
}

Vector3d Camera::pixel2camera ( const Vector2d& p_p, double depth )
{
return Vector3d (
( p_p ( 0,0 )-cx_ ) *depth/fx_,
( p_p ( 1,0 )-cy_ ) *depth/fy_,
depth
);
}

Vector2d Camera::world2pixel ( const Vector3d& p_w, const SE3& T_c_w )
{
return camera2pixel ( world2camera ( p_w, T_c_w ) );
}

Vector3d Camera::pixel2world ( const Vector2d& p_p, const SE3& T_c_w, double depth )
{
return camera2world ( pixel2camera ( p_p, depth ), T_c_w );
}


}

1.3、Frame类

1.4 MapPoint类

1.5 Map类

1.6 Config类

2、基本VO操作,特征提取,匹配

3、改进:优化PNP的结果

4、改进:局部地图

5、小结

目标:

  1. 实际设计一个视觉里程计前端。
  2. 理解 SLAM 软件框架是如何搭建的。
  3. 理解在前端设计中容易出现的问题,以及修补的方式。

你会管理局部的机器人轨迹与路标点,并体验一下一个软件框架是如何组成的。

可能的问题:

  • 相机运动过快、图像模糊、误匹配……都会使算法失效。

1、template的作用

    模板函数:

  • 不是一个确定的函数,编译器不会为其生成可执行代码。

  • 定义模板函数,只是一个对函数功能框架的描述

  • 具体执行时候,将根据传递的实际参数,决定其功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template<class T>
void Swap(T &x, T &y)
{
T tmp = x;
x = y;
y = tmp;
}
int main()
{
int a = 2, b = 9;
Swap(a,b);    //编译器自动生成 void Swap (int &, int &)函数
double c = 2.9, d = 3.2;
Swap(c, d);
    char *a = "abc",*b = "def"; //编译器自动生成 void Swap (char &, char &)函数
Swap(a,b);
cout<<"a="<<a<<" "<<"b="<<b<<endl;
return 0;
}

C++模板函数_咸鱼不贤的博客-CSDN博客_c++ 模板函数

2、STL的作用

  •  STL 标准模板库

  • STL,英文全称 standard template library,中文可译为标准模板库或者泛型库,其包含有大量的模板类和模板函数,是 C++ 提供的一个基础模板的集合,用于完成诸如输入/输出、数学计算等功能。

  • 从根本上说,STL 是一些容器、算法和其他一些组件的集合,所有容器和算法都是总结了几十年来算法和数据结构的研究成果,汇集了许多计算机专家学者经验的基础上实现的,因此可以说,STL 基本上达到了各种存储方法和相关算法的高度优化。

  • STL 可以更加方便灵活地处理数据。

表 2 C++ STL头文件

寄语

  • 少刷视频,多读书

  • 读书,多思考

  • 提升英语水平,多邻国/雅思/托福

    • 多读英文原著
  • 深入的学习一门技术

    • unix网络编程c++等

  • ML

    • 《机器学习》

    • 《统计学习方法》

    • 《图解机器学习-日》

    • 《模式识别与机器学习》

  • RL

    • 《Reinforcement Learning: An Introduction》【PDF】

    • 《多视图几何–机械工业》【实体书】

  • SLAM:

    • 《视觉SLAM十四讲》【实体书/PDF】

    • 基础知识

      • Pnp求解

      • EKF

      • ROS

    • 源码阅读ORB_SLAM2

    • 硬件搭建

    • 《宾夕法尼亚大学-SLAM》

  • 算法研究

    • 图论算法(最短路径)

    • 动态规划

    • 最优化理论:退火算法


Soft Power

  • 英语

    • 阅读

    • 单词

    • 口语

  • Etc


Academic Education/Examination


Annual Plan

Q1计划

  • 技术:

    • SLAM配套视频,代码

    • ORB_SLAM2源码阅读

  • 英语:《RL English edtion》

  • 软考:

    • PPT知识阅读理解

    • [ ]

Q2计划

  • SLAM
  • 软考-高项

4月

  • SLAM

5月

  • SLAM

6月

  • SLAM

Q3计划

  • 学历
  • SLAM

Q4计划

  • SLAM

读书

2023交大安泰寒假书单 | 6本书籍点燃你的寒冬(上)

漫长的20世纪 作者: 乔万尼·阿里吉。资本主义自诞生以来的历史发展规律。
    这部堪称经典的著作,将我们的视野拉长,让我们看到资本主义自诞生以来的历史发展规律。我们能看到产业资本和金融资本的交替扩张循环,也能看到政府与市场不断发现新的协作关系,还能看到每一轮大国崛起的内在动力。了解历史,有助于我们更好地预判未来的大趋势。

《数字唬人》 作者: 迈克尔·布拉斯兰 /安德鲁·迪诺

    在本书中,牛津大学首席经济学者与知名记者联手出击,通过日常生活中妙趣横生的故事和数字常识,拆穿统计学常用的唬人伎俩,利用普通人所具备的常识、经验与能力,揭开数字代表的高超谎言,还原事件的真相,使读者在轻松愉快的阅读中直捣数字核心与背后的意义,练就一生受用的数字透视力。

《女士品茶》 作者:戴维·萨尔斯伯格。在20世纪波澜壮阔的科学发展史中,一瞥统计学的缘起和大放异彩,读起来颇有趣味。

《Think Again: The Power of Knowing What You Don’t Know》 作者:Adam Grant(沃顿商学院教授)(反思)

这是一本可以教会我们如何拥抱怀疑、拥抱未知和拥抱自己的错误的书籍。在现实生活中人们往往囿于自己的思维定式和偏见,不愿意反思也不会反思。然而,真正的智者并不拘泥于一种思考模式,而是会愿意不断地重新思考他们的立场。这本书教会我们,作为一种心态和技能,反思的能力是可以被教授和习得的。在这个不断变化的社会,学会反思可能是帮助你获得优势的秘密武器。

《The new geography of jobs》 作者:Enrico Moretti

Our global economy is becoming increasingly local, and where we live and work is more important than ever. This is true even after the pandemic. This book explains why people agglomerate and how the agglomeration effect has reshaped the economic geography of the US, especially as the economy has undergone globalization and the structural change from manufacturing to services, making local spillovers even more critical for economic success.

Globalization will continue to be important. China will undergo structural change, too, as other countries have experienced as they develop. This book provides a great insight into the importance of geography in considering the country’s economy and development in the future.

《东方学》 作者:爱德华·W·萨义德

一本哲学著作,指出西方对于东方的凝视,与其说是传统与现代的对望,毋宁说更是一种权力关系。

今天,所有陷于“东方主义”泥沼中的传统文明应勇敢而全面地对自己和他者进行双重反思。

《向心城市》 作者:陆铭 城市化

一、ORB_SLAM2的特点

1、ORB_SLAM2是首个支持单目、双目和RGB-D相机的完整开源SLAM方案,能够实现地图重用,回环检测和重新定位的功能。

2、能够在GPU上进行实时工作,比如手机、无人机、汽车。

3、特征点法的巅峰之作,定位精度非常高。

4、能够实时计算处相机的位姿,并生成场景的稀疏三维重建地图。

二、算法流程框架

ORB-SLAM整体流程如下图所示

它主要有三个线程组成:跟踪、Local Mapping(又称小图)、Loop Closing(又称大图)

a、跟踪(Tracking)

    这一部分主要工作是从图像中提取ORB特征,根据上一帧进行姿态估计,或者进行通过全局重定位初始化位姿,然后跟踪已经重建的局部地图,优化位姿,再根据一些规则确定新的关键帧。

跟踪线程相当于一个视觉里程计,流程如下:

  • 首先,对原始图像提取ORB特征并计算描述子。

  • 根据特征描述,在图像间进行特征匹配。

  • 根据匹配特征点估计相机运动。

  • 根据关键帧判别准则,判断当前帧是否为关键帧。

b、建图(LocalMapping)

    这一部分主要完成局部地图构建。包括对关键帧的插入,验证最近生成的地图点并进行筛选,然后生成新的地图点,使用局部捆集调整(Local BA),最后再对插入的关键帧进行筛选,去除多余的关键帧。

c、闭环检测(LoopClosing)

  这一部分主要分为两个过程,分别是闭环探测和闭环校正。闭环检测先使用WOB进行探测,然后通过Sim3算法计算相似变换。闭环校正,主要是闭环融合和Essential Graph的图优化

三、安装教程

代码

1
git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2

编译

1
2
3
cd ORB_SLAM2
chmod +x build.sh
./build.sh

四、TUM数据集

SLAM数据集TUM,KITTI,EuRoC数据集的下载地址与真实轨迹文件的查找_m0_60355964的博客-CSDN博客_euroc数据集下载

【TUM数据集 】Computer Vision Group - Dataset Download

五、Demo RUN

1、单目例子

1
2
./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt 
Examples/Monocular/TUM1.yaml ../TUM_datasets/rgbd_dataset_freiburg1_desk/

Example Video

2、自制单目-数据集mp4

3、

相关博客

vslam流程框架介绍_chengwei_peng的博客-CSDN博客_vslam是什么意思

【知乎】VSLAM小科普

orbslam2 安装与运行_Darren_pty的博客-CSDN博客_orbslam2安装运行

ORB_SLAM2 源码解析 ORB_SLAM2简介(一)_小负不负的博客-CSDN博客_orb-slam2

【一文足以系列】ORB SLAM2完整详细算法流程_铃灵狗的博客-CSDN博客_orbslam2

ORB-SLAM2笔记 ·魔法少女郭德纲 语雀(B站视频讲解)

他人镜:

文科生:

实践代码:

Math

目标:

  • 理解光流法跟踪特征点的原理

  • 理解直接法是如何估计相机位姿的

  • 使用g2o进行直接法的计算。

1、直接法引出

特征点法的缺点:

缺点 解决思路
关键点的提取与描述子的计算非常耗时。 1、保留特征点,只计算关键点,不计算描述子,使用光流跟踪特征点运动(仍使用特征点,匹配描述子换成光流跟踪,估计相机运动仍使用对极几何,Pnp或ICP算法)
关注与特征点,忽略了特征点之外的所有信息。 法2、只计算关键点,不计算描述子,使用直接法,计算特征点在下一时刻图像的位置。
特征缺失(白墙,空荡荡的走廊) 法3、既不计算关键点,也不计算描述子,根据像素灰度差异,直接计算相机运动。

法1还是特征点法;法2,法3,则是直接法;

特征点法 直接法
优化相机运动 特征点在相机中的投影,最小化投影误差 在直接法中,我们并不需要知道点与点之间之间的对应关系,而是
通过最小化光度误差(Photometric error)来求得它们
最小化光度误差
SVO,LSD_SLAM
重构稀疏特征点(稀疏地图) 直接法分为稀疏、稠密和
半稠密三种。
直接法根据

像素的亮度信息,估计相机的运动

区别:

  • 需要配对点,通过其它法得到

  • 不需要配对点,直接得到关系

不提特征计算VO的思路:

  • 通过其它方式寻找配对点–光流

  • 无配对点–直接法

Read more »

1、使用ceres编译报错 error: ‘integer_sequence’ is not a member of ‘std‘

修改cmake 将设置c++标准的

1
set(CMAKE_CXX_FLAGS "-std=c++11")

替换为

1
set(CMAKE_CXX_STANDARD 11)

可以解决