Difference in Left Right Balance

Just got back from a ride and noticed that my L/R balance in Intervals was 60/40. Checking on Garmin Connect shows it at 57/43. Something slightly off somewhereScreenshot 2021-04-12 at 14.46.39

Hmm. It seems the Garmin analysis is ignoring zeros for L/R balance. Intervals.icu keeps them in. If you are only pedalling with your left leg then you should get 0 and only right leg 100 (and there are 100’s in the data as well). So I think it is better to keep them?

You can click “Ride CSV” here to look at the L/R balance data: https://intervals.icu/activities/i889450/data

Thanks David. That link to the CSV table is brilliant. Ive got a significant left right imbalance which I’ve thought evens out the harder I go. That table seems to confirm it. It’s plays havoc with my data when I use a single sided PM on one of my bikes

I have noticed that my L/R balance in intervals.icu is systematically the opposite of the L/R balance given by Training peaks although it is always around 50/50. For example, it is 49/51 in intervals.icu and 51/49 in TPs. At this point I have doubts about which is the left and which is the right…

I have had some problems with this in the past but with 49/51 its not easy to know which is correct.

The LR data can be found within the original FIT file.
The decoding goes something like this…

The payload[2] basically checks if the PM is a LR or just a L.

		// LR Pedal Power Balance
			if ( payload[2]>>7  == 1 ) {
				_data.rPwrBal = value;
				_data.lPwrBal = 100-value;
			} else {
				_data.lPwrBal = value;           // this essentially becomes 100%
				_data.rPwrBal = 100-value;  // this is meaningless. WHich means redundant code for me
			}

Tx. Where did those docs come from? I have figured this out just from looking at the data.

It’s from the ANT+ specs.
There’s also Bluetooth Specs for Power Meter etc. (I abhor reading the bluetooth specs. It’s full of holes and the language makes my head spin)

Took me a while to figure out how to deciper Bluetooth Power Meter numbers for the BreakAway Indoor Training App when I don’t have a Trainer That talks FTMS

1 Like

Hi David, I too am finding that the data for left right balance is coming in opposite when reviewing the data off the .fit file. I notice on the ride that the “stronger” leg is normally the left (closer when going harder), but the analysis always turns up with the right being the leg that does more of the work. My data is closer to 53-47 (my last ride was a dismal 55-45). Is it possible that it is recording or capturing the inverse?
Was glad to see others had the same or similar question.
Appreciate any thoughts.
Best,
Scott

Hmm. I will have to have another look at this :frowning:

Hi David, appreciate that and as a follow up, I did some single leg tests and the data was 100% Right or Left and it recorded correctly on the Garmin (and Karoo), but the opposite when uploaded on Intervals.icu. Let me know if you would like a .fit file and happy to upload for your review.
Best,
Scott

For me it is correct both on Garmin Connect and Intervals but GC displays Left on top of the graph while Intervals has Right on top.
Recorded on Edge 830.

Intervals:
image

Garmin:
image

Tx. Please send me that file (david@intervals.icu). Also please check if it is as @MedTechCD says and the display is just different.

Happy New Year~ I don’t understand this comment-


If you pedal only with the left leg, shouldn’t the data show 100% L and 0% R
I’ll get you a .fit today with only single leg pedaling on dual PM pedals.

Best,Scott

1 Like

Hi David,

Here is a .fit of a 1 minute Left Leg Only ride with Assioma PM data.Processing: Karoo-left_leg_only-Jan-01-2022-104435.fit…
You will see that it shows that the L/R balance is 0/100, which would indicate to me that it is all RIGHT leg output. Am I demonstrating this clearly? Let me know and thanks again for looking into this for me (us).

I’m doing some work on crafting FIT files and started decoding them in an effort to learn more about them.

        let rightPower = message.leftRightBalance?.percentContribution
        let leftPower = 100 - (rightPower ?? 0)
        
        if let pwr = pwr {
          if pwr > 0 {
            leftPowerArray.append(Int(leftPower))
            leftPowerSum = leftPowerArray.reduce(0,+)
            leftPowerAvg = leftPowerSum/leftPowerArray.count
          }
        }
         
        print("\(FormatDisplay.datems(message.timeStamp?.recordDate)) Dist:\(dist)[\(distKm)] Power:\((pwr))[\(leftPower) - \(rightPower ?? 0)] LRBalance[ Cnt:\(leftPowerArray.count) Sum:\(leftPowerSum) Balance:[\(leftPowerAvg)% L / \(100-leftPowerAvg)% R]")

The above is the code I’m playing around w/ for the decoding.

