[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相机 ...
随机推荐
- sublime注释插件与javascript注释规范
前言 代码中注释是不可少的,即使是自己写的代码,过了一段时间之后再重看,如果没有注释记录的话,可能会想不到当初是这样实现的,尤其是在业务逻辑比较复杂的项目,注释变得尤为重要.怎么优雅的写有用的注释呢? ...
- Node.js 手册查询-5-Ejs 方法
express 中使用 //设置模板目录 app.set('views', path.join(__dirname, 'views')); //设置模板引擎 app.set('view engine' ...
- ACM Arithmetic Expression
Description Given N arithmetic expressions, can you tell whose result is closest to 9? Input Line 1: ...
- Android -- 简单广播接收与发送(1)
1. 效果图
- Android --自定义简单Toast
1. 效果图
- Maven_pom.xml介绍
Maven的pom.xml介绍 6.1 简介 pom.xml文件是Maven进行工作的主要配置文件.在这个文件中我们可以配置Maven项目的groupId.artifactId和version ...
- 自己签发免费ssl证书
自己制作ssl证书:自己签发免费ssl证书,为nginx生成自签名ssl证书 这里说下Linux 系统怎么通过openssl命令生成 证书. 首先执行如下命令生成一个keyopenssl genrsa ...
- power 做表
drop table "USER" cascade constraints; /*================================================= ...
- Android中Activity的四种启动模式
要了解Android的启动模式先要了解一下Activity的管理方式: 1.Activity的管理机制 Android的管理主要是通过Activity栈来进行的.当一个Activity启动时,系统根据 ...
- thinkphp添加空数据的解决办法
thinkphp真是个麻烦的东西,各种小问题,其中字段映射的表单名不能与数据库的字段名称相同,否则会添加空数据! 还有自动完成的名称要与字段映射后的名称相同,否则自动完成不会起作用! 还有自动验证的字 ...