Main Content

UAV Obstacle Avoidance in Simulink

This model implements waypoint following along with obstacle avoidance on a UAV in a simulated scenario. The model takes a set of waypoints and uses the 3D VFH+ algorithm to provide an obstacle-free path.

Create UAV Scenario with Custom Lidar Sensor and Obstacles

Create Scenario

Create a UAV scenario and set its local origin.

Scenario = uavScenario("UpdateRate",100,"ReferenceLocation",[0 0 0]);

Add a marker to indicate the start pose of the UAV.

addMesh(Scenario,"cylinder",{[0 0 1] [0 .01]},[0 1 0]);

Define UAV Platform

Specify the initial position and orientation of the UAV in the north-east-down (NED) frame.

InitialPosition = [0 0 -7];
InitialOrientation = [0 0 0];

Create a UAV platform in the scenario.

platUAV = uavPlatform("UAV",Scenario, ...
                      "ReferenceFrame","NED", ...
                      "InitialPosition",InitialPosition, ...

Add a quadrotor mesh for visualization.

updateMesh(platUAV,"quadrotor",{1.2},[0 0 1],eul2tform([0 0 pi]));

Create and Mount Sensor Model

Specify the lidar resolution.

AzimuthResolution = 0.5;      
ElevationResolution = 2;

Specify the lidar range.

MaxRange = 7;
AzimuthLimits = [-179 179];
ElevationLimits = [-15 15];

Create a statistical sensor model to generate point clouds for the lidar sensor.

LidarModel = uavLidarPointCloudGenerator("UpdateRate",10, ...
                                         "MaxRange",MaxRange, ...
                                         "RangeAccuracy",3, ...
                                         "AzimuthResolution",AzimuthResolution, ...
                                         "ElevationResolution",ElevationResolution, ...
                                         "AzimuthLimits",AzimuthLimits, ...
                                         "ElevationLimits",ElevationLimits, ...                                       

Create a lidar sensor and mount the sensor on the quadrotor.

uavSensor("Lidar",platUAV,LidarModel, ...
          "MountingLocation",[0 0 -0.4], ...
          "MountingAngles",[0 0 180]);

Preview the scenario using the show3D function.


Add Obstacles to Scenario

Add cuboid obstacles, representing buildings, to the scenario.

ObstaclePositions = [10 0; 20 10; 10 20]; % Locations of the obstacles
ObstacleHeight = 15;                      % Height of the obstacles
ObstaclesWidth = 3;                       % Width of the obstacles

for i = 1:size(ObstaclePositions,1)
    addMesh(Scenario,"polygon", ...
        {[ObstaclePositions(i,1)-ObstaclesWidth/2 ObstaclePositions(i,2)-ObstaclesWidth/2; ...
        ObstaclePositions(i,1)+ObstaclesWidth/2 ObstaclePositions(i,2)-ObstaclesWidth/2; ...
        ObstaclePositions(i,1)+ObstaclesWidth/2 ObstaclePositions(i,2)+ObstaclesWidth/2; ...
        ObstaclePositions(i,1)-ObstaclesWidth/2 ObstaclePositions(i,2)+ObstaclesWidth/2], ...
        [0 ObstacleHeight]},0.651*ones(1,3));
legend("Start Position","Obstacles")

Model Overview

The model consists of these main components:

  • UAV scenario — Configures the scenario and visualizes the trajectory.

  • Waypoint following and obstacle avoidance — Implements waypoint following with obstacle avoidance.

  • Controller and plant — Position controller for the UAV.

  • Control Panel — Use this panel to enable or disable obstacle avoidance, as well as alter the lookahead distance for obstacle avoidance.

Open the model.


UAV Scenario

The scenario blocks configure the scenario and visualize the obstacles, trajectory, and the lidar point cloud data.

This subsystem contains these blocks:

  • UAV Scenario Configuration — Configures the scenario blocks to use the generated scenario for simulation.

  • UAV Scenario Motion Read — Reads the current UAV state from the scenario.

  • UAV Scenario Lidar — Reads the point cloud data from the scenario.

  • UAV Scenario Motion Write — Updates the new UAV state.

  • UAV Scenario Scope — Visualizes the UAV trajectory and lidar point cloud data.

Waypoint Following and Obstacle Avoidance

The Waypoint following and obstacle avoidance subsystem finds the obstacle-free desired position and the desired yaw according to the current UAV state and point cloud data.

This subsystem includes these blocks and subsystems:

  • Waypoint Follower — Computes a lookahead point for the UAV in the direction of the next waypoint.

  • Obstacle Avoidance — Uses the 3D VFH+ algorithm to calculate the obstacle-free direction and yaw for a collision-free flight, and updates the lookahead point computed by the Waypoint Follower block.

  • Conversion — This subsystem controls the frequency at which obstacle avoidance is used during the flight, and other data type and transform conversions.

  • Lookahead Distance — Constant block, the value of which is multiplied by the unit vector in the desired direction, and then added to the current UAV position to compute the desired position.

  • Enable Obstacle Avoidance — This subsystem enables or disables obstacle avoidance.

  • Waypoints — The set of waypoints through which the UAV is expected to fly.

Specify the waypoints for the UAV.

Waypoints = [InitialPosition; 0 20 -7; 20 20 -7; 20 0 -7];

Add markers to indicate the waypoints.

for i = 2:size(Waypoints,1)
    addMesh(Scenario,"cylinder",{[Waypoints(i,2) Waypoints(i,1) 1] [0 0.1]},[1 0 0]);
hold on
plot3([InitialPosition(1,2); Waypoints(:,2)],[InitialPosition(1,2); Waypoints(:,1)],[-InitialPosition(1,3); -Waypoints(:,3)],"-g")
legend(["Start Position","Obstacles","","","Waypoints","","","Direct Path"])

Controller and plant

The Controller and plant subsystem generates the control commands and updates the UAV state based on the lookahead point.

This subsystem includes these blocks:

  • Controller — This subsystem computes the control commands (roll, pitch, yaw, and thrust) to move the UAV towards the desired position. It uses multiple PID loops to implement position control.

  • Quadrotor Plant — This Guidance Model block updates the UAV state using the control commands.

  • Conversion — This subsystem extracts the position and orientation from the UAV state, and performs data and coordinate transforms for visualization.

Specify the controller parameters. These parameters are based on a hit-and-trial approach, and can be tuned for a smoother flight.

% Proportional Gains
Px = 6;
Py = 6;
Pz = 6.5;

% Derivative Gains
Dx = 1.5;
Dy = 1.5;
Dz = 2.5;

% Integral Gains
Ix = 0;
Iy = 0;
Iz = 0;

% Filter Coefficients
Nx = 10;
Ny = 10;
Nz = 14.4947065605712; 

Specify gravity, drone mass, and sample time for the controller and plant blocks.

UAVSampleTime = 0.001;
Gravity = 9.81;
DroneMass = 0.1;

Control Panel

The switch enables or disables the updates to the lookahead point from the Obstacle Avoidance block.

The slider updates the lookahead distance used to compute the lookahead point.

  • At greater lookahead distances, UAV flight is faster, but has greater risk of colliding with an obstacle.

  • At lower values, the flight is slower, but has a lower risk of colliding with an obstacle.

Simulate Model

Configure and run the model, and observe the motion of the UAV.

  • The UAV flies through the waypoints while avoiding obstacles, and then the simulation stops.

  • Alter the lookahead distance to change the UAV speed.

  • Change the parameters of the Obstacle Avoidance block and note the change in the flight path.

out = sim("ObstacleAvoidanceDemo.slx");

Visualize Obstacle-Free UAV trajectory

Plot the actual UAV trajectory and the waypoints to show the effect of obstacle avoidance on the UAV flight.

hold on
points = squeeze(out.trajectoryPoints(1,:,:))';
legend(["Start Position","Obstacles","","","Waypoints","","","Direct Path","UAV Trajectory"])