Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TCX speed unit ? #74

Closed
pulmark opened this issue Oct 13, 2016 · 8 comments
Closed

TCX speed unit ? #74

pulmark opened this issue Oct 13, 2016 · 8 comments

Comments

@pulmark
Copy link

pulmark commented Oct 13, 2016

I integrated bipolar master branch into V800_downloader and build it. Now it seems to support cycling power data in HRM files with PPT5.

I noticed that TCX conversion uses km/h for speed data as it should be m/s. I don't know if this is specific to my environment, I use M450 for cycling, I have Powertap G3 hub and download training data directly from head unit via USB connection by using V800_downloader in Linux OS. In addition to power, G3 hub measures also speed and cadence.

For building in Linux OS I cloned V800_downloader and then added bipolar into it by cloning it under V800_downloader (bipolar directory). I then had to edit some project files to build app with QT Creator. For some reason I couldn't get delivered Linux libusb files to work with QT Creator so just modified project files to use libusb development libraries and header files that I installed into my Linux OS.

I run then tests and noticed that HRM files now have power data and it is displayed in PPT5. Then did TCX testing and noticed speed unit error when uploading TCX file into MapMyRide web service. Fixed speed values to be m/s instead of km/h in

QDomDocument TrainingSession::toTCX(const QString &buildTime) const

method. All fine after modification.

Also to add power/speed data into TCX files I modified V800_downloader code to enable Garmin ActivityExtension (XML data - TPX element). This option cannot be set in V800_downloader UI.

@pcolby
Copy link
Owner

pcolby commented Oct 13, 2016

Hi @pulmark,

I noticed that TCX conversion uses km/h for speed data as it should be m/s.

Interesting. I didn't actually know what units TCX uses for speed. Its not made clear in the schema, and I never thought to check (a bit silly of me). It should be very easy to convert... I'll take a closer look in the next couple of days.

For building in Linux OS I cloned V800_downloader and then added bipolar into it by cloning it under V800_downloader (bipolar directory).

You could, if you prefer, just use my v800_downloader clone instead of the official. The original author appears to have abandoned the project, and my clone is simply the latest version with all Bipolar updates applied (just as you have done).

There's an open pull request if you want to see the differences.

Thanks! 😃

@pcolby pcolby self-assigned this Oct 13, 2016
@pulmark
Copy link
Author

pulmark commented Oct 13, 2016

Ok, thanks for the info !

Yep, fix speed units is easy, I just did "divide by 3.6" modifications into the TrainingSession::toTCX() method.

I have working build environment now. I will investigate your v800_downloader clone. I don't know how you have done it but maybe building a separate library of bipolar parts that are common to V800_downloader and bipolar would be the next step ?

pcolby added a commit that referenced this issue Oct 14, 2016
The Polar speed data in in kilometres-per-hour, but TCX uses metres-per-
second (apparently; the relevant schemas are not explicit about it).

For completeness, the HRM output is already using the correct units
(that is, kilometres-per-hour multiplied by 10 or 128 depending on the
situation), and the GPX output does not include speed data at all. So
neither of those formats needing correcting.
pcolby added a commit to pcolby/v800_downloader that referenced this issue Oct 16, 2016
pcolby added a commit that referenced this issue Oct 16, 2016
@pcolby
Copy link
Owner

pcolby commented Oct 18, 2016

I don't know how you have done it but maybe building a separate library of bipolar parts that are common to V800_downloader and bipolar would be the next step ?

Yep, would be pretty easy to do - there's only a very small amount of UI logic that's leaked into the protobuf and Polar-specific classes that v800d uses. I've put together a basic project outline already, but its not a high priority right now.

Cheers.

@pcolby pcolby closed this as completed Oct 19, 2016
@MHatGH
Copy link

MHatGH commented Nov 14, 2016

first of all - this is a very nice Project !!
I'm using it with a M400 and it works fine, so you can add the M400 to the list of supported models :-).
While testing the new extended tcx Option, I saw that you missed to change the unit of speed values when writing tcx files in extended Format. You changed it in summaries but not in the trackpoints.
I use RubiTracks 4 to view my data and I got wrong values displayed. (too smal by a factor of 3.6)

And I've seen you are planing to integrate FIT file Export ?
Flexible & Interoperable Data Transfer (FIT) output Feature( #48 opened on Jan 12 2015)
This feature is very interesting to me because of the ability to transfer stepp-length values comming from my foot-pod. Is this still ongoing ore did you cancel it ? Any timeplan for this ?

@pcolby
Copy link
Owner

pcolby commented Nov 15, 2016

first of all - this is a very nice Project !!

Thanks :)

