發表文章

文章總列表

解析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 提供兩個完美教學,解釋如何修正誤差 修正水平誤差 (Smoothing & Simplifying Tracks) 修正高度誤差 (Calculating elevation gains) 核心概念很簡單,水平和垂直處理的手法,基本上是一樣的 假設第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檔照以下順序處理,就有里程表 水平過濾 垂直過濾 剩下的點,計算累積距離,累計爬升,得到表格 {時間,里程,高度,累計爬升,經緯...

EXCEL好用的函數:LET,在公式裡宣告local variable

圖片
緣起 我覺得EXCEL大概有兩個使用情境,我的體感大概比例約99%:1% 用過即丟,隨便做一做 嚴肅的使用,算的結果得超級可靠 我的同溫層(工程師)普遍不信任EXCEL,需要可靠的情境,大家會問:為什麼不用Python。這代表現代工程師普遍會寫Python;在15年前可能有人想用Perl,當年我自學Python2,現在已經是Python3了 扯遠了,既然EXCEL就裝在那裡,如果稍微 多做一點 ,免費提高可靠度,不香嗎? (正在努力學習的貓吉) EXCEL二維查找 我解過兩次EXCEL二維查找,我們用這個來討論EXCEL維護問題 2021年 2025年 2025年版的最後公式如下,裡面的LET函數只要多做一點,就能大幅提升EXCEL可讀性 第一個版本 二維查找得呼叫5次EXCEL公式才能實作,寫成下面那樣,三個月就沒辦法維護了 INDEX()呼叫3次 XMATCH()呼叫2次 第二個版本 儲存格裡按ALT+ENTER適當把公式排版一下,分得出INDEX()幾個參數就能大幅提高可讀性。過了三個月也許得查一下INDEX()定義,不過這個版本我有信心維護 第三個版本 EXCEL如果能在公式裡加入註解,比如第二版改成下面這樣,可讀性就好很多;像EXCEL這種有悠久歷史(包袱重)的軟體,機率不高啊 INDEX(     /*tbl*/ C17:E19,     /*row_idx*/ XMATCH(...),     /*col_idx*/ XMATCH(...) ) 雖然不能加註解,微軟團隊還是提供了LET()函數,能用容易理解的方式編寫函數!我們能宣告區域變數row_idx/ col_idx,然後在最後的運算,用有意義的方式讓人理解。這樣閱讀時,能一個一個區塊研究,也能在隔壁儲存格實驗每個變數的意義 為了半年後我還記得,我寫這篇BLOG讓我記得LET()做什麼 第四個版本 最後一個版本就是 2025年的二維查找 ,公式放到NAME MANAGER,避免複製貼上 情境是這樣的 整欄儲存格,都要第三版公式,EXCEL拖一下就複製完公式 也許某次改了公式,公式一拉,某個儲存格漏掉了 有些儲存格是舊公式,有些是新公式,然後查問題找得懷疑人生 寫軟體有所謂的DRY原則(Don't Repeat Yourself),避免把某個...

EXCEL表格二維陣列查詢 2025

圖片
緣起 最近又要用 EXCEL表格做二維陣列存取 ,之前用VBA搭建,想試著不要寫CODE。在2025年問問AI有沒有更好的做法 GROK AI給我的回應 GROK AI回答唬爛的傾象嚴重,不過我猜,微軟應該是有收過這個抱怨(起碼我很不爽) GROK回答的第一句我完全認同。我很確定網路上的EXCEL教學都比我聰明,這些範例他們扛得住,我卻受不了... 受不了的人自己找出路 GROK AI給的解法 GROK雖然很會唬爛,但是下面步驟是真的可靠,確實可以用 這段code要貼在NAME MANAGER,我留著當筆記 =LAMBDA(tbl, row_key, col_key,     LET(         row_idx, XMATCH(row_key, INDEX(tbl,,1), 0),         col_idx, XMATCH(col_key, INDEX(tbl,1,), 0),         INDEX(tbl, row_idx, col_idx)     ) ) 測 試看看 先展示結果 用Get2D台積電股價,這個複雜度我受得了 用組合技查中華電信的資本額,嗯... 結語 2025年版比2021年舒服多了,以後我用EXCEL,都會先開這篇文章,加一下公式 這個解法比 2021年 使用VBA更好,開啟VBA經常會遇到安全性問題,這招不會

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

圖片
緣起 上次東三塔 27H41M完賽 ,2026年手滑報名28H,只剩19分鐘緩衝,完賽邊緣!所以我得仔細爬梳2025年的資料,把事情規劃好 騎得快很難,體能弱很難立刻變強;優化休息時間倒是簡單很多。我問AI工具教我怎麼從Garmin FIT檔找出所有休息時間,經過一番努力,這篇文章介紹兩個方法 GoldenCheetah 軟體抓回來,餵Fit檔案就能畫圖;整個挖空的區域是停等,一目暸然 標出長休息點,台東都歷(30),睿豐門市(40)時間超乎預期。明年專心優化這裡吧 工程師,還是想掌控一切,自己寫script最對味 我還是想自己操作FIT檔,理由略過1000字。步驟和思路列在下面,下次可以抄 fitfileviewer.com 這個網站很好用,塞FIT file能轉出CSV檔,再用EXCEL分析;EXCEL技能點滿的同學可以在這裡停下(我不是);後面基本上所有分析,都是用這個網站做交叉比對 安裝 Python3 開發環境 只裝Python3,我不喜歡裝很大包的安裝包,簡潔一點 用venv安裝所有套件,創造虛擬目錄,和其他環境隔開 python3 -m venv bike_analysis // 創造出虛擬環境 cd bike_analysis // 切到虛擬環境目錄 source bin/activate // 啟用此虛擬環境 然後安裝需要的套件 pip3 install fitparse // fit 檔分析套件 pip3 install jupyter // jupyter 開發環境 pip3 install matplotlib // 做圖工具 啟動jupyter jupyter notebook jupyter notebook簡介 我很少用jupyter,基本上是為了這件事裝;不過我知道,他可以把Python的軟體切成一塊一塊的執行,反覆的操作。以我這次做實驗,效能會提高很多 下圖,首先我開了一個notebook叫Untitled,然後把fit檔拷貝到裡面去 第一個區塊,示範怎麼開檔。這裡有一個列印紀錄的函數,後面會反覆使用 第二個區塊,列出FIT檔裡所有的紀錄。這裡看得出FIT檔的資料是分門別類的 第三個區塊,我們來看file_id這個區塊資料;上方是FIT File Viewer印的資料,下方是Jupyter notebook印的。基本上是完全一樣的,...

ANT+找樂子(2),解析心跳感應器和封包

圖片
整活啦 ANT+ Device Profile,Heart Rate Monitor 規格 ,心跳傳輸的速度約4Hz。 上一篇範例程式 速度怎麼搞都很慢,問Grok AI,或是Chatgpt答案都很怪,這種冷門知識還是得靠自己。這篇要講心跳表的定義,以及怎麼用openant讀出數值 心跳表的規格 RF頻率 = 2457Mhz(下表的57代表2400Mhz + 57Mhz) 心跳表用哪個頻率是規定好的 訊息發送間隔是32768/8070=4.06Hz,大多ANT+感應器操作在4Hz附近 Device Type是0x78,Transmission Type=1 為什麼Message Period不設定成8192(4Hz) 為了避免無線電波碰撞。ANT+讓每個裝置頻率略有不同,就算發生碰撞也是短時間,稍後還是會錯開。這個是很有智慧的設計! 直接操作Channel 不囉唆,直接上code node = Node(), set network key ANT+的公開鑰匙,幾乎99%的ANT+裝置都用這把鑰匙 ANTPLUS_NETWORK_KEY = [0xB9, 0xA5, 0x21, 0xFB, 0xBD, 0x72, 0xC3, 0x45] new_channel,開啟host(電腦)和裝置的通道,這個通道是雙向的 幾乎所有範例都是雙向,直接抄 set_period(8070) 根據上表,心跳表的週期是8070照著設定 ch.set_id(54345, 120, 241) # GARMIN WATCH ch.set_id(49528, 120, 1) # Magene 上述的code,連接Garmin Watch或是Magene心跳帶都可以 ch.open() node.start() 開始和ANT+裝置溝通 finally:     node.stop() 如果按CTRL+C,有機會能正確結束程式。不然在MAC經常要插拔Dongle才能恢復 解析ANT+封包 來自規格書的照片先來一張, 中文資料 byte0[bit7]叫Toggle bit,ANT+經常會重送資料以免接收端漏收,招數很土,但是有用 因為會重送,所以當封包內容改變,toggle-bit會變化;這樣接收端就能判斷是資料有變 byte0[bit6:0]叫page,這裡是一個編號,代表後面b...

ANT+找樂子(1),建構開發環境

圖片
緣起 Garmin單車碼表是高階貨色,行業的領頭羊。搭配ANT+感應器,心跳表,單車踏頻,功率計,然後就被鎖在Garmin宇宙了。寫年度考績表實在壓力太大了,我決定深入看看ANT+協定,找樂子 找樂子工具 我用這些東西找樂子,他們不難找 Macbook AIR M2 ANT+ Dongle,下圖左邊的收訊很爛,右邊的好多了,不過都可以用 ANT+ Dongle再說個兩句 右邊的Dongle插入電腦顯示以下資訊,USB廠商識別碼0xFCF(4047),加拿大Dynastream公司在2003年發布ANT規格,2006變成GARMIN子公司 設定開發環境具體步驟 寫下來,下次重灌電腦可以用 取得libusb,和USB Dongle打交道 Windows也許有安裝包可以下載 MAC靠 homebrew 裝,我有點抗拒怕把系統弄亂。反正就找樂子,裝吧 連進他的網站,命令直接複製貼上 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 操作brew brew update // 更新brew工具 brew install libusb // 安裝libusb brew install joe // 安裝我慣用的editor, joe (這一步可跳過) brew list // 列出所有安裝的包裹 設定 openant 開發環境,已經有人包好方便的Python套件,找樂子,裝吧 建立獨立antdev開發環境,和系統Python隔開 python3 -m venv antdev 啟用開發環境 & 升級pip cd antdev source bin/activate pip install --upgrade pip 安裝openant開發包 pip install openant 掃描ANT+裝置 打開手錶的心跳廣播,戴上心跳表,或是讓任何ANT+裝置醒過來 輸入命令尋找ANT+裝置 openant scan 下圖找到裝置 - ID=54345 - Device_type=120 - Transmission_type=241 解析ID 稍微聊一下上面找到的ID,基本上ANT+裝置 完整ID 是32bit,由三個...

單車內搭衣指南

圖片
緣起 我一直想知道單車內搭衣,到底有沒有用。我前後測試非常多件,寫一下comment 96單車內搭衣 迪卡儂399內搭衣 ATLAS秋冬內搭衣 SHIMANO內搭衣 Q36.5 base layer0/ base layer1 新竹風城單車出清CABALLERO內衣 淘寶EVR內搭衣 內搭衣主要有四種材質,他們幾乎不會壞,這裡有 常見布料 介紹 聚酯纖維(可以上色) 聚丙烯(只有白色,繩子,超疏水) 尼龍(亮亮的,滑順,但是容易起毛) 彈性纖維(萊卡,Spandex) 內搭衣穿一整天 穿迪卡儂399當睡衣,衣服太透氣了,根本不聚熱,睡覺冷得要死;隔天套上T-Shirt/襯衫上班,辦公室有空調,一整天感覺冷冷的,這衣服不能替代棉質內衣 車衣+內搭衣,在戶外騎車 我騎觀霧來回大概10H,夏天單穿車衣,流汗流到衣服黏在身上 多一層內搭衣,保證車衣不黏皮膚;網狀材質的衣服不會黏在身上,不管是聚酯纖維,聚丙烯,尼龍,導汗效果都很好。只要拉下拉鍊,風加減能穿到身體,不會被濕車衣全部擋住 外騎我一定穿一件,只要沒有 熱到沒風 ,基本上都有好處 室內騎車的實驗 踩訓練台穿車衣加內搭衣,超白癡的實驗,多一層一定更熱啊!在室內穿內搭衣比較涼,也能避免汗亂噴,踩台我穿內搭衣 內搭衣+車衣(熱到受不了) 車衣(流汗衣服黏在身上) 內搭衣(電風扇能吹到身上) 內搭衣PK 我買了那麼多件,應該有資格說個兩句 聚酯纖維容易染色,所以顏色繽紛的貨色,大多是聚酯纖維 迪卡儂有 399 (聚酯纖維80%)和 749 (聚丙烯40%+尼龍40%)兩種內搭衣,我問grok AI差異,他說聚丙烯布料排汗效能最頂,只是難以染色,幾乎都是白色。也許我該去買一件749實驗看看 ATLAS秋冬款 是100%聚丙烯,非常透氣,比較厚 SHIMANO VERTEX內搭衣 是85%聚丙烯,蝦皮買從印尼雅加達寄來。和ATLAS接近 96單車內搭衣 比較薄,應該是聚酯纖維,穿起來比迪卡儂399涼 Q36.5 base layer 0 ,數字最小,應對最熱的天氣,非常薄,穿起來非常涼 Q36.5 base layer 1 ,比layer 0稍微厚一點,材料多一點 中國EVR內搭衣,網布比較大顆,保證隔開衣服和皮膚 CABALLERO網站停在2017,應該沒營業了。以尼龍為主力(90%),加上萊卡(10%)。標價1280出清20...