hdl_graph_slam源码解析(三)

hdl_graph_slam源码解析(三)

3. scan_matching_odometry

Hello,热爱SLAM的小伙伴们,大家好!在经历了惊魂体检、春节土嗨以及爆肝论文后,越来越懒的魏小新继续给大家带来鸽了快半年的源码解析(三),期间也是十分惊讶原来自己写的东西真的有人看有人催更,这更加坚定了我和大家一起分享、解读优秀开源SLAM代码的想法,希望自己可以一直这样永葆热情。废话不多说,let’s do it!

3.3 ndt

NDT,即是normal distribution transformation的缩写,翻译成中文就是正太分布变换了,哦不对,是正态分布变换!该算法的核心思想是首先将空间离散为方格,若是二维空间,则离散为栅格,若是三维空间则离散划分为立方体,没错就像切豆腐一样。然后这样做有什么好处呢,笔者觉得这样就可以将采样的点云划分到不同的网格中,这样可以很方便的描述点云的局部特性,例如点云局部的形状(直线、平面or球体)、方向(平面法向、直线方向等)。例如现在我们可以利用统计的方法分析每一块豆腐的特性。

所谓正态分布变换,当然是采用正态分布的形式来拟合分析点云的局部特性。至于为什么用正态分布来描述呢?那还不是因为正态分布足够优秀!首先啊,相信大家都对正态分布的公式很熟悉,这种分布呢不仅是一种广泛存在的数据分布形式,同时又具有良好的数学性质,均值和方差(高维情况:均值向量和协方差矩阵),因此总是能在各种SLAM中的建模中看到它。其次,更有趣的是,高维情况下的协方差矩阵还能反映点云的局部特性。假设现在已知有 N N N个点落在了一个格子里面,为了简化问题就说是二维情况吧,然后我们可以很容易的求出这 N N N个点的均值 μ \mu μ和协方差矩阵 Σ \Sigma Σ,显然对于二维情况,该协方差矩阵为 2 × 2 2\times2 2×2的矩阵。若这几个点在一条直线上,则容易知道该协方差矩阵的秩为1,因此对应的特征值其中一个为0;而当这几个点近似在一条直线上时,则协方差矩阵的一个特征值会明显大于另外一个。当大致均匀分布时,两个特征值会大小类似。因此,正态分布不仅具有良好的数学性质来描述分布,还能够反映点云的局部形态。

既然正态分布可以反映点云的局部形态,自然可以利用正态分布来表示局部点云,这样就可以利用数学公式来表示一组离散的点云。

用公式表示就是:
p ( x ) = 1 2 π ∣ Σ ∣ exp ⁡ { − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) } p(x)=\frac{1}{\sqrt{2\pi|\Sigma|}}\exp\{-\frac{1}{2}(x-\mu)^T\Sigma^{-1}(x-\mu)\} p(x)=2πΣ 1exp{ 21(xμ)TΣ1(xμ)}

3.4 ndt matching

上一节中我们说可以用正态分布来拟合表示点云,这种方法可以很好的描述点云的局部形态。既然本节的主题是scan matching odometry,那么肯定要想怎么把这种表示方法应用到点云配准,进而用到激光里程计中呢?如下图所示,图中左侧是用正态分布拟合给定参考点云(上一时刻的激光扫描)后的示意图,图中红色椭圆是高斯分布对应的协方差椭圆。图中右侧当前时刻的激光扫描(目标点云),怎样利用ndt方法确定两组点云对应的位姿变换矩阵 T T T呢?

对于目标点云中的一点,我们可以根据当前假设的位姿变换矩阵 T T T计算其在参考点云坐标系内的坐标,并根据该坐标确定其在参考点云中对应的正态分布,则可以根据正态分布的概率计算方法,计算该点满足对应正态分布的概率 p μ , Σ ( x ) p_{\mu,\Sigma}(x) pμ,Σ(x)。则计算完目标点云中所有的点后,可以得到这样一个联合概率:
p = ∏ i = 1 N p i ( T x ) μ i , Σ i p=\prod_{i=1}^{N}p_{i}(Tx)_{\mu_i,\Sigma_i} p=i=1Npi(Tx)μi,Σi
由极大似然估计,可以得到对位姿变换矩阵 T T </

<think>好的,我需要帮助用户解决如何安装hdl_graph_slam源码的问题。首先,我应该回顾用户提供的引用内容,看看是否有相关的安装步骤。引用[1]提到了安装libpcl-dev和g2o的历史版本,以及编译ndt_omp。引用[2]提到了创建工作空间和catkin_make的步骤。引用[3]提到了后端优化的代码位置,可能对安装帮助不大。 用户的问题是关于源码安装的指南,所以需要整理出步骤。首先,依赖项安装是关键。根据引用[1],需要安装libpcl-dev,可能还需要安装其他依赖如ROS、Eigen、g2o等。然后,创建工作空间,如引用[2]中的mkdir和catkin_init_workspace。接着,克隆源码,可能包括hdl_graph_slam和其依赖的ndt_omp。之后,编译工作空间,使用catkin_make。需要注意g2o的版本问题,如果Eigen是3.2,可能需要使用旧版g2o,如引用[1]提到的20170730_git版本。此外,编译顺序可能需要先编译ndt_omp,再编译hdl_graph_slam。最后,设置环境变量,source setup.bash或者添加到.bashrc中。 需要确保步骤清晰,分点说明,并且提醒用户注意依赖版本的问题,避免出现头文件错误。同时,引用相关引用来源,例如引用[1]和引用[2]中的内容。可能还需要提到如果遇到问题,可以参考提供的博客链接或重新安装系统作为最后手段,但尽量避免这种情况。</think>### hdl_graph_slam源码安装指南 #### 一、安装系统依赖 1. **Ubuntu基础环境** 推荐使用Ubuntu 16.04/18.04 + ROS Kinetic/Melodic。需提前配置ROS环境[^2]。 2. **PCL库安装** 通过apt直接安装: ```bash sudo apt-get install libpcl-dev # 安装PCL点云库[^1] ``` 3. **Eigen与g2o依赖** - Eigen需至少3.2版本,建议3.3+ - g2o需使用兼容Eigen的历史版本(如20170730_git),避免依赖冲突[^1]: ```bash git clone https://github.com/RainerKuemmerle/g2o.git -b 20170730_git ``` #### 二、创建工作空间 ```bash mkdir -p ~/hdl_ws/src # 创建ROS工作空间 cd ~/hdl_ws catkin_make # 初始化工作空间 source devel/setup.bash ``` #### 、克隆与编译源码 1. **下载核心仓库** ```bash cd ~/hdl_ws/src git clone https://github.com/koide3/hdl_graph_slam.git ``` 2. **编译依赖项ndt_omp** 需优先编译依赖库`ndt_omp`[^1]: ```bash git clone https://github.com/koide3/ndt_omp.git cd .. catkin_make -DCATKIN_WHITELIST_PACKAGES="ndt_omp" # 仅编译ndt_omp ``` 3. **编译hdl_graph_slam** ```bash catkin_make -DCATKIN_WHITELIST_PACKAGES="" # 编译全部包 ``` #### 四、环境配置 将以下命令添加到`~/.bashrc`中: ```bash echo "source ~/hdl_ws/devel/setup.bash" >> ~/.bashrc source ~/.bashrc ``` #### 五、验证安装 运行测试节点(需准备数据集): ```bash roslaunch hdl_graph_slam hdl_graph_slam.launch ``` ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值