Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .github/pr-assets/pr-maskedmimic-round5.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added .github/pr-assets/pr-maskedmimic-round6.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ Jekyll 把笔记渲染成同名 `.html`,源 `.md` 不会发布,所以 `[PPO]
- **画真实机器人用真机的图,不用火柴人**:取 [Robot_Description_Gallery_Online](https://github.com/ImChong/Robot_Description_Gallery_Online) 的 `web/thumbs/<id>.webp`(透明底,按各家开源 URDF 渲染),裁到机身、按 `data/robots.json` 的 `measured.height_m` 等比例缩放后放进 `assets/img/robots/`,图注写明出处;bundle 里用 `document.currentScript.src` 解析 `../../img/robots/`,网页和离线视频都能找到(LCP 第 10 幕就是这么做的)。**机器人要跟着数据动**(重定向结果、跟踪轨迹)时,可以用 [Robot_Retarget_Online](https://github.com/ImChong/Robot_Retarget_Online) 的 MuJoCo WASM + three.js 模型加载代码按 qpos 逐帧离线渲染成透明底贴图表(正交相机与 bundle 的投影同一套,二维标注直接叠上去),做法见 GMR(`g1Mesh()`)。
- **讲硬件 / 机构设计时,可以直接用论文的图**(裁剪截图):放进 `assets/img/papers/<bundle>/`(webp),bundle 里同样用 `document.currentScript.src` 解析路径,画面上写明「论文图 N」;论文图可以做底图,动的部分(高亮、标注、示意动画)叠在上面。ToddlerBot 第 2 幕(图 7 的三种传动)、第 5 幕(图 10 的标定卡具,旁白念到哪种颜色就框出哪几块)、第 6 幕(图 11 的台架照片加部件标注)、第 8 幕(图 1 的遥操作装置)是这样做的。arXiv 默认许可下图的版权仍归作者,只做讲解引用、不改原图。
- **主动画各幕里不预告下一篇**:下一篇的主题只放在配音视频的片尾,`K.explainer` 的分镜、字幕轨和旁白的正片部分都不提(2026-10-11 的看片反馈)。
- **真机效果用项目页的视频片段**:论文项目页放了真机视频时,直接剪对应的片段嵌进讲解动画和配音视频,别再用论文里的静态截图(2026-10-16 OmniH2O 的看片反馈;之后的视频照此做)。片段剪成 H.264、无声、faststart 的 mp4(单段 480×270,或 2×2 / 1×3 拼成一段,小块高必须是偶数,`-crf 30 -preset slow`,一段 0.1–0.5 MB)加一张首帧 webp 当海报,放进 `assets/img/papers/<bundle>/clips/`;分镜里用 `K.svgClip(x, y, w, h, src, { poster })`,draw 里调 `clip.at(K.clipSince(t, cue), 可见)`,`cue` 是片段开始那一幕内时刻。网页上片段 `preload="none"`,播到那一幕才下载,那一幕不画了(换幕、暂停)就停;离线视频里 `stage.html` 按时间线算出片段已经播了几秒(旁白比分镜长时片段照样往下播),`render.mjs` 先把 `clips/*.mp4` 转成全关键帧 VP9 放进 `out/<paper>/clips/`(渲染用的 Chromium 解不了 H.264),每帧 seek 到准确时刻、等 `window.__clipWait()` 返回再截图。画面上写明「项目页视频」和项目页标的倍速,笔记的参考来源写明出处,只做讲解引用。片段上别压字(`check_layout` 把它当整块图)。做法见 OmniH2O 的 `projClip()`,`test_storyboard_clips_live_where_render_finds_them` 会核对位置、编码与海报。
- **真机效果用项目页的视频片段**:论文项目页放了真机视频时,直接剪对应的片段嵌进讲解动画和配音视频,别再用论文里的静态截图(2026-10-16 OmniH2O 的看片反馈;之后的视频照此做)。片段剪成 H.264、无声、faststart 的 mp4(单段 480×270,或 2×2 / 1×3 拼成一段,小块高必须是偶数,`-crf 30 -preset slow`,一段 0.1–0.5 MB)加一张首帧 webp 当海报,放进 `assets/img/papers/<bundle>/clips/`;分镜里用 `K.svgClip(x, y, w, h, src, { poster })`,draw 里调 `clip.at(K.clipSince(t, cue), 可见)`,`cue` 是片段开始那一幕内时刻。网页上片段 `preload="none"`,播到那一幕才下载,那一幕不画了(换幕、暂停)就停;离线视频里 `stage.html` 按时间线算出片段已经播了几秒(旁白比分镜长时片段照样往下播),`render.mjs` 先把 `clips/*.mp4` 转成全关键帧 VP9 放进 `out/<paper>/clips/`(渲染用的 Chromium 解不了 H.264),每帧 seek 到准确时刻、等 `window.__clipWait()` 返回再截图。画面上写明「项目页视频」和项目页标的倍速,笔记的参考来源写明出处,只做讲解引用。片段上别压字(`check_layout` 把它当整块图)。剪之前先按 0.25 s 抽一张缩略图表把整段源视频看一遍,确认旁白讲的动作落在剪的区间里、人物不贴着裁剪框(MaskedMimic 第 14 幕两段「侧手翻」原先都剪在源视频 0–5 s,翻是在 5.5–7.0 s,2026-10-18 看片反馈)。做法见 OmniH2O 的 `projClip()`,`test_storyboard_clips_live_where_render_finds_them` 会核对位置、编码与海报。
- **一个格子里只放一个例子**:项目页常把四个例子拼成 2 × 2,原样塞进 380 宽的格子,每个例子只剩 190 × 107,手机上人小得看不清(MaskedMimic 2026-10-17 的看片反馈)。把每个例子单独裁出来、按顺序拼成一段,片段下面写出放到第几个、是什么(MaskedMimic 的 `seqClip()`);论文里竖排几块的总览图同理,旁白讲到哪块就把哪块单独放大。
- **改了某一幕先出这一段给人看**:`node render.mjs <paper> clip <from>,<to>` 只渲染这段时间并配上同一段旁白,确认后再重渲整片。

Expand Down Expand Up @@ -153,7 +153,7 @@ kramdown 在 `markdown="1"` 的 HTML 块里既不跑 GFM 的中文 id 生成器
<div class="paper-demo" data-demo="ppo-video" data-src="media/ppo_explainer_video.mp4" data-poster="media/ppo_explainer_video_poster.jpg"><p class="demo-fallback">(……也可以直接<a href="media/ppo_explainer_video.mp4" download="PPO_讲解视频.mp4">下载 mp4</a>)</p></div>
```

`<video>` 过不了 nh3 清洗,所以播放器与「下载视频」按钮由 `kit.js` 的 `K.video(host, { title, sub, size, fileName })` 在运行时生成,bundle 里只需注册一个调用它的构建函数;无 JS 时兜底文案里的 `<a download>` 仍可下载。视频用 H.264 + AAC 的 mp4(`-movflags +faststart`),体积尽量压在 6 MB 左右(超过 5 分钟的 AWR 为 7.1 MB,六分多钟的 PHC / ADD 为 8.5 / 8.3 MB,七分多钟的 ASE 为 9.5 MB,六七分钟的 CALM / PULSE 用 `-preset slow -crf 31` 压到 7.9 / 9.4 MB,八分钟的 Diffusion Policy 用 `-preset slow -crf 33` 压到 9.9 MB,GR00T N1 为 7.0 MB,六分钟上下的 Transformer / π₀ / π₀.₅ 用 `-preset slow -crf 31` 压到 7.7 / 8.2 / 8.7 MB,五分半上下的 SONIC 同参数压到 7.0 MB,八分半的 SMP 用 `-preset slow -crf 34` 加 48k 音频压到 9.7 MB,八分多钟的域随机化用 `-crf 35` 加 48k 音频压到 9.9 MB,九分半的四足野外盲走用 `-preset slow -crf 36 -tune stillimage` 加 48k 音频压到 10.4 MB,十分半的真实世界人形行走同参数改 `-crf 37` 压到 11.1 MB,十分钟出头的十二幕 ASAP 同参数 `-crf 37` 压到 11.3 MB(火柴人和曲线一直在动,`-crf 36` 是 11.7 MB),九分 47 秒的十二幕 BeyondMimic 同参数 `-crf 37` 压到 11.3 MB,十分钟出头的十二幕接触辅助 InEKF 同参数 `-crf 36` 压到 11.1 MB(`-crf 37` 是 10.7 MB),十分钟出头的十二幕 OP3 足球用 `-crf 36` 压到 11.4 MB,十一分钟出头的十二幕 Berkeley Humanoid 同参数 `-crf 37` 压到 12.1 MB,十三分半的十二幕 ToddlerBot 同参数 `-crf 37` 压到 14.5 MB,十分 51 秒的十二幕 HumanML3D 同参数 `-crf 37` 压到 11.7 MB,12 分 2 秒的十三幕 GMR 同参数 `-crf 37` 压到 13.2 MB,12 分 56 秒的十二幕 OmniRetarget 同参数 `-crf 37` 压到 13.4 MB,13 分 17 秒的十三幕 ExBody 同参数 `-crf 37` 压到 14.2 MB,13 分 49 秒的十四幕 H2O 同参数 `-crf 37` 压到 15.5 MB,13 分 25 秒的十七幕 OmniH2O 同参数 `-crf 37` 压到 15.1 MB(第二版嵌了项目页的真机片段,初版是 14.5 MB),15 分 8 秒的十八幕 MaskedMimic 同参数 `-crf 37` 压到 18.4 MB(嵌了项目页的 13 段仿真片段;第一版 16.7 MB、第二版 16.8 MB、第三版 17.4 MB),将近十分钟的十幕 LCP 用 `-crf 37` 压到 11.3 MB;对话里交付的是 `-crf 19` 原片),`preload="none"` 不会拖慢页面。
`<video>` 过不了 nh3 清洗,所以播放器与「下载视频」按钮由 `kit.js` 的 `K.video(host, { title, sub, size, fileName })` 在运行时生成,bundle 里只需注册一个调用它的构建函数;无 JS 时兜底文案里的 `<a download>` 仍可下载。视频用 H.264 + AAC 的 mp4(`-movflags +faststart`),体积尽量压在 6 MB 左右(超过 5 分钟的 AWR 为 7.1 MB,六分多钟的 PHC / ADD 为 8.5 / 8.3 MB,七分多钟的 ASE 为 9.5 MB,六七分钟的 CALM / PULSE 用 `-preset slow -crf 31` 压到 7.9 / 9.4 MB,八分钟的 Diffusion Policy 用 `-preset slow -crf 33` 压到 9.9 MB,GR00T N1 为 7.0 MB,六分钟上下的 Transformer / π₀ / π₀.₅ 用 `-preset slow -crf 31` 压到 7.7 / 8.2 / 8.7 MB,五分半上下的 SONIC 同参数压到 7.0 MB,八分半的 SMP 用 `-preset slow -crf 34` 加 48k 音频压到 9.7 MB,八分多钟的域随机化用 `-crf 35` 加 48k 音频压到 9.9 MB,九分半的四足野外盲走用 `-preset slow -crf 36 -tune stillimage` 加 48k 音频压到 10.4 MB,十分半的真实世界人形行走同参数改 `-crf 37` 压到 11.1 MB,十分钟出头的十二幕 ASAP 同参数 `-crf 37` 压到 11.3 MB(火柴人和曲线一直在动,`-crf 36` 是 11.7 MB),九分 47 秒的十二幕 BeyondMimic 同参数 `-crf 37` 压到 11.3 MB,十分钟出头的十二幕接触辅助 InEKF 同参数 `-crf 36` 压到 11.1 MB(`-crf 37` 是 10.7 MB),十分钟出头的十二幕 OP3 足球用 `-crf 36` 压到 11.4 MB,十一分钟出头的十二幕 Berkeley Humanoid 同参数 `-crf 37` 压到 12.1 MB,十三分半的十二幕 ToddlerBot 同参数 `-crf 37` 压到 14.5 MB,十分 51 秒的十二幕 HumanML3D 同参数 `-crf 37` 压到 11.7 MB,12 分 2 秒的十三幕 GMR 同参数 `-crf 37` 压到 13.2 MB,12 分 56 秒的十二幕 OmniRetarget 同参数 `-crf 37` 压到 13.4 MB,13 分 17 秒的十三幕 ExBody 同参数 `-crf 37` 压到 14.2 MB,13 分 49 秒的十四幕 H2O 同参数 `-crf 37` 压到 15.5 MB,13 分 25 秒的十七幕 OmniH2O 同参数 `-crf 37` 压到 15.1 MB(第二版嵌了项目页的真机片段,初版是 14.5 MB),15 分 8 秒的十八幕 MaskedMimic 同参数 `-crf 37` 压到 18.5 MB(嵌了项目页的 13 段仿真片段;第一版 16.7 MB、第二版 16.8 MB、第三版 17.4 MB、第四版 18.4 MB),将近十分钟的十幕 LCP 用 `-crf 37` 压到 11.3 MB;对话里交付的是 `-crf 19` 原片),`preload="none"` 不会拖慢页面。

**首页路线图的悬浮卡片会显示视频信息**:`scripts/prepare_pages.py` 从笔记的 `data-demo="*-video"` 读 mp4 的 `mvhd` 时长、从 `## 🎬 N幕动画` 读幕数、从「🎯 一句话总结」第一段取简介,写进 `_data/papers.json` 的 `video_seconds` / `explainer_scenes` / `summary_zh`,`index.html` 再按 `_data/roadmap_links.yml` 输出成 `#roadmap-node-details`。所以接入或重渲视频后要重跑 `python3 scripts/prepare_pages.py`,并给路线图节点加上 🎬(`tests/test_roadmap_links.py::test_roadmap_video_badges_match_real_videos` 会核对两边一致)。

Expand Down
Binary file modified assets/img/papers/maskedmimic/clips/castle.mp4
Binary file not shown.
Binary file added assets/img/papers/maskedmimic/clips/combo.mp4
Binary file not shown.
Binary file added assets/img/papers/maskedmimic/clips/combo.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/img/papers/maskedmimic/clips/tracking.mp4
Binary file not shown.
Binary file modified assets/img/papers/maskedmimic/clips/vr.mp4
Binary file not shown.
Binary file modified assets/img/papers/maskedmimic/clips/vr.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions assets/js/demos/kit.js
Original file line number Diff line number Diff line change
Expand Up @@ -914,6 +914,8 @@
function target(sec) {
var d = v.duration;
if (!(d > 0)) return Math.max(0, sec);
// 换幕淡入时 cue 还没到,clipSince 是负的;循环片段把负数绕到片尾,会在开头闪一下最后的画面(MaskedMimic 2026-10-18)
if (sec < 0) sec = 0;
return v.loop ? ((sec % d) + d) % d : clamp(sec, 0, d - 0.001);
}
if (offline) {
Expand Down
Loading
Loading