windows C++ VISUAL STUDIO开启slam

目录

安装问题

报错

slam视觉

salm工程的大致过程:

位姿

- 相机的位姿:

- PnP问题

后端优化:

- 滤波与非线性优化

- 图优化


  • 安装问题

  • cmake-gui安装 Pangolin + 依赖库:https://blog.csdn.net/weixin_45675146/article/details/120884870
  • visual studio下载和配置opencv和Eigen库:https://www.cnblogs.com/hyujia1015/p/13379396.html; https://blog.csdn.net/weixin_52520877/article/details/122471945; https://blog.csdn.net/weixin_54583016/article/details/121424060
  • Visual Studio – 借助远程Linux服务器: https://blog.csdn.net/HW140701/article/details/123479767
  • vcpkg安装:https://zhuanlan.zhihu.com/p/153199835; https://zhuanlan.zhihu.com/p/87391067; https://zhuanlan.zhihu.com/p/342824602; https://blog.csdn.net/moringacui/article/details/116936020
        vcpkg install XX:x64-windows
        vcpkg integrate install
        vcpkg integrate remove
        与CMake一起使用时,需添加依赖以及在设置路径"-DCMAKE_TOOLCHAIN_FILE=D:/应用程序/vcpkg-master/scripts/buildsystems/vcpkg.cmake"
  • 报错

  • #头文件报错问题:

https://blog.csdn.net/qq_33266987/article/details/51878975

统文件在最前面,然后是第三方库文件,最后是自己的头文件

  • #include\10.0.19041.0\um\GL\gl.h(1157,11): error C2144: 语法错误:“void”的前面应有“;”......后面一堆。

解决方法:在源文件中加上“ #include ”。

  • image.h(209,55): warning C4003: 类函数宏的调用“max”参数不足

