mjfit
MuJoCo 精确凸碰撞几何:销、孔、螺纹与齿轮
许可证
MIT
概述
mjfit 是一个 Python 库,为 MuJoCo 中的装配任务生成碰撞几何:由任意轮廓生成销及其孔、螺栓及其螺母,或一对相互啮合的齿轮,每个零件都由凸块构成,这些凸块的并集恰好就是零件本身。它出自 MIT 的 Pulkit Agrawal 的 Improbable AI Lab,最初是为训练论文 Blind Precise Assembly: Proprioceptive Sim-to-Real Peg-in-Hole for Diverse Parts(本体感知的仿真到现实多样零件销孔装配)中的策略而编写的,并以 MIT 许可证发布在 GitHub 上。
它解决的问题很具体。MuJoCo 只对凸形状做碰撞,而孔是凹的。常见的办法是用 CoACD 或 V-HACD 做近似凸分解,或者在网格上使用 MuJoCo 的有符号距离场(SDF)碰撞。凸分解恰恰会填掉装配任务所依赖的配合间隙,而 SDF 碰撞更慢,还会漏掉接触。mjfit 的做法是把孔周围的板切成凸楔块,让销等于孔向内偏移一个间隙,并由凸轮廓扫掠出螺纹牙和齿轮齿,这样销的每条边都恰好与孔边相距一个间隙,MuJoCo 也能原生地对每一块做碰撞。曲线会变成外接于它的多边形,因此圆孔永远不会比图纸上的小。
每个生成器都返回一个 MJCF 字符串,可从 Python 或 mjfit 命令行调用;轮廓和尺寸都是参数,因此一次训练就能容纳成千上万种不同的装配体。项目主页 在浏览器中实时运行论文中的策略和 mjfit 的对比实验。
mjfit 包含三个生成器。mjfit.peg 接收孔或销其中之一的轮廓——可以是顶点列表,也可以是 mjfit.shapes 中的形状(圆形、矩形、跑道形、梯形、正多边形、星形、任意多边形、带圆角的贝塞尔轮廓,或 CSV 文件)——并按配合间隙将另一个构建为其精确偏置。可选项包括:在孔内添加立着的材料,例如 USB 舌片或连接器插针(销会变成包围它们的空心壳体)、更宽的夹持段、带最小边缘的凸形外板、封闭孔,或固定的销质量。mjfit.thread 可按 ISO 公制、梯形、ACME、方形、锯齿形、圆钢丝或自定义齿形构建螺栓及其螺母,支持单头或多头、左旋或右旋。mjfit.gear 构建直齿轮或一对啮合齿轮,渐开线齿安装在铰链上,可选配电机;每个齿是一个凸棱柱。
配置是保存生成器参数的 YAML 文件,软件包自带现成配置:圆形、星形、USB-A、USB-C、HDMI、RJ45、D-sub(DB9)和 XLR3 销,M10 和 M6 螺纹以及一个 FurnitureBench 桌腿,还有若干齿轮副。针对训练,mjfit.sample_pegs 可从两个系列(带圆角的随机凸轮廓,或孔内最多有三个岛的基本形状)中抽取可复现的随机装配体,mjfit.grid 则可在一个场景中排布多个装配体,且名称绝不冲突。
输出可以直接使用:每个 geom 都属于一个带有硬接触的默认类,文件既可以单独运行,也可以包含进更大的场景中;当 USD 转换器需要时,网格还可以导出为 OBJ 文件。仓库的基准测试在 CPU 上以及借助 MuJoCo Warp 在 GPU 上,将 mjfit 与 CoACD、V-HACD 和 MuJoCo 的网格 SDF 进行比较,测试对象为配合间隙低至 20 µm 的 16 mm 圆形或方形销,并附带可复现每个数字的命令。
为何重要
接触丰富的装配是仿真中最难学会的任务之一,而最难的部分往往不是学习本身,而是几何:如果仿真中的孔比真实的更小、更粗糙或更慢,在其上训练的策略就会学到错误的东西。mjfit 让每位 MuJoCo 用户只需一次 pip install,就能得到精确、快速、可程序化变化的销、孔、螺纹和齿轮,也适用于在 GPU 上大规模训练的 MuJoCo Warp。它所服务的论文展示了这带来的可能:完全在仿真中训练的盲插策略迁移到真实机械臂上,能够插入从未见过形状的销。
解决的问题
MuJoCo 只对凸形状做碰撞,所以带孔的板必须近似处理。凸分解会封住插销、拧螺纹或齿轮啮合任务所依赖的间隙,而距离场碰撞又慢又会漏掉接触。mjfit 用并集恰好等于零件的凸块构建每个零件,保留间隙,并能由参数生成成千上万种不同的装配体。
要点
- 用并集恰好等于零件的凸块,为 MuJoCo 构建销与孔、螺栓与螺母以及相互啮合的齿轮
- 销的每条边都恰好与孔边相距一个间隙;圆变为外接多边形,因此孔永远不会比图纸上的小
- 根据仓库的基准测试,在 CPU 上一对销和孔的仿真速度比 MuJoCo 网格 SDF 快一个数量级,精度相当或更高
- 自带真实连接器和紧固件的配置:USB-A、USB-C、HDMI、RJ45、D-sub、XLR、M10 和 M6 螺纹、齿轮副
- 程序化采样可为一次训练抽取成千上万个可复现的装配体
- 为 MIT 论文 Blind Precise Assembly 而开发,其插入策略可从仿真迁移到真实机械臂
适用人群
- 在 MuJoCo 或 MuJoCo Warp 中训练装配、插入、拧螺纹或齿轮啮合策略的研究人员
- 需要大量具有紧密、精确间隙的不同零件的机器人学习团队
- 在凹形零件上遇到凸分解或 SDF 碰撞局限的仿真工程师
- 学习接触丰富操作、需要现成连接器和紧固件模型的学生
局限
- 早期版本:0.1.0,由一位作者维护,需从 GitHub 而非 PyPI 安装
- 仅支持 MuJoCo;其他仿真器只能得到 OBJ 格式的网格,而不是接触模型
- 生成的是参数化零件(销与孔、螺纹、直齿轮),而不是任意 CAD 模型
- 刚性接触需要 1 ms 或更小的时间步长,铰链上的齿轮需要使用 MuJoCo 的 PGS 求解器,而不是默认的 Newton 求解器
- 螺纹楔块会因螺旋线离散化而损失少量材料,因此螺纹只在这一公差范围内精确