利用激光雷达扫描实现同步定位和绘图(SLAM)
从文件加载激光扫描数据
负载( 'offlineSlamData.mat' );
运行SLAM算法,构建优化地图并绘制机器人轨迹
最大激光雷达范围=8; mapResolution=20; slamAlg=lidarSLAM(mapResolution,maxLidarRange);
砰砰声。 环路关闭阈值=210; 砰砰声。 环路闭合搜索半径=8;
通过最初的10次扫描观察地图构建过程
对于 i=1:10 [isScanAccepted,loopClosureInfo,optimizationInfo]=添加扫描(slamAlg,扫描{i}); 如果 isScanAccepted(扫描接受) fprintf(打印)( '添加了扫描%d\n' ,i); 结束 结束
添加了扫描1 添加扫描2 添加扫描3 已添加扫描4 添加了扫描5 添加了扫描6 添加扫描7 添加了扫描8 添加了扫描9 添加扫描10
图形; 显示(slamAlg); 标题({ “环境地图” , '初始10次扫描的姿势图' });
观察回路闭合的效果和优化过程
firstTimeLCDetected=false; 图形; 对于 i=10:长度(扫描) [isScanAccepted,loopClosureInfo,optimizationInfo]=addScan(slamAlg,扫描{i}); 如果 ~已扫描接受 持续 ; 结束 %如果您想查看 %完成地图构建过程,删除下面的if条件 如果 optimizationInfo。 已执行&&~firstTimeLCDetected 显示(slamAlg, “姿势” , “关闭” ); 持有 在 ; 显示(slamAlg.PoseGraph); 持有 远离的 ; firstTimeLCDetected=true; 刷新屏幕 结束 结束 标题( '第一个循环闭合' );
机器人构造的地图和轨迹可视化
图形 显示(slamAlg); 标题({ “最终环境地图” , “机器人轨迹” });
目视检查与原始平面图相比的已建地图
构建占用率网格图
[scans,optimizedPoses]=扫描和姿势(slamAlg); map=buildMap(扫描、优化姿势、mapResolution、maxLidarRange);
图形; 显示(地图); 持有 在 显示(slamAlg.PoseGraph, “ID” , “关闭” ); 持有 远离的 标题( “使用激光雷达SLAM构建的占用网格图” );