使用2D激光雷达的SLAM(Matlab代码实现)

     目录

💥1 概述

📚2 运行结果

🎉3 参考文献

👨‍💻4 Matlab代码

💥1 概述

SLAM (simultaneous localization and mapping),也称为CML (Concurrent Mapping and Localization), 即时定位与地图构建,或并发建图与定位。问题可以描述为:将一个机器人放入未知环境中的未知位置,是否有办法让机器人一边逐步描绘出此环境完全的地图,同时一边决定机器人应该往哪个方向行进。

例如扫地机器人就是一个很典型的SLAM问题,所谓完全的地图(a consistent map)是指不受障碍行进到房间可进入的每个角落。

SLAM最早由Smith、Self和Cheeseman于1988年提出。

由于其重要的理论与应用价值,被很多学者认为是实现真正全自主移动机器人的关键。

当你来到一个陌生的环境时,为了迅速熟悉环境并完成自己的任务(比如找饭馆,找旅馆),你应当做以下事情:

a.用眼睛观察周围地标如建筑、大树、花坛等,并记住他们的特征(特征提取)

b.在自己的脑海中,根据双目获得的信息,把特征地标在三维地图中重建出来(三维重建)

c.当自己在行走时,不断获取新的特征地标,并且校正自己头脑中的地图模型(bundle adjustment or EKF)

d.根据自己前一段时间行走获得的特征地标,确定自己的位置(trajectory)

e.当无意中走了很长一段路的时候,和脑海中的以往地标进行匹配,看一看是否走回了原路(loop-closure detection)。实际这一步可有可无。

以上五步是同时进行的,因此是simultaneous localization and mapping。

📚2 运行结果

主函数部分代码:

clear; close all; clc;


%cfig = figure('Position', [10,10,1280,1080]);
cfig = figure(1);


% Lidar parameters
lidar = SetLidarParameters();


% Map parameters
borderSize      = 1;            % m
pixelSize       = 0.2;          % m
miniUpdated     = false;        % 
miniUpdateDT    = 0.1;          % m
miniUpdateDR    = deg2rad(5);   % rad
% If the robot has moved 0.1 m or rotated 5 degree from last key scan, 
% we would add a new key scan and update the map


% Scan matching parameters
fastResolution  = [0.05; 0.05; deg2rad(0.5)]; % [m; m; rad]
bruteResolution = [0.01; 0.01; deg2rad(0.1)]; % not used




% Load lidar data
lidar_data = load('dataset/horizental_lidar.mat');
N = size(lidar_data.timestamps, 1);


% Create an empty map
map.points = [];
map.connections = [];
map.keyscans = [];
pose = [0; 0; 0];
path = pose;


% Here we go!!!!!!!!!!!!!!!!!!!!
for scanIdx = 1 : 1 : N
    
    disp(['scan ', num2str(scanIdx)]);
    
    % Get current scan [x1,y1; x2,y2; ...]
    time = lidar_data.timestamps(scanIdx) * 1e-9;
    scan = ReadAScan(lidar_data, scanIdx, lidar, 24);
    
    % If it's the first scan, initiate
    if scanIdx == 1
        map = Initialize(map, pose, scan);
        miniUpdated = true;
        continue;
    end
    
    % ===== Matching current scan to local map ============
    % 1. If we executed a mini update in last step, we shall update the
    %    local points map and local grid map (coarse)
    if miniUpdated
        localMap = ExtractLocalMap(map.points, pose, scan, borderSize);
        gridMap1 = OccuGrid(localMap, pixelSize);
        gridMap2 = OccuGrid(localMap, pixelSize/2);
    end
    
    % 2. Predict current pose using constant velocity motion model
    if scanIdx > 2
        pose_guess = pose + DiffPose(path(:,end-1), pose);
    else
        pose_guess = pose;
    end
        
    % 3. Fast matching
    if miniUpdated
        [pose, ~] = FastMatch(gridMap1, scan, pose_guess, fastResolution);
    else
        [pose, ~] = FastMatch(gridMap2, scan, pose_guess, fastResolution);
    end
    
    % 4. Refine the pose using smaller pixels
    % gridMap = OccuGrid(localMap, pixelSize/2);
    [pose, hits] = FastMatch(gridMap2, scan, pose, fastResolution/2);
    %----------------------------------------------------------------------
    
    
    % Execute a mini update, if the robot has moved a certain distance
    dp = abs(DiffPose(map.keyscans(end).pose, pose));
    if dp(1)>miniUpdateDT || dp(2)>miniUpdateDT || dp(3)>miniUpdateDR
        miniUpdated = true;
        [map, pose] = AddAKeyScan(map, gridMap2, scan, pose, hits,...
                        pixelSize, bruteResolution, 0.1, deg2rad(3));
    else
        miniUpdated = false;
    end    
    path = [path, pose];      
    
    
    % ===== Loop Closing =========================================
%     if miniUpdated
%         if TryLoopOrNot(map)
%             map.keyscans(end).loopTried = true;
%             map = DetectLoopClosure(map, scan, hits, 4, pi/6, pixelSize);
%         end
%     end
    
    %----------------------------------------------------------------------
    
    % Plot
    if mod(scanIdx, 30) == 0
        PlotMap(cfig, map, path, scan, scanIdx);
    end
    
end

🎉3 参考文献

[1]赵一鸣,李艳华,商雅楠,李静,于勇,李凉海.激光雷达的应用及发展趋势[J].遥测遥控,2014,35(05):4-22.

部分理论引用网络文献,若有侵权联系博主删除。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MATLAB中,激光雷达SLAM(Simultaneous Localization and Mapping)是通过使用激光雷达传感器来同时定位和构建地图的技术。激光雷达SLAM在机器人导航和自主驾驶等领域具有重要的应用。 在MATLAB中,可以使用Robotics System Toolbox来实现激光雷达SLAM。该工具箱提供了一组函数和类,用于处理激光雷达数据、建立地图和执行定位。 要在MATLAB中进行激光雷达SLAM,您可以按照以下步骤进行操作: 1. 导入激光雷达数据:使用`rosbag`函数导入保存有激光雷达数据的ROS包,或者使用`laserscan`函数直接加载激光雷达数据。 2. 预处理激光雷达数据:使用`preprocessLidarData`函数进行激光雷达数据的去噪处理、重采样和点云滤波。 3. 构建激光雷达地图:使用`occupancyMap`函数初始化一个占据栅格地图对象,并使用`insertRay`函数将激光雷达数据插入地图中。 4. 运行激光雷达SLAM算法:使用`slamAlgorithm`函数以及其他相关函数(如`updatePose`和`updateMap`)执行激光雷达SLAM算法,同时更新机器人的姿态和地图。 5. 可视化SLAM结果:使用`show`函数可视化机器人的轨迹、地图以及激光雷达数据。 请注意,以上步骤仅为激光雷达SLAM的一个基本流程示例,具体的实现方式可能会因应用场景和实际需求而有所不同。在MATLAB的官方文档和示例中,您可以找到更详细的教程和代码示例,以帮助您更好地理解和实现激光雷达SLAM。<span class="em">1</span> #### 引用[.reference_title] - *1* [python编写的2D激光扫描SLAM程序](https://download.csdn.net/download/zhwb9190/16674134)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值