Going Slowly Upwind

s/y Charlotte Hanse 531 Upwind sailing

It has been a struggle to gather reliable speed data from our new/old Hanse 531. Mostly because of calibration problems, but partly also because of archaic instruments operating on should-be-obsolete data networks. To start somewhere, I put together some really preliminary stuff we recorded during our sail from Visby to Kalmar.

Overview of the Sailed Track

s/y Charlotte Hanse 531 from Visby to Kalmar
10-minute averages: blue (4-5 kt), green (5-6 kt), yellow (6-7 kt), red (7+ kt)

Overview of the Data Challenge

So, why do I collect the data, and what are the end results I am looking for?

“How fast do you generally sail? What planning speed are you using? What kind of performance can I expect when sailing a … ?”

These are probably the questions I would like to answer. Instead of getting lost in a big forest of anecdotes (“Oh yes! It goes easily over nine knots in a gentle breeze!”), I’d like to replace that with a data-based approach.

The end result should (at some point) be relevant insights into real-life sailing performance of our Hanse 531. For ourselves, but oviously also for the prospective next owner.

Data Series

With some upwind sailing data in the database, and to get some preliminary drafts of a polar diagram for our boat, I needed these different data series:

  • Apparent wind angle (AWA) readings from the wind sensor.
  • Speed through water (STW) readings from the paddlewheel sensor, and speed over ground (SOG) readings from the GPS.
  • The true heading from the magnetic compass, and the course traveled over ground (COG) from the GPS.

This wasn’t very complicated on our previous boat: just calibrate the instruments and gather the data. On our Hanse 531, however, I had tried and failed several times at any kind of calibration, so the raw was very so and so.

Weird Wind Angles

For much of the first part of the trip, we were going upwind, sailing as tightly against the wind as possible. Looking at the data, however, it didn’t look right. (Acutally, it looked quite obviously wrong!)

The average apparent wind angles (over many hours) were widely different between the tacks. Using a basic calibration calculation (-41+28)/2 I got an error of -6,5 degrees.

Earlier, I had added and removed (or so I thought) a -7 degree calibration to the AWA. The calibration UI on the old Raymarine ST/ST+ wind instrument was terrible, though, so I probably got that wrong.

Assuming the correct calibration would be -0.5, I added back 6.5 degrees:

Voila! The tacks were now symmetrical. They might not actually have been, of course, but I’d get back to that later.

Boat Speed

For part of the sailing, the GPS-measured speed over ground (SOG) matched the paddlewheel-measured speed through water (STW/SPD) quite closely. Then, as the wind increased (or had been blowing for a while), they did diverge a bit, between 0.4 – 0.6 knots.

There would have been some wind-generated current, so at least some of this increase could have been attributed to that. Over here, they say that wind-generated current usually stays under 5% of the wind speed, so with wind between 15-20 knots, that would be under 0.7 – 1.0 knots.

Taking that into account, the paddlewheel-boatspeed did seem to be roughly in the right neighborhood.

True Heading

I started with the picture above, showing the raw magnetic heading (as reported by the electronic compass) and the course over ground (as reported by the GPS).

The compass data was not calibrated, so I had to (somehow) figure out the correct true heading based on the raw values from the sensor.

To do that, I needed two other variables: variation (the effect of the unevenness of the globe’s magnetic field, also called declination) and deviation (the distortion on the compass as a result of local magnetic fields).


Variation would normally have been fed to the network from one of the NMEA devices, but on our Hanse 531, there wasn’t any device smart enough to do that.

Luckily, a company called Amentum had a cloud API to query geomagnetic data based on time and location.

I wrote a small piece of code to run through our summer’s sailing and whenever we had moved more than 50 kilometers from our previous position, I queried and stored the variation information for that spot and time.

Some variation data fetched and stored in the database.

Estimating the deviation of the compass— how much the surrounding local magnetic fields affected it— was trickier.

Usually, this would have been done aboard the boat, either automatically by the compass itself, or manually by motoring in known headings and noting down the deviating/differing compass headings.

Doing it after the fact, I only had the previously recorded data to go on. A good deal of it, though, about 126.000 data points.

I ran a query through the dataset that estimated the deviation over all headings (0 … 360 degrees) as [COG – variation – heading].

