文章總列表

解析Garmin FIT file,計算累計里程和累計高度

緣起

東三塔規劃表為例,大會有檢錄點,我們有休息點,把他們全部塞入試算表。要估算時間,得猜平均速度我的方法簡述如下

  • 距離:絕對里程相減,簡單
  • 爬升量:累積爬升量相減,麻煩
  • 坡度爬升量/ 距離
  • 平均速度平地速度 - 坡度*K,騎一趟觀霧可以估算

這篇要解決累計爬升量,我想要有一份軌跡檔(FIT),計算出每公里的資訊


預期的產出

假如弄得到軌跡檔(比如我自己的FIT檔),我就能算出下表,這樣規劃路線就是查表而已

  • 累積里程
  • 海拔高度
  • 累計爬升
  • 經緯度

上表做圖,看得出蘇花公路120~200,爬升1000,可以用來分配體力,安排休息點


解析FIT檔案

Garmin FIT檔可以用fitfileviewer閱讀,“record”是單車碼表運作的依據,每一秒的經緯度,心律,功率,踏頻,高度,左右腳平衡,blah blah。這裡只需要

  • 時間
  • 經緯度
  • 高度

不同廠商的碼表,紀錄邏輯也不同,寫軟體處理相容性問題,也是非常有趣

  • Garmin/ Wahoo:每秒紀錄
  • Bryton/ iGPSport:有變化才紀錄

假如上面的資訊完全沒誤差,計算每秒之間的移動距離,和爬升量,得到

  • delta_distance[n]
  • delta_altitude[n]

累加上述參數,就有每秒鐘的絕對里程,累積爬升量。最後再查表,問題就解完了

  • 累計距離=1km,經緯度,累計高度,海拔高度
  • 累計距離=2km,經緯度,累計高度,海拔高度


處理誤差

真實世界感應器都有誤差,GPSVisualizer提供兩個完美教學,解釋如何修正誤差

核心概念很簡單,水平和垂直處理的手法,基本上是一樣的

  1. 假設第0點是有效參考點pt[0]
  2. 計算distance(pt[1], pt[0]),小於5公尺,pt[1]當成雜訊丟掉
  3. 計算distance(pt[2], pt[0]),超過5公尺,pt[2]有效並當成新的參考點
  4. 計算distance(pt[3], pt[2]),...


得到里程表

所以FIT檔照以下順序處理,就有里程表

  1. 水平過濾
  2. 垂直過濾
  3. 剩下的點,計算累積距離,累計爬升,得到表格
    {時間,里程,高度,累計爬升,經緯度}
  4. 最後這張表格,用0.5公里當精準度取值,輸出結果


結語

處理GARMIN FIT file不是很難,這一篇研究單車碼表內,怎麼處理距離和高度。我也解決最初的問題:取得每公里的高度和爬升量

最初沒有考慮雜訊,算出來的速度和高度誤差不少;詢問AI介紹GPSVisualizer的算法,照著實作效果滿好的;這篇就沒太多source code,意義不大;如果您真的動手解這題想看我怎麼寫再聯絡我吧

最後這些運算結果,我架了一個簡單的網站,如果有需要,可以自取來用。下一篇來寫一下,架網站的心得


留言

這個網誌中的熱門文章

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

小米掃地機器人S20+ review

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