2020-09-26 08:35:30.0000 Dist:Optional(44013.25)[44.0132 km] Power:Optional(73.0)[52 - 48] leftPower[ Cnt:4871 Sum:258417 53% L / 47% R]
2020-09-26 08:35:31.0000 Dist:Optional(44018.3)[44.0183 km] Power:Optional(78.0)[51 - 49] leftPower[ Cnt:4872 Sum:258468 53% L / 47% R]
2020-09-26 08:35:32.0000 Dist:Optional(44023.46)[44.0235 km] Power:Optional(95.0)[63 - 37] leftPower[ Cnt:4873 Sum:258531 53% L / 47% R]
2020-09-26 08:35:33.0000 Dist:Optional(44028.48)[44.0285 km] Power:Optional(0.0)[63 - 37] leftPower[ Cnt:4873 Sum:258531 53% L / 47% R]
2020-09-26 08:35:34.0000 Dist:Optional(44033.25)[44.0333 km] Power:Optional(0.0)[100 - 0] leftPower[ Cnt:4873 Sum:258531 53% L / 47% R]
2020-09-26 08:35:35.0000 Dist:Optional(44037.82)[44.0378 km] Power:Optional(0.0)[100 - 0] leftPower[ Cnt:4873 Sum:258531 53% L / 47% R]

I’m not 100% sure of the data yet, but here are my observations.

If Power is 0 (no pedalling at all), the LR balance is still marked as [100%L - 0%R]. Initially I just added them together (power = 0, use 100 for L % anyways, this ended up w/ wrong Overall Average)

So I started to ignore the 100% L when power is 0 and the averages came out to the same as what Garmin Connect says it is.

Would have been great if @Scott_Price had linked his FIT file so I can try processing it for confirmation. (I don’t currently have access to my very very old Windows Box for simulating the LR balance using the ANT+ simulator)

I also noticed that for GC, the when power was zero, they also don’t (plot) or don’t show the LR Balance.


Viewing the Balance data from one of my FIT files confirms that 0 means 100% Left and 100 is 100% Right side. The Balance value is the percentage contributed by the right leg.
So to get that correct, 0 in Balance field should be 100% Left on the condition that Power (or maybe cadence?) is NOT 0. Or it might be easier to set Balance to N/A when Power = 0.
It also means that the field L/R Balance should be displayed as (100 - Balance value)/(Balance value).
That still doesn’t get us an explanation why @Scott_Price has it displayed as 0/100 when pedalling left leg only…
The screenshot doesn’t show the graph and the FIT file is not attached (can’t do that on the forum). Posting the content of the csv export might be helpfull.

Hi MedTechCD,
I did send the .fit to David and he can share it with you as I only had his email. Appreciate your efforts to get to the bottom of this.
Best,
Scott

Tx for sending the file. All the left_right_balance record data is 100 which doesn’t make sense for left leg only, it should be all zeros. I am not sure what to do about that :frowning:

Does the Karoo have a balance display? What does that say for the ride?

(Note: I wrote this and then deleted as I wanted more confirmation)

For left leg only, the value should be all 100
the LRBalance data from is referencing Left contribution - Right contribution
When pedaling on Left only, the right contribution = 0

Hence, for the decoding, the leftpower is:
leftPower = 100 - (rightPower ?? 0)

since rightPower = 0, (left leg pedaling only) then left balance = 100%

Am I making sense?

I don’t get this. Why is it this way?

Here is the same dataset as my earlier post, this time I’m using the Mac app called FitFileExplorer to see the data dump.

Note that in this case, the parameter we’re interested in is called left_right_balance and the data is 186,171

The way to interpret this is to mask it using the “&” bitmask but the simplest way is just to minus the value with 128 (https://www.thisisant.com/forum/viewthread/6647/)

eg:
left_right_balance_186 = 186 - 128 = 58% (right pedal)
so, left pedal balance = 100 - 58 = 48%

More testing. This time using the ANT+ simulator and recording the data using my garmin, then uploading it to GC, Intervals and GoldenCheetah
I did 100% Left, then 90% left, then 100% Right
Findings:

  • same L-R was displayed on my garmin watch
  • same L-R was plotted in GC
  • GC is using 100%L - 50/50 - 100%R(top to bottom) vs Intervals using 0L and 100R. (If this was re-labelled as 0R - 100R, then it would be the same between GC / GoldenCheetah & Intervals)
  • Loaded it into GoldenCheetah and it uses similar nomenclature as intervals (0% - 100%) with reference to L side power. (hence it also shows 100%L then 90%L then 0% Left)
  • final L/R balance summary shows the same as 71% L and 29% R for both GC and Intervals.


Screenshot 2022-01-03 at 4.35.18 PM

Here’s the same dataset (as above) decoded by the FITSdk FitToCsv.jar file. (refer to the table header for the mathematic and the Left / Right power Balance in %)

Now we come to @Scott_Price’s fit file. Thanks to @david sending it to me via email. Now, this one got me stumped until i dig more. (It’s also helpful that scott mentioned it’s a Karoo, (non-garmin) unit)

Note that in this decode, the left_right_balance field is showing 100, which I think is not correct per the FIT definition, hence when I do a 100 - 128 = -28

I also uploaded this karoo data to GC and GoldenCheetah and both GC & GoldenCheetah doesn’t display LR balance data.

Note: Technical coding stuffs

This is directly from Garmin’s FITSdk, profile.xlsx (that’s how to do the “&” bitmask stuffs)

also this post earlier

Yep… I get the price for being overly descriptive / technical in my posts :rofl: :yum:

The FIT file i used / created using ANT+ Simulator