RoboDojo 烤面包:面包脱落与入槽接触逃逸#

结论先行:这两例都不是“夹爪忘了闭合”,也不能只用“面包摩擦太小”解释。 两例在失稳前的闭爪命令都为 0;真正的共同点是夹持线位于面包上缘附近,离质心约 4.4–4.6 cm。当双指法向接触消失后,空夹爪继续闭合,面包才下落。layout 002 受到相邻面包和货架接触的放大;layout 011 则先在抬升中发生平面内转动,接触点滚向上缘、几何余量耗尽,随后法向冲量才塌缩。换言之,“载荷消失”是结果,不是第一根因。

这是一份 DexLab 对 RoboDojo make_toast 离线 Code-as-Policy 运行的外部记录诊断,不是 DexLab 原生后端复现,也不是 PhysX 与其他引擎的对比。页面保留两个互不混分母的批次:2026-11-12 的旧批次为 19/100 成功,下方两个局部脱落片段只解释其中两个策略机械失败;2026-11-13 的 v67 批次为 65/100 成功,新增的三个入槽接触逃逸来自其 35 个失败。两个批次的策略、证据通道和失败分类不同,不能合并成一个成功率或一个物理归因。

Case 1:相邻面包挤压后的滚边脱落#

下载 layout 002 完整 MP4

seed 0 / layout 002 在 step 982 发生接触塌缩。此前双指法向冲量峰值约为 0.252 N·s,该帧降为 0;相邻面包在释放附近产生约 0.062 N·s 冲量,随后目标面包先撞货架(约 0.048 N·s)。接触点比质心高约 4.60 cm,对质心的力臂约 4.85 cm。这相当于只捏住薄片上缘,再被旁边薄片横向顶一下:接触法线旋转,面包绕上缘滚出双指,而不是沿一个稳定、居中的夹持面被提起。

释放后记录到约 0.70 m/s 平动速度和 11.4 rad/s 角速度峰值;约 62.4 mJ 势能下降同时进入平动、转动及后续碰撞。较明显的转动能和先撞货架的顺序支持“受挤压后滚边”,但 25 Hz 位姿微分不足以做逐物理步的严格能量守恒。

Case 2:没有明显外碰撞的浅夹持滑脱#

下载 layout 011 完整 MP4

seed 0 / layout 011 在 step 188 失稳。双指法向冲量从约 0.253 N·s 降到 0.0019 N·s;释放前附近没有测到相邻面包或货架冲量,之后面包在 step 192 撞桌面(约 0.111 N·s)。接触点比质心高约 4.42 cm;对约 11.8 cm 高的面包片而言,它只比上缘低约 1.4 cm。

逐帧回看把第一失效层再往前推进了一步。step 186→188,面包相对腕部的平面内转角约从 6.93° 增至 12.45°,两个接触代理到 OBB 上缘的平均余量从 14.41 mm 缩至 2.87 mm;法向冲量则在前两帧仍约 0.253 / 0.250 N·s,到 step 188 才塌缩。step 181–183 的腕部向上加速度峰值约 4.58 m/s²,会放大浅夹持的有效载荷,但现有记录不足以把它与摩擦、刚性边缘和缺少顺应性的贡献唯一拆开。

因此这里的证据链是:上缘浅夹持 → 抬升放大绕夹持线的平面内转动 → 接触滚向上缘、几何余量耗尽 → 双指冲量塌缩 → 空夹爪继续闭合 → 自由落体。 直觉上,它像只捏住一张硬卡片最上方的一小截再向上提:手指看起来已经合拢,卡片也短暂跟着走,但下方质心通过长力臂让卡片逐渐绕捏点转动;等捏点滚到边缘,手仍然闭着,卡片却已经脱手。这个类比只解释浅夹持的几何与转动链,不证明真实面包材质、摩擦或顺应性与仿真相同。面包下落时平动速度峰值约 1.09 m/s、角速度峰值约 5.56 rad/s。这比“正常载荷无故消失”更具体,也仍然没有把参数级根因过度归给 PhysX。

v67:三个入槽接触逃逸#

修正后的结论:这三例确实是仿真机器人状态异常,但现有证据只支持“槽口卡滞后的主动位置控制—刚性接触耦合失稳”,不支持把全部额外能量唯一归给被动 PhysX solver。 三例搬运阶段都保持夹持,第一异常都发生在槽口深压阶段。s1/l026 和 s1/l049 先分别停在目标上方 19 mm 和 28 mm;策略没有退出接触,而是继续执行向下的 rs-down。s0/l025 则在第一次 seat 深压内直接逃逸。

case

初始条件/动作

状态演化与第一失效

任务后果

s0/l025

第二片稳定搬到槽口;TCP 从 z=0.951 m 向 0.924 m 直线下降

seat 在 10 个动作步内被阻挡,TCP 反而升到 1.212 m;相对动作前上升 26.1 cm,距三维目标 34.2 cm

后续上移仍被阻挡、横移和再下降进入 IK 不可达;释放状态无法确认,最终只放入一片

s1/l026

