FIT SDKを再発明して、ペダリング開始時のパワースパイクを検出して0に補正するツールをJavaで作りました。
SDKに相当する部分はfitrepair-utils
プロジェクトです。
元々の課題
ROTOR Power(SW 0.900)でペダリング開始時に異常なペダリングパワー*1が記録されることがありました。
- 使用しているサイクルコンピュータはGarmin Edge 510J
- 発生するのは常に信号待ちからのペダリング開始時(発進時)*2
- Firmwareアップデートや電池交換で改善せず
この異常値を検出して0に補正したい。
- 2,000Wのようなデータが1つでもあると、STRAVAで他のデータが地面を這うようなグラフになってしまい困る
検討
Garmin online fit repair tool や ROTOR User Software 1.6で一定値以上のパワーを補正することはできますが、今回のようなデータだけを補正することができません。
Fit File Repair Tool もありましたが、Windows 8(x64)で動作しませんでした。
FIT SDK の使用を検討し調査しましたが、コードがクソだった。*3
Qiitaの記事には書かなかったこと
結果
冒頭のようにFIT SDKを再発明して、それを使用してパワーデータ補正ツールを作成しました。
パワーデータ補正ツール (fitrepair-main)
0Wから上昇して直後に50%より大きく減少*5しているパワーを検出して、0Wに補正します。
この補正によりmax powerとaverage powerが変わるので更新します。 またデータ上accumulated power(累計値)があるので、これも更新します。
TrainingPeaks独自のNormalized Power (NP) もありますが、計算式が不明のため、補正していません。
SDK (fitrepair-utils)
最も基本的な使用例
final Reader reader = new Reader(); reader.getDispatcher().setHeaderLintener( (header) -> { // do something. }); reader.getDispatcher().setDefinitionMsgListener( (defMsg) -> { // do something. }); reader.getDispatcher().setDataMsgListener( (defMsg, msg) -> { // do something. }); final boolean result; try (final InputStream in = new FileInputStream(fitFile)) { result = reader.read(in); } catch (final IOException e) { logger.error("Error while reading fit file.", e); return; } finally { reader.getDispatcher().removeListeners(); }
DataMessageListener
ではデコードしたデータのRawレベルなオブジェクトDataMessage
が返ります。(相当使いづらいと思います)
Record、Lap、Session等の走行データを処理したい場合は、それぞれ対応したListenerを登録すればWrapされたオブジェクトが返りますので、簡単に処理することができます。
例:RecordListener
reader.getDispatcher().setRecordListener( (DefinitionMessage defMsg, Record msg) -> { // do something. // e.g. msg.getPower(); // msg.getCadence(); });