matchScans

估计两次激光扫描之间的位姿

描述

姿势= matchScans(currScanrefScan找到一个参考之间的相对位姿lidarScan和电流lidarScan使用正态分布变换(NDT)。

姿势= matchScans(currRangescurrAnglesrefRangesrefAngles查找指定为范围和角度的两次激光扫描之间的相对位姿。

[姿势统计)= matchScans (___返回有关使用先前输入参数的扫描匹配结果的其他统计资料。

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

例子

全部折叠

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

refRanges = 5 * 1 (1300);refAngles = linspace(-pi / 2,PI / 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])保持

本例使用'fminunc'求解算法来执行扫描匹配。此求解算法需要优化工具箱™许可证。

指定一个基准激光扫描作为范围和角度。

refRanges = 5 * 1 (1300);refAngles = linspace(-pi / 2,PI / 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(折光,折光);[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')标题(“对齐扫描”

输入参数

全部折叠

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

您的激光雷达扫描可以包含为NaN值,但该算法忽略它们。

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

您的激光雷达扫描可以包含为NaN值,但该算法忽略它们。

当前激光扫描范围,指定为矢量。范围被给定为距离从激光传感器测量的对象。

您的激光扫描范围可以包含为NaN值,但该算法忽略它们。

当前的激光扫描角度,规定为以弧度为单位的矢量。角度被赋予与相应的范围测量的取向。

基准激光扫描范围,指定为以米为单位的矢量。范围被给定为距离从激光传感器测量的对象。

您的激光扫描范围可以包含为NaN值,但该算法忽略它们。

基准激光扫描角度,规定为以弧度为单位的矢量。角度被赋予与相应的范围测量的取向。

名称-值对的观点

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

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

优化算法,指定为任意一个“信赖域”“fminunc”。使用“fminunc”需要优化工具箱™许可证。

电流相对于基准激光扫描的姿态的初始猜测,指定为逗号分隔的一对组成的“InitialPose”[X Y的2θ向量。(x, y)单位是米和吗THETA是弧度的旋转。

在米的小区边的长度,指定为逗号分隔的一对组成的“CELLSIZE”和一个数字标。matchScans采用单元尺寸离散的无损检测算法的空间。

调整单元大小对于正确使用NDT算法非常重要。最佳的单元大小取决于输入扫描和机器人的环境。较大的单元格大小可能导致与采样率较低的区域的匹配精度较低。更小的单元尺寸需要更多的内存和更少的后续扫描之间的变化。传感器噪声对小单元尺寸算法也有影响。选择适当的单元大小取决于环境和输入数据的规模。

最大迭代次数,指定为逗号分隔的一对组成的“MaxIterations”一个标量整数。迭代次数越多,姿态估计越精确,但代价是执行时间越长。

下界在NDT评分的变化,指定为逗号分隔的一对组成的“ScoreTolerance”和一个数字标。无损检测得分存储在得分了输出域统计结构体。迭代之间,如果得分变化较小于此公差,算法收敛到一个解决方案。较小的公差结果更准确的姿势估计,但需要较长的执行时间。

输出参数

全部折叠

当前扫描相对于构成对参考扫描,返回[X Y的2θ,在那里(x, y)单位是米和吗THETA是弧度的旋转。

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

  • 得分了- 表示NDT得分,同时执行扫描匹配数值标量。这个得分是经变换的当前扫描的参考扫描相匹配的似然的估计。得分了总是非负。分数越大,说明匹配得越好。

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

参考文献

[1]拜伯,P.,和W.斯特拉瑟。“正态分布变换:一种新的方法,以激光扫描匹配。”智能机器人与系统论文集。2003.

[2]Magnusson,马丁。“三维正态分布变换——一种有效的配准、表面分析和环路检测的表示方法。”PhD Dissertation. Örebro University, School of Science and Technology, 2009.

扩展功能

介绍了在R2019b