plan
Syntax
Description
Examples
This example shows how to plan a coverage path that surveys the parking lots of the MathWorks Lakeside campus.
Get the geodetic coordinates for the MathWorks Lakeside campus, then create the limits for our map.
mwLS = [42.3013 -71.375 0]; latlim = [mwLS(1)-0.003 mwLS(1)+0.003]; lonlim = [mwLS(2)-0.003 mwLS(2)+0.003];
Create a figure containing the map with the longitude and latitude limits.
fig = figure;
g = geoaxes(fig,Basemap="satellite");
geolimits(latlim,lonlim)Get the outline of the first parking lot in longitude and latitude coordinates. Then create the polygon by concatenating them.
pl1lat = [42.3028 42.30325 42.3027 42.3017 42.3019]'; pl1lon = [-71.37527 -71.37442 -71.3736 -71.37378 -71.375234]'; pl1Poly = [pl1lat pl1lon];
Repeat the process for the second parking lot.
pl2lat = [42.30035 42.2999 42.2996 42.2999]'; pl2lon = [-71.3762 -71.3734 -71.37376 -71.37589]'; pl2poly = [pl2lat pl2lon];
Create the coverage space with both polygons, and specify these properties:
Waypoints coordinates format: Geodetic
Reference location: MathWorks Lakeside campus location
Reference height: 25 meters
Width of sensor footprint: 20 meters
cs = uavCoverageSpace(Polygons={pl1Poly,pl2poly},UseLocalCoordinates=false,...
ReferenceLocation=mwLS,ReferenceHeight=25,UnitWidth=20);Show the coverage space on the map.
show(cs,Parent=g);

Set the sweep angle for polygons 1 and 2 to 85 and 5 degrees, respectively, to have paths that are parallel to the roads in the parking lots. Then create the coverage planner for that coverage space with the exhaustive solver algorithm.
setCoveragePattern(cs,1,SweepAngle=85)
setCoveragePattern(cs,2,SweepAngle=5)
cp = uavCoveragePlanner(cs,Solver="Exhaustive");Set the takeoff position to a location in the courtyard, then plan the coverage path.
takeoff = [42.30089 -71.3752, 0]; [wp,soln] = plan(cp,takeoff); hold on geoplot(wp(:,1),wp(:,2),LineWidth=1.5); geoplot(takeoff(1),takeoff(2),MarkerSize=25,Marker=".") legend("","","Path","Takeoff/Landing") hold off

This example shows how to plan a coverage path for a region in local coordinates and compares the results of using the exhaustive solver with the results of using the minimum traversal solver.
Define the vertices for a coverage space.
area = [5 8.75; 5 27.5; 17.5 22.5; 25 31.25; 35 31.25; 30 20; 15 6.25];
Because vertices define a concave polygon and the coverage planner requires convex polygons, decompose the polygon into convex polygons. Then create a coverage space with the polygons from decomposition.
polygons = coverageDecomposition(area); cs = uavCoverageSpace(Polygons=polygons);
Define the takeoff and landing positions at [0 0 0] and [32.25 37.25 0], respectively. Then show the coverage space and plot the takeoff and landing positions.
takeoff = [0 0 0]; landing = [32.25 37.25 0]; show(cs); exampleHelperPlotTakeoffLandingLegend(takeoff,landing)