opencv编程解决warning C4003: “max”宏的实参不足 - lala8 - 博客园 (cnblogs.com)

  • C2589 “(”:“::”右边的非法标记(59条消息) error C2589: “(”: “::”右边的非法标记;error C2059: 语法错误 : “::”_西电之梦的博客-CSDN博客https://blog.csdn.net/xidianzhimeng/article/details/21181279
  • #vcpkg安装问题,报错(如下):

1、-- Downloading https://github.com/boostorg/bind/archive/boost-1.79.0.tar.gz -> boostorg-bind-boost-1.79.0.tar.gz...
[DEBUG] To include the environment variables in debug output, pass --debug-env
[DEBUG] Feature flag 'binarycaching' unset
[DEBUG] Downloading https://github.com/boostorg/bind/archive/boost-1.79.0.tar.gz
[DEBUG] Download failed -- retrying after 1000 ms.
Error: Failed to download from mirror set:
https://github.com/boostorg/bind/archive/boost-1.79.0.tar.gz: WinHttpSendRequest() failed: 12030

[DEBUG] D:\a\_work\1\s\src\vcpkg\base\downloads.cpp(788):
[DEBUG] Exiting after 47.67 s (47663496 us)

CMake Error at scripts/cmake/vcpkg_download_distfile.cmake:24 (message):

      Failed to download file with error: 1
      If you use a proxy, please check your proxy setting. Possible causes are:

      1. You are actually using an HTTP proxy, but setting HTTPS_PROXY variable
         to `https://address:port`. 

      2. You are using Fiddler. 

      3. Your proxy's remote server is out of service.
error: building boost-bind:x64-windows failed with: BUILD_FAILED

解决:一般都是由于网的问题,可以选择科学上网,或者换个wifi什么的,要是下载链接能直接打开的话,就选择下载到本地,再改成指定名字名放到vcpkg-master\downloads路径下。METIS安装包这里下载:https://github.com/agiorla/METIS

2、Error: database corrupted.  Package boost-container-hash:x64-windows is installed but dependency boost-detail:x64-windows is not.

解决:是由于各项依赖先后安装顺序问题。

因此可以 1.先删除container-hash相关安装文件 2.运行命令 vcpkg remove  boost-container-hash:x64-windows --recurse option 3.运行命令 vcpkg install boost-detail:x64-windows 4. 再从垃圾站把container-hash相关安装文件还原回来 

3、boost的依赖包实在太多了,一会就会报第一个错误,所以用爬虫把相关的boost-1.79.0包都给下载下来,再放到vcpkg-master\downloads路径下:(第一次用爬虫,这个示例非常简单,但特好用,参考:(62条消息) VCPKG 安装 BOOST OpenCV等库下载失败的问题_yulinxx的博客-CSDN博客_vcpkg安装boost失败

import requests
from bs4 import BeautifulSoup
url = 'http://106.15.181.5/'
res = requests.get(url)
soup = BeautifulSoup(res.text, 'html.parser')
listTr = soup.find_all('tr')

urlList = []
for i in listTr:
    url1 = i.find('a')['href']
    if url1.startswith('/boostorg') and url1.endswith('1.79.0.tar.gz'):#我需要boost-1.79版本,所以指定后缀1.79.0.
        urlList.append(url1)

for j in urlList:
    data = requests.get(url + j).content
    with open(j[1:], 'wb') as f:
        f.write(data)
        print(f'{j[1:]} 下载成功')

print('\n任务完成')

slam视觉

在视觉 SLAM 中,前端和计算机视觉研究领域更为相关,比如图像的特征提取与匹配等,后端则主要是滤波与非线性优化算法。

salm工程的大致过程:

首先通过传感器(这里利用的是相机)获取环境中的数据信息,也就是一帧一帧的图像,在前端视觉里程计中通过这些图像信息计算出相机的位置(准确来说是位姿,后面会细说)。

同时进行闭环检测,判断机器人是否到达先前经过的地方。然后利用后端非线性优化,对前端得出的相机位姿进行优化,得到全局最优的状态。

最后根据每一时刻的相机位姿和空间中目标的信息,根据需求建立相应的地图。


位姿

- 相机的位姿:

其实就是指相机在世界坐标系下的位置坐标和旋转姿态,位姿估计就是根据两帧之间匹配点的关系计算当前时刻相机的位姿。然后再利用相机的位姿,估计特征点的空间位置。

- PnP问题

给定3D点的坐标以及对应2D点的坐标以及内参矩阵,求解相机的姿态。如果两张图像中的一张特征点3D位置已知,那么至少需要3个点对(以及至少一个额外验证点验证结果)就可以计算相机的运动。
PnP 问题有很多种求解方法,例如用三对点估计位姿的 P3P[45] ,直接线性变换( DLT ),
EPnP Efficient PnP [46] UPnP[47] 等等)。此外,还能用 非线性优化 的方式,构建最
小二乘问题并迭代求解(进一步优化),也就是万金油式的 Bundle Adjustment

后端优化:

- 滤波与非线性优化

卡尔曼滤波器与非线性优化算法的比较:

  1. 首先第一个就是马尔科夫性,即k时刻的状态只和k - 1时刻的状态有关,就像视觉里程计中只考虑相邻两帧关系一样.而非线性优化方法更倾向于使用所有的历史记录.
  2. EKF的非线性误差,EKF只在x_k-1处做了一次线性优化,根据这次线性化的效果直接计算出后验概率,也就是该点处的线性化近似在后验概率处仍然是有效的,而实际上,当离工作点较远时,一阶泰勒展开并不能近似整个函数,因为非线性.而在非线性优化中,对于每一次迭代都进行一次泰勒展开,而不是像EKF那样只固定在一点展开.
  3. EKF要存储均值和协方差矩阵,协方差矩阵维数相当大,所以EKF不适合于大型的SLAM场景.

- 图优化

一般分解为两个任务:

1、构建图。机器人位姿作为顶点,位姿间关系作为边。

2、优化图。调整机器人的位姿(顶点)来尽量满足边的约束,使得误差最小。

首先要做的是将曲线拟合问题抽象成图优化。
BA问题:把相机姿态和特征点空间位置做出最优的调整 (adjustment) 之后,最后收束到相机光心的这个过程 ,称为Bundle Adjustment。
BA的本质是一个优化问题,其目的是最小化重投影误差——>对PnP的结果进行优化
BA 的求解: 主要是构造 Bundle Adjustment 问题,设置 Schur 消元,然后调用稠密或者稀疏矩阵求解器对变量进行优化即可

g2o 图优化 6步

  1. 创建一个线性求解器LinearSolver。
  2. 创建BlockSolver,并用上面定义的线性求解器初始化。
  3. 创建总求解器solver,并从GN/LM/DogLeg 中选一个作为迭代策略,再用上述块求解器BlockSolver初始化。
  4. 创建图优化的核心:稀疏优化器(SparseOptimizer)。
  5. 定义图的顶点和边,并添加到SparseOptimizer中。
  6. 设置优化参数,开始执行优化。
typedef g2o::BlockSolver< g2o::BlockSolverTraits<3,1> > Block;  // 每个误差项优化变量维度为3,误差值维度为1

// 第1步:创建一个线性求解器LinearSolver
Block::LinearSolverType* linearSolver = new g2o::LinearSolverDense(); 

// 第2步:创建BlockSolver。并用上面定义的线性求解器初始化
Block* solver_ptr = new Block( linearSolver );      

// 第3步:创建总求解器solver。并从GN, LM, DogLeg 中选一个,再用上述块求解器BlockSolver初始化
g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg( solver_ptr );

// 第4步:创建终极大boss 稀疏优化器(SparseOptimizer)
g2o::SparseOptimizer optimizer;     // 图模型
optimizer.setAlgorithm( solver );   // 设置求解器
optimizer.setVerbose( true );       // 打开调试输出

// 第5步:定义图的顶点和边。并添加到SparseOptimizer中
CurveFittingVertex* v = new CurveFittingVertex(); //往图中增加顶点。维度及类型:g2o::BaseVertex<3,Eigen::Vector3d
v->setEstimate( Eigen::Vector3d(0,0,0) );  // 设定初始值
v->setId(0);                               // 定义节点编号,(决定了在H矩阵中的位置)
optimizer.addVertex( v );                  // 把节点添加到图中
for ( int i=0; i
  edge->setId(i);             // 定义边的编号,(决定了在H矩阵中的位置)
  edge->setVertex( 0, v );                // 设置连接的顶点
  edge->setMeasurement( y_data[i] );      // 观测数值
  edge->setInformation( Eigen::Matrix::Identity()*1/(w_sigma*w_sigma) ); //setInformation() 信息矩阵:协方差矩阵之逆
  optimizer.addEdge( edge );
}

// 第6步:设置优化参数,开始执行优化
optimizer.initializeOptimization();
optimizer.optimize(100);

Bundle Adjustment原理及应用(附实战代码) - 知乎 (zhihu.com)
参考: SLAM从0到1——6. 图优化g2o:从看懂代码到动手编写(长文) - 知乎 (zhihu.com)  (62条消息) g2o图优化_令狐少侠、的博客-CSDN博客_g2o优化

你可能感兴趣的:(c++,windows,visual,studio)