scenario = robotScenario(UpdateRate=5);
floorColor = [0.5882 0.2941 0];
addMesh(scenario,"Plane",Position=[5 5 0],Size=[10 10],Color=floorColor);
wallHeight = 1;
wallWidth = 0.25;
wallLength = 10;
wallColor = [1 1 0.8157];
% Add outer walls.
addMesh(scenario,"Box",Position=[wallWidth/2, wallLength/2, wallHeight/2], ...
Size=[wallWidth, wallLength, wallHeight], Color=wallColor,
IsBinaryOccupied=true);
addMesh(scenario,"Box",Position=[wallLength-wallWidth/2, wallLength/2,
wallHeight/2], ...
Size=[wallWidth, wallLength, wallHeight], Color=wallColor,
IsBinaryOccupied=true);
addMesh(scenario,"Box",Position=[wallLength/2, wallLength-wallWidth/2,
wallHeight/2], ...
Size=[wallLength, wallWidth, wallHeight], Color=wallColor,
IsBinaryOccupied=true);
addMesh(scenario,"Box",Position=[wallLength/2, wallWidth/2, wallHeight/2], ...
Size=[wallLength, wallWidth, wallHeight], Color=wallColor,
IsBinaryOccupied=true);
% Add inner walls.
addMesh(scenario,"Box",Position=[wallLength/8, wallLength/3, wallHeight/2],...
Size=[wallLength/4, wallWidth,
wallHeight],Color=wallColor,IsBinaryOccupied=true);
addMesh(scenario,"Box",Position=[wallLength/4, wallLength/3, wallHeight/2],...
Size=[wallWidth, wallLength/6,
wallHeight],Color=wallColor,IsBinaryOccupied=true);
addMesh(scenario,"Box",Position=[(wallLength-wallLength/4), wallLength/2,
wallHeight/2],...
Size=[wallLength/2, wallWidth,
wallHeight],Color=wallColor,IsBinaryOccupied=true);
addMesh(scenario,"Box",Position=[wallLength/2, wallLength/2, wallHeight/2],...
Size=[wallWidth, wallLength/3,
wallHeight],Color=wallColor,IsBinaryOccupied=true);
addMesh(scenario,"Box",Position=[(wallLength-wallLength/4), wallLength/2.5,
wallHeight/2],...
Size=[wallLength/3, wallWidth,
wallHeight],Color=wallColor,IsBinaryOccupied=true);
addMesh(scenario,"Box",Position=[(wallLength-wallLength/4), wallLength/2,
wallHeight/2],...
Size=[wallLength/3, wallWidth,
wallHeight],Color=wallColor,IsBinaryOccupied=true);
addMesh(scenario,"Box",Position=[(wallLength-wallLength/4), wallLength/2,
wallHeight/3.5],...
Size=[wallLength/2.5, wallWidth,
wallHeight],Color=wallColor,IsBinaryOccupied=true);
addMesh(scenario,"Box",Position=[wallLength/6, wallLength/3.5, wallHeight/4],...
Size=[wallWidth, wallLength/9,
wallHeight],Color=wallColor,IsBinaryOccupied=true);
addMesh(scenario,"Box",Position=[wallLength/7, wallLength/3, wallHeight/4],...
Size=[wallWidth, wallLength/9,
wallHeight],Color=wallColor,IsBinaryOccupied=true);
addMesh(scenario,"Box",Position=[wallLength/4, wallLength/5, wallHeight/7],...
Size=[wallWidth, wallLength/11,
wallHeight],Color=wallColor,IsBinaryOccupied=true);
addMesh(scenario,"Box",Position=[wallLength/3, wallLength/2, wallHeight/4],...
Size=[wallWidth, wallLength/3,
wallHeight],Color=wallColor,IsBinaryOccupied=true);
show3D(scenario);
lightangle(-45,30);
view(60,50);
map = binaryOccupancyMap(scenario,GridOriginInLocal=[-2 -2],...
MapSize=[15 15],...
MapHeightLimits=[0 3]);
inflate(map,0.3);
show(map)
startPosition = [1 1];
goalPosition = [8 8];
rng(100)
numnodes = 2000;
planner = mobileRobotPRM(map,numnodes);
planner.ConnectionDistance = 1;
waypoints = findpath(planner,startPosition,goalPosition);
%obtain binary grid
% Robot height from base.
robotheight = 0.12;
% Number of waypoints.
numWaypoints = size(waypoints,1);
% Robot arrival
time at first waypoint
. firstInTime = 0;
% Robot arrival
time at last waypoint
. lastInTime = firstInTime + (numWaypoints-1);
% Generate waypoint trajectory with waypoints from planned path.
traj = waypointTrajectory(SampleRate=10,...
TimeOfArrival=firstInTime:lastInTime, ...
Waypoints=[waypoints, robotheight*ones(numWaypoints,1)],
...
ReferenceFrame="ENU");
huskyRobot = loadrobot("clearpathHusky");
platform = robotPlatform("husky",scenario, RigidBodyTree=huskyRobot,...
BaseTrajectory=traj);
[ax,plotFrames] = show3D(scenario);
lightangle(-45,30)
view(60,50)
hold(ax,"on")
% pp3
plot(ax,waypoints(:,1),waypoints(:,2),"-ms",...
LineWidth=2,...
MarkerSize=4,...
MarkerEdgeColor="b",...
MarkerFaceColor=[0.5 0.5 0.5]);
hold(ax,"off")
setup(scenario)
% Control simulation rate at 20 Hz.
r = rateControl(20);
% Status of robot in simulation.
robotStartMoving = false;
while advance(scenario)
show3D(scenario,Parent=ax,FastUpdate=true);
waitfor(r);
currentPose = read(platform);
if ~any(isnan(currentPose))
% implies that robot is in the scene and performing simulation.
robotStartMoving = true;
if any(isnan(currentPose)) && robotStartMoving
% break, once robot reaches goal position.
break;
en
c2NlbmFyaW8gPSByb2JvdFNjZW5hcmlvKFVwZGF0ZVJhdGU9NSk7CmZsb29yQ29sb3IgPSBbMC41ODgyIDAuMjk0MSAwXTsKYWRkTWVzaChzY2VuYXJpbywiUGxhbmUiLFBvc2l0aW9uPVs1IDUgMF0sU2l6ZT1bMTAgMTBdLENvbG9yPWZsb29yQ29sb3IpOwp3YWxsSGVpZ2h0ID0gMTsKd2FsbFdpZHRoID0gMC4yNTsKd2FsbExlbmd0aCA9IDEwOwp3YWxsQ29sb3IgPSBbMSAxIDAuODE1N107CiUgQWRkIG91dGVyIHdhbGxzLgphZGRNZXNoKHNjZW5hcmlvLCJCb3giLFBvc2l0aW9uPVt3YWxsV2lkdGgvMiwgd2FsbExlbmd0aC8yLCB3YWxsSGVpZ2h0LzJdLCAuLi4KIFNpemU9W3dhbGxXaWR0aCwgd2FsbExlbmd0aCwgd2FsbEhlaWdodF0sIENvbG9yPXdhbGxDb2xvciwgCklzQmluYXJ5T2NjdXBpZWQ9dHJ1ZSk7CmFkZE1lc2goc2NlbmFyaW8sIkJveCIsUG9zaXRpb249W3dhbGxMZW5ndGgtd2FsbFdpZHRoLzIsIHdhbGxMZW5ndGgvMiwgCndhbGxIZWlnaHQvMl0sIC4uLgogU2l6ZT1bd2FsbFdpZHRoLCB3YWxsTGVuZ3RoLCB3YWxsSGVpZ2h0XSwgQ29sb3I9d2FsbENvbG9yLCAKSXNCaW5hcnlPY2N1cGllZD10cnVlKTsKYWRkTWVzaChzY2VuYXJpbywiQm94IixQb3NpdGlvbj1bd2FsbExlbmd0aC8yLCB3YWxsTGVuZ3RoLXdhbGxXaWR0aC8yLCAKd2FsbEhlaWdodC8yXSwgLi4uCiBTaXplPVt3YWxsTGVuZ3RoLCB3YWxsV2lkdGgsIHdhbGxIZWlnaHRdLCBDb2xvcj13YWxsQ29sb3IsIApJc0JpbmFyeU9jY3VwaWVkPXRydWUpOwphZGRNZXNoKHNjZW5hcmlvLCJCb3giLFBvc2l0aW9uPVt3YWxsTGVuZ3RoLzIsIHdhbGxXaWR0aC8yLCB3YWxsSGVpZ2h0LzJdLCAuLi4KIFNpemU9W3dhbGxMZW5ndGgsIHdhbGxXaWR0aCwgd2FsbEhlaWdodF0sIENvbG9yPXdhbGxDb2xvciwgCklzQmluYXJ5T2NjdXBpZWQ9dHJ1ZSk7CiUgQWRkIGlubmVyIHdhbGxzLgphZGRNZXNoKHNjZW5hcmlvLCJCb3giLFBvc2l0aW9uPVt3YWxsTGVuZ3RoLzgsIHdhbGxMZW5ndGgvMywgd2FsbEhlaWdodC8yXSwuLi4KIFNpemU9W3dhbGxMZW5ndGgvNCwgd2FsbFdpZHRoLCAKd2FsbEhlaWdodF0sQ29sb3I9d2FsbENvbG9yLElzQmluYXJ5T2NjdXBpZWQ9dHJ1ZSk7CmFkZE1lc2goc2NlbmFyaW8sIkJveCIsUG9zaXRpb249W3dhbGxMZW5ndGgvNCwgd2FsbExlbmd0aC8zLCB3YWxsSGVpZ2h0LzJdLC4uLgogU2l6ZT1bd2FsbFdpZHRoLCB3YWxsTGVuZ3RoLzYsIAp3YWxsSGVpZ2h0XSxDb2xvcj13YWxsQ29sb3IsSXNCaW5hcnlPY2N1cGllZD10cnVlKTsKYWRkTWVzaChzY2VuYXJpbywiQm94IixQb3NpdGlvbj1bKHdhbGxMZW5ndGgtd2FsbExlbmd0aC80KSwgd2FsbExlbmd0aC8yLCAKd2FsbEhlaWdodC8yXSwuLi4KIFNpemU9W3dhbGxMZW5ndGgvMiwgd2FsbFdpZHRoLCAKd2FsbEhlaWdodF0sQ29sb3I9d2FsbENvbG9yLElzQmluYXJ5T2NjdXBpZWQ9dHJ1ZSk7CmFkZE1lc2goc2NlbmFyaW8sIkJveCIsUG9zaXRpb249W3dhbGxMZW5ndGgvMiwgd2FsbExlbmd0aC8yLCB3YWxsSGVpZ2h0LzJdLC4uLgogU2l6ZT1bd2FsbFdpZHRoLCB3YWxsTGVuZ3RoLzMsIAp3YWxsSGVpZ2h0XSxDb2xvcj13YWxsQ29sb3IsSXNCaW5hcnlPY2N1cGllZD10cnVlKTsKYWRkTWVzaChzY2VuYXJpbywiQm94IixQb3NpdGlvbj1bKHdhbGxMZW5ndGgtd2FsbExlbmd0aC80KSwgd2FsbExlbmd0aC8yLjUsIAp3YWxsSGVpZ2h0LzJdLC4uLgogU2l6ZT1bd2FsbExlbmd0aC8zLCB3YWxsV2lkdGgsIAp3YWxsSGVpZ2h0XSxDb2xvcj13YWxsQ29sb3IsSXNCaW5hcnlPY2N1cGllZD10cnVlKTsKYWRkTWVzaChzY2VuYXJpbywiQm94IixQb3NpdGlvbj1bKHdhbGxMZW5ndGgtd2FsbExlbmd0aC80KSwgd2FsbExlbmd0aC8yLCAKd2FsbEhlaWdodC8yXSwuLi4KIFNpemU9W3dhbGxMZW5ndGgvMywgd2FsbFdpZHRoLCAKd2FsbEhlaWdodF0sQ29sb3I9d2FsbENvbG9yLElzQmluYXJ5T2NjdXBpZWQ9dHJ1ZSk7CmFkZE1lc2goc2NlbmFyaW8sIkJveCIsUG9zaXRpb249Wyh3YWxsTGVuZ3RoLXdhbGxMZW5ndGgvNCksIHdhbGxMZW5ndGgvMiwgCndhbGxIZWlnaHQvMy41XSwuLi4KIFNpemU9W3dhbGxMZW5ndGgvMi41LCB3YWxsV2lkdGgsIAp3YWxsSGVpZ2h0XSxDb2xvcj13YWxsQ29sb3IsSXNCaW5hcnlPY2N1cGllZD10cnVlKTsKYWRkTWVzaChzY2VuYXJpbywiQm94IixQb3NpdGlvbj1bd2FsbExlbmd0aC82LCB3YWxsTGVuZ3RoLzMuNSwgd2FsbEhlaWdodC80XSwuLi4KIFNpemU9W3dhbGxXaWR0aCwgd2FsbExlbmd0aC85LCAKd2FsbEhlaWdodF0sQ29sb3I9d2FsbENvbG9yLElzQmluYXJ5T2NjdXBpZWQ9dHJ1ZSk7CmFkZE1lc2goc2NlbmFyaW8sIkJveCIsUG9zaXRpb249W3dhbGxMZW5ndGgvNywgd2FsbExlbmd0aC8zLCB3YWxsSGVpZ2h0LzRdLC4uLgogU2l6ZT1bd2FsbFdpZHRoLCB3YWxsTGVuZ3RoLzksIAp3YWxsSGVpZ2h0XSxDb2xvcj13YWxsQ29sb3IsSXNCaW5hcnlPY2N1cGllZD10cnVlKTsKYWRkTWVzaChzY2VuYXJpbywiQm94IixQb3NpdGlvbj1bd2FsbExlbmd0aC80LCB3YWxsTGVuZ3RoLzUsIHdhbGxIZWlnaHQvN10sLi4uCiBTaXplPVt3YWxsV2lkdGgsIHdhbGxMZW5ndGgvMTEsIAp3YWxsSGVpZ2h0XSxDb2xvcj13YWxsQ29sb3IsSXNCaW5hcnlPY2N1cGllZD10cnVlKTsKYWRkTWVzaChzY2VuYXJpbywiQm94IixQb3NpdGlvbj1bd2FsbExlbmd0aC8zLCB3YWxsTGVuZ3RoLzIsIHdhbGxIZWlnaHQvNF0sLi4uCiBTaXplPVt3YWxsV2lkdGgsIHdhbGxMZW5ndGgvMywgCndhbGxIZWlnaHRdLENvbG9yPXdhbGxDb2xvcixJc0JpbmFyeU9jY3VwaWVkPXRydWUpOwpzaG93M0Qoc2NlbmFyaW8pOwpsaWdodGFuZ2xlKC00NSwzMCk7CnZpZXcoNjAsNTApOwptYXAgPSBiaW5hcnlPY2N1cGFuY3lNYXAoc2NlbmFyaW8sR3JpZE9yaWdpbkluTG9jYWw9Wy0yIC0yXSwuLi4KIE1hcFNpemU9WzE1IDE1XSwuLi4KIE1hcEhlaWdodExpbWl0cz1bMCAzXSk7CmluZmxhdGUobWFwLDAuMyk7CnNob3cobWFwKQpzdGFydFBvc2l0aW9uID0gWzEgMV07CmdvYWxQb3NpdGlvbiA9IFs4IDhdOwpybmcoMTAwKQpudW1ub2RlcyA9IDIwMDA7CnBsYW5uZXIgPSBtb2JpbGVSb2JvdFBSTShtYXAsbnVtbm9kZXMpOwpwbGFubmVyLkNvbm5lY3Rpb25EaXN0YW5jZSA9IDE7CndheXBvaW50cyA9IGZpbmRwYXRoKHBsYW5uZXIsc3RhcnRQb3NpdGlvbixnb2FsUG9zaXRpb24pOwolb2J0YWluIGJpbmFyeSBncmlkCiUgUm9ib3QgaGVpZ2h0IGZyb20gYmFzZS4Kcm9ib3RoZWlnaHQgPSAwLjEyOwolIE51bWJlciBvZiB3YXlwb2ludHMuCm51bVdheXBvaW50cyA9IHNpemUod2F5cG9pbnRzLDEpOwolIFJvYm90IGFycml2YWwgdGltZSBhdCBmaXJzdCB3YXlwb2ludC4KZmlyc3RJblRpbWUgPSAwOwolIFJvYm90IGFycml2YWwgdGltZSBhdCBsYXN0IHdheXBvaW50LgpsYXN0SW5UaW1lID0gZmlyc3RJblRpbWUgKyAobnVtV2F5cG9pbnRzLTEpOwolIEdlbmVyYXRlIHdheXBvaW50IHRyYWplY3Rvcnkgd2l0aCB3YXlwb2ludHMgZnJvbSBwbGFubmVkIHBhdGguCnRyYWogPSB3YXlwb2ludFRyYWplY3RvcnkoU2FtcGxlUmF0ZT0xMCwuLi4KIFRpbWVPZkFycml2YWw9Zmlyc3RJblRpbWU6bGFzdEluVGltZSwgLi4uCiBXYXlwb2ludHM9W3dheXBvaW50cywgcm9ib3RoZWlnaHQqb25lcyhudW1XYXlwb2ludHMsMSldLCAKLi4uCiBSZWZlcmVuY2VGcmFtZT0iRU5VIik7Cmh1c2t5Um9ib3QgPSBsb2Fkcm9ib3QoImNsZWFycGF0aEh1c2t5Iik7CnBsYXRmb3JtID0gcm9ib3RQbGF0Zm9ybSgiaHVza3kiLHNjZW5hcmlvLCBSaWdpZEJvZHlUcmVlPWh1c2t5Um9ib3QsLi4uCiBCYXNlVHJhamVjdG9yeT10cmFqKTsKW2F4LHBsb3RGcmFtZXNdID0gc2hvdzNEKHNjZW5hcmlvKTsKbGlnaHRhbmdsZSgtNDUsMzApCnZpZXcoNjAsNTApCmhvbGQoYXgsIm9uIikKJSBwcDMKcGxvdChheCx3YXlwb2ludHMoOiwxKSx3YXlwb2ludHMoOiwyKSwiLW1zIiwuLi4KIExpbmVXaWR0aD0yLC4uLgogTWFya2VyU2l6ZT00LC4uLgogTWFya2VyRWRnZUNvbG9yPSJiIiwuLi4KIE1hcmtlckZhY2VDb2xvcj1bMC41IDAuNSAwLjVdKTsKaG9sZChheCwib2ZmIikKc2V0dXAoc2NlbmFyaW8pCiUgQ29udHJvbCBzaW11bGF0aW9uIHJhdGUgYXQgMjAgSHouCnIgPSByYXRlQ29udHJvbCgyMCk7CiUgU3RhdHVzIG9mIHJvYm90IGluIHNpbXVsYXRpb24uCnJvYm90U3RhcnRNb3ZpbmcgPSBmYWxzZTsKd2hpbGUgYWR2YW5jZShzY2VuYXJpbykKIHNob3czRChzY2VuYXJpbyxQYXJlbnQ9YXgsRmFzdFVwZGF0ZT10cnVlKTsKIHdhaXRmb3Iocik7CiBjdXJyZW50UG9zZSA9IHJlYWQocGxhdGZvcm0pOwogaWYgfmFueShpc25hbihjdXJyZW50UG9zZSkpCiAlIGltcGxpZXMgdGhhdCByb2JvdCBpcyBpbiB0aGUgc2NlbmUgYW5kIHBlcmZvcm1pbmcgc2ltdWxhdGlvbi4KIHJvYm90U3RhcnRNb3ZpbmcgPSB0cnVlOwogZW5kCiBpZiBhbnkoaXNuYW4oY3VycmVudFBvc2UpKSAmJiByb2JvdFN0YXJ0TW92aW5nCiAlIGJyZWFrLCBvbmNlIHJvYm90IHJlYWNoZXMgZ29hbCBwb3NpdGlvbi4KIGJyZWFrOwogZW5kCmVu
scenario = robotScenario(UpdateRate=5);
floorColor = [0.5882 0.2941 0];
addMesh(scenario,"Plane",Position=[5 5 0],Size=[10 10],Color=floorColor);
wallHeight = 1;
wallWidth = 0.25;
wallLength = 10;
wallColor = [1 1 0.8157];
% Add outer walls.
addMesh(scenario,"Box",Position=[wallWidth/2, wallLength/2, wallHeight/2], ...
Size=[wallWidth, wallLength, wallHeight], Color=wallColor,
IsBinaryOccupied=true);
addMesh(scenario,"Box",Position=[wallLength-wallWidth/2, wallLength/2,
wallHeight/2], ...
Size=[wallWidth, wallLength, wallHeight], Color=wallColor,
IsBinaryOccupied=true);
addMesh(scenario,"Box",Position=[wallLength/2, wallLength-wallWidth/2,
wallHeight/2], ...
Size=[wallLength, wallWidth, wallHeight], Color=wallColor,
IsBinaryOccupied=true);
addMesh(scenario,"Box",Position=[wallLength/2, wallWidth/2, wallHeight/2], ...
Size=[wallLength, wallWidth, wallHeight], Color=wallColor,
IsBinaryOccupied=true);
% Add inner walls.
addMesh(scenario,"Box",Position=[wallLength/8, wallLength/3, wallHeight/2],...
Size=[wallLength/4, wallWidth,
wallHeight],Color=wallColor,IsBinaryOccupied=true);
addMesh(scenario,"Box",Position=[wallLength/4, wallLength/3, wallHeight/2],...
Size=[wallWidth, wallLength/6,
wallHeight],Color=wallColor,IsBinaryOccupied=true);
addMesh(scenario,"Box",Position=[(wallLength-wallLength/4), wallLength/2,
wallHeight/2],...
Size=[wallLength/2, wallWidth,
wallHeight],Color=wallColor,IsBinaryOccupied=true);
addMesh(scenario,"Box",Position=[wallLength/2, wallLength/2, wallHeight/2],...
Size=[wallWidth, wallLength/3,
wallHeight],Color=wallColor,IsBinaryOccupied=true);
addMesh(scenario,"Box",Position=[(wallLength-wallLength/4), wallLength/2.5,
wallHeight/2],...
Size=[wallLength/3, wallWidth,
wallHeight],Color=wallColor,IsBinaryOccupied=true);
addMesh(scenario,"Box",Position=[(wallLength-wallLength/4), wallLength/2,
wallHeight/2],...
Size=[wallLength/3, wallWidth,
wallHeight],Color=wallColor,IsBinaryOccupied=true);
addMesh(scenario,"Box",Position=[(wallLength-wallLength/4), wallLength/2,
wallHeight/3.5],...
Size=[wallLength/2.5, wallWidth,
wallHeight],Color=wallColor,IsBinaryOccupied=true);
addMesh(scenario,"Box",Position=[wallLength/6, wallLength/3.5, wallHeight/4],...
Size=[wallWidth, wallLength/9,
wallHeight],Color=wallColor,IsBinaryOccupied=true);
addMesh(scenario,"Box",Position=[wallLength/7, wallLength/3, wallHeight/4],...
Size=[wallWidth, wallLength/9,
wallHeight],Color=wallColor,IsBinaryOccupied=true);
addMesh(scenario,"Box",Position=[wallLength/4, wallLength/5, wallHeight/7],...
Size=[wallWidth, wallLength/11,
wallHeight],Color=wallColor,IsBinaryOccupied=true);
addMesh(scenario,"Box",Position=[wallLength/3, wallLength/2, wallHeight/4],...
Size=[wallWidth, wallLength/3,
wallHeight],Color=wallColor,IsBinaryOccupied=true);
show3D(scenario);
lightangle(-45,30);
view(60,50);
map = binaryOccupancyMap(scenario,GridOriginInLocal=[-2 -2],...
MapSize=[15 15],...
MapHeightLimits=[0 3]);
inflate(map,0.3);
show(map)
startPosition = [1 1];
goalPosition = [8 8];
rng(100)
numnodes = 2000;
planner = mobileRobotPRM(map,numnodes);
planner.ConnectionDistance = 1;
waypoints = findpath(planner,startPosition,goalPosition);
%obtain binary grid
% Robot height from base.
robotheight = 0.12;
% Number of waypoints.
numWaypoints = size(waypoints,1);
% Robot arrival time at first waypoint.
firstInTime = 0;
% Robot arrival time at last waypoint.
lastInTime = firstInTime + (numWaypoints-1);
% Generate waypoint trajectory with waypoints from planned path.
traj = waypointTrajectory(SampleRate=10,...
TimeOfArrival=firstInTime:lastInTime, ...
Waypoints=[waypoints, robotheight*ones(numWaypoints,1)],
...
ReferenceFrame="ENU");
huskyRobot = loadrobot("clearpathHusky");
platform = robotPlatform("husky",scenario, RigidBodyTree=huskyRobot,...
BaseTrajectory=traj);
[ax,plotFrames] = show3D(scenario);
lightangle(-45,30)
view(60,50)
hold(ax,"on")
% pp3
plot(ax,waypoints(:,1),waypoints(:,2),"-ms",...
LineWidth=2,...
MarkerSize=4,...
MarkerEdgeColor="b",...
MarkerFaceColor=[0.5 0.5 0.5]);
hold(ax,"off")
setup(scenario)
% Control simulation rate at 20 Hz.
r = rateControl(20);
% Status of robot in simulation.
robotStartMoving = false;
while advance(scenario)
show3D(scenario,Parent=ax,FastUpdate=true);
waitfor(r);
currentPose = read(platform);
if ~any(isnan(currentPose))
% implies that robot is in the scene and performing simulation.
robotStartMoving = true;
end
if any(isnan(currentPose)) && robotStartMoving
% break, once robot reaches goal position.
break;
end
en