126k raw deviation points. Deviation range -14 … +9 degrees.

To get a more relevant subset of data points I did a few cleaning operations. Firstly, I included only points:

  • with the average heading and cog staying within 0.5 degrees during the last 12 seconds (so the boat was sticking to the same course and not turning);
  • with SOG at least 3.11 knots (1.6 m/s), to exclude slowly drifting in one direction while heading in another; and
  • with absolute heel/roll less than 3 degrees, to exclude most of the leeway correlating with heeling.
Deviation filter #1, 36k data points. Range: -10.3 .. +5.2 degrees.

Next, I filtered out outliers according to the interquartile range method, and replaced degree buckets with fewer than ten data points with an interpolation between the surrounding degrees.

(For example: deviation for 80˚ was 5.61˚ based on 100 samples, deviation for 81˚ was 9.80˚ based on 5 samples, deviation for 82˚ was 6.02˚ based on 130 samples — replace 81˚ with [5.61˚+6.02˚]/2 = 5.815˚)

Notably, the range actually widened a bit.

After outliers, 33k data points. Range -11 … +7 degrees.

Next, I ran a smoothing function (moving average) on the whole thing, calculating an average for each point based on two points before it, the point itself, and two points after it.

(Deviation for ˚90 = sum[dev 88˚+89˚+90˚+91˚+92˚]/5)

One smoothing run. Range -10 … +3.

Then I ran the smoothing with some more iterations, ie calculating five-point moving averages of the previously calculated moving averages.

3x smoothing iterations. Range -9 … +1 degrees.
20x smoothing iterations. With the filtered raw data in the background. Range -9 … 0 degrees.

The resulting 20x smoothed deviation curve looked kind of convincing, I thought. Was it correct? No idea.

When applied to the heading vs COG data, however, it produced encouraging results, showing little difference in leeway on the port and starboard tacks!

The leeway on the different tacks is similar.

Room for Improvement

Summing it all up, I finally got some speed data grouped by angle and wind speed!

My first polar diagram! CHEERS! Some lines are dotted because not enough data points.

So how well were we— our accidental sailing family of six plus dog— able to sail the boat?

Not that well, in fact!

In the picture, we’re sailing upwind (against waves, mind you!) and during the selected, darker area of roughly 2.5 hours, we averaged 6.61 knots, while the comparable polar boat would have done 8.51 knots. It’s a huge difference of 1.9 knots, and this means that during that period, we achieved only roughly 78% of the target speed.

The target boat, however, is not a Hanse 531. I couldn’t find an exactly comparable boat, so I had to go with a Hanse 540. That specific Hanse 540 should be quicker, with a 2.8 m vs 2.43 m draft and 2.600 kg less weight (18.5t vs 21.1t), but maybe not that much faster.

One possible further explanation for the big difference in average: we were sailing in quite gusty conditions, so I was regularly pinching and/or letting out the mainsheet to depower.

And the other tack:

Two hours of upwind sailing on the starboard tack.

On the starboard tack, and with less wind (average 11 kt vs 16 kt), we did much better. Here, the selected area shows that we averaged 7,04 knots, whereas the speedy 540 would have done 7,78 knots. So -0,7 knots, and about 90% of the Hanse 540 speed.

When looking at max speeds instead of averages, we got up to 92% over the selected one-hour duration.

And zooming in on some good-looking parts…

About four minute of sailing upwind on the starboard tack.

… we got to 96% or so momentarily. So maybe not that bad, after all.


My first conclusion is that we need to invest some in making it easier to acquire better performance data. It was a fun challenge, though, to sift through the historical data points trying to make sense of it all.

Secondly, what the data shows about our real-life upwind sailing:

  • Port tack: in true wind averaging 16 knots (gusts up to 21 knots), with full sails up, we averaged about 6.6 knots of boat speed, measured over about one hour.
  • Starboard tack: in true wind averaging 11 knots and with much smaller waves we averaged about 7.0 knots of boat speed, measured over an hour and a half.

Thirdly, when going forward, we have put more effort into configuring and trimming the boat for better speed.

Fun, that will be.

Leave a comment

Your email address will not be published. Required fields are marked *