第一片到槽口;seat 先停在 0.943 m,比目标高 1.9 cm

紧接着的 rs-down 仍指向 0.924 m,10 步后 TCP 升到 1.049 m;相对动作前上升 10.6 cm

夹持在逃逸期间释放,撤离继续被阻挡;槽占用不确定,任务以 0 片确认完成

s1/l049

第一片已放入;第二片 seat 停在 0.952 m,比目标高 2.8 cm

10 mm 上移与横移仍被阻挡;随后 rs-down 在 11 步内把 TCP 从 0.975 m 带到 1.258 m,上升 28.3 cm,距三维目标 47.8 cm

夹持释放、撤离失败,第二片无法确认,任务停在一片

展开三个完整右腕视频

s0/l025

s1/l026

s1/l049

为什么这不是规划器假象?#

move_to 返回的 final_xyz 不是候选 IK 或回退姿态。固定 PyRUA 源码在每个环境动作后读取观测关节角,再用 FK 计算 TCP;blocked 也由实际关节对应 TCP 与计划末姿态的偏差判定。因此日志证明:仿真中的关节状态真的沿错误方向变化,而不是日志打印了一个不可达的替代目标。

三个逃逸动作持续 40–44 ms,动作前后 TCP 的平均竖直变化率分别约为 6.53、2.65、6.43 m/s。这是端点差分,不是峰值速度,也不是刚体质心速度。若 0.07 kg 面包在整段始终随 TCP 上升,仅面包重力势能增量会约为 0.179、0.073、0.194 J;但后两例在逃逸中释放,机器人各连杆动能与势能也未记录,所以这些数字只表示异常尺度,不能组成能量守恒账本。

第一失效层、主因与放大器#

  • 第一失效层:槽口几何卡滞。 s1/l026 与 s1/l049 在逃逸前已经被槽沿/端壁阻挡;s0/l025 的卡滞与逃逸发生在同一个向下动作内。当前没有逐接触对记录,不能继续断言具体是面包—槽沿、手指—槽沿还是多体同时接触。

  • 任务级主因:卡滞后仍保持闭环深压。 策略把“停在目标上方”交给平移 3–9 mm 后再次向下,而没有先退出槽口、卸载接触并重新观测;这把一个可恢复的插入失败变成高约束多点接触。

  • 仿真级主因:高刚度位置驱动与刚性多点接触的失稳耦合。 冻结源码中的 X5 手臂使用 stiffness=4400、damping=40、effort_limit_sim=100;PyRUA 每个环境动作允许最多约 0.2 rad 的关节目标推进。机器人不是被动刚体,驱动器在卡滞时仍能做功,接触法向变化或去穿透可以把这部分功转成侧向/向上运动。

  • 静态放大器,而非已证实单因: 本批源配置为 4 ms 步长、每动作一个物理步、机器人 8 次位置迭代和 0 次速度迭代,CCD 与 stabilization 均关闭,最大去穿透速度为 5 m/s。面包 metadata 写 mass=0.07 kg、friction=0.45,但刚体加载器不读取 friction,而回退到 static=0.6、dynamic=1.5、restitution=0;动态摩擦大于静态摩擦的组合可能放大粘滞—卡住,但本批没有运行时材质 pair/combine mode 读回。

  • 未唯一确定的机制: 现有 40 ms 级动作结果不能拆开驱动器做功、接触冲量、去穿透修正和时间离散误差。尤其是刚体创建时 track_contact_forces=False,本批也没有 4 ms 级关节速度、驱动力矩、穿透深度或切向冲量,因此“solver 凭空注入了全部异常动能”仍是待验证假设。

直觉上,它像用一只很硬的弹簧机械臂把硬卡片压进过窄的缝:卡片卡住后,电机还在给弹簧上劲;接触法线一换向,积累的执行器功就可能把机械臂从侧上方弹开。这个类比说明“主动驱动 + 卡滞接触”为什么不能按普通低摩擦滑落理解;它不能区分物理上由执行器释放的能量和数值去穿透额外产生的能量。

修复顺序与下一判因门槛#

  1. 先消除危险动作链: 首次深压被阻挡且高出目标超过 5 mm 时,立即停止向下目标;至少退出槽口 20–30 mm、卸载接触、重新观测面包—TCP 位姿后再试。接触阶段把目标改为 1–2 mm 小步斜坡,并设置 TCP 反向位移/速度门禁。

  2. 再做冻结 case 的单因素 A/B: 保持初态、策略目标和材质不变,依次测试速度迭代 0→1→4、位置迭代 8→16、stabilization、最大去穿透速度 5→1→0.5 m/s、步长 4→2 ms。CCD 只针对薄物体高速漏碰,不应被当成静态卡滞的通用修复。

  3. 修正材质映射而不是盲目加摩擦: 让 metadata 的 friction 明确映射到一组满足 μ_static ≥ μ_dynamic 的参数并读回有效 pair;过高摩擦反而可能让槽沿卡滞更严重。随后再对比带标定顺应性的指垫/面包/槽沿接触。

  4. 补齐 4 ms 受力账本: 每步记录 q、dq、目标 q*、驱动力矩、接触对的法向/切向冲量、穿透和面包位姿。计算 W_drive=Στ_drive·Δq 与系统 Δ(K+U);只有在驱动功、重力功和接触约束功都无法解释的正残差重复出现,并随更小步长/更严求解收敛而下降时,才把剩余量归为 solver 能量注入。

