深蹲做到第 7 下,眼镜该显示什么?《铁面私教》的 Rokid AIUI 开发实战
大家好,我是 Steven。
深蹲做到第七下,你想知道还差几下。等把杠铃放回架子上,你才有空看刚才这一组练得怎么样、还要休息多久。两次抬眼,中间可能只隔了几秒,需要的却是两种界面。
我做「铁面私教」,就是想把这两次抬眼接起来。它是一款面向独自做力量训练的人的眼镜陪练。训练中看次数,组间看点评,练完把记录存进日志。
作品 铁面私教 · Rokid Glasses 原生 AIUI 智能体 · 商店已上架 v0.3.7
体验 在 Rokid 智能体商店搜索「铁面私教」。 项目早期演示

图 1 早期真机联调录屏截帧。眼镜首页右上角显示了腕表原型传来的心率。
一组深蹲,四个界面
打开应用,可以用镜腿选动作,也可以长按说「开始训练」。选中深蹲后,准备页把重量和目标次数摆在眼前。开始做以后,屏幕正中央换成已经完成的次数,下方一排格子显示进度。
收组以后,界面才展开节奏、幅度和稳定性,右上角开始显示休息倒计时。我把「下一组」放在组间页底部,因为看完报告的人通常就想做一件事,接着练。

图 2 v0.3.7 的 InkLab 回归画面。准备页显示 20 kg,进行页数到 7,组间页展开这 7 次的结果。计次使用测试轨迹,点评使用模型回放。
两条输入,进同一份训练会话
这套交互落在 AIUI 的 Ink 页面上。app.json 声明页面路由,set-live 显示组内进度,set-report 显示组间结果。lib/ 里的计次和会话逻辑把页面串起来。换页时,动作、组序、计数和休息时间仍由眼镜端的同一份训练会话维护。 Rokid AIUI 开发资料

图 3 训练主流程的架构。镜腿操作、语音指令和计次事件都由眼镜端处理。收组后的数据另外交给模型生成点评。
这里有个时序上的取舍。计次得跟上动作,点评可以晚一点到。 收组后,本地统计和倒计时先显示。模型拿到本组的次数、节奏和幅度,再生成一句点评和下一组建议。遇到模型超时,规则版点评会留在屏上,用户照常能开始下一组。
一句话怎么记到正确的那一组
假设刚做完卧推,用户说「卧推 60 公斤 12 个」。应用先把动作、重量和次数写成结构化参数,由本地代码核对,再显示「卧推 60 kg × 12,记入第 1 组?」。如果接着说「刚那组少记了俩」,应用会找到当前训练里刚记的那一组,把改完的次数放到确认卡上。两种操作都在确认后写入。

图 4 语音记组确认卡。用例通过注入识音文本触发本地规则,检查确认前后的状态变化。
这块有一个调试时才暴露的问题。最早,我把所有功能的可选参数平铺给模型。它经常顺手填一堆无关字段。有一次只是改某一天的训练主题,模型也带回了整周模板 ID,意图就被归到了换模板的分支。
后来我把工具收成 run_feature({ feature, args })。比如刚才那句卧推,返回可以很短。
{
"feature": "log_set",
"args": {
"exercise": "卧推",
"weightKg": 60,
"reps": 12
}
}
feature 负责选功能,args 只装这次用得上的数据。本地再按对应功能校验。改一天主题时,即使模型还是带回模板 ID,执行前也会过滤掉。
为什么加了一块腕表
做深蹲时,头部通常会跟着身体上下移动,眼镜上的 IMU 能拿到有用的信号。换成卧推或弯举,头部相对稳定,腕部的变化更明显。所以我做了一个配套腕表原型,用蓝牙把腕部动作和心率送到眼镜。应用按动作和设备状态,在每组开始时选择计次来源。
以眼镜上的深蹲计次为例,算法先把加速度投影到垂直方向,再滤波,最后判断波形是否走完一个符合幅度和时间条件的周期。大约每秒 60 个样本由本地计次模块处理,Ink 页面拿到的是判定后的计次事件。报告里每一下的幅度也是信号相对基线的变化,可以拿来对照一组里前几下和后几下。
联调里还有一个问题。腕表已经连上,开始一组时,固件仍可能拒绝启动数据流。我给这个分支加了手动记组入口。眼镜会明确显示「传感器异常,这组手动记」。用户可以按镜腿记组,也可以直接报做了几次,照常进入组间报告。

图 5 InkLab 模拟腕表拒绝启动数据流。用例继续完成手动记组,并检查能否进入组报告。
我怎么验证这组练完了
AIUI Studio 的模拟调试适合先看单绿布局、焦点和镜腿操作。到了计次、记组和保存,我会检查操作之后实际出现的状态。比如点了「保存并结束」,就再打开训练日志,看刚才那条记录有没有进去。
| 要验证的事 | 用什么验证 | 看到的结果 |
|---|---|---|
| 深蹲能从准备走到组报告 | InkLab 回放 60 Hz 加速度测试轨迹 | 计次到 7,收组后进入报告页 |
| 报数和改口能写到对应的组 | 注入识音文本,走本地规则和确认卡 | 确认后记组,改口后更新对应记录 |
| 腕表数据流启动失败时能继续训练 | 模拟腕表返回失败 | 当前组切到手动记组,仍能进入报告 |
| 整场训练能存入日志 | Rokid Glasses 上运行隔离开发包,使用合成测试数据 | 总结页保存后,训练日志出现这次记录 |

图 6 v0.3.7 隔离开发包的眼镜真机截图。左侧显示本场完成 3 组,右侧是保存后写入训练日志的记录。
有一轮真机测试卡在宿主启动语音识别,页面没有进入聆听态。那轮仍然用注入文本检查了确认和保存,麦克风收音则单独留在真机验收里。这样下次看到「说了没反应」,可以先查录音和识音,再查意图有没有进到执行层。
接下来我想多收一些真实佩戴的训练数据,用人工标注逐次对照。换一个人、换一种速度,哪些动作会漏记,哪些容易多记?有了这些结果,我再决定把自动计次扩到哪些动作。也欢迎大家试完告诉我,做到第七下时,你最想在眼前看到什么?
应用中的部分动作插图来自 Bryl Lim 的 Workout Guide 及其上游 Everkinetic,已转换为适合单绿眼镜显示的关键帧,沿用 CC BY-SA 4.0 许可。 Workout Guide · Everkinetic · 插图许可
更多推荐


所有评论(0)