估计机器人姿态与扫描匹配

本实施例表明如何使用正态分布变换(NDT)算法[1],以匹配两个激光扫描。扫描匹配的目标是找到的相对姿势(或变换),其中取在扫描两个机器人位置之间。该扫描可以根据自己的重叠特征的形状排列。

为了估计这个姿势,NDT细分激光扫描为二维细胞和每个小区被分配了相应的正常分布。分布表示测量在该细胞中的点的概率。一旦概率密度的计算中,优化方法找到的当前激光扫描与所述参考扫描激光之间的相对姿势。为了加快该方法的收敛,可以提供姿态的初始猜测。典型地,机器人里程计用于提供初始估计。

如果你申请的扫描匹配扫描序列,你可以用它来恢复机器人穿过环境的粗略地图。扫描匹配也起着其它的应用,诸如位置跟踪和同步定位和地图创建(SLAM)至关重要的作用。

从文件加载激光扫描数据

加载lidarScans.mat

激光扫描数据是通过在室内环境中的移动机器人收集。的区域的近似平面布置图,通过所述空间中的机器人的路径一起被显示在下面的图像。

绘制两个激光扫描

接两个激光扫描于从扫描匹配lidarScans。他们应该接近,因此序列中的共同特点。

referenceScan = lidarScans(180);currentScan = lidarScans(202);

显示两个扫描。注意事项有平移和旋转偏移,但某些功能仍然匹配。

currScanCart = currentScan.Cartesian;refScanCart = referenceScan.Cartesian;图图(refScanCart(:,1),refScanCart(:,2),数 'k'。);保持情节(currScanCart(:,1),currScanCart(:,2),'R'。);传说(“参考激光扫描”“当前激光扫描”'位置''西北');

运行扫描匹配算法和显示转化扫描

通过两次扫描来扫描匹配功能。matchScans计算当前扫描的相对于所述参考扫描的相对姿势。

变换= matchScans(currentScan,referenceScan)
变换=1×30.5348 -0.0065 -0.0336

在视觉上确认的相对姿势被正确计算的,使用所计算出的姿势变换当前扫描transformScan。此转化的激光扫描可以被用于可视化的结果。

transScan = transformScan(currentScan,变换);

显示参考扫描沿着变换后的电流的激光扫描。如果扫描匹配成功,两次扫描应该很好对齐。

图图(refScanCart(:,1),refScanCart(:,2),数 'k'。);保持transScanCart = transScan.Cartesian;情节(transScanCart(:,1),transScanCart(:,2),'R'。);传说(“参考激光扫描”“转化的当前激光扫描”'位置''西北');

建立使用占用栅格地图迭代扫描匹配

如果你申请的扫描匹配扫描序列,你可以用它来恢复环境的粗略地图。使用occupancyMap类构建环境的概率占用栅格地图。

对于15米长15米范围内创建一个占用网格对象。设置地图的起源为[-7.5 -7.5。

MAP = occupancyMap(15,15,20);map.GridLocationInWorld = [-7.5 -7.5]
MAP = occupancyMap与属性:XWorldLimits:[-7.5000 7.5000] YWorldLimits:[-7.5000 7.5000] OccupiedThreshold:0.6500 FreeThreshold:0.2000 ProbabilitySaturation:[0.0010 0.9990] GridLocationInWorld:[-7.5000 -7.5000]数据类型: '双' 默认值:0.5000分辨率:20 GridSize:[300 300] XLocalLimits:[0 15] YLocalLimits:[0 15] GridOriginInLocal:[0 0] LocalOriginInWorld:[-7.5000 -7.5000]

预先分配的阵列来捕捉机器人的绝对移动。初始化第一姿态为[0 0 0]。所有其他的姿势相对于所述第一测量扫描。

numScans = numel(lidarScans);initialPose = [0 0 0];poseList =零(numScans,3);poseList(1,:) = initialPose;变换= initialPose;

创建用于处理扫描和映射区域的循环。激光扫描在对处理。限定第一扫描作为参考扫描和第二扫描的当前扫描。然后将两次扫描被传递给扫描匹配算法和两次扫描之间的相对姿态计算。该exampleHelperComposeTransform函数用于计算累计绝对机器人姿态的。然后用绝对的机器人出现在沿扫描数据可以被传递到insertRay入住电网的功能。

通过所有的扫描%循环,并计算它们之间的相对位姿对于IDX = 2:numScans%进程对中的数据。referenceScan = lidarScans(IDX-1);currentScan = lidarScans(IDX);%执行扫描匹配。请注意,扫描角度保持不变,做%不必重新计算。为了提高准确性,设置最大%迭代到500使用人数从过去的变换%迭代作为初始估计。[变换,统计] = matchScans(currentScan,referenceScan,...'MaxIterations',500,'InitialPose',转变);%的|分数|在统计结构的一个很好的迹象扫描匹配%质量。如果stats.Score / currentScan.Count <1.0 DISP([“低扫描匹配率指数”num2str(IDX)”。得分='num2str(stats.Score)'']);结束%维护机器人的姿势列表。absolutePose = exampleHelperComposeTransform(poseList(IDX-1,:),变换);poseList(IDX,:) = absolutePose;%整合当前的激光扫描到概率占用%的网格。insertRay(地图,absolutePose,currentScan,10);结束

可视化地图

可视化填充了激光扫描占用栅格地图。

图显示(地图);标题(“占用栅格地图用扫描匹配结果建”);

画出通过扫描匹配算法中计算的绝对机器人姿势。这表明,机器人率先通过了环境的地图的路径。

保持情节(poseList(:,1),poseList(:,2),“博”'显示名称'“估计机器人的位置”);传说('表演''位置''西北'

参考

[1] P.拜伯,W.斯特拉瑟,“正常的分布变换:一种新的方法,以激光扫描匹配”,在IEEE / RSJ国际会议论文集上智能机器人和系统(IROS),2003,第2743-2748。