机器可读时间线、静态参数和证据边界见 contact-escape-v67.json。这三个 case 占 v67 失败的 3/35,占全部回合的 3/100;它们是明确的仿真状态逃逸,但不是另外 32 个失败的统一解释。

策略问题与仿真问题要分开#

层

本次证据支持什么

不支持什么

策略/抓取几何

两例夹持点都太靠上;layout 002 还缺少与邻片和货架的净空

不能用“闭爪命令没发”解释;命令一直是闭合

接触动力学

双指法向载荷在失稳帧突降到接近 0;layout 002 有邻片冲量;layout 011 的转动和上缘余量损失发生在冲量塌缩之前

不能把释放前的正常载荷简单解释为静摩擦系数太小,也不能把冲量归零本身当作第一根因

任务执行

2026-11-12 旧批次 19/100 成功,大多数失败属于策略未完成、目标未到达或错误结束;独立 v67 批次为 65/100

两个脱落片段不能解释旧批次另外 79 个策略执行失败;三个接触逃逸也不能解释 v67 另外 32 个失败

仿真有效性

当前刚性薄片模型会放大上缘点/线接触的突变;运行时材质配对与切向冲量仍缺少完整读回

尚未建立 PhysX 求解器错误、真实面包标定或跨引擎优劣

仿真的具体缺口#

  1. 面包和指垫都按刚体接触处理。 面包质量为 0.07 kg,包围盒约 116.9 × 116.1 × 11.8 mm;模型没有面包受压、表面粗糙度和指腹顺应性。真实面包会在夹持处产生有限接触面,刚性薄片更容易从上缘接触突然跳到完全失去接触。

  2. 材质配置存在需要运行时读回的漂移。 静态 metadata 写 friction=0.45,对象加载路径实际读取 static_friction / dynamic_friction,缺失时使用另一组默认值。最终 finger–bread pair 的 combine mode 和有效系数没有在本批证据中完整读回;这值得修复,但不能替代抓取几何修正。

  3. 接触记录还不够完整。 图中的冲量是每 40 ms 记录窗内、10 个 4 ms 物理子步的法向峰值,不含完整切向摩擦冲量;能量来自 25 Hz 位姿有限差分。它足以定位接触何时消失和区分两种失效形态,不足以声称严格能量闭合或材料参数已标定。

  4. 第三栏是诊断代理,不是相机上的原生碰撞网格。 青色 B0 与橙色 B1–B3 由记录的刚体位姿和包围盒后处理得到,左右方向在释放帧对齐腕部视图。它用于核对物体、质心、轨迹和接触方向,不能替代 PhysX 真实碰撞形状的运行时导出。

下一步改什么#

策略侧先修抓取几何,而不是先加摩擦:

  • 将本策略快照的抓取深度从上缘下方约 0.016 m 先 A/B 到 0.028 m;若货架净空允许,再试到约 0.034 m。

  • 保留 GOOD_W = 0.0145 m 作为“完整厚度夹持”的判据,但把低于判据时的行为从“保留窄夹持继续搬运”改成“松开、加深并重抓”。

  • layout 002 类案例增加约 1.5 mm 内侧净空,并先做 1–2 cm 低速竖直试提,确认脱离邻片和货架后再横移;弱夹持搬运段由约 15 mm 缩到 8 mm 只是次级减速措施。

  • 试提期间监控双指接触对称性、夹爪开度突降和物体相对夹爪位移;任一异常立即放回重抓。

仿真侧做受控 A/B:运行时保存 finger–bread 材质 pair、摩擦 combine mode、接触 offset、CCD 和 stabilization;增加切向冲量及接触面积/多点接触记录;最后再比较刚性模型与带顺应性的指垫或面包代理。只有在相同策略、初态和动作下比较这些变量,才能判断仿真建模贡献了多少。

证据范围#

  • 旧脱落批次:2026-11-12;100 个不同 seed/layout 工况,成功 19、失败 81。视频为 25 Hz RGB 与刚体位姿;接触诊断聚合 250 Hz PhysX 回调。两个片段均为失稳前后约 4 秒、2 倍慢放;第 8 秒对应释放 step。

  • v67 接触逃逸批次:2026-11-13;100 个不同 seed/layout 工况,成功 65、失败 35;三个逃逸 case 均有完整右腕视频和动作级端点日志,但没有逐物理步接触/驱动记录。

  • 机器可读指标:旧批次 metrics.json 与 layout-011-root-cause.json;v67 见 contact-escape-v67.json。

  • 没有运行另一物理引擎、真实面包实验或参数标定;没有完成三个 v67 case 的受控 solver/控制/材质 A/B。结论只覆盖各自批次和已记录事件。