视觉slam14讲与C++、cmake笔记(二)

CH6

CH6-C++

if-break(for情况下)

break是直接跳出最近的循环,执行循环外的语句。

return是直接结束程序

continue是跳出本次循环,进行下一次循环。

ceres库

根据不同的求导方式(自动求导、手动求导以及解析求导),对应不同种类的模板,构建不同的仿函数,再构造求解器对所构造的代价函数(在仿函数中)进行求解:

ceres solver之三种求导方式_ceres数值求导_复古蓝的博客-CSDN博客

CH6-cmake

LIST

在编译G2O过程中,指通过find_package去寻找似乎并不能奏效,需要通过调用LIST命令设置路径

list(APPEND <list><element> [<element> ...])表示将新的元素添加到LIST中,与调用OpenCV时的set有点类似

在调用G2O时,需要通过LIST指定路径:

LIST(APPEND CMAKE_MODULE_PATH /home/jetson/slambook2/3rdparty/g2o/cmake_modules)

cmake命令之list_cmakelist_物随心转的博客-CSDN博客

CH7

CH7-C++

值传递和引用传递&

在函数定义中,存在值传递调用和引用传递调用两种方式,引用传递调用是指用&对变量名称进行定义:

C++引用(&)详解_c++ &_彡笙的博客-CSDN博客

什么是值传递,什么是引用传递?_lc的空间站的博客-CSDN博客

类的继承和派生

C++(11)——继承和派生_c++11 struct 继承_青布衫白少年的博客-CSDN博客

在程序中,使用了派生类Ptr,对智能指针std::Ptr进行派生。

inline

inline是C++关键字,在函数声明或定义中,函数返回类型前加上关键字inline,即可以把函数指定为内联函数。这样可以解决一些频繁调用的函数大量消耗栈空间(栈内存)的问题。关键字inline必须与函数定义放在一起才能使函数成为内联函数,仅仅将inline放在函数声明前面不起任何作用。inline是一种“用于实现”的关键字,而不是一种“用于声明”的关键字。一般情况下当某个函数被用于循环中,可以通过将inline与函数定义放在一起来提升内部运行效率。

C++ inline用法详解_&Mr.Gong的博客-CSDN博客

奇异值分解SVD

奇异值分解(SVD)原理总结_小白学视觉的博客-CSDN博客

在使用SVD分解求解最小二乘问题Ax=0时,求得的解应该是x为A^{T}A的最小特征值对应的单位特征向量

此时,\left \| Ax \right \|=\left \| Dy \right \|=\sigma _{n}

void函数构建和别的函数构建

void函数一般是没有返回值的。如果想要构建有返回值的函数,需要按照返回值的类型来定义函数的类型,例如:

int test1() {
  int a = 1;
  return a;
}

CH7-cmake

add_definitions

为当前以下层路径的所有源文件和target增加编译定义

在本章中主要指为orb_self增加SSE指令集的支持,参考官网解释:

add_definitions — CMake 3.2.3 Documentation

CMAKE语法:add_definitions、add_compile_options_cmake add_compile_options_持续学习,不断沉淀的博客-CSDN博客

${PROJECT_SOURCE_DIR}

PROJECT_SOURCE_DIR是CMake内置变量之一,它代表当前项目根目录的路径。当使用project命令指定项目名称时,CMake会自动设置PROJECT_SOURCE_DIR的默认值为项目根目录的路径(CMakeLists.txt所在的路径)

CH8

CH8-C++

inline

内联函数,本身时可以提升函数的运行效率的。再C++调用编译的过程中,可以在含有内联函数的地方展开,减少了函数调栈压缩栈等时间,极大的提升了运行效率。在函数有很多行的时候,调栈的时间可以忽略不计。但是当函数只有一两行时,调栈的时间占比就会增多。通过使用内联函数来提升程序的运行效率。

内联函数(inline)详解_Massachusetts_11的博客-CSDN博客

public、protected、private

对于基类内部元素来说,public元素可以被类内外访问。protected元素只能被基类和派生类所访问。而private元素只能被基类所访问。

1) 公有继承(public)

公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。

(2)私有继承(private)

私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。

(3)保护继承(protected)

保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。

继承 public protect private_继承public pro pri_one_soft_stone的博客-CSDN博客

std::bind函数

std::bind_小飞侠hello的博客-CSDN博客

锁进程问题

参考第八章光流法和直接法中的注释

CH8-cmake

暂无

CH9

CH9-C++

.h头文件中关于""和<>的区别

C++中include头文件使用""与<>的区别_一般情况下,自定义的头文件能否用<>_图形跟班的博客-CSDN博客

类内构造函数,与类名称相同

C++构造函数的各种用法全面解析(C++初学面向对象编程)_c++ 构造函数_Chung丶无际鹰的博客-CSDN博客

C++虚函数详解-CSDN博客

CH9-cmake

暂无

CH13

CH13-C++

#pragma once 与 #ifndef-CSDN博客

 

CH13-cmake

附录

g2o线性求解器类型:

G2O:线性求解器_linearsolverdense_繁星水水的博客-CSDN博客

g2o边问题

g2o的边并不是无向的,一定是由pose指向landmark,如果设置反了会导致优化、内存溢出等一系列的问题产生。typedef g2o::BlockSolver<g2o::BlockSolverTraits<PoseDim, LandMarkDim>> BlockSolverType;

 SVD分解三角测量

SLAM--三角测量SVD分解法、最小二乘法及R t矩阵的判断_slam 三角化 svd-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值