本节摘要:接触抖动、莫名穿透、该滑的滑该停的停——接触参数病是仿真故障里最高发的门类,而它的诊断路径完全有章可循。本节用一次完整的排错实录示范「从现象倒推参数」的思考过程:抄体检单、查步长、对 solref、验惯量、审摩擦,五步走完,抖动的病根现形。文末把三类接触病(抖动、穿透、打滑)各自的处方压成对照卡。
3.2 讲清了软约束模型的原理,本节把它用起来——以一名排错者的视角,完整走一遍「机器人站在地上高频打摆」的诊疗过程。这个症状在试车场里出镜率最高,堪称接触病的「感冒」。
工单描述:双臂机器人固定基座站立,无控制输入、姿态静止,预期纹丝不动;实际现象是脚底与地面接触处持续高频小幅抖动,末端放大后振幅肉眼可见,跑了三十秒不发散也不收敛。提交者已尝试「加大接触刚度」「加大求解迭代」「减小 timestep」,全部无效甚至更糟。
三个已试无效的方案本身就是诊断信息:加大刚度更糟,说明方向反了(软约束的思路是往「适配」调,不是往「硬」怼);减步长无效,说明病根可能不在时间离散;加大迭代无效,说明不是收敛问题。带着这三条线索进入正式流程。
任何接触病的第一站都是 3.2 的四指标体检单——接触数、约束行数、迭代数、残差:
import mujoco import numpy as np model = mujoco.MjModel.from_xml_path("biped.xml") data = mujoco.MjData(model) mujoco.mj_forward(model, data) print("接触数:", data.ncon) print("约束行数:", data.nefc) print("迭代数:", data.solver_niter[0]) # 每个接触的法向与切向信息 for i in range(min(data.ncon, 8)): c = data.contact[i] print(f"接触 {i}: 穿透 {c.dist:.6f} | 维度 condim={c.dim}")
工单模型的体检单读数:接触数四(双足各两点,正常)、约束行数十(正常)、迭代数六(收敛快,求解器无罪)、穿透量异常——四个接触的 dist 全部在万分之一米级别持续振荡,正负号每几步翻转一次。穿透在振荡 = 接触力在振荡 = 软垫被高频压缩回弹。病根范围收窄到「软垫参数与系统的匹配」上。
3.2 的铁律立即上线:solref 时间常数不得小于步长。问提交者三个数:步长两毫秒,solref 默认(时间常数二十毫秒、阻尼比一),模型里脚底 geom 的 solref 被全局 default 改成了「零点零零二、零点八」——时间常数恰好等于步长。这违反铁律的临界情形:软垫要求二十毫秒内压回的动态,步长两毫秒勉强采样,阻尼比又低于一(欠阻尼),回弹过冲,于是「压缩—回弹—再压缩」的振荡闭环比比皆是。
修复与验证一步到位:脚底接触的 solref 时间常数提到零点零五、阻尼比回一,抖动幅度下降八成但未绝迹——参数病常常是多因叠加,治好主因后残留的次因才看得清。
残留的轻微抖动把视线引向 2.2 的惯量纪律。复查模型:脚掌板用薄 box 建模,质量五千克但厚度仅两厘米——薄板的转动惯量本就偏小,加上引擎按 box 均匀分布计算,脚掌绕踝轴的等效惯量偏小,对接触力的高频扰动特别敏感(小惯量配硬约束正是 3.3 点名的「病态组合」)。而真机的脚掌里有电机与减速器,转动惯量远大于薄壳。
处方两层:惯量按真实装配体重填(有 CAD 数据);关节补 armature——踝关节 armature 从零提到零点零一,等效把电机转子惯量折算进来。抖动绝迹,静止标准差进入毫米以下。armature 是「仿真手感和真机手感对齐」的隐蔽旋钮,真机有减速器的关节都值得给它。
抖动治好后顺手审摩擦(打滑类故障的主战场,这里做预防性检查):椭圆锥默认开(好);impratio 默认一——足式任务的常见处方是提到五到十,让摩擦垫相对法向垫更「硬」,同样的法向波动下摩擦上限波动更小,行走任务里侧向打滑会明显减少;condim 脚底保持三,地面无滚转扭矩需求,不升六。此处没有动刀,因为症状不存在——接触排错的纪律之一是「只治存在的病」,每个参数改动都要有症状指认。

把上面图里的信息再压薄一层,形成随身卡。抖动的顺序:软垫时间常数、阻尼比、armature、最后才步长;穿透先分「稳态深穿」(solimp 深层刚度)与「间歇撞穿」(隧穿,缩步长或加厚碰撞件);打滑先治法向波动(抖动常是它爹),再动摩擦参数。三条病的最后手段都是缩步长——它最有效也最贵,放在流程末尾。
两条通用纪律。纪律一:一次改一项。 本节实录如果第一轮就同时改 solref、armature 与 impratio,治好了也不知道该谢谁,复发时不知道防谁。纪律二:记录进故障笔记。 这次「solref 等于步长加欠阻尼」的组合,你的团队一年内大概率还会写出来第二次——笔记的价值在第二次发病时兑现。
个例治完了,最后一节上升到方法论:面对任何说不清的异常,怎么系统地查,以及一份能让你少走夜路的故障对照表。