openGym 如何自动调整下次训练重量:progression.js 源码走读完整指南

发布时间:2026/10/8 2:59:19
openGym 如何自动调整下次训练重量:progression.js 源码走读完整指南
openGym 如何自动调整下次训练重量progression.js 源码走读完整指南【免费下载链接】openGymSelf-hosted gym body-weight tracker — plan routines, log workouts (supersets, warm-ups, cardio), see which muscles are trained, fatigued or detrained, import from FitNotes/Strong/Hevy, passkey login. Your data, your server.项目地址: https://gitcode.com/GitHub_Trending/op/openGymopenGym 是一款自托管self-hosted的健身与自身体重训练记录应用你可以计划训练、记录组次支持超级组、热身、有氧、查看哪些肌肉正在疲劳或退练并把数据完全留在自己的服务器上。其中最实用的一点是它会自动调整你下次训练的重量。这篇文章带你走读核心文件 progression.js看看下次加 2.5 kg 还是维持原重量这个决定究竟是怎么算出来的。 一句话原理不存数字只算历史传统做法是每次训练完把下次重量写进数据库——一旦某次记录填错后面的数字就会一路错下去。openGym 选择了另一条路源码开头几行注释就写明了这一设计这里的一切都是训练历史的纯函数。没有任何东西写回已完成的训练——日志记录的是发生了什么而下一次的处方是每次需要时从历史现场推导出来的。这意味着两个好处你改了一条填错的组次、或换了渐进策略下次目标立刻正确不存在会失同步的计数器每次给出的数字都附带一条可翻译的理由why字段——正如源码所说说不清来路的建议你迟早会不再信任它。5 种渐进策略你的数据在跑哪套规则策略清单定义在 POLICIES策略加重条件失败减载off目标保持你设置的样子不自动变化—linear线性渐进每一组都完成目标次数加一个步长连续 3 次未达标greyskull灰骷髅前两组达标、最后一组力竭末组做到 2 倍目标次数可加双倍步长1 次失败即减载 10%double双渐进同一重量上爬过次数区间每组合区间上限后加重、次数回底连续 3 次未达标time计时每组持满目标时长目标 5 秒连续 3 次未达标策略按动作自身 → 所属训练计划 → 模式默认三级回退选取policyFor次数模式默认就是 linear——也就是老用户熟悉的全做满就加一步。有氧模式只允许 off不做自动渐进。核心走读nextPrescription 的五步决策每次开始训练时buildPlannedEntry 会为计划里的每个动作调用 nextPrescription按顺序做这些判断① 诚实读取上一次训练readSessionreadSession 是这场判断里的裁判它读历史的态度相当严格勾选且次数 ≥ 目标 →达标勾选但次数不够 → 未达标你记录到多少就是多少没勾的组、缺的组 → 未达标。热身组会被排除在外计划之外额外加的组不改变处方——多练一组不能替下次训练涨重量。所以一次练崩了的训练绝无可能假装成功把负荷推进。② 统计卡壳次数stallCountstallCount 从最近一次训练往前数连续未达标的次数遇到三种情况就清零成功一次换了重量减载应针对真正失败的重量而不是之后更轻的那次或改了计划旧组次下的失败说明不了新组次的问题。双渐进策略里还有个巧妙的豁免在当前重量上突破最好成绩也算进展不会被误判为卡壳。③ 给出五种结局返回值是一个处方对象kind只有五种界面会原样展示它选择的理由kind含义典型提示first还没有历史本次训练定下基线up上次达标加重 / 加次数 / 加时间hold未达标但没到减载线维持原重量还差 X 次触发减载deload连续卡壳减载到 90% 1RM 附近重建off策略关闭无自动渐进⚖️ 两个值得细看的实现细节重量必须落在杠铃片网格上现实中杠铃片只有 1.25 / 2.5 / 5 kg 等规格所以 addStep 加完重量后会吸附到步长网格——手动点 /- 按钮走的是同一套规则界面和自动渐进永远给出同一个数字。步长本身也不是死数字defaultIncrement腿、背、臀这类大肌群默认 5 kg10 lb其余动作默认 2.5 kg5 lb动作级还能用cfg.inc覆盖。用 Epley 公式给减载定目标减载不是无脑打九折。epley1RM 先按重量 × (1 次数/30)估算当前 1RM再取它的 90%系数可在 0.5–0.95 间配置作为目标然后由 selectDeloadCandidate 在你能装得上的重量 × 你举得动的次数网格里挑出最接近目标的一对——比如 100 kg × 5 卡壳它可能给出 87.5 kg × 6而不是一刀切到 90 kg × 5。线性与双渐进策略都走这条 Epley 路径选不出来才退回简单的乘 0.9 取整。 自身体重动作不加重量加次数俯卧撑没有杠铃片可加减载到 2.5 kg的建议毫无意义。源码里这类动作自重、无独立负重器械、辅助器械走的是专门的爬升分支次数逐次爬升单侧动作每次 2保证两边都动到次数上限就加一组组数爬到 6 组封顶此时应用会明确提示——该上负重或换更难的动作了。策略到此主动让位把决策交还给人。这些计算跑在哪里全部在你的浏览器 / 手机里。开始一次训练时应用现场推导出处方并盖在当次条目上历史只增不改数据上传你的服务器只是为了多端同步整体架构如下手机、笔记本与服务器之间的同步走版本号机制冲突时由客户端自行合并时序图源文件见 sync.mmd延伸阅读想继续深挖这几个文件值得收藏frontend/src/lib/progression.js —— 渐进策略与处方推导的完整实现frontend/src/lib/progression.test.js —— 每种策略的边界用例读它比读文档更快frontend/src/lib/session-start.js —— 处方如何落进一次训练会话frontend/src/lib/rep-range.js —— 双渐进的次数区间归一化frontend/src/lib/history.js —— 组次构建与训练模式判定README.md —— 自托管部署与功能总览理解 openGym 的自动调整重量机制关键其实只有一句话每次开始训练前它都会重新、诚实地读一遍历史再当场算出下一个数字。规则透明、理由可见——这比任何黑箱智能推荐都更值得信任。【免费下载链接】openGymSelf-hosted gym body-weight tracker — plan routines, log workouts (supersets, warm-ups, cardio), see which muscles are trained, fatigued or detrained, import from FitNotes/Strong/Hevy, passkey login. Your data, your server.项目地址: https://gitcode.com/GitHub_Trending/op/openGym创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考