解析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提供兩個完美教學,解釋如何修正誤差
核心概念很簡單,水平和垂直處理的手法,基本上是一樣的
- 假設第0點是有效參考點pt[0]
- 計算distance(pt[1], pt[0]),小於5公尺,pt[1]當成雜訊丟掉
- 計算distance(pt[2], pt[0]),超過5公尺,pt[2]有效並當成新的參考點
- 計算distance(pt[3], pt[2]),...
得到里程表
所以FIT檔照以下順序處理,就有里程表
- 水平過濾
- 垂直過濾
- 剩下的點,計算累積距離,累計爬升,得到表格
{時間,里程,高度,累計爬升,經緯度} - 最後這張表格,用0.5公里當精準度取值,輸出結果
結語
處理GARMIN FIT file不是很難,這一篇研究單車碼表內,怎麼處理距離和高度。我也解決最初的問題:取得每公里的高度和爬升量
最初沒有考慮雜訊,算出來的速度和高度誤差不少;詢問AI介紹GPSVisualizer的算法,照著實作效果滿好的;這篇就沒太多source code,意義不大;如果您真的動手解這題想看我怎麼寫再聯絡我吧
最後這些運算結果,我架了一個簡單的網站,如果有需要,可以自取來用。下一篇來寫一下,架網站的心得
留言