文章總列表

找出單車塔系列挑戰,所有休息時間;分析Garmin FIT file

緣起

上次東三塔27H41M完賽,2026年手滑報名28H,只剩19分鐘緩衝,完賽邊緣!所以我得仔細爬梳2025年的資料,把事情規劃好

騎得快很難,體能弱很難立刻變強;優化休息時間倒是簡單很多。我問AI工具教我怎麼從Garmin FIT檔找出所有休息時間,經過一番努力,這篇文章介紹兩個方法


GoldenCheetah

軟體抓回來,餵Fit檔案就能畫圖;整個挖空的區域是停等,一目暸然


標出長休息點,台東都歷(30),睿豐門市(40)時間超乎預期。明年專心優化這裡吧



工程師,還是想掌控一切,自己寫script最對味

我還是想自己操作FIT檔,理由略過1000字。步驟和思路列在下面,下次可以抄

  1. fitfileviewer.com
    這個網站很好用,塞FIT file能轉出CSV檔,再用EXCEL分析;EXCEL技能點滿的同學可以在這裡停下(我不是);後面基本上所有分析,都是用這個網站做交叉比對

  2. 安裝Python3開發環境
    只裝Python3,我不喜歡裝很大包的安裝包,簡潔一點

  3. 用venv安裝所有套件,創造虛擬目錄,和其他環境隔開
    python3 -m venv bike_analysis // 創造出虛擬環境
    cd bike_analysis // 切到虛擬環境目錄
    source bin/activate // 啟用此虛擬環境

    然後安裝需要的套件
    pip3 install fitparse // fit 檔分析套件
    pip3 install jupyter // jupyter 開發環境
    pip3 install matplotlib // 做圖工具

  4. 啟動jupyter
    jupyter notebook


jupyter notebook簡介

我很少用jupyter,基本上是為了這件事裝;不過我知道,他可以把Python的軟體切成一塊一塊的執行,反覆的操作。以我這次做實驗,效能會提高很多

下圖,首先我開了一個notebook叫Untitled,然後把fit檔拷貝到裡面去

第一個區塊,示範怎麼開檔。這裡有一個列印紀錄的函數,後面會反覆使用

第二個區塊,列出FIT檔裡所有的紀錄。這裡看得出FIT檔的資料是分門別類的



第三個區塊,我們來看file_id這個區塊資料;上方是FIT File Viewer印的資料,下方是Jupyter notebook印的。基本上是完全一樣的,這樣有信心啦

我很用功,FIT File Viewer裡每張表格,我都用Python看過。這樣我會比較有信心


找出休息時間

在FIT檔,Events表格紀錄一些有趣的事件,我感興趣的是Timer start/stop-all。停紅綠燈或是休息,都會產生"stop-all"事件;繼續走會產生"start"事件;每個事件都有時間


經過一番研究,我寫了下面那段code做分析;大致邏輯如下

  1. 只要遇到timer事件,就塞到timestamp[],紀錄所有start/stop-all事件
    ['start', time]
    ['stop', time]

  2. 掃描timestamp[],從第一個掃到最後。如果遇到[x]是stop,[x+1]是start,代表暫停。這時候計算[x+1].time - [x].time就是休息幾秒,存在time_delta[]

  3. 累加time_delta[],就知道總計休息時間

  4. 排序time_delta[]取前20大,就知道停等最久的位置

效果很不錯,總計有106次停止事件,3.5H;排行前20大總計2.85H,這些巨大休息的洞

  • 2189秒(CP4睿豐門市,36.5M)
  • 1721秒(台東都歷,28.7M)
  • 1685秒(CP2花蓮新城)
  • 1181秒(CP3北回歸線)

X軸是所有休息時間排序,Y軸是累加休息時間。總時間在後段快速累加上去。所以停紅綠燈真的沒佔多少時間


一些有趣的數據

碼表和哪些裝置互聯


位置紀錄

每秒一個點,有經緯度,心律,距離(每秒移動多遠),功率,溫度,... 前面休息的時間戳記,也可以在這裡找到具體的位置


心跳的精確時間,拿來算HRV

ANT+心跳表,裡面自帶心跳間距,精度是1/1024s。所以碼表紀錄每秒鐘,每個心跳的間距。把這些數量算出來,可以推估騎東三塔,心跳跳了幾下!




裝置電量和溫度

每分鐘會丟出一筆電池電量;可以分析碼表電量能撐多久


結語

分析那麼多,還是得好好練車,不然還是騎不完 >_<


留言

這個網誌中的熱門文章

STM32 UART + DMA,使用HAL實作TX/RX,以及不定長度接收

小米掃地機器人S20+ review

玩CAN bus的傢伙們 (1) CandleLight-based USB-CAN