Main Content

Simulate UAV Waypoint Following with Different Wind Conditions

This example shows how to create a UAV Scenario containing different wind conditions and use it in Simulink® to simulate a fixed-wing UAV following waypoints. This example uses a simplified kinematic model and control system similar to those in the Tuning Waypoint Following Controller for Fixed-Wing UAV example.

Create UAV Scenario with Wind Model Object

Create a uavScenario containing a test platform to simulate a no-wind scenario.

sceneNoWind = uavScenario;
uavPlatform("UAV",sceneNoWind);

Make a copy of the scenario, and add a steady wind object to the platform to simulate steady wind conditions.

sceneSteadyWind = copy(sceneNoWind);
plat = sceneSteadyWind.Platforms(1);
steadyWind = uavWindSteady(Velocity=[3.5 3.5 0]);
addWind(plat,steadyWind)

Create additional copy scenarios with gust and turbulence wind conditions. When adding wind turbulence, you must specify the noise sample time as an integer multiple of the scene sample time. In MATLAB®, the UpdateRate property of the uavScenario object controls the scene sample time. In Simulink, the Sample time parameter of the UAV Scenario Configuration block controls the scene sample time.

% Create scenario with gust wind
sceneGustWind = copy(sceneNoWind);
plat = sceneGustWind.Platforms(1);
gustWind = uavWindGust(GustAmplitude=[3.5 3.5 0],StartTime=30);
addWind(plat,gustWind)

% Create scenario with turbulence wind
sceneTurbulenceWind = copy(sceneNoWind);
plat = sceneTurbulenceWind.Platforms(1);
turbulenceWind = uavWindTurbulence(BandLimitedNoiseSampleTime=0.1);
addWind(plat,turbulenceWind)

Simulate UAV Waypoint Following with Wind Disturbance

Inspect the simulation model, which consists of four main sections: Waypoint Follower Controller, Low Fidelity Fixed Wing Kinematic Model, Wind Scenario, and Visualization and Logging.

The Tuning Waypoint Following Controller for Fixed-Wing UAV example contains a detailed explaination for each of these sections, except the Wind Scenario section. The Wind Scenario section contains the UAV Scenario blocks that enable you to load uavScenario objects containing different wind conditions into Simulink.

The controlled UAV in this example attempts to maintain constant air speed while following four preset waypoints. The wind velocity affects the UAV ground speed magnitude and direction during flight. This kinematic model contains no aerodynamic force.

modelName = "simulateUAVWaypointFollowingWithWind";
open_system(modelName)

Simulate the scenario with no wind, and visualize the results.

sceneConfig = modelName + "/UAV Scenario Configuration";
set_param(sceneConfig, UAVScenarioObject="sceneNoWind")
sim(modelName)

Figure UAV Animation contains an axes object. The axes object with xlabel North, ylabel West contains 6 objects of type patch, line, scatter.

xNoWind = logsout{3}.Values.Data(:,1);
yNoWind = logsout{3}.Values.Data(:,2);
figure
plot(xNoWind,yNoWind)
hold on
scatter(xNoWind([1 end]),yNoWind([1 end]))
text(xNoWind(1)+100,yNoWind(1)+100,"Start",AffectAutoLimits="on")
text(xNoWind(end)+100,yNoWind(end)+100,"End",AffectAutoLimits="on")
xlabel("North (m)")
ylabel("East (m)")
title("Trajectory Under No Wind Condition")
axis equal

Figure contains an axes object. The axes object with title Trajectory Under No Wind Condition, xlabel North (m), ylabel East (m) contains 4 objects of type line, scatter, text.

Simulate the scenario with steady wind, and visualize the results.

set_param(sceneConfig,UAVScenarioObject="sceneSteadyWind");
sim(modelName);

Figure UAV Animation contains an axes object. The axes object with xlabel North, ylabel West contains 6 objects of type patch, line, scatter.

xSteadyWind = logsout{3}.Values.Data(:,1);
ySteadyWind = logsout{3}.Values.Data(:,2);
figure
plot(xSteadyWind,ySteadyWind)
hold on
scatter(xSteadyWind([1,end]),ySteadyWind([1,end]))
text(xSteadyWind(1)+100,ySteadyWind(1)+100,"Start",AffectAutoLimits="on");
text(xSteadyWind(end)+100,ySteadyWind(end)+100, "End",AffectAutoLimits="on");
xlabel("North (m)")
ylabel("East (m)")
title("Trajectory Under Steady Wind Condition")
axis equal

