見出し画像

Garminの走行ログをcsvファイルにエクスポートしてグラフ化する方法

こんにちは
自転車が大好きなsilicate_meltと申します.

Garminのサイコンって凄いですよねぇ
地図でルート設定すればナビしてくれる上に,位置情報も含めた走行ログを残すことができちゃうんだから
(アタリ前だろ! とか怒らないでくださいね,笑)

さて,前回Garminのペダル型パワーメーターの導入記を書きました.

 2月に天気のよい週末があったので,2回ほど外で乗ってみたのだが,RALLYのパワーメーターも想像以上に良かった.
今年のベストバイは,おそらく既にコレで決まりだろう

 

Garmin Connectで作ったグラフの例

 パワーメーターで出力のログが取れるようになると,上図のように速度やケイデンスとの対応関係を調べてみたくなる.しかしGarmin Connectの走行ログのグラフ表示機能には大きく次の3つの欠点があると考える.
(1)そもそもGarminConnectで重ね合わせグラフを作るのは操作が面倒
(2)縦軸が調整できないからデータを重ねたときに見やすいグラフにならないことが多い
(3)グラフを保存できないから,画面のキャプチャなどをするしかない.

そこで,何かスクリプト的に必要なグラフをチャチャっと作れるツールがないかな…といろいろと調べてみた.
 まず候補に上がったのは Fit File Explorer を使う方法(下記リンク)

Garmin Connectで歯車アイコンをクリックしたところ

 Garmin Connectの歯車アイコンから「オリジナルをエクスポート」を選ぶと,走行ログのfitファイルをダウンロードすることができる.
このfitファイルをFit File Explolerでcsv変換して保存することができるので,それをPythonでグラフ化する方法が考えられる.
しかしこの場合,csv変換とグラフ化の2回の操作が必要となってしまう.
どうせPythonを使うならcsv変換のところから一括処理をしたいところだ.


TCXdumpの修正

ネット検索をして調べてみたところ,同じことを考える人はいるもので,2018年にxshige氏が作成したTCXdumpが見つかった.

 これはエクスポートしたtcxファイルをcsv変換するとともにグラフ表示をするPythonコードである.
 TCXdumpを使ってみたところ,パワメーターには非対応であった.
そこで今回,これをパワーメーターのログも表示・保存できるように修正した.またTCXdumpのオリジナルのグラフ表示機能が見難かったので,自分的
に欲しいデータが見やすくなるようにコードを改良した.

主な修正部分
#がパワメーターのログを読み取るように追加したところ

        if Extensions != None:
            TPX = Extensions.find('AEv2:TPX', ns3 )
            #print('TPX',TPX)

            if TPX != None:
                spd = TPX.find('AEv2:Speed', ns3).text
                spd = float(spd)*3.6 # m/s ==> km/h  
            else:
                spd = -1 # meansa No Speed

            Watts = TPX.find('AEv2:Watts', ns3 )       #
            if Watts != None:                          #
                wat = TPX.find('AEv2:Watts', ns3).text #

            else:                           #
                wat = 0 # meansa No Watts   #

        else:
            spd = -2 #  meansa No Extensions
            wat = -2 #  meansa No Extensions #

その他の修正部分

  • パワーの保存とファイルパスに関わる部分を適宜修正

  • 元々のグラフ表示・保存機能を全削除して,作り直した.


修正版を下に置きました.
走行ログからチャチャっとグラフを作ってみたい方は試してみてください.

 注:この変換コードはパワーメーターの有無は問いません.
tcxファイルの要素名ってサイコンによらず共通なのでしょうかね?  
共通なのであればGarmin以外のサイコンでも使えると思います.

Pythonを使ったことがない人でもGoogle Colaboratoryで簡単に実行できます.Google Colaboratory用のファイルも下に置きました.




Pythonでの使い方:

(1)Garmin Connectにて走行ログをtcxファイルでエクスポートする.
(2)ファイル名が「activity_13907573898.tcx」等となっている.
数値の部分は,例えば「activity_240217.tcx」など日付に変えると良い.
(3)tcxファイルをgarmin.pyと同じディレクトリに置く.
(4)ターミナルで python3 garmin.py activity_240217 (リターン)
  (このとき拡張子名は入れない)
(5)次のファイルが出力される.
1秒間隔の走行ログのcsvファイル
activity_240217.csv,activity_240217_TCXdump.csv
6種類の3軸プロットのjpgファイル
Figure 1.jpg:横軸:時間,縦軸:速度,パワー,高度
Figure 2.jpg:横軸:距離,縦軸:速度,パワー,高度
Figure 3.jpg:横軸:時間,縦軸:速度,パワー,心拍数
Figure 4.jpg:横軸:距離,縦軸:速度,パワー,心拍数
Figure 5.jpg:横軸:時間,縦軸:速度,パワー,ケイデンス
Figure 6.jpg:横軸:距離,縦軸:速度,パワー,ケイデンス

Pythonを使ったことがない方向け:

