多机器人激光雷达测绘

5次观看(过去30天)
机器人
机器人 2021年1月2日
评论道: 机器人2021年1月4日
你好,
我想创建一个区域的地图使用多个机器人,它们有激光雷达传感器。我已经搜索和学习了它是如何工作的matlab例子,并试图理解他们改变这些例子。
我只是想让你给我一个/任何建议,因为我是新的SLAM算法。
2的评论
机器人
机器人 2021年1月4日
我已经根据我的情况更改了“MappingWithKnownPosesDiffDriveExample”代码如下。我找不到激光雷达的例子,但距离传感器也可以。
在这张地图上,我的机器人可以走三条不同的路径。现在我可以用不同的路径成功地运行这段代码了。(详见附件截图)
我想做的是:机器人将一个接一个地从起点出发,每个机器人将采取不同的可能路径并进行映射。之后,这些不同道路的地图将被合并。(ps:我有无限的机器人)
我会很感激你为实现我的目标所做的任何帮助。提前谢谢:)
形象= imread (“threeWay27by26.png”);%选择。png文件作为映射
grayimage = rgb2gray(图片);
Bwimage =灰度图像< 0.5;
refMap = binaryOccupancyMap (bwimage, 1);
refFigure =图(“名字”,“SimpleMap”);
显示(refMap);
[mapdimx, mapdimy] =大小(grayimage);
地图= binaryOccupancyMap (mapdimy mapdimx 10);
mapFigure =图(“名字”,“未知的地图”);
显示(地图);
diffDrive = differentialDriveKinematics (“VehicleInputs”,“VehicleSpeedHeadingRate”);
控制器= controllerPurePursuit (“DesiredLinearVelocity”2,“MaxAngularVelocity”3);
传感器= rangeSensor;
传感器。范围= (0 05);
%以下的路径需要根据所使用的地图更新
Path1 = [1 13;3 12;5 14.5;7 11.5;11 13;10.5 20;14 22;15 19;18日20);
Path2 = [1 13;3 12;5 14.5;7 11.5;11 13;12日12;13 14;16 13;19日14];
Path3 = [1 13;3 12;5 14.5;7 11.5;11 13;10.5 6;14个4.5;16 8;18 6];
路径= path1;%选择路径将用于映射(path1或path2或path3)
图(refFigure);
持有
情节(路径(:1),路径(:,2),“啊——”);
持有
控制器。路点=路径;
initPose = [path(1,1) path(1,2), pi/2];
目标= [path(end,1) path(end,2)]';
姿势(:1)= initPose ';
exampleHelperDiffDriveCnt (diffDrive控制器,initPose,目标,refMap,地图,refFigure, mapFigure,传感器)
函数exampleHelperDiffDriveCnt (diffDrive ppControl initPose,目标,map1, map2,图一,图二,激光雷达)
sampleTime = 0.05;%采样时间[s]
t = 0: sampleTime: 100;%的时间数组
提出了= 0(3元素个数(t));%构成矩阵
姿势(:1)= initPose ';
设置迭代率
r = rateControl (1 / sampleTime);
从数字中找出坐标轴
ax₁= fig1.CurrentAxes;
ax2 = fig2.CurrentAxes;
idx = 1:元素个数(t)
位置=姿势(:,idx) ';
currPose =位置(1:2);
%如果车辆在0.2米的公差内到达目标位置,则结束
dist =标准(目标-currPose);
如果(dist <。2)
disp (“目标位置到达”
打破
结束
通过测量传感器来更新地图
图(2)
[范围,角度]=激光雷达(位置,map1);
扫描= lidarScan(范围、角度);
validScan = removeInvalidData(扫描,“RangeLimits”[0, lidar.Range (2)));
insertRay (map2位置、validScan lidar.Range (2));
显示(map2);
运行Pure Pursuit控制器并将输出转换为车轮速度。
[vRef, wRef] = ppControl(姿势(:,idx));
执行正向离散积分步骤
vel =导数(diffDrive, pose (:,idx), [vRef wRef]);
pose (:,idx+1) = pose (:,idx) + vel*sampleTime;
%更新可视化
plotTrvec = [pose (1:2, idx+1);0);
plotRot = axang2quat([0 0 1 pose (3, idx+1)]);
删除最后一个机器人的图像,以防止显示多个机器人
如果idx > 1
项=得到(ax₁,“孩子”);
(1)删除(项目);
结束
在已知地图上绘制机器人
plotRot plotTransforms (plotTrvec ',“MeshFilePath”,“groundvehicle.stl”,“视图”,“二维”,“FrameSize”, 1“父”、ax₁);
在新地图上绘制机器人
plotRot plotTransforms (plotTrvec ',“MeshFilePath”,“groundvehicle.stl”,“视图”,“二维”,“FrameSize”, 1“父”, ax2);
%等待以适当的速度迭代
等待(r);
结束
结束

登录发表评论。

答案(0)

社区寻宝

在MATLAB中央找到宝藏,并发现社区可以如何帮助你!

开始狩猎!