主要内容

matchScans

估计两个激光扫描之间的姿势

描述

例子

构成= matchScans (currScanrefScan)查找引用之间的相对位姿lidarScan和一个电流lidarScan对象使用正态分布变换(NDT)。

例子

构成= matchScans (currRangescurrAnglesrefRangesrefAngles)找到指定为范围和角度的两个激光扫描之间的相对姿态。

构成统计数据) = matchScans (___)使用前面的输入参数返回关于扫描匹配结果的额外统计信息。

___) = matchScans (___、名称、值)指定由一个或多个指定的附加选项名称,值对参数。

例子

全部折叠

创建参考激光雷达扫描使用lidarScan.指定范围和角度为向量。

refRanges = 5 * 1 (1300);refAngles = linspace(-π/ 2π/ 2300);refScan = lidarScan (refRanges refAngles);

使用transformScan(机器人系统工具箱)函数,生成第二次激光雷达扫描x, y偏置的(0.5, 0.2)

currScan = transformScan(refScan,[0.5 0.2 0]);

匹配参考扫描和第二次扫描,估计它们之间的位姿差异。

构成= matchScans (currScan refScan);

使用transformScan函数通过使用相对位姿差将第二次扫描转换为第一次扫描的帧来对齐扫描。绘制原始扫描和对齐扫描。

currScan2 = transformScan (currScan,姿势);次要情节(2,1,1);持有情节(currScan)情节(refScan)标题(“原始扫描”)举行次要情节(2,1,2);持有情节(currScan2)情节(refScan)标题(“对齐扫描”) xlim([0 5])保持

图中包含2个轴对象。标题为“原始扫描”的轴对象1包含2个类型为line的对象。标题为“对齐扫描”的轴对象2包含2个类型为line的对象。

本示例使用“fminunc”求解算法执行扫描匹配。此求解器算法需要一个Optimization Toolbox™许可证。

指定参考激光扫描作为范围和角度。

refRanges = 5 * 1 (1300);refAngles = linspace(-π/ 2π/ 2300);

使用transformScan(机器人系统工具箱)函数,产生第二次激光扫描x, y偏置的(0.5, 0.2)

[currRanges,currAngles] = transformScan(refRanges,refAngles,[0.5 0.2 0]);

匹配参考扫描和第二次扫描,估计它们之间的位姿差异。

构成= matchScans (currRanges currAngles、refRanges refAngles,“SolverAlgorithm”“fminunc”);

通过给出初始姿态估计来改进估计。

构成= matchScans (currRanges currAngles、refRanges refAngles,“SolverAlgorithm”“fminunc”“InitialPose”-0.4 - -0.1 [0]);

使用transformScan函数通过使用相对位姿差将第二次扫描转换为第一次扫描的帧来对齐扫描。绘制原始扫描和对齐扫描。

[currRanges2, currAngles2] = transformScan (currRanges currAngles,姿势);[x1, y1] = pol2cart(refAngles, reranges); / /刷新图片[x2, y2] = pol2cart(currAngles,currRanges);[x3, y3] = pol2cart(currAngles2,currRanges2);次要情节(1、2、1)情节(x1, y1,“o”x2, y2,“* r”)标题(“原始扫描”次要情节(1、2、2)情节(x1, y1,“o”x3 y3,“* r”)标题(“对齐扫描”)

图中包含2个轴对象。标题为“原始扫描”的轴对象1包含2个类型为line的对象。标题为“对齐扫描”的轴对象2包含2个类型为line的对象。

输入参数

全部折叠

当前激光雷达扫描读数,指定为lidarScan对象。

你的激光雷达扫描可以包含值,但算法会忽略它们。

参考激光雷达扫描读数,指定为lidarScan对象。

你的激光雷达扫描可以包含值,但算法会忽略它们。

当前激光扫描范围,指定为矢量。距离是指从激光传感器测量到的物体的距离。

你的激光扫描范围可以包含值,但算法会忽略它们。

当前激光扫描角度,指定为弧度矢量。角度是作为相应距离测量的方向给出的。

参考激光扫描范围,指定为以米为单位的矢量。距离是指从激光传感器测量到的物体的距离。

你的激光扫描范围可以包含值,但算法会忽略它们。

参考激光扫描角度,指定为弧度矢量。角度是作为相应距离测量的方向给出的。

名称-值参数

指定可选的逗号分隔的对名称,值参数。的名字参数名和价值为对应值。的名字必须出现在引号内。可以以任意顺序指定多个名称和值对参数Name1, Value1,…,的家

例子:“InitialPose”,[1 1π/ 2]

优化算法,指定为“信赖域”“fminunc”.使用“fminunc”需要一个Optimization Toolbox™许可证。

相对于参考激光扫描的当前位姿的初始猜想,指定为逗号分隔对组成“InitialPose”和一个(x yθ)向量。(x, y)平移单位是米和吗θ是以弧度为单位的旋转。

单元格边的长度,单位为米,指定为逗号分隔对,由“CellSize”和一个数字标量。matchScans使用单元格大小离散NDT算法的空间。

调整单元格大小对于正确使用NDT算法非常重要。最佳单元格大小取决于输入扫描和机器人的环境。更大的细胞尺寸可能导致较不准确的匹配,采样较差的区域。更小的单元需要更多的内存和更少的后续扫描差异。传感器噪声也会对小单元的算法产生影响。选择适当的单元格大小取决于环境和输入数据的规模。

最大迭代次数,由逗号分隔对组成“MaxIterations”和一个标量整数。更多的迭代会导致更精确的姿态估计,但代价是更长的执行时间。

NDT评分变化的下界,指定为逗号分隔对,由“ScoreTolerance”和一个数字标量。NDT评分存储在分数输出场统计数据结构。在迭代之间,如果分数的变化小于这个公差,算法将收敛到一个解决方案。容忍度越小,姿态估计越准确,但执行时间越长。

输出参数

全部折叠

当前扫描相对于参考扫描的姿态,返回为(x yθ),在那里(x, y)平移单位是米和吗θ是以弧度为单位的旋转。

扫描匹配统计信息,返回如下字段的结构:

  • 分数-数字标量表示扫描匹配时的NDT评分。这个分数是对转换后的当前扫描与参考扫描匹配的可能性的估计。分数总是非负。分数越大表示匹配越好。

  • 黑森-3 × 3矩阵表示NDT代价函数在给定处的Hessian构成解决方案。Hessian被用作与姿态估计相关的不确定性的指标。

参考文献

P.比伯和W.斯特拉瑟。正态分布变换:激光扫描匹配的新方法。智能机器人与系统论文集.2003.

[2] Magnusson,马丁。三维正态分布变换——配准、表面分析和环路检测的有效表示。博士学位论文。Örebro大学科技学院,2009。

扩展功能

介绍了R2019b