MuJoCo 物体滑动与接触摩擦排查:friction、solimp、condim 调参实战指南
2026/9/11 1:24:12 网站建设 项目流程

MuJoCo 物体滑动与接触摩擦排查:friction、solimp、condim 调参实战指南

【免费下载链接】mujocoMulti-Joint dynamics with Contact. A general purpose physics simulator.项目地址: https://gitcode.com/GitHub_Trending/mu/mujoco

箱子放在斜面上自己溜走、指尖一碰就弹开、摩擦系数调了却没感觉——这是 MuJoCo 接触摩擦调参里最常见的三种卡点。下面按「现象 → 定位 → 修复 → 验证」给一条可照做的路径,把滑动和漂移收敛到可控范围。

先给现象分类:打滑、溜坡还是关节松晃

滑动不是一个问题,是三类不同的病,先别急着改参数。

  • 打滑:两接触面相对滑动,摩擦力没顶住切向力。病在frictionsolimp
  • 溜坡 / 漂移:物体本该静止却缓慢位移,常见于低摩擦面或没给转轴上闸。病在frictionlosssolref太软。
  • 关节松晃:自由体或 hinge 自己慢慢转。病在frictionloss

先判断是哪一类,再去改对应参数,能少走一半弯路。

friction 的第三个数字是滚动摩擦,别只盯着第一个

geomfriction默认是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 用凸优化解接触,每个约束被建模成受控的阻尼二阶系统。solrefsolimp就是这个弹簧的两个旋钮:

  • 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]timeconst0.01–0.02≥2×timestep,过软会渗透滑动
solref[1]dampratio1临界阻尼,不反弹不发散
solimpdmin/dmax0.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 pairfriction最长可写 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 位移

排查顺序:

  1. 先只动friction第 1 数,看位移是否下降——定位是不是打滑。
  2. 没效果再收紧solimp、调solref[0]——定位是不是求解太软。
  3. 还在漂移就加frictionloss——定位是不是缺静摩擦自锁。
  4. 需要差异化某对接触,再上<contact><pair>cone="elliptic"

接触场景 → 推荐参数速查

场景condimfriction 关键位solref / solimp备注
木箱 / 塑料在地面30.5–1.0.015 1/.95 .999先改滑动摩擦
金属对金属30.3–0.6.015 1/.9 .99光滑硬面
橡胶对混凝土30.8–1.2.01 1/.95 .999大摩擦顶切向力
冰面 / 低摩擦30.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 1cone="elliptic"
转轴自锁frictionloss0.001–0.01

延伸阅读

  • MuJoCo Computation 计算原理:接触约束模型、摩擦锥与求解器数学细节
  • XMLreference 模型格式:frictioncondimsolrefsolimpcontact pair逐属性说明
  • Modeling 建模章节:求解参数(timeconst / dampratio / 阻抗)推导
  • humanoid 参考模型:带frictionlosssolimp/solref的完整关节配置

【免费下载链接】mujocoMulti-Joint dynamics with Contact. A general purpose physics simulator.项目地址: https://gitcode.com/GitHub_Trending/mu/mujoco

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询