ArduPilot SOARING feature Development

Hi Development Team,

The soaring feature is not just for Gliders, it has an amazing potential for extending the range and flight time of all types of electric aircraft !!! Unfortunately, it does not seem to get the attention it deserves, for a couple reasons.

  1. Many users are just not aware of the feature.
  2. The feature does not soar in thermals correctly.

I have been flying RC gliders for many years, and could tell anyone willing to further develop the soaring feature how to make this feature work much much better. Most of the difficult programming work has already been done, and with some modifications it could easily be made to many times better. If anyone is interested, let me know and I will give you full details of how to make it find and stay in thermals much better than it does now.



Hi Mike, what would you say would be the changes to be implemented?
I’m thoroughly testing SOAR improvements, not currently published, and imho we’re already at excellent levels.


1 Like


Can you not publically share your thoughts? We would love the hear them.

BTW, Have you seen the work done by the Microsoft team using a fork of Ardupilot? That may make it into Master at some point. Soaring/Gliding for Planes (the OP of that thread is behind the current soaring code I believe). That linked paper blew my mind a bit. I never realized there was so much behind thermalling.

I will be happy to put my observations into the public forum, I just wanted to make sure that someone was actually still interested in developing this and that I would not be posting information that no one would use. I will have to make up some graphics in order to post about finding and tracking thermals, so I will post that later.

My first suggestion is to remove the ridiculously low altitude gain limitation of 1000 meters of the SOAR feature. No sailplane pilot flys cross country at those altitudes, even local flights that stay within gliding distance of the airfield achieve altitude gains much higher than this. Cross country sailplane pilots routinely see altitude gains of 4000 meters even when flying over flat terrain. In mountainous areas, altitude gains of 6000 meters or more are used. Why needlessly limit the capabilities of this feature ??? The best solution would be to set a low default altitude gain as you do now, and let each pilot set this value as needed depending on his location, and terrain.


Suggestions are always welcomed and there is certainly room for improvement.

The specific example of the maximum altitude is actually not a good one. It’s implemented as a float so setting a large altitude should work fine - have you tried this?

The metadata for the parameter does indicate 0 - 1000m as the expected range. I think this will cover 99% of users’ needs, but again it’s not a hard limit.

1 Like

Hi Samuel,

Thank you for the explanation. I did not realize the program would let me go outside the recommended range. Solving this issue allowed me to let the Auto Soar run for quite a long time and give it every opportunity to find thermals and attempt to use them. I did testing in very good conditions and the system detected thermals and went into LOIT mode exactly like it should have, but once it detected lift, it kind of circled around, but not staying in or tracking strong thermals effectively. It would consistently lose very strong soarable thermals. I think the program is just taking the wrong approach. This is not that difficult, and once using the correct method, Ardupilot should be able to outperform me and most other humans in tracking and using thermals for altitude gain . I will draw up some diagrams to show you my suggestion.

Thermals move with wind, so soaring should NOT try to use GPS to thermal over a particular area where a thermal is first found. See the attached pictures, this is a successful thermal climb in a typical 10 - 15 mph wind. I just circled in the same thermal at a constant 45 degree bank angle and stayed in the thermal as it was blown downwind.

THERMAL DETECTION: The thermal detection works very well as is, with users being able to set the amount of lift for their particular plane and soaring conditions. Due to laws of probability, the plane will most often enter on the edge of a thermal. The plane will typically try to bank AWAY from the thermal due to uneven lift gradient. Is it possible for ArduPilot to use this information in deciding which direction to make its initial turn ???

THERMAL ENTRY: Once a thermal is detected, it is VITAL that the plane turn into the thermal IMMEDIATELY.

  1. A full 45 degree bank ( or whatever bank angle the user has chosen for his plane ) should be entered immediately at the maximum roll rate the plane is capable of. Most thermals are not huge in diameter, and any delay or slowness in establishing bank can result in the plane flying though, then past the thermal and missing it.

  2. The plane should also immediately establish its programmed soaring PITCH angle in the thermal. Do NOT try to chase airspeed, as it will vary in turbulence, and more importantly, pitching up and down to chase airspeed will make measurement of lift or sink virtually impossible.

  3. If the plane initiates a tight turn in the proper direction, it can be fairly well centered in the thermal on the first turn.

  4. Lift will be detected through most of the turn, but some areas may show sink if it is not centered well.

MISSED THERMAL: It is not always possible to turn into a thermal, lift gradients can be turbulent and random, so even with measuring which way the plane naturally banks, sometimes we turn the wrong way.

  1. If the thermal gets weaker or is non existent as we try to turn into it, we have likely turned the wrong way. We should measure this, and if it is determined that the entry did not work, we can correct for this at 270 degrees into the first turn, { or at 630 degrees into the second turn if we can not get the plane stabilized and measure accurately fast enough in the fist turn ), and see if the thermal is on the other side of our initial course. Simply level the plane out for a set amount of time, until it crosses the course line, and re-enter the turn in the same direction.

  2. Sometimes we will hit a random bubble of air that is not a good thermal, if the above fails, then it is time to fly on course and look in other areas.

CENTERING IN AND STAYING IN THERMAL: This is where Ardupilot can really outperform a human. By maintaining a constant bank angle and pitch attitude, we can measure the amount of lift throughout our circle.

  1. If we find that one side of the circle has a significantly higher amount of lift, we can shift the plane towards that area by going to 1/2 the programmed soaring bank angle. There will be a delay going to 1/2 bank and then going back to full bank, so I like to do this for about 90 degrees of the turn at slower speeds, a little less at higher speeds.

  2. The correct way to do this is to have the plane established in 1/2 bank when it is going IN THE DIRECTION of where the higher amount of lift was detected. We do NOT want to be in 1/2 bank angle when we are in the highest area of lift, or this will take us away from it.

  3. The direction of the highest lift will be 90 degrees in the turn BEFORE the area where highest lift was detected. Given the delay in going from full bank to 1/2 bank, in a slower plane, I typically start reducing bank at 120 degrees before, and assure that I am rolled back into full bank by the time I get to 70 degrees before maximum area of lift in the circle.

  4. These corrections should be fairly small as most thermals are not that big in diameter, and over-correction can easily take us out of the thermal. This is why we do not completely level the aircraft to shift towards higher lift, as this usually results in over correction and flying out of the thermal entirely.

@JetPilot, I run many tests on SITL using X-Plane and various gliders, in which case 1000 meters as the maximum limit for SOAR_ALT_MIN is necessary to be able to perform some tests.
Thanks for your excellent explanations.