Go for it!

モーターサイクルと自転車とキャンプの日々。

bicicalc作りました

TCX計算機として開発を進めていたpythonのユーティリティ、ようやくまとまってきたのでgithubに放流しました。

基本的にpythonライブラリとしての位置づけで、CUIすらオマケという状態なのでいろいろ不便かと思いますが、テスト、デバッグ、開発に協力してくれる方募集です。

■動作要件

私の手元ではMacOSX 10.5, py25, py25-lxml(from MacPorts), Garmin Edge 705 v2.70で動作確認をしていますが、以下の環境を満たせば動作すると思います。Linuxなどであれば楽に動くはず。

  • Python 2.5以降 (Python 3000で動くか不明)
  • python-lxml

■サポートしているファイルフォーマット

現在サポートしているファイルはGarmin TCXファイルのみです。将来的に、PowerTap, Polarのデータにも対応予定です。

■実装されている機能

以下を実装しています。

計算) o Activity + Duration (sec or hh:mm:ss format) + Distance + Total Ascent + Average HR, Speed/Pace, Cadence o Power + Normalized Power + Average Power + Variability Index + Intensity Factor + Training Stress Score + Work + Mean Maximal Power

コンバータ) o TCX to CSV o TCX to KML o Power / Leg Velocity o Course Profile

■簡単な使い方

アクティビティサマリの計算。

斜度の計算がぶっ壊れてる…。

% ./bicicalc.py ../Garmin/History/2009-06-04-15-17-27.tcx

Duration:       01:14:12
Total Distance:     27.86km
Total Ascent:       345.27m
Average Power:      137.86W
Normalized Power:   176.00W
Variability Index:  1.285
Work:           578.441kJ

        Min Max Average
HeartRate(bpm): 64  176 127
Cadence(rpm):   0   111 56
Speed(km/h):    0   64  24
Power(W):   0   906 137
Grade:      -434.7% 230.9%  0.2%

FTPを指定(–ftpオプション)するとIF, TSSなどを計算します。

% ./bicicalc.py --ftp=230 ../Garmin/History/2009-06-04-15-17-27.tcx

Duration:       01:14:12
Total Distance:     27.86km
Total Ascent:       345.27m
Average Power:      137.86W
Normalized Power:   176.00W
Intensity Factor:   0.765
Training Stress Score:  72.414
Variability Index:  1.285
Work:           578.441kJ

        Min Max Average
HeartRate(bpm): 64  176 127
Cadence(rpm):   0   111 56
Speed(km/h):    0   64  24
Power(W):   0   906 137
Grade:      -434.7% 230.9%  0.2%

MMPの計算。

% ./g_mmp.py ../Garmin/History/2009-06-04-15-17-27.tcx
== 5 seconds Mean Maximal Power ==

Average Watts:  705.00W
Max Power:  732W
Work:       3526J
(略)
== 15 minutes Mean Maximal Power ==

Average Watts:  165.00W
Max Power:  732W
Work:       147949J

任意秒のMMP計算。–mmp-secondオプションを付ける。

% ./g_mmp.py --mmp-second=15 ../Garmin/History/2009-06-04-15-17-27.tcx
== 15 seconds Mean Maximal Power ==

Average Watts:  636.00W
Max Power:  732W
Work:       9545J

分単位でMMP計算するには–mmp-minuteオプションを付ける。

% ./g_mmp.py --mmp-minute=5 ../Garmin/History/2009-06-04-15-17-27.tcx
== 5 minutes Mean Maximal Power ==

Average Watts:  223.00W
Max Power:  479W
Work:       68063J

CSVへ変換。

% ./bicicalc.py --dump-csv ../Garmin/History/2009-03-15-04-00-01.tcx

KMLへ変換。変換した物をGoogle Mapsに食べさせることも可能。 →リンクのサンプル表示イメージのサンプル

% ./bicicalc.py --dump-kml ../Garmin/History/2009-03-15-04-00-01.tcx

power / legspeedの出力。クランク長を入力する。

% ./bicicalc.py --dump-power-legspd --crank-len=172.5 ../Garmin/History/2009-03-15-04-00-01.tcx

チャートにプロットするとこうなる。 [flickr]photo:3401487623[/flickr]

コースプロファイルを出力する。

% ./bicicalc.py --dump-profile ../Garmin/History/2009-03-15-04-00-01.tcx

チャートにプロットするとこうなる。 [flickr]photo:3632150630[/flickr]

ユーザプロファイルの出力。

% ./g_userprofile.py ../Garmin/Profile/UserProfile.tcx
UserProfile
BirthDate:  1978-01-13
Gender:     Male
Weight:     64.0kg
MaximumHR:  198
GearWeight: 8.00kg
FTP:        230Watts

            Low High
HeartRate Zone 1:   99  119
HeartRate Zone 2:   119 139
HeartRate Zone 3:   139 158
HeartRate Zone 4:   158 178
HeartRate Zone 5:   178 198

            Low High
Power Zone 1:       58  127
Power Zone 2:       129 173
Power Zone 3:       175 207
Power Zone 4:       209 241
Power Zone 5:       244 276
Power Zone 6:       278 345
Power Zone 7:       347 460

■プログラム内部的なこと

TCXをパースしてpythonの辞書に詰め込んでいます(辞書の形式はbicicalc独自)。

内部データは基本的にこの辞書のみで、辞書を操作するための関数群を複数実装しており、コマンドラインユーティリティはファイルをパースする、関数を通してフィルタする、整形して表示する機能を有しています。

なので、他のファイルフォーマット(例えばPowerTapとかPolarとか)から辞書へ変換するコードを追加することで、実装済みの計算関数を利用することが可能です。

■最後に

このツールがサイクリストの役に立つことを祈ります。楽しんで!

[ad#text_wide]