何时换线,取决于使用量,而不是日期。同样是一个月,每周打一次球的人和每周打四次球的人,在球场上花的时间相差四倍。日历按相同的节奏推进,但球线承受的负荷并非如此。
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会延伸这条变化轨迹,估算张力何时会降到临界值。这个临界值综合了相对基准值的衰减率和主观评分,输出结果是预计换线日期,或者剩余可用击球数 。只要存在张力测量数据,系统就会自动采用这种方式——具体使用哪种信号,取决于有哪些数据可用,而不是一个可手动切换的设置项。
累计三次或以上 换线之后,判断会更进一步。系统会回顾你实际选择换线那些时刻的衰减率和手感评分,并据此使用你个人的临界值 ,而不是通用标准。同样的张力下降幅度,有人会继续用下去,有人则会选择换线。
判断依据就是这样一步步演进的。
支撑换线决策的证据层级
层级 依据 所需数据
日期 穿线后经过的天数 穿线日期
使用量 打球时长与击球次数 + 手表训练记录
状态 随着击球数累积,张力下降了多少 + 初始张力与DT测量
个人临界值 你本人实际决定换线的节点 + 三次或以上的历史换线记录
每往下一个层级,判断都会更精准,但需要的输入也更多。这张表与其说是功能清单,不如说是我自己实际走过的顺序。一层一层往下推进的过程中,真正卡住我的从来不是"这个基准不对",而是"没有数据可以填进这个基准里"。手表正是自动填补了中间那两个层级。
从手表到应用,再到网页
训练结束后,手表会把数据发送到手机。分析和保存都在手机上完成。已保存的训练会同时出现在手机应用和网页仪表盘中。
球场的网络环境往往不太可靠。发送或保存失败的训练会保留在设备上,下次打开应用时会自动重试。如果结束的训练没有立刻出现,请打开一次手机应用。
开始使用
由于累计打球时长是从登记新球线那一刻才开始计算的,手表记录从换线的那一刻用起来才最有意义。
先在手机应用上登录 — 手表应用需要配合已配对手机上的应用使用
把手表戴在非持拍手腕上 — 击球检测是基于这个佩戴位置设计的
在手表上开始训练 — 户外训练时保持GPS开启,还能记录路线
训练结束后打开手机应用 — 分析和保存都在这里完成
结合球线记录一起查看 — 累计打球时长会用于换线决策
免费版每月可查看8次训练的详细记录,超出部分仍会保留在列表中,订阅后即可解锁查看更早的记录。
String GOAT可以免费开始使用。