何時該換線,取決於使用量,而不是日期。同樣是一個月,每週打一次球的人和每週打四次球的人,在球場上花的時間相差四倍。日曆以相同的節奏前進,但球線承受的負荷並非如此。
String GOAT一開始也是這樣設計的:穿線日期加上以天數計算的週期。我自己也會幫球拍穿線,所以一再遇到這個基準失靈的情況。練得很兇的一週,和幾乎沒打球的一週,卻在同一天收到一樣的提醒。
把基準從日期改成使用量,是顯而易見的解法,但問題恰好卡在這裡。打球時長這種資料,在訓練結束、你估算「今天大概打了兩個半小時」的那一刻,就已經從資料變成了記憶。擊球數更是根本無從計算。我在做一款記錄球線的應用程式,卻沒有辦法記錄球線實際做了多少工作。
手錶應用程式,就是為了補上這個缺口而存在的。在Apple Watch或Galaxy Watch上開始一場訓練,它就會記錄擊球數與打球時長,這份紀錄之後會用於換線判斷。
要做到這一點,得先跨過一個限制。在網球場上,球員通常會把手錶戴在沒有握拍的那隻手腕上,因為戴在持拍手上會妨礙握拍,而且會直接承受衝擊。但對於統計擊球數來說,這個習慣反而不利:球被擊中瞬間的衝擊,在握拍的手臂上表現得最明顯,傳到另一隻手臂時則弱得多。因此,基於手腕感測器的擊球計數,通常都是從「手錶戴在持拍手」這個前提出發的。
String GOAT選擇不去改變這個習慣。手錶依然戴在你原本就習慣的位置——非持拍手腕。
這篇文章寫給自己幫球拍穿線、或自行管理換線週期的球員,內容涵蓋偵測原理、實際準確度,以及這些紀錄如何影響換線決策。
重點整理
- 支援裝置 — watchOS 9.0以上(Apple Watch Series 4及更新機型)、Wear OS 3.0以上(包括Galaxy Watch)。須搭配已配對手機上的應用程式使用。
- 佩戴位置 — 非持拍手腕。
- 記錄內容 — 擊球數、打球時長、心率、消耗卡路里,以及戶外GPS路線。
- 準確度 — 空揮拍與走動不會被計數。整體底線擊球的偵測率約為四分之三,單手反拍會被低估。
- 用途 — 累計打球時長會與各類球線的使用壽命基準比較,讓提醒依據實際使用量,而非日曆日期。
從微弱訊號中判讀擊球
震動訊號確實會傳到另一隻手臂,只是很微弱。真正需要的不是更強的訊號,而是一套經過訓練、能夠讀懂微弱訊號的模型。
String GOAT採用KAIST研究團隊發表的Silent Impact模型,這套模型專為從未握拍手臂的動作中辨識擊球衝擊而設計。該研究已於UIST 2024(ACM使用者介面軟體與技術研討會,作者Park、Yang、Jo)發表,並以CC BY 4.0授權釋出,允許商業使用但須標註出處。String GOAT在應用程式的開放原始碼授權頁面中對此進行了標註。論文發表於ACM Digital Library。
分析在手機上進行,而非在手錶上。手錶負責蒐集感測器資料並傳送出去,手機再把資料輸入模型。由於整個流程都在裝置端完成,球場網路訊號不穩定並不會影響偵測。
一場訓練會記錄哪些內容
選擇球拍,在手錶應用程式中開始訓練,以下內容會持續累積,直到結束訓練為止。
| 項目 | 說明 |
|---|---|
| 擊球數 | 偵測到的擊球衝擊次數 |
| 打球時長 | 從訓練開始到結束的時間 |
| 心率 | 平均值、最大值以及各心率區間的時長 |
| 消耗卡路里 | 來自手錶的健康資料 |
| 距離與路線 | 開啟GPS的戶外訓練 |
支援裝置為watchOS 9.0以上(Apple Watch Series 4及更新機型)以及Wear OS 3.0以上(包括Galaxy Watch)。手錶應用程式須搭配已配對手機上的String GOAT應用程式使用,因此手機應用程式為必要條件。
準確度究竟如何
擊球數一出現在螢幕上,就會讓人忍不住問「這準嗎?」。以下數據來自我們在自家應用程式中的實測,而非論文中報告的效能——手錶硬體以及周邊的處理流程一旦改變,同一套模型的表現也會隨之不同。
先說站得住腳的部分。空揮拍(沒有擊中球)不會被計入。在室內測試中,30次空揮拍被記錄為0次,走動與靜止不動同樣記錄為0。這套模型偵測的是球被擊中的那一刻,而不是揮拍動作本身,所以拿著球拍在場上走動或撿球時,數字並不會往上跳。在以正拍為主的測試中,統計出的次數與實際擊球次數幾乎一致。
再談不足之處。
- 整體底線擊球(從底線擊打落地反彈後的正拍與反拍)的偵測率約為四分之三。統計出的次數可能低於實際擊球數。
- 單手反拍被低估得最明顯。這可能是因為模型的訓練資料中,單手反拍球員的樣本非常少。
- 連續過快的截擊可能會被漏記。緊接著發生的幾次擊球,有時會被合併統計為一次。
- 不區分擊球類型。系統不會告訴你哪些是正拍、反拍,哪些是截擊。
所以這不是裁判那種精確到每一球的計數,而更接近一個可以在訓練之間互相比較的負荷參考值。用來看看今天是不是比上週練得更兇,或是這條球線目前為止承受了多少負荷,已經足夠;但不該把它當成可以照單全收的精確數字。
累計紀錄如何驅動換線提醒
這裡自然會有一個問題:既然計數不精確,又怎麼能拿來判斷呢?真正驅動提醒的其實是打球時長,而不是擊球數。時長取自訓練的開始與結束時間,因此是實測值,而非估算值。
訓練儲存後,打球時長會依球拍分別累積。String GOAT會把這個累計時長,與該類型球線的使用壽命基準進行比較。聚酯線、多芯線與天然羊腸線的耐用時長各不相同,因此每種類型都有各自的基準值,這些數值來自對已發表資料的整理與比對。球線可能在斷裂之前效能就已明顯下降,這一點Tennis Warehouse University的測試也有相關紀錄。
改變的不是提醒出現的時間點,而是提醒所依據的東西。判斷依據不再是「穿線已經一個月了」,而是「這條球線實際被使用了多少小時」。每月打一次球的人和每週打四次球的人,不會再在同一天收到一樣的提醒。
擊球數同樣依球拍累積。把它和打球時長放在一起看,就能區分出哪條球線承受了較多的擊球衝擊,哪條球線雖然時長相同、實際擊球次數卻少得多。
搭配張力測量,判斷會更精準
單靠打球時長與擊球數,判斷就已經比依日曆更準確。但這兩者說到底,只描述了球線被使用了多少,並不能說明它此刻處於什麼狀態。
描述狀態另有一套資料:穿線後立即測得的張力,以及之後測量的DT(動態張力,即拍面硬度)。在登記球線時輸入初始DT,它就會成為基準值;此後每一次測量,都會新增一個資料點。
手錶資料為此增加了第二個維度。你不再只是問張力在多少天內下降了多少,而是能問張力是在打了多少球的過程中下降了多少。任意兩次測量之間的擊球數,由手錶提供。
隨著資料點不斷累積,String GOAT會延伸這條變化軌跡,估算張力何時會降到臨界值。這個臨界值綜合了相對基準值的衰減率與主觀評分,輸出結果是預估換線日期,或剩餘可用擊球數。只要存在張力測量資料,系統就會自動採用這種方式——具體使用哪種訊號,取決於有哪些資料可用,而不是一個可手動切換的設定項。