saw that you missed to change the unit of speed values when writing tcx files in extended Format.

Oh. Can you provide more details of what you think is missed? I had a good look, and thought I covered everything, but the specs are pretty ambiguous in their language. Which "extended" format are you referring to? (Garmin Activity Extension or Garmin Course Extension?) and which child element or attribute of the trackpoint? Thanks! 😄

And I've seen you are planing to integrate FIT file Export? ... Is this still ongoing ore did you cancel it ? Any timeplan for this?

There's no timeline currently. Its one of those things that I'd like to do one day, but there's hasn't been much demand nor interest for it.

Out of curiosity, what application would you use the FIT output with? If there's something I can get my hands on to test generated FIT files, I might be more motivated to implement it 😃

Thanks again.

@MHatGH
Copy link

MHatGH commented Nov 15, 2016

hi,
refering to your current release:

In "QDomDocument TrainingSession::toTCX(const QString &buildTime) const"

"http://www.garmin.com/xmlschemas/ActivityExtension/v2"

LINE

You changed it here

2188 -> if (stats.contains(QLatin1String("speed"))) {
2189 -> lx.appendChild(doc.createElement(QLatin1String("AvgSpeed")))
2190 -> .appendChild(doc.createTextNode(QString::fromLatin1("%1")
2191 -> .arg(first(firstMap(stats.value(QLatin1String("speed")))
2192 -> .value(QLatin1String("average"))).toDouble() / 3.6)));
2193 -> }

but not here

2294 -> if ((index < cadence.length()) && (cadence.at(index).toInt() >= 0) &&
2295 -> (!sensorOffline(samples.value(QLatin1String("speed-offline")).toList(), index))) {
2296 -> tpx.appendChild(doc.createElement(QLatin1String("Speed")))
2297 -> .appendChild(doc.createTextNode(VARIANT_TO_STRING(speed.at(index))));
2298 -> }

my replacement looks like this

(please do not laugh about it ! :) , Theese are my very first steps in Qt and C++ programming, Im interesting to see how this is done mor professionally)

            if ((index < cadence.length()) && (cadence.at(index).toInt() >= 0) &&
                (!sensorOffline(samples.value(QLatin1String("speed-offline")).toList(), index))) {
                tpx.appendChild(doc.createElement(QLatin1String("Speed")))
                    .appendChild(doc.createTextNode(QString::number(speed.at(index).toDouble()/3.6, 'f', 11)));
            }

and You changed it here

2434 -> if (stats.contains(QLatin1String("speed"))) {
2435 -> lap.appendChild(doc.createElement(QLatin1String("MaximumSpeed")))
2436 -> .appendChild(doc.createTextNode(QString::fromLatin1("%1")
2437 -> .arg(first(firstMap(stats.value(QLatin1String("speed")))
2438 -> .value(QLatin1String("maximum"))).toDouble() / 3.6)));
2439 -> }

@MHatGH
Copy link

MHatGH commented Nov 15, 2016

Out of curiosity, what application would you use the FIT output with? If there's something I can get my hands on to test generated FIT files, I might be more motivated to implement it

I want to use it with RubiTracks 4 Pro. There is a Trial Option if you want to test it (mac only)
But FIT files are also supported at strava. And maybe others

For me this Format (as far as I read the docu) gives the most among of data to be tranfered, therfor im interested in.
The tcx files without the activity Extension, forces RubiTracks to calculate pace from GPS data, wich leads to poor quality Graphs. The tcx file including Activity Extension solves this Problem (if I use the unit conversion mentioned above). But the stride length values are still not available.

Beside this Im not realy shure if this is caused by the lack of data in the file. The stride length could be easily calculated from distance and cardence. A Support request to rubitracks, if this stride-length value is supported at all, is not answered yet

@pcolby
Copy link
Owner

pcolby commented Nov 16, 2016

Thanks @MHatGH! Now I can exactly what was missing. I really appreciate the effort you've made reporting the details for me 👍 I'll go ahead an fix that up now 😄

PS: Good use of QString::number... I'm going to have to start using that one in a number of places now :)

@pcolby pcolby reopened this Nov 16, 2016
pcolby added a commit that referenced this issue Nov 16, 2016
This should have been included in 9715268
Thanks to @MHatGH for reporting the omission.
@pcolby pcolby closed this as completed Dec 29, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants