Freesteel Blog » Eyes on Tim’s flight

Eyes on Tim’s flight

Wednesday, April 19th, 2017 at 11:41 pm Written by:

I’m not going to learn too much from myself, so I’ve got the raw data from Tim’s flight as measured by his Kobo/bluefly IGC logger.


As you can see, he ranged a good deal further than I did from Mam Tor, reaching an altitude of 1500m, and he reported scoring glide angles of 10 to 1 on his glider much-fancier-than-mine-of-which-I-am-now-jealous.

Let’s see if we can corroborate this from his data with the power of pandas and matplotlib.

pIGCtim = fd.LoadIGC("Tim-1492470000.igc")
pQ = pIGCtim.resample("1S").interpolate(method="time")  # fill uneven records

dstep = 30 # rolling windowed measurements in seconds
vario = (pQ.alt.diff(dstep)/dstep)  # m/s averaged over 30seconds
groundvelocity = numpy.sqrt(pQ.x.diff(dstep)**2 + pQ.y.diff(dstep)**2)/dstep

Here is vario:

Here is ground velocity:

The glide slope (normally called the glide-angle, even though we don’t quote it as an angle) is the groundvelocity divided by the descent rate. When the descent rate is close to zero, you get stupid numbers, so we need to throw those out and only quote for the parts where there is reasonably direct gliding flight.

glideslope = -groundvelocity/vario

# pandas row-wise subselection technology:
gs = glideslope[(glideslope>0) & (glideslope<20) & (groundvelocity>8)]

plt.scatter(gs.index, gs, label="glide slope")


It does appear that around 12:51 glide angles of around 10 to 1 were achieved for a duration. The kobo flight computer doesn’t filter or process the spot measurements of glide angle, so this is something a pilot must sense by glancing the device repeatedly and recognizing that a similar number has occurred multiple times recently.

From the high point, a very long descent occurred, first to the east, and then to the west in what was a light noreasterly wind.

t0, t1 = pandas.Timestamp("2017-04-18T12:48"), pandas.Timestamp("2017-04-18T12:56")
tX = pQ.x.idxmax()  # furthest east extent
tX1 = tX - pandas.Timedelta(seconds=10)  # leave some space at the corner
tX0 = tX + pandas.Timedelta(seconds=40)
plt.plot(pQ[t0:t1].x, pQ[t0:t1].y)
plt.plot(pQ[t0:tX1].x, pQ[t0:tX1].y)
plt.plot(pQ[tX0:t1].x, pQ[tX0:t1].y)


Now, I am sure that Tim would agree that this type of uninterrupted glide down from 1600m to 600m in some 9 minutes is not exactly the kind of event we are looking for; we want to catch another thermal well before we get low, to go back up, and fly further on without having to turn tail at the 1000m mark like a coward and hope to have enough metres spare to retreat to the home ridge.

No, on this day folks were doing their fifth hundred mile XC flight this week — on a f***ing paraglider. What is wrong with us? According to them: “all you have to do is speed up in sink and slow down in lift.”

Yeah, and playing the piano is just a matter of hitting the keys in the right order.

The answer must be somewhere in these numbers, coz we ain’t getting any help from these born-with-talent flying buggers.

As we have 9 minutes of clear descent here, first going east (outwards), and then going west (home), what is the calculated 30 second rolling interval sink rate with clean matplotlib labels on the timeline:

fig = plt.figure(figsize=(8, 5))
ax1 = fig.add_subplot(111)
plt.plot(vario[t0:tX1], label="sink-east")
plt.plot(vario[tX0:t1], label="sink-west")


And the ground velocity there and back looks like:


That’s 11.8m/s out, and 17.6m/s back suggesting a prevailing wind of 2.9m/s.

Well, not quite. This does not corroborate with the drift of the thermal immediately prior, that had a drift of 5.3m/s according to my calculations:

t0, t1 = pandas.Timestamp("2017-04-18T12:40:00"), pandas.Timestamp("2017-04-18T12:44:35")
plt.plot(pQ[t0:t1].x, pQ[t0:t1].y)
a, b = pQ.loc[t0], pQ.loc[t1]
math.sqrt((b.x-a.x)**2 + (b.y-a.y)**2)/(b._name - a._name).seconds


The heading, when in that thermal, was 212 degrees, while the out leg was 075degrees and the return leg was 263degrees, which should give a mean orientation difference of
5.25*(-cos(246-75) + cos(212-263)) = 8.5, which is still some way off from the out and return ground speed difference of 5.8m/s.

So much for that idea.

And now for something really useless, here’s the plot of the polar curve (airspeed vs sinkrate) based on the two components of that glidedown:

plt.scatter(groundvelocity[t0:tX1]+3.0, vario[t0:tX1], color="b")
plt.scatter(groundvelocity[tX0:t1]-3.0, vario[tX0:t1], color="r")


Not at all curvy.

Who knows what’s going on, with the wrong filtering, uncalibrated up and down air currents or whatever. He didn’t have an airspeed sensor like I did, and I didn’t do any long glides — and anyway the airspeed sensor is probably bogus anyway as it’s on the base-bar and therefore changes angle when I pull the bar in.

So, the gliding polar remains elusive.

But what about my own data?

Well, my visiting aunt with her good camera took this nifty photo of me while I was in a high banking turn in a good thermal after narrowly averting a disappointing trip straight down to the bottom landing field, which would have ruined my day and made me all upset and sorry for myself:


The basebar spans 18 pixels wide and 27 pixels high suggesting a bank angle of 56 degrees.

This can’t be so, as the BNO055 orientation sensor never got higher than 38degrees in the roll direction.

In fact, using the EXIF image properties timestamp against the photo of my takeoff gives a 619second offset where my altitude was 500m (level with takeoff) on a heading of 050 with a bank angle of no more than 20degrees while the bearing to the cement works (the smoke in bottom right hand corner) is about 110.

A horizontal stick that is lifted up by its left end by 20degrees and then spun towards you about the point on the ground by 60 degrees will appear to have an angle against the horizon of atan(sin(20)/(cos(20)*cos(60))) or 36degrees, which is quite a lot different to 56degrees. And I don’t think I can fudge these numbers.

So that’s not working either.


Maybe the calibration is bad.

I blame this f***ing general election that’s just been called.


Why does everything else in the world seem to proceed half-decently, from ship-building, to finding the cure for cancer, with a high probability that suitably intellectually able people will be employed to engage in the endeavor to perform as well as any human could be expected to do, yet in the realm of high-level public administration and the maintenance of civilization, we are served by an endless parade of self-serving ignorant amateurs and con-artists. Why can’t these morons find something better to do with their lives than meddling in our affairs? Like paint pictures of go hang-gliding.

UPDATE: Turns out there was an error in my orientation sensor computations.

Here is the correct set of numbers at close to the moment that picture was taken

time ax ay az gx gy gz roll pitch heading
2017-04-18 11:59:00.506 4.06 6.20 -12.11 1.76 -7.65 -5.86 -51.328610 10.383540 134.798758

A photographed apparent bank angle of 56 degrees is completely consistent with atan(sin(51)/(cos(51)*cos(134-110)))=53.5degrees. I can’t stress what a rare photo this was, perfectly level with the photographer with a straight horizon to measure against and a known angle.

The other numbers here are sqrt(z.gx****2+z.gz**2)=9.796=g, which is the right value, and sqrt(**2+z.ay****2)/9.8=1.44, which means I was pulling 2.4g in that turn.

Who knew I was having so much fun!

Leave a comment

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <blockquote cite=""> <code> <em> <strong>