[SLAM]2D激光线特征提取
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激光线特征提取的更多相关文章
- 2D激光SLAM算法比较+cartographer
Hector slam: Hector slam利用高斯牛顿方法解决scan-matching问题,对传感器要求较高. 缺点:需要雷达(LRS)的更新频率较高,测量噪声小.所以在制图过程中,需要rob ...
- [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/ ...
- 主流视觉SLAM、激光SLAM总结
SLAM预备知识 SLAM for Dummies 全文总结 视觉里程计 卡尔曼滤波推导 MonoSLAM MonoSLAM:Real-Time Single Camera SLAM全文总结 PTAM ...
- 我用MATLAB撸了一个2D LiDAR SLAM
0 引言 刚刚入门学了近一个月的SLAM,但对理论推导一知半解,因此在matlab上捣鼓了个简单的2D LiDAR SLAM的demo来体会体会SLAM的完整流程. (1)数据来源:德意志博物馆Deu ...
- 激光SLAM与视觉SLAM的特点
激光SLAM与视觉SLAM的特点 目前,SLAM技术被广泛运用于机器人.无人机.无人驾驶.AR.VR等领域,依靠传感器可实现机器的自主定位.建图.路径规划等功能.由于传感器不同,SLAM的实现方式也有 ...
- 3D视觉 之 线激光3D相机
1 3D 视觉 常见的三维视觉技术,包含双目.ToF.激光三角.结构光等,如下图: 1)毫米级 双目.ToF.结构光(散斑)的精度为 mm 级,多见于消费领域,如:导航避障,VR/AR,刷脸 ...
- 深度学习结合SLAM研究总结
博客转载自:https://blog.csdn.net/u010821666/article/details/78793225 原文标题:深度学习结合SLAM的研究思路/成果整理之 1. 深度学习跟S ...
- 对比几种在ROS中常用的几种SLAM算法
在此因为要总结写一个文档,所以查阅资料,将总结的内容记录下来,欢迎大家指正! 文章将介绍使用的基于机器人操作系统(ROS)框架工作的SLAM算法. 在ROS中提供的五种基于2D激光的SLAM算法分别是 ...
- 激光三角法点云重建分享——halcon 方法
如今视觉应用方面单纯依靠2D图像解决问题存在很多问题.稳定性差.定位不准确.还有配合机器人抓取方面只能抓高度一致的物品.其实在Halcon算法库有非常强大的三维算法.包括点云重建.激光三角法(2D相机 ...
随机推荐
- 洛谷 P1449 后缀表达式 Label:表达式计算系列
题目描述 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级). 如:3*(5–2)+7对应 ...
- osg中遇到的问题
osg中遇到的问题 今天写程序的时候, 需要把键盘和鼠标消息转发出来, 就直接写了接口用signal丢出来了. 程序写的很多, 测试的时候却崩溃了.... 在场景中拖拽鼠标左键的时候, 会发现在扔出鼠 ...
- Rational Rose 2007 破解版安装过程
Rational Rose 2007 破解版安装过程 首先通过网站将软件下载,然后依照以下步骤进行: 选择第二项,下一步 一直点击next,出现如下,可以修改安装的目的文件夹 设置完路径之后出现如下, ...
- Windows Maven package时报错问题的解决
google了一把,看到别人的说法是Stack size 不够大. Stack Space用来做方法的递归调用时压入Stack Frame.所以当递归调用太深的时候,就有可能耗尽Stack Space ...
- URL编码:不同的操作系统、不同的浏览器、不同的网页字符集,将导致完全不同的编码结果。
URL编码:不同的操作系统.不同的浏览器.不同的网页字符集,将导致完全不同的编码结果. 因此如果Url中有中文或特殊字符,一定要自己调用函数编码解码,不要让浏览器帮你编码,否则出现了问题会浪费你很多时 ...
- [LintCode] Decode Ways 解码方法
A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...
- nodeType
nodeType 属性返回节点的类型 语法attrObject.nodeType DOM节点的类型有很多种 12种常用如下 元素节点 : 1属性节点 : 2文本节点 : 3 nodeType取值 No ...
- php以post方式向接口发送数据
工作需要,我负责收集服务器数据,然后定时向中心服务器发送.我看到了接口信息,需要设置heads头信息,需要发送数据,且是post方式. 这里就用到了curl //发送post请求 function r ...
- Android studio快捷键总结
功能 快捷键 功能 快捷键 格式化代码 command + alt + L 运行程序到设备 Ctrl + R 导包.修正 alt + enter 运行Debug到设备 Ctrl + D 复 ...
- EF框架中加子类后出现列名 'Discriminator' 无效问题