Create a coverage planner with the exhaustive solver algorithm and another coverage planner with a minimum traversal solver algorithm. Because Polygon 2 is closer to the takeoff position, set the visiting sequence of the solver parameters such that we traverse Polygon 2 first.
cpeExh = uavCoveragePlanner(cs,Solver="Exhaustive"); cpMin = uavCoveragePlanner(cs,Solver="MinTraversal"); cpeExh.SolverParameters.VisitingSequence = [2 1]; cpMin.SolverParameters.VisitingSequence = [2 1];
Plan with both solver algorithms using the same takeoff and landing positions.
[wptsExh,solnExh] = plan(cpeExh,takeoff,landing); [wptsMin,solnMin] = plan(cpMin,takeoff,landing);
Show the planned path for both the exhaustive and the minimum traversal algorithms.
figure
show(cs);
title("Exhaustive Solver Algorithm")
exampleHelperPlotTakeoffLandingLegend(takeoff,landing,wptsExh)
figure
show(cs);
title("Minimum Traversal Solver Algorithm")
exampleHelperPlotTakeoffLandingLegend(takeoff,landing,wptsMin)
Export the waypoints from the minimum traversal solver to a .waypoints file with the reference frame set to north-east-down.
exportWaypointsPlan(cpMin,solnMin,"coveragepath.waypoints",ReferenceFrame="NED")
Input Arguments
Coverage path planner, specified as a uavCoveragePlanner object.
UAV takeoff position, specified as a three-element vector.
The format of this argument depends on the value of the UseLocalCoordinates property of the
uavCoverageSpace object in the CoverageSpace property of planner.
If
UseLocalCoordinatesistrue— Specifytakeoffin the format [x y z], where x, y, and z are translations along the x-, y-, and z- axes, respectively, in meters.If
UseLocalCoordinatesisfalse— Specifytakeoffin the format [latitude longitude altitude], where latitude and longitude represent geodetic coordinates, in degrees, and altitude is the height of the position in meters.
Data Types: double
UAV landing position, specified as a three-element vector.
The format of this argument depends on the value of the UseLocalCoordinates property of the
uavCoverageSpace object in the CoverageSpace property of planner.
If
UseLocalCoordinatesistrue— Specifylandingin the format [x y z], where x, y, and z are translations along the x-, y-, and z- axes, respectively, in meters.If
UseLocalCoordinatesisfalse— Specifylandingin the format [latitude longitude altitude], where latitude and longitude represent geodetic coordinates, in degrees, and altitude is the height of the position in meters.
Data Types: double
Verbose mode, specified as a logical 0 (false)
or 1 (true). A value of true
specifies to output diagnostic information about the planning algorithm to the Command
Window, while false specifies to output no information.
Data Types: logical
Output Arguments
Waypoints in 3D space, returned as an N-by-3 matrix, where N is the number of waypoints that the coverage planner generates.
Each row of the matrix contains the position of a waypoint. The format of the
positions depends on the value of the UseLocalCoordinates property of the
uavCoverageSpace object in the CoverageSpace property of planner.
If
UseLocalCoordinatesistrue— Waypoint positions have the format of [x y z], where x, y, and z are translations along the x-, y-, and z- axes, respectively, in meters.If
UseLocalCoordinatesisfalse— Waypoint positions have the format of [latitude longitude altitude], where latitude and longitude represent geodetic coordinates, in degrees, and altitude is the height of the position in meters.
The first and last waypoints in the matrix correspond to the takeoff and landing
positions of the UAV, specified by the takeoff argument or the
takeoff and landing arguments,
respectively
For each other waypoint in the matrix, the altitude is the same as the ReferenceHeight property specified to the
uavCoverageSpace object used to create the coverage path planner
planner.
Data Types: double
Solution information, returned as a structure containing these fields:
VisitingSequence— M-element row vector denoting the visitation order of the polygons defined by theuavCoverageSpaceobject used to createplanner, where M is the total number of polygons in the coverage space. For example,[2 1 3]indicates that the UAV first visits polygon 2, then polygon 1, and finally polygon 3.SweepPattern— M-element row vector of integers denoting the sweep pattern for each polygon, where M is the total number of polygons in the coverage space. Each element is an integer in the range [1, 4] that indicates a sweep pattern:1— Forward sweep pattern2— Counter-clockwise sweep pattern3— Reverse sweep pattern4— Reverse counter-clockwise sweep pattern
For example,
[3 1 2]indicates that the UAV uses the reverse sweep pattern for polygon 1, the forward sweep pattern for polygon 2, and the counter-clockwise sweep pattern for polygon 3.TransitionCost— Euclidean distance cost for transitioning between polygons, including takeoff and landing distance.Takeoff— UAV takeoff location, returned in the same format as thetakeoffargument.Landing— UAV landing location, returned in the same format as thelandingargument.
Data Types: struct
Extended Capabilities
Generating code containing the plan requires you to enable dynamic
memory allocation. For more information about enabling dynamic memory
allocation, see Control Dynamic Memory Allocation in Generated Code (MATLAB Coder).
Deploying to embedded real time (ERT) targets is not supported.
Version History
Introduced in R2023aplan now supports code generation with dynamic memory allocation
enabled. For more information about enabling dynamic memory allocation, see Control Dynamic Memory Allocation in Generated Code (MATLAB Coder).
Deploying to embedded real time (ERT) targets is not supported.
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)