SLAM十四讲
文章平均质量分 67
笔记
磊磊哈哈
这个作者很懒,什么都没留下…
展开
-
slam14讲 工程实践
确定工程框架文件存放内容文件名CMakeLists.txt 设置二进制文件binset(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)自己设置的头文件includeinclude_directories(${PROJECT_SOURCE_DIR}/include)(使用时调用include “myslam/xxx.h”,不易于别的库混淆)源代码文件srcadd_subdirectory(src)测试.转载 2021-02-01 16:20:52 · 166 阅读 · 0 评论 -
建图学习四 octomap库
1.绘制颜色直方图tree.writeColorHistogram()anzhuang依赖sudo apt-get install gnuplot#include <octomap/octomap.h>#include <octomap/ColorOcTree.h>using namespace std;using namespace octomap;int main(int /*argc*/, char** argv) { std::string fi原创 2021-01-09 15:43:11 · 665 阅读 · 0 评论 -
建图学习三 八叉树地图和octomap库
slam14讲 中的八叉树:点云地图存在如下缺点:点云地图规模大,一副640×480像素的图像,会产生30万个空间点,提供很多不必要的细节,需要对其压缩。点云地图无法处理运动物体。只有添加点的方法,没用当点消失时移除其方法,实际中运动物体普遍存在,点云地图不使用。八叉树:把三维空间建模为许多小方块,每个面均匀切成两块,那么可以得到8个同样大的小块<>八叉树的节点表示塔是否被占据的信息,0:表示空白 1:表示占据,更加精细的用x∈[0,1]x\in[0,1]x∈[0,1]表示某节转载 2021-01-07 19:57:10 · 1905 阅读 · 1 评论 -
建图学习二 从点云重建网格
从点云重建网格## 点云贪心三角化原理转载适用于采样点云来自表面连续光滑的曲面,并且点云的密度变化比较均匀的情况,所以使用之前,一般先进行滑动最小二乘滤波以满足条件。流程(1):将点云通过法线投影到某一二维坐标平面。(2):然后对投影得到的点云做平面内的三角化,从而得到各点的拓扑连接关系。平面三角化的过程中用到了基于Delaunay三角剖分的空间区域增长算法(3):最后根据平面内投影点的拓扑连接关系确定各原始三维点间的拓扑连接,所得三角网格即为重建得到的曲面模型Delaunay三角剖析转载 2021-01-05 15:50:00 · 949 阅读 · 1 评论 -
pcl::MovingLeastSquares滑动最小二乘
http://www.sci.utah.edu/~shachar/Publications/crpss.pdf翻译 2021-01-04 17:54:21 · 2650 阅读 · 0 评论 -
建图学习一
使用目的:定位、导航、避障、重建、交互类型:稠密、稀疏单目稠密建图转载 2020-12-26 19:36:18 · 116 阅读 · 0 评论 -
位姿图学习
基本概念何为位姿图?(Pose Graph)参考BA优化,对路标点与其对应点轨迹进行位姿和路标点优化(特征点、GPS、IMU获得位姿),去除路标只考虑相机之间位姿的联系,进行图优化,构建位姿图。位姿图的节点和边(1):节点:相机位姿T1,...,TnT_1,...,T_nT1,...,Tn(2):边:两节点之间的相对运动(可以来自于GPS、IMU、特征点法、直接点法)公式推导估计Ti,与TjT_i,与T_jTi,与Tj之间的运动ΔTij:(李群)\Delta T_{ij}转载 2020-12-15 09:09:08 · 861 阅读 · 0 评论 -
BA与图优化学习
BA(Bundles Adjustment)从视觉图像提炼出最优的3D模型和相机参数。世界坐标系到相机坐标系R,t:旋转平移R,t:旋转平移R,t:旋转平移P:3维点P:3维点P:3维点P=RP+t=[X,Y,Z]TP=RP+t=[X,Y,Z]^TP=RP+t=[X,Y,Z]T相机坐标系到像素坐标系(1):像素下坐标系归一化Pc=[uc,vc,1]=[X/Z,Y/Z,1]TP_c=\left[\begin{matrix}u_c,v_c,1\end{matrix}\right]=[X/原创 2020-12-09 15:25:34 · 1717 阅读 · 0 评论 -
后端一些原理笔记
似然函数资料1原创 2020-12-07 13:59:29 · 70 阅读 · 0 评论 -
直接法学习
直接法(1):稀疏直接法:稀疏关键点直接进行运算(2):半稠密(Semi-Dense)直接法:使用部分像素点,抛弃梯度为零的点(3):稠密直接法:计算所有像素点已知:p1=[uv1]1=1Z1KPp_1=\left[\begin{matrix}u\\v\\1\end{matrix}\right]_1=\frac{1}{Z_1}KPp1=⎣⎡uv1⎦⎤1=Z11KPp2=[uv1]2=1Z2K(RP+t)=1Z2K(TP)1:3p_2=\left[\begin{matrix}u\转载 2020-12-07 09:31:16 · 169 阅读 · 0 评论 -
2D光流
特征点法缺点:(1):关键点提取耗时过长,(ORB:20ms,SIFT:无法实时获取)(2):忽略特征点以外信息,丢弃了大部分信息(3):找不到足够特征点匹配2D光流基本概念稀疏光流:计算部分像素运动:LK(Lucas-Kanade)稠密光流:计算全部像素运动:(Horn-Schunck光流)灰度不变假设:同一个点的像素灰度值,在各个图像中是固定不变的。(实际中很有可能不成立)LK推导灰度不变假设可以得到:I(x+dx,y+dy,t+dt)=I(x,y,t)I(x+dx,y+dy,t转载 2020-12-02 21:31:28 · 221 阅读 · 0 评论 -
ICP学习笔记
来自slam14讲ICP(Iterative Closest Point,ICP)求解3D3D 3维点之间的对应关系。P={p1,p2,...,p3}:一组3D点P=\{p_1,p_2,...,p_3\}:一组3D点P={p1,p2,...,p3}:一组3D点P′={p1′,p2′,...,p3,}:与P对应的一组3D点P'=\{p_1',p'_2,...,p_3,\}:与P对应的一组3D点P′={p1′,p2′,...,p3,}:与P对应的一组3D点求解P与P′P与P'P与P′之间的转载 2020-11-30 22:00:33 · 232 阅读 · 0 评论 -
PNP问题学习
PNP(Perspective)问题:求解3D到2D点对的运动问题。求解方法:P3PEPnP(Efficient PnP)直接线性变换UPnP光束平差法(Bundle Adjustment,BA)直接线性变换直接线性变换用于求解相机内参齐次做标归一化平面坐标直接线性变化(1):假设空间上某个点的齐次做标为P=(X,Y,Z,1)TP=(X,Y,Z,1)^TP=(X,Y,Z,1)T,其投影在图像I1I_1I1上的点为:x1=(u1,v1,1)Tx_1=(u_1,v_1,1)^T原创 2020-11-27 13:33:19 · 3542 阅读 · 0 评论 -
SIFT角点学习
SIFT(Scale-invariant feature transform)本文为笔记原理详见资料1资料1资料21. 高斯模糊 SIFT算法是在不同的尺度空间上查找关键点,而尺度空间的获取需要使用高斯模糊来实现,Lindeberg等人已证明高斯卷积核是实现尺度变换的唯一变换核,并且是唯一的线性核。二维高斯函数σ:正太分布标准差,值越大图像越模糊\sigma:正太分布标准差,值越大图像越模糊σ:正太分布标准差,值越大图像越模糊r:模糊半径:元素到模板中心的距离r:模糊半径:元素到模板中转载 2020-11-14 22:05:57 · 269 阅读 · 0 评论 -
ORB特征学习
原理资料1ORB一种改进的fast角点。分为两部分:(1):FAST角点提取:找到图像的角点,计算特征点的主方向,为后续的BRIEF特征添加了旋转不变特性。(2):BRIEF描述子:对前一步特征提取出特征点的周围图像区域进行描述。ORB对BRIEF进行了改进,在BRIEF使用了先前计算的方向信息。Fast 角点主要检测局部像素灰度变化明显的地方,如果像素与邻域的像素差别较大(亮或暗),那么他更可能是角点,Fast角点相对于其他角点检测速度快。步骤如下:选取像素ppp,假设他的灰度值为Ip原创 2020-11-17 20:26:11 · 383 阅读 · 0 评论 -
角点检测学习(Harris、Fast)
Harris 角点资料1资料2资料3基本原理算法基本思想是使用一个固定窗口在图像上进行任意方向上的滑动,比较滑动前与滑动后两种情况,窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有着较大灰度变化,那么我们可以认为该窗口中存在角点。数学表达式u,v:分别表示横向和纵向位移u,v:分别表示横向和纵向位移u,v:分别表示横向和纵向位移x,y:窗口对应的像素坐标x,y:窗口对应的像素坐标x,y:窗口对应的像素坐标w():窗口函数,每个像素的权重,一般窗口内对应的w权重均为1或者2转载 2020-11-12 17:19:59 · 655 阅读 · 0 评论 -
最优下降法学习
原理设目标函数一阶连续可微在xkx^kxk点处对f(x)f(x)f(x)进行泰勒展开,得到:▽f(xk):f在点xk处的一阶导数\bigtriangledown f(x^k):f在点x_k处的一阶导数▽f(xk):f在点xk处的一阶导数λ:为步长\lambda:为步长λ:为步长f(xk)−f(xk+tpk)=−λ▽f(xk)Tpk+o(∣∣tpk∣∣)f(x^k)-f(x^k+tp^k)=-\lambda\bigtriangledown f(x^k)^Tp^k+o(||tp^k||)f(xk)−转载 2020-11-11 17:15:27 · 337 阅读 · 0 评论 -
g2o图优化学习
g2o是一个最小二乘优化库。可以将优化变量和误差项的关联表现为图的形式,直观的看到优化问题。基本概念图优化,把优化问题表现成图的一种方式。定点(Vertex):表示优化变量。边(Edge):表示误差项,连接到顶点。任意一个非线性最小二乘可以构建一个与之对应的图。安装下载git clone https://github.com/RainerKuemmerle/g2o.git安装依赖项sudo apt-get install libeigen3-dev libsuitespa原创 2020-11-11 10:50:41 · 953 阅读 · 2 评论 -
ceres学习三(导数)
求导函数优先选用自动微分算法,某些情况可能需要用到解析微分算法,尽量避免数值微分算法自动微分Automatic Derivativesstruct CostFunctor { template <typename T> bool operator()(const T* const x, T* residual) const { residual[0] = T(10.0) - x[0]; return true; }};Problem probl翻译 2020-11-05 18:09:38 · 235 阅读 · 0 评论 -
cere学习二(Solver::Options类与Problem::problem类的简单介绍)
Solver::Options类Solver::Options类方法默认值功能bool Solver::Options::IsValid(string *error) const检查options是否合法,不合法的话返回false,并将错误信息存到error里面int Solver::Options::max_num_iterations默认值:50;最大迭代次数double Solver::Options::max_solver_time_in_secon转载 2020-11-05 13:23:50 · 1142 阅读 · 0 评论 -
使用Sophus和pangolin实现轨迹误差
绝对轨迹误差(Absolute Trahextiry,ATE)姿态的真实值与姿态的理想值之间的差,实际上是李代数的均方根误差(Root-Mean-Aquared,RMSE)绝对平移误差(Average Translational Error)平移部分真实值与姿态的理想值之间的差实现:...原创 2020-09-24 11:41:13 · 570 阅读 · 0 评论 -
pangolin库使用一 (安装配置)
Eigen容器#include <Eigen/StdVector>错误vector<Eigen::Matrix4d>std::map<int, Eigen::Vector4f>//虽然会编译通过但是运行时会报错应当使用以下方式std::vector<Eigen::Matrix4d,Eigen::aligned_allocator<Eigen::Matrix4d> >std::map<int, Eigen::Vecto转载 2020-09-16 20:05:53 · 2094 阅读 · 1 评论 -
cere学习一(安装)
官网链接安装安装依赖项sudo apt-get install cmakesudo apt-get install libgoogle-glog-dev libgflags-devsudo apt-get install libatlas-base-devsudo apt-get install libeigen3-devsudo apt-get install libsuitesparse-dev下载安装git clone https://github.com/cer原创 2020-11-04 15:27:30 · 1041 阅读 · 0 评论 -
SLAM中非线性优化(Eigen实现 最小2乘法)
安装matplotlibcpp.h 画散点图下载:git clone https://github.com/lava/matplotlib-cpp例子使用:#include "matplotlibcpp.h"namespace plt = matplotlibcpp;int main() { plt::plot({1,3,2,4}); plt::show();}编译:g++ minimal.cpp -std=c++11 -I/usr/include/python2.7 -l原创 2020-10-16 17:06:46 · 508 阅读 · 0 评论 -
SLAM中非线性优化
这里是笔记,详细请查看链接线性最小二乘非线性最小二乘基础知识<UD分解>P:n阶正定的对称矩阵P:n阶正定的对称矩阵P:n阶正定的对称矩阵对矩阵P进行上三角-对角分解:U:上三角阵U:上三角阵U:上三角阵D:对角阵D:对角阵D:对角阵P=UDUTP=[P11P12...P1nP21P22...P2n............Pn1Pn2...Pnn],U=[U11U12...U1nU21U22...U2n............Un1Un2...Unn](Uii=1,(i=1,2原创 2020-10-15 14:37:01 · 262 阅读 · 0 评论 -
相机标定(原理)
1 原理和目的求解图像坐标系与世界坐标系的关系(求解之间的旋转矩阵)即:像素坐标系<-成像平面坐标系<-相机坐标系<-世界坐标系2 相机的误差来源内参、外参(旋转平移)、透镜畸变内参误差模型相机拍照成像使用小孔成像原理图片看这个像主点:摄影中心作像片的垂线,交点为像主点。一般而言,像主点即为像片的中心点定义: P0(x0,y0,f) 像主点在图片上的投影 P1(x1,y1,z1) 像主点在相机坐标上的投影 f:为焦距 dx,dy,dz 表示零点误差相机坐原创 2020-08-21 20:20:10 · 639 阅读 · 0 评论 -
sophus 使用
非模板类使用转换关系图如下由于我的下载的是模板类参靠SLAM十四讲SO#include <Eigen/Core>#include <Eigen/Dense>#include <Eigen/Geometry>#include <sophus/geometry.hpp>#include <sophus/se3.hpp>#include <sophus/so3.hpp>#include <iostream>转载 2020-09-23 17:02:35 · 1961 阅读 · 0 评论 -
李群与李代数二(求导与扰动模型)
BCH公式与近似公式(Baker-Campbell-haudsorff)给出了李代数指数映射乘积的完整公式:[,]:为李括号[ ,]:为李括号[,]:为李括号ln(eAeB)=A+B+12[A,B]+112[A,[A,B]]−112[B,[A,B]]+...ln(e^{A}e^{B})=A+B+\frac{1}{2}[A,B]+\frac{1}{12}[A,[A,B]]-\frac{1}{12}[B,[A,B]]+...ln(eAeB)=A+B+21[A,B]+121[A,[A,B]]−121[原创 2020-09-22 21:06:55 · 565 阅读 · 0 评论 -
sophus安装
报错:ubuntu16.04 默认支持的版本为3.2.9,安装sophus 需要3.3 Eigen3 version 3.2.92 found in /usr/include/eigen3, but at least version 3.3.0 is required升级git clone https://gitlab.com/libeigen/eigen.gitmkdir buildcd buildcmake …sudo make installsudo ldconfig -v..原创 2020-09-23 11:40:08 · 2709 阅读 · 0 评论 -
李群与李代数一(定义与映射)
为什要使用? SLAM中,位姿是未知的,需要求出最符合当前状态的位姿!因为旋转矩阵本身具有约束的(正交且行列式的值为1),需要通过李群代数把位姿估计变成无约束问题群特殊正交群(对乘法是封闭的[即乘法的结果仍属于该集合])SO(3)={R∈R3×3∣RRT=I,det(R)=1}SO(3)=\{R\in R^{3×3}|RR^T=I,det(R)=1\}SO(3)={R∈R3×3∣RRT=I,det(R)=1}特殊欧氏群(对乘法是封闭的[即乘法的结果仍属于该集合])SO(3)={T=[Rt0T1]T转载 2020-09-21 17:27:25 · 368 阅读 · 0 评论 -
pangolin库使用三(曲线)
绘制曲线#include <iostream>#include <pangolin/pangolin.h>int main(/*int argc, char* argv[]*/){ // Create OpenGL window in single line pangolin::CreateWindowAndBind("Main",640,480); // Data logger object pangolin::DataLog log;//常规数据格式转载 2020-09-20 21:57:19 · 1602 阅读 · 0 评论 -
pangolin库使用三(子图, imageTexture,)
#include <pangolin/pangolin.h>//更新数组函数int main(int argc,char ** argv){ int w=640; int h=480; float Aspect=w/h; pangolin::CreateWindowAndBind("mult",w,h); glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); pangolin::OpenGlRenderState cam(转载 2020-09-19 21:49:20 · 903 阅读 · 0 评论 -
pangolin库使用二(点,划线,画图,按钮)
创建一个相机跟界面相机内参意义#include <pangolin/pangolin.h>#include <unistd.h>using namespace std;int main(int argc,char **argv){ pangolin::CreateWindowAndBind("Main",640,480); //创建一个窗口,宽:640,高:480 glEnable(GL_DEPTH_TEST); //用来开启更新深度缓冲区的功能,也就是原创 2020-09-18 22:09:48 · 1780 阅读 · 0 评论 -
Eigen (reshape,别名问题)
通过赋值重塑大小1 直接赋值 MatrixXf M1(3,3); M1<<1,2,3,4,5,6,7,8,9; cout<<"M1:"<<endl<<M1<<endl; Map<RowVectorXf> v1(M1.data(),M1.size()); cout<<"v1:"<<endl<<v1<<endl;2 指定间隔和长度使用InnerStride Ro原创 2020-09-14 20:09:33 · 225 阅读 · 0 评论 -
Eigen 块操作
官方链接#include <iostream>#include <cmath>访问矩阵数据块 //访问矩阵数据块 Eigen::MatrixXf mat(4,4); mat<<1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16; cout<<"middle block"<<endl; cout<<mat.block<2,2>(0,1)<<endl; //可移动原创 2020-09-10 21:24:07 · 1050 阅读 · 0 评论 -
Eigen 几何变换
头文件#include <Eigen/Geometry>平移T.pretranslate(Vector3d(1, 3, 4)); // 把平移向量设成(1,3,4)缩放Scaling(sx, sy)//2维 x轴sx缩放,y轴sy缩放Scaling(sx, sy, sz)//3维 x轴sx缩放,y轴sy缩放,z轴sz缩放Scaling(s)//全部安s等比缩放旋转矢量、欧拉角、旋转矩阵之间转化 Matrix3f m;m =原创 2020-09-10 17:33:42 · 730 阅读 · 0 评论 -
Eigen 基本类型的简单使用
初始化 Matrix<float,2,3> mat_23; //数据类型float,2行,3列 Vector3d v_3d;Matrix<float, 3, 1> vd_3d; // v_3d,vd_3d是一样的 Matrix3d matrix_33 = Matrix3d::Zero(); //初始化为零 // Matrix3d 实质上是 Eigen::Matrix<double, 3, 3>Matrix<floa原创 2020-09-09 16:29:19 · 1005 阅读 · 0 评论