Google Colaboratoryを使用すれば,パソコンにPythonをインストールすることなく,ブラウザだけで簡単にtcxファイルをcsvファイルに変換するとともにグラフを作成・保存できます.ブラウザなのでスマホでもできます.
(1)Garmin Connectにて走行ログをtcxファイルでエクスポートする.
(2)Googleアカウントを取得する.
(3)Google Driveにログインして,Garmin.ipynbと変換するtcxファイルをドライブに置く.
(4)Google Colaboratoryにログインして,Garmin.ipynbを開く.
(5)Garmin.ipynbのtcxファイルのパスを設定する.
(path = '/content/drive/My Drive/activity_xxxxxx.tcx'  のxxxxxx部分)
(6)Google ColaboratoryでGarmin.ipynbを実行する.
(7)Google Driveに1秒間隔の走行ログのcsvファイルと6種類のjpgファイルが保存される.


使用例(その1)

国道101号線,巨大なまはげ像(2024年2月12日)

 先月2月12日,午後から天気が良くなってきたので,巨大なまはげ像までテスト走行をした.この日は行きが向かい風,帰りが追い風であった.170Wをキープしながら往復53kmを走ってみた.
このときの走行ログをcsv変換するとともにグラフ化した結果を下に示す.

このグラフから分かること:

  • 自宅周辺は市街地なので,一時停止ポイントが多い.

  • 行きは向かい風もあり,とくに走りはじめはケイデンスが低かったが,追い風の帰り道は高いケイデンスで走ることができた.パワーは一定だから,向かい風ではケイデンスが上げられないために速度も上がらなかったことがわかる.

  • 交差点の少ない快走区間にて,行きは向かい風であったので足を休めることなく漕ぎ続けた.帰りは追い風であったので足を止めることも多かったが,それでも速度が落ちなかった.

  • 上のパワーは3秒平均の値.一定のパワー(約170W)をキープするつもりで走ったにもかかわらず,速度やケイデンスと比べてパワーには大きなムラがあることがわかる.私が使っているパワーメーターは左センサーのみのRALLY RK100だが,左右にセンサーがあるタイプで左右のパワーを個別に計測しても,このムラの範囲内に収まってしまって,左右で有意な差を検出することは難しいのではないだろうか? と思った.


使用例(その2)

国道108号線 松ノ木峠にて(2024年2月17日)

 翌週2月17日,この日は朝から天気が良かったので県南の松ノ木峠まで走ってきた.パワーメーター装着後の初ロングライド(206km)である.
 そのときのGarmin Edge840の走行ログをtcxファイルでエクスポートし,上記のgarmin.pyでcsv変換するとともにグラフ表示したものが下記
PythonのMatplotlibをMacで実行すると拡大・縮小可能なインタラクティブなグラフ表示になるので,とても便利だ


 36-46km地点と150-160km地点での速度とパワーの関係を上図に示す.
 この図から行きと帰りの走り方の違いを見ることができる.
 体力に余裕のある行き(36-46km地点)では,一定のパワーと速度を維持しながら走れていることが分かる.
 ところが,疲れが見え始める帰り道(150-160km地点)では,漕いで速度を上げたのちしばらく足を止め,速度が落ちたらまだ漕ぐという,慣性力に頼った走り方をしていることがわかる.そのため速度には大きなムラがある.
 前々から,疲れた時の自分はそのような走り方になっているんだろうな… とは思っていたけれども,データとして見れたのは今回が初めて(笑)
(実はこのことはロードバイクのホイール選びに大きく関係する事柄なのだが,それについてはまた別の機会にnoteにまとめようと思う)


 松の木峠(434m)へのヒルクライム時の記録を上図に示す.
 速度とパワーがゼロになっている部分は景色の写真を撮ったり休憩をしたりして停止していたところだ.
 停止後,再び走り始めると一時的に170Wが出るのだが次第に100Wくらいまで低下して,再び停止してしまっている(黄緑色の矢印).
 しかし使用例(その1)で示した2月12日のライドで判明したように,向かい風の平地であれば自分は170W程度で巡航できるはずなので,上図の事実は単に坂道に対して気持ちが負けていたことを示しているのである(笑)


まとめ


 パワーメーターというと競技用のトレーニング機材な感じがしてしまうが,マイペースのサイクリングでも「遊びの道具」として楽しく活用することができそうだ.だが,そのためにはデータのグラフ化が必須である.
このnoteではその方法の一例を紹介した.

 私はパワーカーブだの,VO2Maxだの,効率的なペダリングだのには興味がない.今の自分はレースに出ようと思っているわけではないし,サイクリングではそうしたデータに縛られた走り方をしても何も楽しくないと思うからだ.
 パワーメーターでログが取れるようになると,真剣にクランクを回していたところ,疲れてチンタラ走っていたところなど,自分の走り方が如実に分かる.
 帰宅後にグラフを見ながらその日のサイクリングを振り返るのも,いろいろと気がつくことが多くて楽しいものである.
 そして,「前回はこんな感じだったから,次のサイクリングではちょっとココを改善してみようかな」程度の感じで気楽に付き合うのが,今の自分には合っているような気がする.


謝辞:便利な変換コードを作成してくれたxshige氏に謝意を表します.

(終わり)


この記事が気に入ったらサポートをしてみませんか?