Simulated missions and contingencies
UAT 402 Advanced UAS Technology and BVLOS Operations
Lesson
By the end of this module you will be able to
- Compute the point of no return with wind
- Check the coverage of emergency landing sites along a route
- Set ArduPilot battery failsafes and rally points consistent with the calculations
- Rehearse a simulated BVLOS mission with abnormal events and record the results
Why this matters
The drone knowledge base’s lab unit on stopping and restoring a simulated link asks learners to record behaviour when telemetry is lost, and its activity guide on BVLOS and risk assessment advises aligning readings, activities, work products and assessment. UAT 305 set ArduPilot failsafes and geofences. Our 20 km pipeline mission has two questions to answer before rehearsal: how far out can we fly and still get home, and if we must land en route, where?
Point of no return
With wind along the route, the outbound leg with a tailwind is faster, but the return leg into the headwind is slowed even more, so the average round-trip speed is always lower than in calm air. The point of no return is the farthest distance at which round-trip energy still does not exceed the usable energy after reserve.
Example 1 A 6 m/s wind along the pipeline
The battery has 700 Wh usable, with 20% kept in reserve on arrival home. Cruise power is 1,200 W, airspeed 16 m/s, and the wind blows along the pipeline away from home at 6 m/s (assumed values).
import numpy as np
cap_wh = 700.0 # usable battery energy
reserve = 0.20 # minimum reserve on arrival home
p_w = 1200.0 # cruise power W
v_air = 16.0 # airspeed m/s
wind = 6.0 # wind along the route away from home m/s (tailwind out, headwind back)
def energy_wh(dist_m, ground_speed):
return p_w * dist_m / ground_speed / 3600
usable = cap_wh * (1 - reserve)
out_gs, back_gs = v_air + wind, v_air - wind
d = np.arange(0, 40001, 10)
need = energy_wh(d, out_gs) + energy_wh(d, back_gs)
pnr = d[need <= usable].max()
print(f"usable energy {usable:.0f} Wh")
print(f"point of no return with wind: {pnr/1000:.2f} km from home")
d0 = usable / (2 * p_w / v_air / 3600)
print(f"same calculation in calm air: {d0/1000:.2f} km")
usable energy 560 Wh
point of no return with wind: 11.55 km from home
same calculation in calm air: 13.44 km
A 6 m/s wind shrinks the point of no return from 13.4 km to 11.6 km. The 20 km pipeline therefore cannot be flown out and back in one flight from home; it must be split into two flights, use launch points at both ends, or be launched mid-route by vehicle. This calculation must be redone daily for the actual wind, using wind at flight height, not at the surface.
Emergency landing sites along the route
When the battery is low, a motor misbehaves or the drone must avoid another aircraft, flying home may be too far. ArduPilot supports rally points, alternate return destinations: the vehicle goes to the nearest one when entering RTL mode (subject to the RALLY_LIMIT_KM and RALLY_INCL_HOME parameters). Battery failsafe thresholds are set with BATT_LOW_VOLT, BATT_LOW_MAH and the critical thresholds, and the action is chosen with BATT_FS_LOW_ACT, such as Land, RTL or SmartRTL. These landing sites must have the landowner’s permission and be inspected before use.
Example 2 Which stretch of the pipeline has nowhere to land?
There are four landing sites: home, a school field at 6 km, a temple yard at 12 km and the end depot at 20 km. In an emergency the drone must reach a site within 3 km (assumed from reserve energy). Check every 0.1 km.
import numpy as np
route_km = np.round(np.arange(0, 20.05, 0.1), 1) # points along the pipeline every 0.1 km
sites = {"home": 0.0, "L1 school field": 6.0, "L2 temple yard": 12.0, "end depot": 20.0}
reach_km = 3.0 # distance that must reach a landing site in an emergency (assumed from reserve energy)
gaps, best = [], []
for x in route_km:
name, pos = min(sites.items(), key=lambda s: abs(s[1] - x))
dist = abs(pos - x)
best.append(dist)
if dist > reach_km:
gaps.append(x)
print(f"worst distance to a landing site: {max(best):.2f} km")
if gaps:
print(f"uncovered stretch: {min(gaps):.1f} to {max(gaps):.1f} km")
sites["L3 new field"] = 16.0
worst = max(min(abs(p - x) for p in sites.values()) for x in route_km)
print(f"after adding L3 at 16.0 km, worst distance {worst:.2f} km")
worst distance to a landing site: 4.00 km
uncovered stretch: 15.1 to 16.9 km
after adding L3 at 16.0 km, worst distance 3.00 km
The stretch from 15.1 to 16.9 km is more than 3 km from any site. Adding a field at 16 km closes the gap, but the worst distance becomes exactly 3.00 km, the limit, with no margin at all; more sites or more reserve energy are needed. Checking every 0.1 km also matters, because checking too coarsely can miss short gaps.
Module lab
Lab: rehearsing a BVLOS mission in SITL
- Build the pipeline mission in ArduPilot SITL, set the wind to the forecast, and compute the point of no return with Example 1
- Add rally points following Example 2 and set the battery failsafe to act before the point of no return
- The instructor injects events in flight, such as cutting telemetry, draining the battery quickly or an approaching aircraft; the team must follow its written procedures
- Record the time and decision for every event and compare the drone’s behaviour with what was expected
- Debrief after the rehearsal, identifying procedures to fix and the limitations of simulation compared with real flight
Common mistakes
Watch out
- Computing range in calm air
- Using surface wind instead of wind at flight height
- Setting the battery failsafe at a fixed percentage without considering distance to a landing site
- Adding rally points that are not permitted or have never been inspected
- Treating SITL rehearsal results as equal to real flight
Summary
- Wind along the route always makes round-trip energy greater than in calm air
- The point of no return must be recomputed daily for the actual wind
- Emergency landing sites must cover every stretch of the route with margin
- ArduPilot rally points and battery failsafes must match the calculations and be rehearsed
Check your understanding
- With 15 m/s airspeed and a 5 m/s wind, what are the outbound and return ground speeds?
- Why does wind reduce round-trip range even though the outbound leg is faster?
- Which ArduPilot parameter chooses the action when the battery is low?
- What is a rally point?
- With landing sites at 0 and 8 km and a 3 km reach, which stretch is not covered?
Answers
- 20 m/s outbound, 10 m/s on return
- Time lost on the headwind leg exceeds time gained on the tailwind leg
- BATT_FS_LOW_ACT
- An alternate return destination the vehicle flies to in RTL mode, choosing the nearest one
- The stretch more than 3 km from both sites, between 3 and 5 km
Key formulas
| Round-trip energy | |
| Point of no return |
Key references
- ArduPilot Dev Team. Battery failsafe (Copter documentation). link
- ArduPilot Dev Team. Rally points (documentation). link
- ArduPilot Dev Team. SITL simulator (software in the loop). link
- Joint Authorities for Rulemaking on Unmanned Systems. (2024). JARUS guidelines on Specific Operations Risk Assessment (SORA), main body, edition 2.5 (JAR-DEL-SRM-SORA-MB-2.5). link
Further reading
Study the assigned knowledge units in advance, review media and take the module quiz
Activity guide: BVLOS and risk assessment
Dropping and restoring a simulated link
In class / field
Lab or field practice from worksheets with a safety checklist
Learning evidence: Checked worksheets and quiz results