Range Maximization

for Multirotors


The process of maximizing the straight line range capability of a battery-powered multirotor boils down to determining the optimal combination of flight speed and battery configuration. This document describes an experimental procedure to determine these values by performing a few test flights.

There's a bit of theory followed by examples of implementing the process with both ArduPilot and PX4 software stacks.


For each battery configuration, there is a "best-range" flight speed. This speed can be identified by flying the aircraft at a range of speeds and plotting data from autopilot's log file. The plot we need is range as a function of speed. (Range is calculated from power consumption, details in the examples below).

In this example, the best-range speed is 19 m/s and the range is 51 km.

By repeating this process for each battery configuration, and plotting the data for all these flights together, we can identify the best battery configuration.

In this example, battery pack 2 gives the best range of 54 km when the aircraft is flown at 20 m/s. Notice that a change of battery configuration affect both best-range speed and range. Therefore, each battery configuration must be tested across a range of speeds.

Example: DJI F450 with PX4

This example shows a typical first flight that might be used to quickly assess a new aircraft (DJI Flamewheel 450 with Pixhawk2.1).

Flight Path

A mission file makes the flight path repeatable between tests. This example uses a series of straight lines with speed changes after every down-and-back lap.

Example mission plan file: F450PX4-V1.plan

Log File Analysis

Example log file: 17_07_59.ulg

Our goal is a plot of range vs speed.

Range is calculated from power consumption.

Range = Speed * Time of Flight

Time of Flight is calculated from the battery capacity and the rate at which it's consumed.

Range = Speed * Battery Capacity / Power Consumption

This calculation is shown in the example spreadsheet liked below. Note that this example uses a simplified version that treats power consumption in terms of current (amps) rather than power (watts).

Speed measurements are available in log files, but aren't synchronized with power measurements. A little approximation is needed to get the matched pairs of range and speed needed to make the desired plot.

1.) Use PyUlog's ulog2csv function to convert the ULOG into a collection of CSV files.

2.) Bring the following data fields into a single spreadsheet

timestamp, vel_m_s, voltage_filtered_v, current_filtered_a

Power measurements are recorded 2 or 3 times more frequently than speed. I averaged the power measurements between speed measurements and assigned the result to the time of the next speed value.

Range Optimization - Range vs Speed - F450 PX4.png

Excel sheet: 17_07_59_range_analysis.xlsx

This flight included cruise segments ranging from 10 to 20 m/s in increments of 2. Most of these speeds show a cluster of data points. Notice that the aircraft had a hard time reaching the highest speeds. The data point clusters are spread vertically because one leg of the flight is against the wind and the other is with the wind.

Notice that range falls off above 14 m/s and the aircraft has trouble reaching 20 m/s.