MuJoCo 物体滑动与接触摩擦排查:friction、solimp、condim 调参实战指南
【免费下载链接】mujocoMulti-Joint dynamics with Contact. A general purpose physics simulator.项目地址: https://gitcode.com/GitHub_Trending/mu/mujoco
箱子放在斜面上自己溜走、指尖一碰就弹开、摩擦系数调了却没感觉——这是 MuJoCo 接触摩擦调参里最常见的三种卡点。下面按「现象 → 定位 → 修复 → 验证」给一条可照做的路径,把滑动和漂移收敛到可控范围。
先给现象分类:打滑、溜坡还是关节松晃
滑动不是一个问题,是三类不同的病,先别急着改参数。
- 打滑:两接触面相对滑动,摩擦力没顶住切向力。病在
friction或solimp。 - 溜坡 / 漂移:物体本该静止却缓慢位移,常见于低摩擦面或没给转轴上闸。病在
frictionloss或solref太软。 - 关节松晃:自由体或 hinge 自己慢慢转。病在
frictionloss。
先判断是哪一类,再去改对应参数,能少走一半弯路。
friction 的第三个数字是滚动摩擦,别只盯着第一个
geom的friction默认是1 0.005 0.0001,三个数分别是滑动摩擦、扭转摩擦、滚动摩擦。注意:第一个数作用在切平面的两个轴上,才是真正决定「会不会打滑」的那一个。很多「设了摩擦没用」的情况,其实是改错了位或没到量级。
这段把箱子的滑动摩擦提到 0.7,并收紧接触求解,解决「放在地面就打滑」:
<geom type="box" size="0.1 0.1 0.05" condim="3" friction="0.7 0.005 0.0001" solref=".015 1" solimp=".95 .999 .001 .1 .1"/>按材质选第一个数:
| 接触对 | 滑动摩擦(第 1 数) | 为什么 |
|---|---|---|
| 金属—金属 | 0.3–0.6 | 光滑硬质面,摩擦偏低 |
| 橡胶—混凝土 | 0.8–1.2 | 需要大摩擦才顶得住切向力 |
| 冰面 / 低摩擦 | 0.05–0.1 | 配合下面frictionloss防漂移 |
⚠️ 只调第 1 个数解决 90% 的打滑;第 2、3 数分别管扭转和滚动,按需再动。
condim 决定这一对接触给几个摩擦自由度
condim是接触力/力矩的维度,默认 3。它决定这一对接触能产生哪些方向的约束,取值只能是 1、3、4、6(不能是 2 或 5)。
condim=1:无摩擦,只有法向力,等同限位。condim=3:常规有摩擦接触,法向 + 切向抗滑,大多数场景用这个。condim=4:额外加绕法向的扭转摩擦,做软指尖抓取更稳;系数带长度单位,可理解为接触面直径。condim=6:再加滚动摩擦,让球不会在平面上滚到无穷远;系数也是长度单位。
两个 geom 自动配对时,实际condim取两者的最大值,所以把关键那只手或地面设成 4/6 即可。
solref / solimp 把接触做成一个软弹簧
MuJoCo 用凸优化解接触,每个约束被建模成受控的阻尼二阶系统。solref和solimp就是这个弹簧的两个旋钮:
solref:时间常数 + 阻尼比。timeconst应 ≥ 2 倍timestep(否则系统相对积分器过硬会飘),dampratio=1是临界阻尼。经典写法.015 1。solimp:阻抗d∈(0,1)的上下限。值越大越硬、穿透和蠕变越小;第 0、1 项是dmin/dmax。
这段把接触做得更硬、更不穿透,解决「一推就陷进去、松手又弹开」:
<geom type="capsule" condim="3" friction="0.7" solref=".01 1" solimp=".95 .999 .001 .1 .1"/>滑动敏感场景的取值建议:
| 参数 | 推荐区间 | 为什么 |
|---|---|---|
solref[0]timeconst | 0.01–0.02 | ≥2×timestep,过软会渗透滑动 |
solref[1]dampratio | 1 | 临界阻尼,不反弹不发散 |
solimpdmin/dmax | 0.95 / 0.999 | 越接近 1 越硬,压住穿透 |
各向异性摩擦:cone="elliptic" 与分轴系数
默认摩擦锥是pyramidal,在<option>里改cone="elliptic"可切到椭圆锥,更贴近真实,且允许两个切向方向用不同系数。
这段让切向摩擦各向异性(第 1、2 数不同 = 两个切向方向摩擦不等),适合「滑行方向比横向更滑」这类场景:
<option cone="elliptic"/> <contact> <pair geom1="box" geom2="floor" friction="0.8 0.3 0.005 0.0001 0.0001"/> </contact>contact pair的friction最长可写 5 个数:滑动1 滑动2 扭转 滚动1 滚动2。前两个不同 → 切向各向异性;后两个不同 → 滚动各向异性。
只改某一对接触: pair 的覆盖规则
全局改friction会牵动所有接触。想只动「箱子—地板」这一对,用显式<contact><pair>:
<contact> <pair geom1="box" geom2="floor" condim="3" friction="0.8 0.005 0.0001" solref=".01 1" solimp=".9 .999 .001 .1 .1"/> </contact>这段只在指定两个 geom 之间生效,不影响其余接触,适合机器人手抓取多种材质、或某一处需要单独标定摩擦的场景。solref/solimp写"0 0"表示沿用全局值,可只覆盖你关心的那一项。
关节自己晃:frictionloss 给转轴上闸
frictionloss模拟的是干摩擦 / 静摩擦——在运动开始前就顶住力、与载荷无关。它不是速度相关的阻尼,而是给力设一个上限约束。
这段给 hinge 上闸,解决「转轴不受力也慢慢转」;自由关节的单值会覆盖全部 6 个自由度:
<joint name="knee" type="hinge" axis="0 1 0" range="-1 1" frictionloss="0.01"/>取值建议:
| 场景 | frictionloss | 为什么 |
|---|---|---|
| 低速精密关节 | 0.001–0.005 | 只需轻微自锁 |
| 重载 / 大关节 | 0.01–0.05 | 需要更大约束才顶得住 |
| 自由体原地不动 | 0.005–0.01 | 单值覆盖 6 DOF,「顶住外力前不位移」 |
验证闭环:重置、施力、量位移
改完别靠肉眼,跑一个固定脚本量化位移。下面用 Python API 重置、沿 x 施加恒定外力、记录质心坐标,跑 1000 步看收敛到多少:
mj_resetData(m, d) d.qfrc_applied[0] = 5.0 # 沿 x 施加恒定力 for _ in range(1000): mj_step(m, d) print(d.xpos[1], end=" ") # 记录质心 x 位移排查顺序:
- 先只动
friction第 1 数,看位移是否下降——定位是不是打滑。 - 没效果再收紧
solimp、调solref[0]——定位是不是求解太软。 - 还在漂移就加
frictionloss——定位是不是缺静摩擦自锁。 - 需要差异化某对接触,再上
<contact><pair>与cone="elliptic"。
接触场景 → 推荐参数速查
| 场景 | condim | friction 关键位 | solref / solimp | 备注 |
|---|---|---|---|---|
| 木箱 / 塑料在地面 | 3 | 0.5–1.0 | .015 1/.95 .999 | 先改滑动摩擦 |
| 金属对金属 | 3 | 0.3–0.6 | .015 1/.9 .99 | 光滑硬面 |
| 橡胶对混凝土 | 3 | 0.8–1.2 | .01 1/.95 .999 | 大摩擦顶切向力 |
| 冰面 / 低摩擦 | 3 | 0.05–0.1 | 同上 | 配 frictionloss 0.001–0.005 |
| 软指尖抓取 | 4 | 第 2 数 ~0.1 | .015 1 | 加扭转摩擦更稳 |
| 球在平面止滚 | 6 | 第 3 数 0.001–0.01 | .015 1 | 加滚动摩擦 |
| 各向异性 / 滑行 | 3–6 | 前两项不同 | .015 1 | cone="elliptic" |
| 转轴自锁 | — | — | — | frictionloss0.001–0.01 |
延伸阅读
- MuJoCo Computation 计算原理:接触约束模型、摩擦锥与求解器数学细节
- XMLreference 模型格式:
friction、condim、solref、solimp、contact pair逐属性说明 - Modeling 建模章节:求解参数(timeconst / dampratio / 阻抗)推导
- humanoid 参考模型:带
frictionloss与solimp/solref的完整关节配置
【免费下载链接】mujocoMulti-Joint dynamics with Contact. A general purpose physics simulator.项目地址: https://gitcode.com/GitHub_Trending/mu/mujoco
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考