两个正在决定的问题,放在一起是因为它们共用同一个约束:操作者在中国,机器人在芬兰,实测 RTT 326 ms。这一页记录的是为什么这么选,包含被否掉的方案和否掉的理由 —— 六天后回头看时,"当时为什么没走那条路"比结论本身更值钱。
Tailscale 实测:中国↔芬兰 直连 P2P(不是中转),tailscale ping RTT 326 ms。闭环要这么算:
| 环节 | 约 |
|---|---|
| 相机采集 + 编码 | 40 ms |
| 网络单程 | 163 ms |
| 头显/浏览器解码 + 显示 | 40 ms |
| 你看到的世界,晚了 | ≈ 250 ms |
| 你的动作 → 舵机(单程) | 163 ms |
| 闭环合计 | ≈ 400–450 ms |
人在 100 ms 以下感觉不到延迟;300 ms 以上必须改成"动一下、停下来看、再动"(遥操作文献里的 move-and-wait)。抓杯子在这个延迟下能做但会频繁抓空;倒液体基本不用想。
这是整个方案的支点。据此分工:
| 谁 | 做什么 | 为什么给他 |
|---|---|---|
| 芬兰现场(如果有人) | 主从臂做抓取 | 0 延迟 |
| 中国的操作者 | 头部转向观众、底盘挪位、旋转杯身给观众看、推杯给顾客、触发自主策略 | 都是慢速大幅动作,400 ms 完全够用 |
Demo Day 现场预计没有我们的人,所以主从臂那一段不存在,全部动作落在中国这一侧 —— 更要挑延迟容忍的动作。GOAL-AUDIENCE-INTERACTION.md 里那几个互动动作正好全是慢动作,不是巧合。
XLeVR/web-ui/index.html:115 有完整的 Desktop Interface,interface.js:352 的 sendKeyCommand() 把按键发给同一个后端。页面副标题原文:"Dual-arm robot control via VR controllers and keyboard"。https://<jetson>:8443,就能控制双臂。不需要 Quest、不需要登录 Meta、不需要 VPN。而且有个反直觉的点,它是选键盘的真正理由:
叙事上不亏。台上那块画中画写的是 "Operator: China · live",观众要看的是"有个人在 7,000 公里外实时操作这台机器人"。这件事用键盘完成和用头显完成,说服力一样。
好消息是架构对我们有利。XLeVR 是 Jetson 上的 HTTPS 服务(:8443,自签证书),Quest 用浏览器打开一个 WebXR 页面,VR 场景在头显本地渲染。网络上只走两样:手柄/头显姿态出去,机器人相机画中画回来。不需要推流 VR 画面,带宽很小(头相机 424×240),也不会因为网络卡而晕 —— 只有机器人显得迟钝。
问题只剩:怎么让中国的 Quest "看见"芬兰的 Jetson。
侧载 Tailscale APK 要开发者模式,而 Quest 开发者模式的链条是:Meta 开发者账号(验证手机或信用卡)→ 建一个组织 → 在手机 App 里给设备开开关。手上这台是租借的,账号不是我们的,这条链走不完,也不该给租借设备绑自己的开发者组织。
Quest 浏览器 → 公网 HTTPS 地址(正式证书) → cloudflared → Jetson :8443
cloudflared tunnel --url https://localhost:8443 --no-tls-verify
头显上什么都不用装:不用开发者模式、不用侧载、不用 Tailscale。--no-tls-verify 是必须的 —— 本地是自签证书,cloudflared 默认会拒。出来的 *.trycloudflare.com 地址自带正式证书,WebXR 的安全上下文要求直接满足。
代价两条,都要处理:延迟(绕 Cloudflare 边缘,比直连高,必须实测别猜)和公开 URL(任何人拿到就能控制机器人,必须加认证)。
Quest 过 Meta 账号那关仍需访问 Meta 服务。关键坑:Android 同一时刻只允许一个 VpnService 应用 —— 校园 VPN 客户端和 Tailscale 装在头显里会互相顶掉。
这条链有 5 个串联的失败点,全过才有 VR:
而 6 天后就是 Demo Day,同时还有左臂模型没上机、看门狗没补、桌子没落实。按 1→2→3 顺序试,任何一步卡住就停,转键盘方案。
PROJECT.md 里 HOLD(接液)和 POUR(倒)状态都是 "Nothing built"DEMO-STRATEGY.md 里倒液体是 ⭐⭐⭐⭐,排第二排第一的 ⭐⭐⭐⭐⭐ 是 "当众把杯子挪 10 cm,它还是能抓到",原文写着"没有任何其他动作有这么高的说服力密度"—— 而它不需要液体。在远程这个设定下它的说服力还翻倍:操作者在中国,不可能事先知道杯子在哪。观众心里"这是不是提前录好的"当场死透,而且这一段不需要自主策略、不需要手眼标定。
依据是实测(BLADE-README.md:449):70 mm 塑料杯可靠;90 mm 玻璃杯包布是抛硬币。Fin-Ray 弧面半径 48 mm,最大覆盖到 90 mm 杯。
| # | 做什么 | 成本 | 什么时候做 |
|---|---|---|---|
| 1 | 抓取套环 —— 套在任何杯子外面,外径做成已验证可靠的 70 mm 那一档,底下带一圈下沿凸缘让指尖勾住 | 低(改一个参数化 SCAD 件) | 现在就该做 |
| 2 | 带小孔的杯盖 —— 防运输晃洒 | 极低(几小时) | 顺手 |
| 3 | 配重底座 —— 套环下方加配重降重心 | 低 | 顺手 |
| 4 | 万向环杯托 —— 杯子坐在两轴万向环里,手臂怎么转都保持水平 | 中(两组轴承) | Demo Day 之后 |
| 5 | 重力供液 —— 上方架带阀容器,机器人只负责举稳。不要做泵 | 中 | Demo Day 之后 |
它把"倒洒"从控制问题变成机械问题 —— 不再依赖策略精度,观众也一眼看懂。但要做两组轴承,6 天有风险。
用水 + 食用色素,不要真酒(黏、有味、洒了难清、酒精配电子设备是另一类风险)。
更保险的变体:透明密封杯,液体预先封在里面 —— 永远不会洒,视觉上完全是一杯酒,代价是没有"接液"那一段。
唯一现实的组合:盖子 + 套环 + 人工倒液、机器人只举稳。泵、万向环、自动阀门都不要碰。
02-hardware/training-props/ 里已经有 robot-cobbler-shaker v1/v3/v4(调酒摇壶道具,v3 带可拆标记)。如果要走"调酒"的视觉叙事,这个现成的可能比液体更划算。interface.js:352),没有从中国实际操作过一次手臂。