Figure contains an axes object. The axes object with title Trajectory Under Steady Wind Condition, xlabel North (m), ylabel East (m) contains 4 objects of type line, scatter, text.

Simulate the scenario with wind gust and visualize the results.

set_param(sceneConfig,UAVScenarioObject="sceneGustWind")
sim(modelName)

Figure UAV Animation contains an axes object. The axes object with xlabel North, ylabel West contains 6 objects of type patch, line, scatter.

xGustWind = logsout{3}.Values.Data(:,1);
yGustWind = logsout{3}.Values.Data(:,2);
figure()
plot(xGustWind, yGustWind)
hold on
scatter(xGustWind([1,end]),yGustWind([1,end]))
text(xGustWind(1)+100,yGustWind(1)+100,"Start",AffectAutoLimits="on");
text(xGustWind(end)+100,yGustWind(end)+100,"End",AffectAutoLimits="on");
xlabel("North (m)")
ylabel("East (m)")
title("Trajectory Under Gust Wind Condition")
axis equal

Figure contains an axes object. The axes object with title Trajectory Under Gust Wind Condition, xlabel North (m), ylabel East (m) contains 4 objects of type line, scatter, text.

Simulate the scenario with turbulence wind and visualize the results.

set_param(sceneConfig,UAVScenarioObject="sceneTurbulenceWind");
sim(modelName);

Figure UAV Animation contains an axes object. The axes object with xlabel North, ylabel West contains 6 objects of type patch, line, scatter.

xTurbulenceWind = logsout{3}.Values.Data(:,1);
yTurbulenceWind = logsout{3}.Values.Data(:,2);
figure()
plot(xGustWind,yGustWind)
hold on
scatter(xTurbulenceWind([1,end]),yTurbulenceWind([1,end]))
text(xTurbulenceWind(1)+100,yTurbulenceWind(1)+100,"Start",AffectAutoLimits="on");
text(xTurbulenceWind(end)+100,yTurbulenceWind(end)+100,"End",AffectAutoLimits="on");
xlabel("North (m)")
ylabel("East (m)")
title("Trajectory Under Turbulence Wind Condition")
axis equal

Figure contains an axes object. The axes object with title Trajectory Under Turbulence Wind Condition, xlabel North (m), ylabel East (m) contains 4 objects of type line, scatter, text.

Plot the trajectory of the UAV under each of the wind conditions, and observe the results. The UAV in the no wind simulation follows the waypoint with consistent turn behavior at all four waypoints. The steady wind adds a constant shift to the ground speed computation, given the UAV is flying at a constant airspeed, which leads to irregular turns at all four waypoints because the difference in flight direction results in a different ground speed. Because you defined the wind gust with respect to the body frame of the UAV, the turns are consistently affected at the four waypoints. The wind turbulence adds random wind disturbance to the UAV, randomly perturbing the turns.

figure
plot(xNoWind,yNoWind)
hold on
plot(xSteadyWind,ySteadyWind)
plot(xGustWind,yGustWind)
plot(xTurbulenceWind,yTurbulenceWind)
legend(["NoWind","SteadyWind","GustWind","TurbulenceWind"])
xlabel("North (m)")
ylabel("East (m)")
title("Compare Trajectories Under Different Wind Conditions")
axis equal

Figure contains an axes object. The axes object with title Compare Trajectories Under Different Wind Conditions, xlabel North (m), ylabel East (m) contains 4 objects of type line. These objects represent NoWind, SteadyWind, GustWind, TurbulenceWind.

Close the simulation model.

close_system(modelName,0)
dataDictionary = Simulink.data.dictionary.open(modelName + ".sldd");
discardChanges(dataDictionary)
close(dataDictionary)

Conclusion

The influence of wind on UAV operations is important when assessing the robustness of navigation algorithms. By leveraging the Simulink simulation environment, you can introduce a range of wind conditions to evaluate algorithm performance.