目录
-
安装问题
- 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 <windows.h>”。
- 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视觉
salm工程的大致过程:
首先通过传感器(这里利用的是相机)获取环境中的数据信息,也就是一帧一帧的图像,在前端视觉里程计中通过这些图像信息计算出相机的位置(准确来说是位姿,后面会细说)。
同时进行闭环检测,判断机器人是否到达先前经过的地方。然后利用后端非线性优化,对前端得出的相机位姿进行优化,得到全局最优的状态。
最后根据每一时刻的相机位姿和空间中目标的信息,根据需求建立相应的地图。
位姿
- 相机的位姿:
其实就是指相机在世界坐标系下的位置坐标和旋转姿态,位姿估计就是根据两帧之间匹配点的关系计算当前时刻相机的位姿。然后再利用相机的位姿,估计特征点的空间位置。
- PnP问题
后端优化:
- 滤波与非线性优化
卡尔曼滤波器与非线性优化算法的比较:
- 首先第一个就是马尔科夫性,即k时刻的状态只和k - 1时刻的状态有关,就像视觉里程计中只考虑相邻两帧关系一样.而非线性优化方法更倾向于使用所有的历史记录.
- EKF的非线性误差,EKF只在x_k-1处做了一次线性优化,根据这次线性化的效果直接计算出后验概率,也就是该点处的线性化近似在后验概率处仍然是有效的,而实际上,当离工作点较远时,一阶泰勒展开并不能近似整个函数,因为非线性.而在非线性优化中,对于每一次迭代都进行一次泰勒展开,而不是像EKF那样只固定在一点展开.
- EKF要存储均值和协方差矩阵,协方差矩阵维数相当大,所以EKF不适合于大型的SLAM场景.
- 图优化
一般分解为两个任务:
1、构建图。机器人位姿作为顶点,位姿间关系作为边。
2、优化图。调整机器人的位姿(顶点)来尽量满足边的约束,使得误差最小。
g2o 图优化 6步:
- 创建一个线性求解器LinearSolver。
- 创建BlockSolver,并用上面定义的线性求解器初始化。
- 创建总求解器solver,并从GN/LM/DogLeg 中选一个作为迭代策略,再用上述块求解器BlockSolver初始化。
- 创建图优化的核心:稀疏优化器(SparseOptimizer)。
- 定义图的顶点和边,并添加到SparseOptimizer中。
- 设置优化参数,开始执行优化。
typedef g2o::BlockSolver< g2o::BlockSolverTraits<3,1> > Block; // 每个误差项优化变量维度为3,误差值维度为1
// 第1步:创建一个线性求解器LinearSolver
Block::LinearSolverType* linearSolver = new g2o::LinearSolverDense<Block::PoseMatrixType>();
// 第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<N; i++ ) // 往图中增加边
{
CurveFittingEdge* edge = new CurveFittingEdge( x_data[i] //定义简单的一元边。观测值维度,类型,连接顶点类型g2o::BaseUnaryEdge<1,double,CurveFittingVertex>
edge->setId(i); // 定义边的编号,(决定了在H矩阵中的位置)
edge->setVertex( 0, v ); // 设置连接的顶点
edge->setMeasurement( y_data[i] ); // 观测数值
edge->setInformation( Eigen::Matrix<double,1,1>::Identity()*1/(w_sigma*w_sigma) ); //setInformation() 信息矩阵:协方差矩阵之逆
optimizer.addEdge( edge );
}
// 第6步:设置优化参数,开始执行优化
optimizer.initializeOptimization();
optimizer.optimize(100);