Nguyen, V., et al. (2007)."A comparison of line extraction algorithms using 2D range data for indoor mobile robotics." Autonomous Robots 23(2): 97-111.

论文提出了6中从二维激光扫描数据中提取线段的方法

1.分割合并算法

有的时候十分烦那些斜着的连线,实际不是想要的。

2.回归方法

先聚类,再回归

3.累积、区域生长算法

感觉对噪声数据真的没办法了,窝成一团的点,提取的线十分破碎而且乱...

 function [ lineSegCoord ] = extractLineSegment( model,normals,intervalPts,normalDelta,dThreshold)
%EXTRACTLINESEGMENT Summary of this function goes here
% Detailed explanation goes here
if (nargin == ) || isempty(model)
lineSegCoord = [];
return;
end;
ns = createns(model','NSMethod','kdtree')
pts=size(model,);
if (nargin == )
normalDelta=0.9;
dThreshold=0.5;
end
if isempty(normals)
normals=zeros(,pts);
for nor=:pts
[idx, dist] = knnsearch(ns,model(:,nor)','k',2);
data=model(:,idx);
men=mean(data,);
rep= repmat(men,,size(data,));
data = data - rep;
% Compute the MxM covariance matrix A
A = cov(data');
% Compute the eigenvector of A
[V, LAMBDA] = eig(A);
% Find the eigenvector corresponding to the minimum eigenvalue in A
% This should always be the first column, but check just in case
[~,idx] = min(diag(LAMBDA));
% Normalize
V = V(:,idx)./norm(V(:,idx));
%定向
normals(:,nor)=V;
end
end lineSeg=[;];
newLineIdx=;
for j=:pts-
current=model(:,j);
pre=model(:,j-);
next=model(:,j+);
curNormal=normals(:,j);
preNormal=normals(:,j-);
nextNormal=normals(:,j+);
[d,vPt]=Dist2D_Point_to_Line(current,pre,next);
dis=norm(current-pre);
delta=dot(curNormal,preNormal)/(norm(curNormal)*norm(preNormal));
if(delta>normalDelta&& d<dThreshold) %注意两个阈值
lineSeg(,newLineIdx)=lineSeg(,newLineIdx)+;%点数
else
newLineIdx=newLineIdx+;
lineSeg=[lineSeg [; ]];
lineSeg(,newLineIdx)=lineSeg(,newLineIdx-)+ lineSeg(,newLineIdx-);%起始点索引
end
end
indexLs=;
lineSegCoord=[];
for k=:size(lineSeg,)
from=lineSeg(,k);
to=from+lineSeg(,k)-;
if(lineSeg(,k) > intervalPts)
try
pts= model(:,(from:to));
coef1 = polyfit(pts(,:),pts(,:),);
k2 = coef1();
b2 = coef1();
coef2 = robustfit(pts(,:),pts(,:),'welsch');
k2 = coef2();
b2 = coef2();
ML = true;
catch
ML = false;
end;
[D,fPb]= Dist2D_Point_to_Line(model(:,from),[ b2]',[1 k2+b2]');
[D,tPb]= Dist2D_Point_to_Line(model(:,to),[ b2]',[1 k2+b2]');
interval=abs(model(,from) -model(,to));
if(interval>0.05)
x = linspace(fPb() ,tPb(), );
if ML
y_ML = k2*x +b2;
lineSegCoord=[lineSegCoord [fPb() fPb() tPb() tPb()]'];
plot(x, y_ML, 'b-', 'LineWidth', );
end;
else
y = linspace(fPb() ,tPb(), );
if ML
x_ML =(y-b2)/k2;
lineSegCoord=[lineSegCoord [fPb() fPb() tPb() tPb()]'];
plot(x_ML, y, 'b-', 'LineWidth', );
end;
end;
% try
% tmpPts= model(:,(from:to));
% Theta_ML = estimate_line_ML(tmpPts,[], sigma, );
% ML = true;
% catch
% % probably the optimization toolbox is not installed
% ML = false;
% end;
% interval=abs(model(,from) -model(,to));
% if(interval>)
% x = linspace(model(,from) ,model(,to), );
% if ML
% y_ML = -Theta_ML()/Theta_ML()*x - Theta_ML()/Theta_ML();
% lineSegCoord=[lineSegCoord [x() y_ML() x() y_ML()]'];
% plot(x, y_ML, 'b-', 'LineWidth', );
% end;
% else
% y = linspace(model(,from) ,model(,to), );
% if ML
% x_ML = -Theta_ML()/Theta_ML()*y - Theta_ML()/Theta_ML();
% lineSegCoord=[lineSegCoord [x_ML() y() x_ML() y()]'];
% plot(x_ML, y, 'b-', 'LineWidth', );
% end;
% end;
end
end
end

4.Ransac方法

5.霍夫变换方法

6.EM方法

[SLAM]2D激光线特征提取的更多相关文章

  1. 2D激光SLAM算法比较+cartographer

    Hector slam: Hector slam利用高斯牛顿方法解决scan-matching问题,对传感器要求较高. 缺点:需要雷达(LRS)的更新频率较高,测量噪声小.所以在制图过程中,需要rob ...

  2. [SLAM]2D激光扫描匹配方法

    1.Beam Model 2.Likehood field for k=1:size(zt,1) if zt(k,2)>0 d = -grid_dim/2; else d = grid_dim/ ...

  3. 主流视觉SLAM、激光SLAM总结

    SLAM预备知识 SLAM for Dummies 全文总结 视觉里程计 卡尔曼滤波推导 MonoSLAM MonoSLAM:Real-Time Single Camera SLAM全文总结 PTAM ...

  4. 我用MATLAB撸了一个2D LiDAR SLAM

    0 引言 刚刚入门学了近一个月的SLAM,但对理论推导一知半解,因此在matlab上捣鼓了个简单的2D LiDAR SLAM的demo来体会体会SLAM的完整流程. (1)数据来源:德意志博物馆Deu ...

  5. 激光SLAM与视觉SLAM的特点

    激光SLAM与视觉SLAM的特点 目前,SLAM技术被广泛运用于机器人.无人机.无人驾驶.AR.VR等领域,依靠传感器可实现机器的自主定位.建图.路径规划等功能.由于传感器不同,SLAM的实现方式也有 ...

  6. 3D视觉 之 线激光3D相机

    1  3D 视觉 常见的三维视觉技术,包含双目.ToF.激光三角.结构光等,如下图:     1)毫米级 双目.ToF.结构光(散斑)的精度为 mm 级,多见于消费领域,如:导航避障,VR/AR,刷脸 ...

  7. 深度学习结合SLAM研究总结

    博客转载自:https://blog.csdn.net/u010821666/article/details/78793225 原文标题:深度学习结合SLAM的研究思路/成果整理之 1. 深度学习跟S ...

  8. 对比几种在ROS中常用的几种SLAM算法

    在此因为要总结写一个文档,所以查阅资料,将总结的内容记录下来,欢迎大家指正! 文章将介绍使用的基于机器人操作系统(ROS)框架工作的SLAM算法. 在ROS中提供的五种基于2D激光的SLAM算法分别是 ...

  9. 激光三角法点云重建分享——halcon 方法

    如今视觉应用方面单纯依靠2D图像解决问题存在很多问题.稳定性差.定位不准确.还有配合机器人抓取方面只能抓高度一致的物品.其实在Halcon算法库有非常强大的三维算法.包括点云重建.激光三角法(2D相机 ...

随机推荐

  1. Mongoose学习参考文档——基础篇

    Mongoose学习参考文档 前言:本学习参考文档仅供参考,如有问题,师请雅正 一.快速通道 1.1 名词解释 Schema : 一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力 Model ...

  2. Coder-Strike 2014 - Finals (online edition, Div. 2) A. Pasha and Hamsters

    水题 #include <iostream> #include <vector> #include <algorithm> using namespace std; ...

  3. strace命令跟踪进程

    在实际系统维护过程中,常常需要知道一个进程在做哪些动作,比如想判断一个进程是否hang,我们可以使用strace命令,此命令式用来跟踪一个进程在调用哪些系统函数和信号 通过跟踪xinetd进程演示st ...

  4. jquery 最简单的动画效果

    <p style="border: 1px solid red"> 我会慢慢变大 </p> <a>dianji</a> <sc ...

  5. js_实用

    [js提示] 文件中加 /// <reference path="exp_validate.js" /> 即可在当前js文件使用exp_validate.js中全局变量 ...

  6. SolrCloud 5.x 集群部署方法

    CentOS下安装Solr5.3    http://www.centoscn.com/image-text/install/2015/0918/6190.html solr5.3.1 集群服务搭建 ...

  7. C#中Thread.sleep() 【转载】

    我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间.那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题: 1.假设现在是 2008-4-7 12:00:00.000,如果我 ...

  8. HTTP头部解析

    当我们打开一个网页时,浏览器要向网站服务器发送一个HTTP请求头,然后网站服务器根据HTTP请求头的内容生成当次请求的内容发送给浏览器.你明白HTTP请求头的具体含意吗?下面一条条的为你详细解读,先看 ...

  9. PHP中文函数顺序排列一数组且其序数不变

    函数Abs() 描述: mixed abs (mixed number); Returns the absolute value of number. If the argument number i ...

  10. Otsu algorithm

    一.介绍 OTSU算法也称最大类间差法,有时也称之为大津算法,被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响,因此在数字图像处理上得到了广泛的应用.它是按图像的灰度特性,将 ...