[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相机 ...
随机推荐
- Codeforces Round #243 (Div. 2) C. Sereja and Swaps
由于n比较小,直接暴力解决 #include <iostream> #include <vector> #include <algorithm> #include ...
- Leetcode Remove Nth Node From End of List
Given a linked list, remove the nth node from the end of list and return its head. For example, Give ...
- 【HDU】4089 Activation
http://acm.hdu.edu.cn/showproblem.php?pid=4089 题意: 有n个人排队等着在官网上激活游戏.主角排在第m个. 对于队列中的第一个人.有以下情况:1.激活失败 ...
- Android --RatingBar的使用
1.效果图
- BZOJ4546: codechef XRQRS
Description 给定一个初始时为空的整数序列(元素由1开始标号)以及一些询问: 类型1:在数组后面就加入数字x. 类型2:在区间L…R中找到y,最大化(x xor y). 类型3:删除数组最后 ...
- 彩色照片转换为黑白照片(Color image converted to black and white picture)
This blog will be talking about the color image converted to black and white picture. The project st ...
- JS引用另外JS文件的顺序问题。
1.在a.js中可以引用b.js文件,这样就可以在网页中只引用a.js文件,从而可以使用a.js和b.js文件中的所有方法. 引用格式如下:document.write('<script typ ...
- 运行java的class文件方法详解
一.运行class文件 执行带main方法的class文件,命令行为:java <CLASS文件名>注意:CLASS文件名不要带文件后缀.class 例如: 复制代码代码如下: java ...
- [转]B树、B-树、B+树、B*树
题记:转一篇很直观介绍各类B树的文章. B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树, ...
- java 反取字符串
public class demo2 { /** * 2 : 将字符串反取出来 新中国好 好国中新 */ public static void main(String[] args) { String ...