更新日志#

版本 3.3.2 (2025 年 4 月 28 日)#

MJX#

  1. 添加了逆动力学。

  2. 添加了肌腱促动器力传感器。

版本 3.3.1 (2025 年 4 月 9 日)#

破坏性 API 变更

  1. 用于切换 内部弹性体接触 的标志的默认值从“true”更改为“false”。此功能已被证明对用户来说是反直觉的。

  2. 所有附着函数(mjs_attachBodymjs_attachFramemjs_attachToSitemjs_attachFrameToSite)均已移除,并由单个函数 mjs_attach 取代。

通用#

  1. 添加了 肌腱电枢:与肌腱长度变化相关的惯性。

  2. 添加了 编译器/保存惯性信息 标志,在保存到 XML 时为所有刚体写入显式惯性子句。

  3. 复合体 添加了 方向 属性。此外,允许复合体成为框架的直接子节点。

  4. 添加了 肌腱促动器力限制肌腱促动器力传感器

MJX#

  1. 添加了肌腱促动器力限制。

Bug 修复#

  1. mj_jacDot 缺少一个考虑雅可比矩阵计算参考点运动的项,现已修复。

  2. 修复了将 mjSpec 附着到框架或站点时,子世界体(worldbody)中元素的父框架设置不正确的错误。

  3. 修复了在不支持 ARB_clip_control 的平台(例如 MacOS)上阴影渲染闪烁的错误。与 @aftersomemath 协作修复。

Python 绑定#

  1. 在模型编辑教程中添加了程序化模型创建示例:mjspec_colab

  2. bind 方法中添加了对无名 mjSpec 对象的支持,详情请参阅文档中的相应 章节

版本 3.3.0 (2025 年 2 月 26 日)#

功能推广#

  1. 引入了一种新型的快速可变形体,通过将 flexcomp/dof 设置为“trilinear”来激活。这种 可变形 弹性体对象具有与常规弹性体相同的碰撞几何形状,但自由度少得多。不是每个顶点有 3 个自由度,而是只有边界框的角点可以自由移动,内部顶点的位置通过对 8 个角点进行三线性插值计算得出,整个弹性体对象总共有 24 个自由度(如果某些角点被固定,则更少)。这限制了弹性体可实现的变形类型,但能实现更快的仿真。例如,请参见右侧视频,比较 完整三线性 弹性体模型化可变形夹持器垫。

_images/ccd_light.gif _images/ccd_dark.gif
  1. 在 3.2.3 中引入并通过 nativeccd 标志启用的原生凸碰撞检测流程现在是默认设置。有关详细信息,请参阅 凸碰撞检测 章节。

    迁移:如果新的流程破坏了您的工作流程,请将 nativeccd 设置为“disable”。

通用#

  1. 通过暴露 viewport 属性、set_figures 方法和 clear_figures 方法,在 MuJoCo 查看器中添加了对自定义绘图的支持。

  2. 分离了 弹性体 的碰撞和变形网格。这使得软体计算的成本固定,同时保留了高分辨率碰撞的精度。

  3. 添加了 势能动能 传感器。

  4. 改进了原生渲染器中的阴影渲染。

  5. introspect 移至 python/introspect

破坏性 API 变更

  1. 如上所述,原生凸碰撞检测流程现在是默认设置,这可能会破坏一些工作流程。在这种情况下,将 nativeccd 设置为“disable”以恢复旧的行为。

  2. 添加了 mjs_setDeepCopy API 函数。当深拷贝标志为 0 时,附加模型将不会将其复制到父级,因此附加后可以使用子级的原始引用来修改父级。默认行为是执行此类浅拷贝。通过将深拷贝标志设置为 1,可以恢复附加时创建子模型深拷贝的旧行为。

  3. 网格惯性推断的变更

    以前,为了指定质量位于表面上,任何几何体类型都可以使用 geom/shellinertia。现在,如果几何体是网格,则此属性将被忽略;而是使用资产中的 asset/mesh/inertia 属性指定网格的惯性推断。

    以前,如果体积惯性计算失败(例如由于网格非常平坦),编译器会静默回退到表面惯性计算。现在,编译器将抛出一条有意义的错误信息。

  4. 移除了复合体类型 grid。用户应改为使用 flexcomp

  5. 移除了 particle 复合体类型。建议改为使用更通用的 replicate,例如参见 此模型

MJX#

  1. 添加了对具有内部球体和圆柱体包裹的空间肌腱的支持。

  2. 修复了盒-盒碰撞的错误 #2356

Python 绑定#

  1. mujoco.rollout 添加了一个教学 Colab 笔记本,这是一个用于多线程仿真展开(rollouts)的 Python 模块。可在此处获取 rollout_colab
    @aftersomemath 贡献。

版本 3.2.7 (2025 年 1 月 14 日)#

Python 绑定#

  1. rollout 现在具有原生多线程特性。如果传入长度为 nthreadMjData 实例序列,rollout 将自动创建一个线程池并并行计算。线程池可以在多次调用中重用,但此时不能从多个线程同时调用该函数。要同时运行多个线程化的 rollout,请使用封装了线程池的新类 Rollout。由 @aftersomemath 贡献。

  2. 修复了使用 mjpython 时造成的全局命名空间污染(#2265)。

通用#

破坏性 API 变更(次要)

  1. 字段 mjData.qLDiagSqrtInv 已移除。此字段仅用于对偶求解器。现在按需计算,而非无条件计算。相关地,为 mj_solveM2 添加了相应的参数。

  1. 减少了 PGS 求解器的 A 矩阵 的内存占用。这是 MuJoCo 中最后一个剩余的密集内存分配,从而可以显著减少 动态内存分配启发式方法

Bug 修复#

  1. 修复了盒-球碰撞器中的错误,对于深度穿透,深度不正确(#2206)。

  2. 修复了 mj_mulM2 中的一个错误并添加了测试。

版本 3.2.6 (2024 年 12 月 2 日)#

通用#

  1. 复合体 中移除了绳索(rope)和环(loop)。建议用户分别改用 cable 插件或 flexcomp

MJX#

  1. 添加了肌肉促动器。

Python 绑定#

  1. 为 Python 3.13 提供预构建的 wheel 包。

  2. 添加了 bind 方法并移除了 mjSpec 对象的 id 属性。在重复附加和分离的场景中,使用 id 容易出错。建议 Python 用户使用名称来唯一标识模型元素。

  3. rollout 现在可以接受长度为 nroll 的 MjModel 序列。同时移除了 nroll 参数,因为其值始终可以推断。

Bug 修复#

  1. 修复了 #2212mjx.get_data 中的类型错误。

  2. 修复了 3.2.0 中引入的关于处理 texrepeat 属性的错误,该属性被错误地从 float 转换为 int(修复了 #2223)。

版本 3.2.5 (2024 年 11 月 4 日)#

功能推广#

  1. 通过 mjSpec 提供的 模型编辑 框架,于 3.2.0 版本作为开发中功能引入,现在已稳定并推荐普遍使用。

  2. 在 3.2.3 中引入并通过 nativeccd 标志启用的原生凸碰撞检测流程,虽然尚未成为默认设置,但已推荐普遍使用。当遇到碰撞相关问题时,请尝试使用它并报告您遇到的任何问题。

通用#

  1. 全局编译器标志 exactmeshinertia 已移除,并替换为网格特定的 inertia 属性。

  2. 已移除无用的 convexhull 编译器选项(用于禁用网格凸包计算)。

  3. 移除了已弃用的 mju_rotVecMatmju_rotVecMatTmjv_makeConnector 函数。

  4. 排序现在使用更快、原生的排序函数(修复了 #1638)。

  5. 在 3.2.1 中引入的 PBR 纹理层从独立子元素重构为一个单一的 layer 子元素。

  6. 已移除复合体类型 box、cylinder 和 sphere。用户应改为使用 flexcomp 中可用的等效类型。

MJX#

  1. 添加了 apply_ftjacxfrc_accumulate 作为公共函数。

  2. 添加了 TOUCH 传感器。

  3. 添加了对 eq_active 的支持。修复了 #2173

  4. 添加了射线与椭球体的相交计算。

Bug 修复#

  1. 修复了与具有站点语义的连接(connect)和焊接(weld)约束相关的几个 Bug(修复了 #2179,由 @yinfanyi 报告)。在 3.2.3 中为连接和焊接引入站点指定,有条件地改变了 mjData.eq_obj1idmjData.eq_obj2id 的语义,但这些改变未在多处正确传播,导致约束惯性计算、受影响的力/扭矩传感器读数以及此类约束的运行时启用/禁用不正确。

  2. 修复了滑块曲柄 传动 中的错误。该错误是在 3.0.0 中引入的。

  3. 修复了弹性体纹理坐标中的错误,该错误阻止了 mjModel 中纹理的正确分配。

文档#

  1. API 参考 中的函数头现在链接到它们在 GitHub 中的源代码定义。

版本 3.2.4 (2024 年 10 月 15 日)#

通用#

  1. 牛顿求解器不再需要 nv*nv 内存分配,从而允许更大的模型。例如,参见 100_humanoids.xml。仍有两个二次内存分配需要完全稀疏化:mjData.actuator_moment 和 PGS 求解器使用的矩阵。

  2. 移除了 solidmembrane 插件,并将相关的计算移入引擎。参见 3D 示例模型2D 示例模型,了解以前需要这些插件的弹性体对象示例。

  3. mjs_activatePlugin 取代了函数 mjs_setActivePlugins

MJX#

  1. 在运动学中添加了 mocap_posmocap_quat

  2. 添加了对具有滑轮和外部球体和圆柱体包裹的 空间肌腱 的支持。

  3. 添加了球体-圆柱体和球体-椭球体碰撞函数(#2126)。

  4. 修复了摩擦损耗约束的错误。

  5. 添加了 TENDONPOSTENDONVEL 传感器。

  6. 修复了 _decode_pyramid 中切向接触力计算的错误。

  7. 添加了 JOINTINPARENT 促动器传动类型。

Python 绑定#

  1. 移除了对 Python 3.8 的支持,因其已 在上游被弃用

Bug 修复#

  1. 修复了 MJX 中未设置 actuator_force 的错误(#2068)。

  2. 修复了调用 mjx.put_data 后 MJX 数据肌腱字段不正确的错误。

  3. 如果将高度场与 碰撞传感器 一起使用,编译器现在会返回错误,因为目前尚不支持。

版本 3.2.3 (2024 年 9 月 16 日)#

通用#

破坏性 API 变更

  1. 运行时选项 mpr_tolerancempr_iterations 已在 XML 和 mjOption 结构体中重命名为 ccd_toleranceccd_iterations。这是因为新的凸碰撞检测流程(见下文)不使用 MPR 算法。这些选项的语义保持不变。

  2. 函数 mjs_findMeshmjs_findKeyframe 已被 mjs_findElement 取代,该函数允许查找任何对象类型。

  3. 已移除将 2D/3D 弹性插件与 复合体 实验性使用的功能。用户应改为使用 flexcomp,它提供了正确的碰撞行为。

  1. 添加了 nativeccd 标志。启用此标志后,通用凸碰撞检测将通过新的原生代码路径处理,而非 libccd。此功能处于早期测试阶段,欢迎遇到碰撞相关问题的用户试用并报告任何问题。

  1. 添加了一种定义 连接焊接 等式约束的新方法,使用两个站点(site)。当基础配置中不满足约束的假设时,新的语义非常有用。在这种情况下,站点将在仿真开始时“自动对齐”。此外,在运行时更改站点位置(mjModel.site_pos)和方向( mjModel.site_quat)将正确修改约束定义。右侧视频展示了使用新语义的 示例模型

  2. 引入了自由关节对齐,这是一项适用于具有自由关节且无子体(简单自由浮动体)的刚体的优化:自动将刚体框架与惯性框架对齐。此功能可以使用 freejoint/align 属性单独切换,或使用编译器 alignfree 属性全局切换。对齐操作将相关的 6x6 惯性子矩阵对角化,从而使自由刚体的仿真更快、更稳定。

    虽然此优化是严格的改进,但它改变了关节自由度的语义。因此,在旧版本(例如,在 关键帧 中)保存的 qposqvel 值将失效。由于这种潜在的破坏性,全局编译器属性当前默认为“false”,但在未来的版本中可能会更改为“true”。建议所有新模型使用对齐的自由关节。

  3. 添加了一个 mjSpec 选项,可以直接从缓冲区创建纹理。

  4. 所有几何体类型现在都支持 壳(表面)惯性

  5. 附加子模型时,关键帧 现在将正确合并到父模型中,但仅在第一次附加时合并。

  6. 添加了 mjtSameFrame 枚举,其中包含刚体及其子级可能的框架对齐方式。这些对齐方式用于 mj_kinematics 中的计算快捷方式。

  7. 添加了 mj_jacDot,用于计算运动学雅可比矩阵的时间导数。修复了 #411

MJX#

  1. mjx.Data 添加了 efc_pos#1388)。

  2. 添加了位置相关的传感器:MAGNETOMETERCAMPROJECTIONRANGEFINDERJOINTPOSACTUATORPOSBALLQUATFRAMEPOSFRAMEXAXISFRAMEYAXISFRAMEZAXISFRAMEQUATSUBTREECOMCLOCK

  3. 添加了速度相关的传感器:VELOCIMETERGYROJOINTVELACTUATORVELBALLANGVELFRAMELINVELFRAMEANGVELSUBTREELINVELSUBTREEANGMOM

  4. 添加了加速度/力相关的传感器:ACCELEROMETERFORCETORQUEACTUATORFRCJOINTACTFRCFRAMELINACCFRAMEANGACC

  5. 更改了默认策略,以避免将未使用的(仅限 MuJoCo 的)数组放置在设备上。

  6. mjx.make_data 添加了 device 参数,使其与 mjx.put_modelmjx.put_data 保持一致。

  7. 添加了对 implicitfast 集成 的支持,除了 流体阻力 以外的所有情况。

  8. 修复了稀疏质量矩阵的 qLDiagInv 尺寸不正确的错误。

  9. 添加了对关节和肌腱 摩擦损耗 的支持。

  10. 添加了对使用两个站点进行 连接 等式约束的支持。

  11. 添加了对具有站点包裹的 空间肌腱 的支持。

Bug 修复#

  1. 修复了 3.1.7 中引入的网格边界体积层次结构性能回归问题(#1875,由 @michael-ahn 贡献)。

  2. 修复了一个错误,对于同时具有肌肉和无状态促动器并使用隐式积分器之一的模型,会计算出错误的导数。

  3. 修复了肌腱缠绕球体的错误。在此修复之前,肌腱如果缠绕带有外部放置的 侧站点 的球体,可能会跳到球体内部而不是缠绕在其外部。

  4. 修复了在模型 附加 期间导致 meshdirtexturedir 被覆盖的错误,从而阻止了资产位于不同目录的模型附加。

Python 绑定#

  1. 添加了对 mjSpec 中引擎插件的支持(#1903)。

  2. 加载模型时,改进了关于资产字典问题的错误报告。

版本 3.2.2 (2024 年 8 月 8 日)#

通用#

  1. 将纹理和材质限制增加回 1000。3.2.0 版本无意中将此限制降低到 100,破坏了一些现有模型(#1877)。

版本 3.2.1 (2024 年 8 月 5 日)#

通用#

  1. mjModel.tex_rgb 重命名为 mjModel.tex_data

  2. 添加了一个新的 autoreset 标志,用于在检测到 NaN 或无穷大时禁用自动重置。

  3. 向 MJCF 材质 元素添加了子元素,以允许为渲染指定多个纹理(例如,occlusion, roughness, metallic)。请注意,MuJoCo 渲染器不支持这些新功能,它们是为与外部渲染器配合使用而提供的。

  4. 使用 C++ 构建时,排序(mjQUICKSORT)现在调用 std::sort#1638)。

MJX#

  1. mjx.Modelmjx.Data 添加了更多字段,以进一步与相应的 MuJoCo 结构体兼容。

  2. 添加了对 固定肌腱 的支持。

  3. 添加了对肌腱长度限制的支持(mjtConstraint 中的 mjCNSTR_LIMIT_TENDON)。

  4. 添加了对肌腱等式约束的支持(mjtEq 中的 mjEQ_TENDON)。

  5. 添加了对肌腱促动器传动的支持(mjtTrn 中的 mjTRN_TENDON)。

Python 绑定#

  1. mujoco.spec.from_filemujoco.spec.from_stringmujoco.spec.compile 中添加了对资产字典参数的支持。

Bug 修复#

  1. 修复了隐式积分器未考虑禁用促动器的错误(#1838)。

版本 3.2.0 (2024 年 7 月 15 日)#

新特性#

  1. 引入了一个主要新特性:程序化模型创建和编辑,使用新的顶层数据结构 mjSpec。详细信息请参阅 模型编辑 章节。请注意,截至本版本,此功能仍在测试中,并可能在未来发生破坏性变更。修复了 #364

通用#

破坏性 API 变更

  1. 移除了已弃用的 mj_makeEmptyFileVFSmj_findFileVFS 函数。常数 mjMAXVFSmjMAXVFSNAME 也已移除,因为它们不再需要。

    迁移:使用 mj_addBufferVFS 直接将缓冲区复制到 VFS 文件中。

  2. 调用 mj_defaultVFS 可能会在 VFS 内部分配内存,必须调用相应的 mj_deleteVFS 来释放任何内部分配的内存。

  3. 已弃用 mju_rotVecMatmju_rotVecMatT,推荐使用 mju_mulMatVec3mju_mulMatTVec3。这些函数名和参数顺序与 API 的其余部分更一致。旧函数已从 Python 绑定中移除,并将在下一个版本中从 C API 中移除。

  4. 从促动器插件中移除了 actuator_actdim 回调。它们现在具有 actdim 属性,必须与将状态写入 act 数组的促动器一起使用。这修复了在具有有状态促动器插件的模型中使用关键帧时发生的崩溃。提供错误的 actdim 值时,PID 插件将报错。

  1. 向 MJCF 添加了 attach 元元素,允许将来自不同模型的子树 附加 到当前模型中的刚体上。

  2. VFS 实现已用 C++ 重写,现在速度和内存占用效率显著提高。

  1. 添加了对正交相机(orthographic cameras)的支持。固定相机和自由相机均可使用此功能,分别通过 camera/orthographicglobal/orthographic 属性设置。

  2. 添加了 maxhullvert,网格凸包中的最大顶点数。

  3. 添加了 mj_setKeyframe,用于将当前状态保存到模型关键帧中。

  4. 在 URDF 解析器中添加了对 ball 关节的支持(URDF 中的“spherical”)。

  5. 将之前硬编码在 mjtnum.h 中的 mjUSEDOUBLE 替换为编译时标志 mjUSESINGLE。如果未定义此符号,MuJoCo 将像往常一样使用双精度浮点数。如果定义了 mjUSESINGLE,MuJoCo 将使用单精度浮点数。参见 mjtNum

    相关地,修复了阻止使用单精度构建的各种类型错误。

  6. mjData.qposmjData.mocap_quat 中的四元数不再由 mj_kinematics 原地归一化。而是在使用时进行归一化。在第一步之后,mjData.qpos 中的四元数将被归一化。

  7. 编译器中的网格加载通常是加载过程中最慢的部分,现在已改为多线程。

MJX#

  1. 添加了对 椭圆摩擦锥 的支持。

  2. 修复了导致某些困难约束设置的线搜索解不够最优的错误。

  3. 修复了牛顿求解器中有时导致梯度不够最优的错误。

Simulate(仿真)#

  1. 添加了改进的教程视频。

  2. 改进了布朗噪声生成器。

  3. 如果模型加载时间超过 0.25 秒,现在会显示加载时间。

Python 绑定#

  1. 修复了对 mujoco.MjData 实例使用 copy.deepcopy() 时造成的内存泄漏(#1572)。

Bug 修复#

  1. 修复了 mj_copyData(或 Python 绑定中的 copy.copy())未正确复制接触信息的错误(#1710)。

  2. 修复了保存到 XML 时导致框架(frame)被多次写入的问题(#1802)。

版本 3.1.6 (2024 年 6 月 3 日)#

通用#

  1. 添加了 mj_geomDistance,用于计算两个几何体之间的最短有符号距离以及可选的连接它们的线段。相关地,添加了 3 个传感器:距离法线起始到终止。详细信息请参阅函数和传感器的文档。修复了 #51

  2. 位置促动器的改进

    • 位置促动器 添加了 时间常数 属性。当设置为正值时,促动器将具有 filterexact 动力学的状态。

    • 位置积分速度 促动器添加了 阻尼比。作为 kv 属性的替代方案,它提供了一种方便的方式使用自然单位设置促动器阻尼。详细信息请参阅属性文档。

MJX#

  1. 添加了高度场碰撞支持。修复了 #1491

  2. mjx.Model 添加了预编译字段 mesh_convex,以便可以对网格属性进行 vmap 操作。修复了 #1655

  3. 修复了凸网格碰撞中的错误,即使找到了面分离轴,也创建了错误的边缘接触。修复了 #1695

Bug 修复#

  1. 修复了启用 fusestatic 时可能导致碰撞被忽略的错误,这在使用 URDF 导入时经常发生。修复了 #1069#1577

  2. 修复了导致 SDF 迭代可视化写入超出存储它们的向量大小的错误。修复了 #1539

版本 3.1.5 (2024 年 5 月 7 日)#

通用#

  1. 向 MJCF 添加了 replicate,这是一个 元元素,允许通过增量的平移和旋转偏移重复子树。

  2. 在 MuJoCo 编译器中启用了内部缓存,从而加快了重新编译速度。目前,已处理的纹理、高度场和 OBJ 网格会被缓存。尚未支持 Unity 环境。

  3. 添加了 mjModel.mesh_scale:应用于资产顶点的缩放比例,由 scale 属性指定。

  4. 添加了原生渲染器忽略但可供外部渲染器使用的视觉属性

  5. mj_stackAllocNummj_stackAllocIntsize 参数类型从 int 更改为 size_t

  6. flexcomp 中添加了对 gmsh 格式版本 2.2 表面网格的支持。

MJX#

破坏性 API 变更

  1. 移除了已弃用的 mjx.device_get_intomjx.device_put 函数,因为它们缺少关键的新功能。

    迁移:请使用 mjx.get_data_into 代替 mjx.device_get_into,使用 mjx.put_data 代替 mjx.device_put

  1. 添加了圆柱体平面碰撞。

  2. mjx.Data 添加了 efc_type,向 mjx.Contact 添加了 dimefc_address

  3. mjx.Contact 添加了 geom,并将 geom1geom2 标记为已弃用。

  4. mjx.Data 添加了 nenfnlnefcncon,以匹配 mujoco.MjData

  5. 根据上面添加的字段,移除了 mjx.get_paramsmjx.nconmjx.count_constraints

  6. 更改了设备上网格的组织方式,以加快当一个网格被复制用于许多几何体时的碰撞检测。

  7. 修复了在宽阶段碰撞检测中胶囊体可能被忽略的错误。

  8. 使用 SDF 添加了圆柱体碰撞。

  9. 添加了对所有 condim 的支持:1、3、4、6。

  10. 添加了对 id2namename2id 的支持函数,它们是 mj_id2namemj_name2id 的 MJX 版本。

  11. 添加了对 gravcompactuatorgravcomp 的支持。

  12. 修复了 mjx.ray 中射线-网格测试有时允许负距离的错误。

  13. 添加了一个新的 可微分物理教程,演示了如何使用从 MJX 物理步骤自动导出的解析梯度来训练运动策略。由 @Andrew-Luo1 贡献。

Bug 修复#

  1. 灯光的默认值没有被保存,现已修复。

  2. 在保存 XML 时,防止主体名称覆盖框架名称。此 Bug 在 3.1.4 中引入。

  3. 修复了 mj_saveModel 的 Python 绑定中的错误:buffer 参数在文档中标记为可选,但实际上并非可选。

  4. 修复了阻止内存分配大于 2.15 GB 的错误。修复了 #1606

版本 3.1.4 (2024 年 4 月 10 日)#

通用#

破坏性 API 变更

  1. 移除了原生向传感器添加噪声的功能。请注意,mjModel.sensor_noise 字段和 相应的属性 得以保留,现在作为用户保存标准差信息的便捷位置供其自行使用。移除此功能是因为

    • 没有机制为随机噪声生成器设置种子。

    • 它不是线程安全的,即使提供了种子,在多个线程上采样也会导致不可重现的结果。

    • 此功能被视为引擎的越权行为。添加噪声应由用户负责。

    • 我们不知道有人实际使用此功能。

    迁移:请自行向传感器值添加噪声。

  1. 添加了 actuatorgravcomp 关节属性。启用此属性后,关节上的重力补偿力将被视为由促动器施加。详细信息请参阅属性文档。演示机械臂笛卡尔促动器的示例模型 refsite.xml 已更新为使用此属性。

  2. 添加了对 gmsh 格式 2.2、四面体网格的支持,该网格例如由 fTetwild 生成。

  3. 添加了 mju_euler2Quat,用于将欧拉角序列转换为四元数。

MJX#

  1. 改进了凸碰撞的 SAT 性能。

  2. 修复了球体/胶囊体-凸体深度穿透的错误。

  3. 修复了 mjx.put_data 生成的 mjx.Data 的 treedef 与 mjx.make_data 不同的错误。

  4. 对于凸网格碰撞的 margin/gap,抛出错误,因为尚不支持。

  5. 添加了椭球体平面碰撞。

  6. 添加了对 userdata 的支持。

  7. 使用有符号距离函数(SDF)添加了椭球体-椭球体和椭球体-胶囊体碰撞。

Simulate(仿真)#

  1. 修复了启用标志字符串顺序中的错误。在此更改之前,使用 Simulate UI 切换 invdiscrete 或(现已移除的)sensornoise 标志实际上会切换另一个标志。

Python 绑定#

  1. 添加了用于非线性最小二乘法的 mujoco.minimize Python 模块,专为系统辨识(sysID)设计。sysID 教程正在开发中,但包含逆运动学等示例的教学 Colab 笔记本可在此处获取:ls_colab
    右侧视频显示了教程中的示例片段。

版本 3.1.3 (2024 年 3 月 5 日)#

通用#

  1. 位置积分速度 促动器添加了 inheritrange 属性,可以方便地根据传动目标(关节或肌腱)的范围设置促动器的 ctrlrangeactrange(分别)。详细信息请参阅 position/inheritrange

  2. 已弃用 mj_makeEmptyFileVFS,推荐使用 mj_addBufferVFSmjVFS 现在计算其内部文件缓冲区的校验和。mj_addBufferVFS 在 mjVFS 中分配一个具有给定名称的空缓冲区,并将数据缓冲区复制到其中,合并并替换了已弃用的分两步过程:先调用 mj_makeEmptyFileVFS,然后直接复制到给定的 mjVFS 内部文件缓冲区。

  3. 添加了 mj_angmomMat,用于计算 3 x nv 角动量矩阵 \(H(q)\),提供了从广义速度到子树角动量 \(h = H \dot q\) 的线性映射。由 @v-r-a 贡献。

MJX#

  1. 提高了获取和放置设备数据的性能。

    • 使用 tobytes() 进行 numpy 数组序列化,这比转换为元组快几个数量级。

    • 当数组形状未更改时,避免重新分配主机 mjData 数组。

    • 加快了包含大量几何体的模型中 mjx.ncon 的计算速度。

    • nc 可以从 mjx.Data 中推导出来时,避免在 mjx.get_data_into 中调用 mjx.ncon

  2. 修复了阻止 mjx-viewer 运行的错误。更新了 mjx-viewer 以使用更新的 mjx.get_data_into 函数调用。

  3. 修复了 mjx.euler 中在使用密集质量矩阵时应用错误阻尼的错误。

  4. 修复了 mjx.solve 中在使用 mjtSolver 中的 mjSOL_NEWTON 时导致收敛缓慢的错误。

  5. mjx.Model 添加了对 mjOption.impratio 的支持。

  6. 添加了对 mjx.Modelmjx.Data 中相机的支持。修复了 #1422

  7. 添加了使用 top_k 和边界球体的宽阶段实现。

Python 绑定#

  1. 修复了 mjContact 结构体的 geomvertelemflex 数组成员以及 mjrContext 结构体的所有数组成员绑定中不正确的数据类型。

版本 3.1.2 (2024 年 2 月 5 日)#

通用#

  1. 改进了 discardvisual 编译器标志,该标志现在会丢弃所有仅用于可视化的资产。详细信息请参阅 discardvisual

  2. 移除了用于中阶段碰撞检测的 计时器,现在已并入窄阶段计时器。这是因为单独计时这两个阶段需要在碰撞函数内部使用细粒度计时器;这些函数非常小且快速,以至于计时器本身会产生可测量的成本。

  3. visual/global 添加了标志 bvactive,允许用户关闭活动边界体积的可视化(此 更新日志项 中的红/绿框)。对于具有非常高分辨率网格的模型,此可视化所需的计算可能会降低仿真速度。修复了 #1279

  4. 地形高程数据现在可以直接在 XML 中使用 elevation 属性指定(不再仅限于 PNG 文件)。请参见示例模型

MJX#

  1. 添加了 dyntype filterexact

  2. 添加了 site 传输。

  3. 更新了 MJX colab 教程,使其包含更稳定的四足机器人环境。

  4. 添加了 mjx.ray,它镜像了用于平面、球体、胶囊体、盒子和网格的 mj_ray

  5. 添加了镜像 mj_isSparsemjx.is_sparse 和镜像 mj_fullMmjx.full_m

  6. 添加了通过 jacobian: [dense, sparse, auto], “auto” 指定稀疏或密集质量矩阵的支持。

  7. 当存在非零摩擦损失时,抛出“未实现”错误。修复了 #1344

Python 绑定#

  1. 改进了 rollout 模块的实现。请注意以下更改是破坏性的,依赖代码需要修改。

    • 使用 mjSTATE_FULLPHYSICS 作为状态规范,通过检查时间来启用散度检测。

    • 允许用户为 用户输入 字段的任何组合作为控制指定用户定义的控制规范。

    • 输出不再被压缩,并且始终具有 dim=3。

  2. 被动查看器sync 函数现在可以获取 user_scn 中渲染标志的更改,正如在 #1190 中所要求的。

错误修复#

  1. 修复了在 flex 不在 worldbody 中时阻止将 pin 与插件一起使用的错误。修复了 #1270

  2. 修复了 muscle model 中的一个错误,该错误导致长度范围下限之外的值非零。修复了 #1342

版本 3.1.1(2023 年 12 月 18 日)#

错误修复#

  1. 修复了在箱体-箱体碰撞中,如果一个箱体深深嵌入另一个箱体,则不产生接触的错误(在 3.1.0 中引入)。

  2. 修复了 simulate 中“LOADING…”消息显示不正确的错误。

  3. 修复了在 Python 被动查看器 中,当与包含 Flex 对象的模型一起使用时发生的崩溃。

  4. 修复了 MJX 中 get_dataput_datasite_xmat 被忽略的错误

  5. 修复了 MJX 中 get_dataefc_address 有时计算不正确的错误。

版本 3.1.0(2023 年 12 月 12 日)#

通用#

  1. 通过使用线搜索和新的优化目标函数,改进了带符号距离函数 (SDF) 碰撞的收敛性。这减少了寻找接触点所需的初始点数量,并且对于非常小或非常大的 geom 尺寸更加鲁棒。

  2. 在 MJCF 中添加了 frame,这是一个 元元素,它定义了对其直接子元素的纯坐标变换,而无需 body

  3. positionintvelocity 促动器中添加了 kv 属性,用于指定促动器应用的阻尼。这可用于实现参考速度为 0 的 PD 控制器。使用此属性时,建议使用 implicitfast 或 implicit integrators

插件#

  1. 允许促动器插件使用 mjData.act 中的激活变量作为其内部状态,而不是 mjData.plugin_state。促动器插件现在可以指定计算激活变量的 callbacks,并且可以与内置的 dyntype 促动器动力学一起使用。

  2. 添加了 pid 促动器插件,这是一个可配置的 PID 控制器,实现了 MuJoCo 原生促动器不提供的积分项。

MJX#

  1. 在 MJX 中添加了 site_xpossite_xmat

  2. 添加了 put_dataput_modelget_data 以替换将被弃用的 device_putdevice_get_into。这些新函数可以正确转换中间计算(如 efc_J)的结果字段。

错误修复#

  1. 修复了可移动参考站点(refsite)的笛卡尔坐标促动问题,例如在四足机器人上使用以主体为中心的笛卡尔坐标促动器时。在此修复之前,此类促动器可能导致动量不守恒。

  2. 修复了阻止将 flex 与 simulate 一起使用的错误。

  3. 修复了阻止弹性插件与固定 flex 顶点一起使用的错误。

  4. 发布针对 macOS 10.16 的 Python wheels,以支持设置了 SYSTEM_VERSION_COMPAT 的 x86_64 系统。最低支持版本仍为 11.0,但我们发布这些 wheels 以修复这些用户的兼容性问题。请参见 #1213

  5. 修复了网格的质量计算:使用正确的网格体积,而不是使用惯性框来近似。

版本 3.0.1(2023 年 11 月 15 日)#

通用#

  1. mjData 中添加了 mjData.qfrc_passive 中总被动力场的子项:qfrc_{spring, damper, gravcomp, fluid}。这些向量的总和等于 qfrc_passive

  1. 添加了 actuatorgroupdisable 属性和关联的 mjOption.disableactuator 整数位字段,可用于在运行时根据其 group 禁用促动器集。修复了 #1092。请参见 Group disable

    • 前 6 个促动器组可在 simulate 查看器中切换。请参见示例模型和右侧关联的屏幕截图。

  2. mjMAXUIITEM(Simulate 中每个部分的 UI 元素最大数量)增加到 200。

MJX#

  1. 添加了对牛顿解算器(mjtSolver 中的 mjSOL_NEWTON)的支持。牛顿解算器显著加快了 GPU 上的模拟速度

    每秒步数,A100 上的共轭梯度法对比牛顿法#

    模型

    共轭梯度法 (CG)

    牛顿法

    加速比

    人型机器人 (Humanoid)

    640,000

    1,020,000

    1.6 倍

    Barkour v0

    1,290,000

    1,750,000

    1.35 倍

    Shadow Hand

    215,000

    270,000

    1.25 倍

    人型机器人是标准的 MuJoCo 人型机器人,Google Barkour 和 Shadow Hand 都可在 MuJoCo Menagerie 中获得。

  2. 添加了对关节等式约束(mjtEq 中的 mjEQ_JOINT)的支持。

  3. 修复了混合 jnt_limited 关节约束不正确的错误。

  4. 使 device_put 类型验证更详细(修复了 #1113)。

  5. 对于没有限制的关节,从 MJX 中移除了空的 EFC 行(修复了 #1117)。

  6. 修复了 scan.body_tree 中的错误,该错误导致某些运动学树布局的平滑动力学不正确。

Python 绑定#

  1. 修复了 macOS mjpython 启动器,使其可与 Apple 命令行工具中的 Python 解释器一起使用。

  2. 修复了在使用插件的模型复制 mujoco.MjData 实例时发生的崩溃。在 MjData 中引入了 model 属性,该属性是对用于创建该 MjData 实例的模型的引用。

模拟#

  1. simulate:正确处理“暂停更新”、“全屏”和“垂直同步”按钮。

文档#

  1. 教程 colab 中添加了提供程序化相机控制示例的单元格

  2. 添加了 用户界面 框架的文档。

  3. 修复了文档中的拼写错误和支持的字段(修复了 #1105#1106)。

错误修复#

  1. 修复了与使用 torquescale 修改的焊接相关的错误。

版本 3.0.0(2023 年 10 月 18 日)#

新功能#

  1. 通过新的 MuJoCo XLA (MJX) (MJX) Python 模块添加了在 GPU 和 TPU 上的模拟。Python 用户现在可以在 Google TPU 或其自己的加速器硬件上以每秒数百万步的速度原生运行 MuJoCo 模拟。

    • MJX 旨在与设备上的强化学习算法配合使用。此 Colab notebook 演示了如何结合强化学习使用 MJX 训练人形机器人和四足机器人进行运动:colab 徽章

    • MJX API 与 MuJoCo 兼容,但在此版本中缺少一些功能。有关更多详细信息,请参见 MJX 功能对等性 的概述。

  1. 添加了新的带符号距离场 (SDF) 碰撞原语。SDF 可以采用任何形状,并且不限于凸形状。碰撞点通过梯度下降最小化两个碰撞 SDF 的最大值来找到。

    • 添加了新的 SDF 插件,用于定义隐式几何体。该插件必须定义计算查询点处 SDF 及其梯度的函数。有关更多详细信息,请参见文档

  1. 添加了新的低级模型元素 flex,用于定义可变形对象。这些 单纯复形 可以是维度 1、2 或 3,分别对应于可拉伸的线、三角形或四面体。使用两个新的 MJCF 元素来定义 flex。顶层的 deformable 部分包含低级 flex 定义。flexcomp 元素类似于 composite,是一个创建可变形对象的便利宏,支持 GMSH 四面体文件格式。

    • 添加了 shell 被动力场插件,使用恒定的预计算 Hessian(余切算子)计算弯曲力。

    注意:此功能仍在开发中,可能会发生变化。特别是,可变形对象功能目前可通过 deformablecomposite 使用,并且两者都可以由第一方弹性插件修改。我们预计未来其中一些功能会得到统一。

  1. 添加了使用 mj_island 的约束孤岛发现。约束孤岛是不交互的约束和自由度的不相交集合。目前唯一支持孤岛的解算器是 CG。可以使用新的 enable flag 激活孤岛发现。如果启用了孤岛发现,geom、接触和肌腱将根据相应的孤岛着色,参见视频。目前对于具有可变形对象的模型(参见上一项)禁用了孤岛发现。

  2. 添加了 mjThreadPoolmjTask,允许在 MuJoCo 引擎管道中进行多线程操作。如果启用了引擎内部线程,以下操作将进行多线程处理

    • 孤岛约束求解,如果启用了孤岛发现(enabled)并且选择了 CG solver。与单线程模拟相比,22 个类人模型显示了 3 倍的加速。

    • 惯性相关计算和碰撞检测将并行进行。

    引擎内部线程正在进行中,目前仅在第一方代码中通过 testspeed 实用程序(使用 npoolthread 标志公开)可用。

  3. 添加了从 OBJ 文件初始化 composite 粒子的功能。修复了 #642#674

通用#

破坏性 API 变更

  1. 移除了宏 mjMARKSTACKmjFREESTACK

    迁移:这些宏已被新函数 mj_markStackmj_freeStack 取代。这些函数以完全封装的方式管理 mjData 栈(即,不会在调用点引入局部变量)。

  2. mj_stackAlloc 重命名为 mj_stackAllocNum。新函数 mj_stackAllocByte 分配任意数量的字节,并包含一个附加参数来指定返回指针的对齐方式。

    迁移:分配 mjtNum 数组的功能现在通过 mj_stackAllocNum 提供。

  3. mjModelmjData 中的 nstack 字段重命名为 narena。将 narenapstackmaxuse_stack 更改为计数字节数,而不是 mjtNum⁠ 的数量。

  4. 更改了 mjData.solver,该数组用于收集解算器诊断信息。这个 mjSolverStat 结构数组现在长度为 mjNISLAND * mjNSOLVER,被解释为一个矩阵。长度为 mjNSOLVER 的每一行包含每个约束孤岛的独立解算器统计信息。如果解算器不使用孤岛,则仅填充第 0 行。

    • 新常量 mjNISLAND 设置为 20。

    • mjNSOLVER 从 1000 减少到 200。

    • 添加了 mjData.solver_nisland:解算器运行的孤岛数量。

    • mjData.solver_iter 重命名为 solver_niter。此成员和 mjData.solver_nnz 现在都是长度为 mjNISLAND 的整数向量。

  5. 删除了 mjOption.collision 和相关的 option/collision 属性。

    迁移

    • 对于具有 <option collision="all"/> 的模型,删除该属性。

    • 对于具有 <option collision="dynamic"/> 的模型,删除所有 pair 元素。

    • 对于具有 <option collision="predefined"/> 的模型,首先删除模型中所有 contypeconaffinity 属性,然后通过以下方式将其全局设置为 0 来禁用所有动态碰撞(通过 contype/conaffinity 确定):
      <default> <geom contype="0" conaffinity="0"/> </default>.

  6. 删除了 ropecloth 复合对象。

    迁移:用户应使用 cableshell 弹性插件。

  7. 添加了 mjData.eq_active 用户输入变量,用于启用/禁用等式约束的状态。将 mjModel.eq_active 重命名为 mjModel.eq_active0,该属性现在表示“mjData.eq_active 的初始值”。修复了 #876

    迁移:将对 mjModel.eq_active 的使用替换为 mjData.eq_active

  8. autolimits 的默认值从“false”更改为“true”。这是一个小的破坏性更改。潜在的破坏适用于定义了“range”但未设置“limited”属性的元素。此类模型自版本 2.2.2(2022 年 7 月)起无法加载。

  1. 添加了新的 dyntypefilterexact,它使用精确公式而不是欧拉积分更新一阶滤波器状态。

  2. 添加了一个促动器属性 actearly,它对促动器力使用半隐式积分:使用下一步的促动器状态计算当前促动器力。

  3. 将上一版本中引入的 actuatorforcerangeactuatorforcelimited 分别重命名为 actuatorfrcrangeactuatorfrclimited

  4. 添加了标志 eulerdamp,它在欧拉积分器中禁用关节阻尼的隐式积分。有关更多详细信息,请参见 数值积分 部分。

  5. 添加了标志 invdiscrete,它为除 RK4 之外的所有 integrators 启用离散时间逆动力学。有关更多详细信息,请参见标志文档。

  6. 添加了 ls_iterationsls_tolerance 选项,用于调整 CG 和 Newton 解算器中的线搜索停止标准。这对于性能调优非常有用。

  7. mjModel 中添加了 mesh_posmesh_quat 字段,用于存储应用于网格资产的归一化变换。修复了 #409

  8. 添加了相机 resolution 属性和 camprojection 传感器。如果相机分辨率设置为正值,相机投影传感器将报告目标站点在相机图像上的投影位置,使用像素坐标。

  9. 添加了 camera 校准属性

  10. 实现了反转 Z 渲染以获得更好的深度精度。添加了枚举 mjtDepthMap,其值为 mjDEPTH_ZERONEARmjDEPTH_ZEROFAR,可用于设置 mjrContext 中的新 readDepthMap 属性,以控制 mjr_readPixels 返回的深度如何从 znear 映射到 zfar。贡献 #978Levi Burner 提供。

  11. 删除了代码示例 testxml。此实用程序提供的功能已在 WriteReadCompare 测试中实现。

  12. 删除了代码示例 derivative。功能由 mjd_transitionFD 提供。

Python 绑定#

  1. 修复了 #870,该错误导致使用无效相机名称调用 update_scene 时使用默认相机。

  2. 被动查看器 句柄中添加了 user_scn,允许用户添加自定义可视化 geom(#1023)。

  3. 在函数 viewer.launchviewer.launch_passive 中添加了可选的布尔关键字参数 show_left_uishow_right_ui,允许用户启动隐藏 UI 面板的查看器。

模拟#

  1. simulate 和托管的 Python viewer 中添加了状态历史机制。可以通过拖动历史滑块(更精确地)使用左右箭头键查看状态历史。参见屏幕截图

  2. LOADING... 标签现在正确显示。贡献 #1070Levi Burner 提供。

文档#

  1. 添加了流体动力建模的详细文档,以及一个说明性示例模型,展示了使用基于椭球体的流体模型实现的扑克牌翻滚

错误修复#

  1. 修复了在构建中间阶段碰撞树时导致 geom margin 被忽略的错误。

  2. 修复了为焊接等式约束生成 efc_diagApprox 中错误值的错误。

版本 2.3.7(2023 年 7 月 20 日)#

通用#

  1. 为球体-圆柱体接触添加了原始碰撞器,以前这对使用通用的凸体-凸体碰撞器。

  2. 添加了 joint-actuatorforcerange 用于夹紧关节处的总促动器力,以及 sensor-jointactuatorfrc 用于测量施加在关节上的总促动力。关节级促动器力夹紧最重要的用例是确保 Cartesian actuator 力可通过关节处的单个电机实现。详见 Force limits

  3. 为地形、纹理和网格资源添加了可选的 content_type 属性。此属性支持格式化的 Media Type(以前称为 MIME 类型)字符串,用于确定资源文件的类型,而无需依赖于文件扩展名。

  4. 为四元数 减法积分(带角速度的旋转)添加了解析导数。导数在 3D 切线空间中。

  5. 添加了 mjv_connector,其功能与 mjv_makeConnector 相同,但具有更方便的“from-to”参数化。mjv_makeConnector 现已弃用。

  6. 将支持的最旧 MacOS 版本从 10.12 升级到 11。MacOS 11 是 Apple 仍在维护的最旧版本。

Python 绑定#

  1. 被动查看器 句柄现在公开了 update_hfieldupdate_meshupdate_texture 方法,允许用户更新可渲染资源。(问题 #812#958#965)。

  2. 允许在 被动查看器 中指定自定义键盘事件回调(#766)。

  3. 修复了 Python 退出时被动查看器正在运行时发生的 GLFW 崩溃(#790)。

模型#

  1. 添加了简单的汽车示例模型。

版本 2.3.6(2023 年 6 月 20 日)#

注意

MuJoCo 2.3.6 是正式支持 Python 3.7 的最后一个版本。

模型#

  1. 添加了3x3x3 立方体示例模型。详情请参见README

错误修复#

  1. 修复了在体积无效时导致网格包围盒和坐标系计算不正确的错误。在这种情况下,如果 shellinertia 等于 true,MuJoCo 现在才接受非封闭几何体。

  2. 修复了用于计算肌腱阻尼和流体力的导数的稀疏雅可比乘法逻辑,该逻辑影响了 implicit 和 implicitfast 积分器的行为。

  3. 修复了 mj_ray,使其与 geom 可视化约定一致

    • 平面和地形场尊重 geom_groupflg_static 参数。在此更改之前,射线会无条件地与平面和地形场相交。

    • flg_static 现在适用于所有静态 geom,而不仅仅是那些直接属于世界体的 geom。

插件#

  1. 添加了触控网格传感器插件。有关详细信息,请参见文档,以及相关的touch_grid.xml示例模型。该插件包括场景内可视化

模拟#

  1. 在 simulate UI 中添加了可视化选项卡,对应于 visual MJCF 元素的成员。在 GUI 中修改值后,保存的 XML 将包含新值。mjStatistic 中可修改的成员(extentmeansizecenter)由编译器计算,因此没有默认值。为了使这些属性出现在保存的 XML 中,必须在加载的 XML 中指定一个值。

Before / After
  1. 增加了默认间距中 UI 元素的文本宽度。[之前/之后]

通用#

  1. 添加了 mj_getStatemj_setState 函数,用于获取和设置模拟状态,将其表示为浮点数的连接向量。详情请参见 状态 部分。

  2. 添加了 mjContact.solreffriction,允许在使用 elliptic friction cones 时,对接触的法向轴和摩擦轴使用不同的 solref 参数。此属性对于弹性摩擦碰撞是必需的,参见相关的示例模型,模拟弹性橡胶球的旋转反冲行为。这是一个高级选项,目前仅由显式 接触对 支持,使用 solreffriction 属性。

  3. 添加了 mjd_inverseFD,用于有限差分逆动力学导数。

  4. 添加了用于处理带宽稠密“箭头”矩阵的函数。这种矩阵在进行直接轨迹优化时很常见。详情请参见 mju_cholFactorBand 文档。

  5. 添加了 mj_multiRay 函数,用于与从单点发出的多条射线相交。这比多次调用 mj_ray 快得多。

  6. 现在,射线-网格碰撞速度提高了多达 10 倍,使用了网格面的包围体层级结构。

  7. mjMAXUIITEM(Simulate 中每个部分的 UI 元素最大数量)增加到 100。

  8. 添加了资源提供程序的文档

  9. 更改了 mju_sigmoid 的公式,这是一个有限支持的 sigmoid 函数 \(s \colon \mathbf R \rightarrow [0, 1]\)。之前,平滑部分由两个拼接的二次函数组成,一次连续可微。现在是一个单一的五次函数,两次连续可微

    \[s(x) = \begin{cases} 0, & & x \le 0 \\ 6x^5 - 15x^4 + 10x^3, & 0 \lt & x \lt 1 \\ 1, & 1 \le & x \qquad \end{cases} \]
  1. 为肌肉促动器添加了可选的 tausmooth 属性。当其值为正时,肌肉激活/去激活的时间常数 \(\tau\) 使用 mju_sigmoid 在 Millard 等人 (2013) 肌肉模型给出的两个极值之间以宽度为 tausmooth 的范围内平滑过渡。更多详情请参见 Muscle actuators。与此相关,mju_muscleDynamics 现在接受 3 个参数而不是 2 个,新增了平滑宽度参数。

  2. 将公共 C 宏定义从 mujoco.h 移至名为 mjmacro.h 的新公共头文件中。新文件包含在 mujoco.h 中,因此此更改不会破坏现有用户代码。

  3. 地址清理器 (ASAN)内存清理器 (MSAN) 添加了检测内存错误的插桩,这些错误可能在使用 mjData 栈和竞技场分配内存时发生。

  4. mj_printData 的输出中移除了 pstackparena,因为这些是 mjData 分配器的实现细节,受检测构建中的诊断填充影响。

  5. 删除了 mj_activatemj_deactivate 函数。这些函数是为了与 MuJoCo 闭源时的旧用户代码兼容而保留的,但自开源以来一直是空操作函数。

版本 2.3.5(2023 年 4 月 25 日)#

错误修复#

  1. 修复了当使用 mjVFS 时阻止从磁盘读取 OBJ 和 PNG 文件的资源加载错误。

  2. 修复了在 Python 被动查看器中应用鼠标扰动时 macOS 上偶尔出现的段错误。

插件#

  1. mjpPlugin 中的 visualize 回调现在接收一个 mjvOption 作为输入参数。

版本 2.3.4(2023 年 4 月 20 日)#

注意

此版本受到资源加载错误的影响,当使用 mjVFS 时,会阻止从磁盘读取 OBJ 和 PNG 文件。建议用户跳过此版本,直接使用版本 2.3.5。

通用#

  1. 删除了 compiler/coordinate 属性的“全局”设置。此很少使用的设置使编译器逻辑复杂化并阻止了未来的改进。为了转换使用此选项的旧模型,请在 MuJoCo 2.3.3 或更早版本中加载并保存它们。

_images/ellipsoidinertia.gif
  1. 添加了 visual-global 标志 ellipsoidinertia,以使用椭球而不是默认的盒子可视化等效的物体惯性。

  2. mjData 中添加了中相和宽相碰撞统计信息。

  3. 添加了 引擎插件 的文档。

  4. introspect 模块中添加了结构体信息。

  5. 添加了一种名为 资源提供程序 的新扩展机制。这种可扩展机制允许 MuJoCo 从本地操作系统文件系统或 虚拟文件系统 以外的数据源读取资源。

Python 绑定#

  1. macOS 上的离屏渲染不再限制在主线程。这是通过使用低级 Core OpenGL (CGL) API 创建 OpenGL 上下文实现的,而不是通过依赖 Cocoa 的 NSOpenGL 的 GLFW。由此产生的上下文不绑定到 Cocoa 窗口,因此也不绑定到主线程。

  2. 修复了 viewer.launch_passiveviewer.launch_repl 中的竞态条件。这些函数之前可能在内部调用 mj_forward 之前返回。这允许用户代码继续执行,并可能与内部 mj_forward 同时修改物理状态,导致例如MuJoCo 栈溢出错误段错误

  3. viewer.launch_passive 函数现在返回一个句柄,可用于与查看器交互。被动查看器现在还需要对其句柄进行显式调用 sync 以获取对物理状态的任何更新。这是为了避免可能导致视觉伪影的竞态条件。详情请参见文档

  4. 由于其功能已被 launch_passive 取代,viewer.launch_repl 函数已被移除。

  5. 添加了少量通过新 introspect 元数据发现的缺失结构体字段。

错误修复#

  1. 修复了新 implicitfast 积分器中椭球体流体模型力处理中的错误。

  2. 移除了 mj_copyData 中不必要的整个竞技场复制,这会显著降低复制操作的速度。

  3. 使 shellinertia 忽略 exactmeshinertia,后者

    仅用于旧版体积计算(#759)。

版本 2.3.3(2023 年 3 月 20 日)#

通用#

  1. 改进了隐式积分

    • RNE 算法的导数现在使用稀疏数学计算,这在使用 implicit 积分器 时显著提高了大型模型的速度。

    • 添加了一个新的积分器,名为 implicitfast。它类似于现有的 implicit 积分器,但跳过了科氏力和向心力的导数。有关详细动机和讨论,请参见数值积分部分。建议所有新模型使用 implicitfast 积分器,并且它将在未来的版本中成为默认积分器。

    下表显示了使用不同积分器计算 627-DoF humanoid100 模型的计算成本。“implicit (old)”使用密集 RNE 导数,“implicit (new)”是上面提到的稀疏化之后的结果。时间测量在 AMD 3995WX CPU 的单个核心上进行。

计时

欧拉

隐式快速

隐式 (新)

隐式 (旧)

单步 (毫秒)

0.5

0.53

0.77

5.0

步数/秒

2000

1900

1300

200

_images/midphase.gif
  1. 添加了碰撞中相,用于在体对中修剪 geom,更多详细信息请参见文档。这基于体惯性系中的静态 AABB 包围体层次结构(BVH 二叉树)。右侧的 GIF 截自此较长视频

  2. 除非明确请求,否则 mjd_transitionFD 函数不再触发传感器计算。

  3. 纠正了 mjLROpt 结构体中 inteval 属性的拼写为 interval

  4. 网格纹理和法线映射现在是每个三角形 3 个,而不是每个顶点 1 个。网格顶点不再像以前那样被重复以规避此限制。

  5. 稀疏约束雅可比矩阵的非零元素现在已预先计数并用于矩阵内存分配。例如,来自 humanoid100 模型的约束雅可比矩阵以前需要约 500,000 个 mjtNum,现在只需要约 6000 个。现在可以使用 CG 解算器加载和运行非常大的模型。

  6. 修改了 mju_errormju_warning,使其成为可变参数函数(支持类似 printf 的参数)。函数 mju_error_imju_error_smju_warning_imju_warning_s 现已弃用。

  7. 实现了一个高性能的 mju_sqrMatTDSparse 函数,该函数不需要密集内存分配。

  8. 添加了 mj_stackAllocInt,以获取在 mjData 栈上分配 int 的正确大小。减少了 10% - 15% 的栈内存使用。

Python 绑定#

  1. 修复了使用 viewer.launch_repl 时发生的 IPython 历史记录损坏问题。launch_repl 函数现在提供了 IPython 交互式 shell 会话的无缝延续,并且不再被视为实验性功能。

  2. 添加了 viewer.launch_passive,它以被动、非阻塞模式启动交互式查看器。对 launch_passive 的调用会立即返回,允许用户代码继续执行,查看器会自动反映物理状态的任何更改。(请注意,此功能目前处于实验/测试阶段,尚未在我们的查看器文档中描述。)

  3. 添加了 macOS 的 mjpython 启动器,这是 viewer.launch_passive 在该系统上运行所必需的。

  4. 从关节索引器中移除了 efc_ 字段。自引入竞技场内存以来,这些字段的动态大小会根据活动约束的数量在时间步之间发生变化,从而破坏了关节和 efc_ 行之间的严格对应关系。

  5. mjVisualmjvPerturb 结构体的绑定中添加了许多缺失的字段。

模拟#

  1. 实现了 macOS 上 损坏的垂直同步 的解决方法,以便在启用垂直同步切换时帧率能够正确限制。

_images/contactlabel.png
  1. 添加了接触可视化的可选标签,指示哪两个几何体正在接触(如果定义了名称则显示名称,否则显示 ID)。这在杂乱的场景中非常有用。


版本 2.3.2(2023 年 2 月 7 日)#

通用#

  1. 已实现性能更高的 mju_transposeSparse 函数,无需密集内存分配。对于来自 humanoid100.xml 模型中的约束雅可比矩阵,此函数速度提升 35%。

  2. 函数 mj_name2id 现在使用哈希函数而非线性搜索实现,以提高性能。

  3. Geom 名称现在从 URDF 中解析。任何重复名称都将被忽略。mj_printData 输出现在包含接触的 geom 名称。

Bug 修复#

  1. 修复了一个 bug:对于 shellinertia 等于 true 的情况,网格方向会被壳惯量的主要成分覆盖,而顶点坐标却使用体积惯量旋转。现在,在壳体情况下也使用体积惯量方向。

  2. 修复了使用边界框拟合选项 fitaabb 时,网格到原始体拟合中的未对齐 bug。

_images/meshfit.png
  1. Python 查看器中的 launch_repl 功能已修复。

  2. mjd_transitionFD 中正确设置 time,以支持时间相关的用户代码。

  3. 修复了存在 user 类型传感器时,传感器数据维度验证的 bug。

  4. 修复了在模型编译期间遇到空的 nsensordata 回调时,插件错误消息不正确的 bug。

  5. mj_fwdConstraint 提前返回时,正确结束计时器 (TM_END)。

  6. 修复了 mj_deleteFileVFS 中的无限循环 bug。

模拟#

  1. 将 simulate 传感器图 y 轴精度增加 1 位 (#719)。

  2. 除非正在可视化惯量,否则身体标签现在绘制在身体框架而不是惯量框架处。

插件#

  1. reset 回调现在接收实例特定的 plugin_stateplugin_data 作为参数,而不是整个 mjData。由于 reset 是在调用任何物理前向传递之前在 mj_resetData 内部调用的,因此在此阶段读取 mjData 中的任何内容都是错误的。

  2. mjpPlugin 中的 capabilities 字段重命名为 capabilityflags,以更清楚地表明这是一个位字段。

版本 2.3.1(2022 年 12 月 6 日)#

Python 绑定#

  1. 现在可以通过 mujoco Python 包将 simulate GUI 作为 mujoco.viewer 提供。详细信息请参阅文档。(由 Levi Burner 贡献)

  2. MuJoCo 教程 Colab 中的 Renderer 类现在可直接在原生 Python 绑定中使用。

通用#

  1. 肌腱 springlength 属性现在可以接受两个值。给定两个非递减值,springlength 指定弹簧刚度的死区范围。如果肌腱长度在这两个值之间,则力为 0。如果长度超出此范围,则力的行为类似于常规弹簧,弹簧静止长度对应于最近的 springlength 值。这可用于创建由弹簧而非约束强制执行限制的肌腱,这更便宜且更容易分析。请参阅 tendon_springlength.xml 示例模型。

    注意

    这是一个轻微的 API 破坏性变更。mjModel.tendon_lengthspring 的大小现在是 ntendon x 2,而不是 ntendon x 1

  2. 删除了无状态执行器必须在有状态执行器之前的要求。

  3. 添加了 mju_fillmju_symmetrizemju_eye 实用函数。

  4. body 添加了 gravcomp 属性,实现了重力补偿和浮力。请参阅 balloons.xml 示例模型。

  5. cable 插件库重命名为 elasticity

  6. general actuators 添加了 actdim 属性。值大于 1 仅允许用于 dyntype user,因为原生激活动力学都是标量。向 engine_forward_test.cc 添加了实现二阶激活动力学的示例测试。

  7. 改进了粒子 composite 类型,现在允许用户指定几何体和多个关节。请参阅两个新示例:particle_free.xmlparticle_free2d.xml

  8. 非 AVX 配置的性能改进

  9. 添加新的固态被动力插件

    • 这是一个与 composite 粒子兼容的新力场。

    • 生成四面体网格,其粒子质量集中在顶点。

    • 使用分段常应变模型,该模型等同于有限元,但以无坐标公式表示。这意味着除了边缘伸长之外,所有量都可以预先计算,就像在质量-弹簧模型中一样。

    • 仅适用于小应变(大位移但小变形)。四面体在大载荷下可能会倒转。

  10. 添加了 API 函数 mj_loadPluginLibrarymj_loadAllPluginLibraries。第一个函数与 POSIX 系统上的 dlopen 以及 Windows 上的 LoadLibraryA 相同。第二个函数扫描指定目录以查找所有动态库文件并加载找到的每个库。这些函数打开的动态库在加载时被假定注册一个或多个 MuJoCo 插件。

  11. 向插件添加了一个可选的 visualize 回调,该回调在 mjv_updateScene 期间调用。此回调允许自定义插件可视化。例如,启用 Cable 插件的应力可视化。

  12. user 类型的传感器不再需要 objtypeobjnameneedstage。如果未指定,objtype 现在是 mjOBJ_UNKNOWNuser 传感器 datatype 默认值现在是 “real”needstage 默认值现在是 “acc”

  13. 添加了在 URDF 导入中对胶囊体的支持。

  14. 在 macOS 上,在 Apple Silicon 机器上通过 Rosetta 2 翻译运行时,会发出信息性错误消息。预构建的 MuJoCo 二进制文件在 x86-64 机器上使用 AVX 指令,而 Rosetta 2 不支持此指令。(在此版本之前,用户只会收到神秘的“非法指令”消息。)

Bug 修复#

  1. 修复了 mj_addFileVFS 中导致文件路径被忽略的 bug(在 2.1.4 中引入)。

模拟#

  1. simulate 应用程序搜索插件的目录从 plugin 重命名为 mujoco_plugin

  2. 鼠标力扰动现在应用于选择点,而不是身体质心。

版本 2.3.0(2022 年 10 月 18 日)#

通用#

  1. mjData 中的 contact 数组和以 efc_ 为前缀的数组已从 buffer 移至新的 arena 内存空间。创建 mjData 时,这些数组不再分配固定大小的内存。相反,每次调用 mj_forward 时(具体来说,在 mj_collisionmj_makeConstraint 中)都会确定精确的内存需求,并从 arena 空间分配数组。stack 现在也与其可用内存共享 arena。此更改减少了不使用 PGS 求解器的模型中 mjData 的内存占用,并且将来会允许显著减少内存。详细信息请参阅内存分配部分。

  2. 添加了 colab notebook 教程,展示如何使用线性二次调节器在一条腿上平衡人形机器人。该 notebook 使用 MuJoCo 的原生 Python 绑定,并包含一个草稿 Renderer 类,方便在 Python 中进行渲染。
    自己动手试试:LQRopenincolab

  3. 人形机器人模型更新:- 添加了两个关键帧(单腿站立和蹲下)。- 增加了最大髋部屈曲角度。- 添加了在髋部高度屈曲角度时连接髋部和膝盖的腿筋。- 一般美观性改进,包括改进的默认设置使用和更好的命名方案。

  4. 添加了 mju_boxQP 和分配函数 mju_boxQPmalloc 用于求解箱式约束二次规划

    \[x^* = \text{argmin} \; \tfrac{1}{2} x^T H x + x^T g \quad \text{s.t.} \quad l \le x \le u\]

    该算法由 Tassa 等人于 2014 年引入,在 2-5 次 Cholesky 分解后收敛,与问题大小无关。

  5. 添加了 mju_mulVecMatVec,用于将一个方阵 \(M\) 与向量 \(x\)\(y\) 两侧相乘。该函数返回 \(x^TMy\)

  6. 添加了新的插件 API。插件允许开发人员在不修改核心引擎代码的情况下扩展 MuJoCo 的功能。插件机制旨在取代现有的回调,尽管这些回调仍将作为简单用例和向后兼容性的选项保留一段时间。新机制管理有状态插件,并支持来自不同来源的多个插件,允许以模块化方式引入 MuJoCo 扩展,而不是作为全局覆盖。请注意,新机制目前除了代码之外没有文档记录,因为我们正在内部测试它。如果您有兴趣使用插件机制,请先与我们联系。

  7. 添加了 assetdir 编译器选项,它设置了 meshdirtexturedir 的值。后两个属性中的值优先于 assetdir

  8. 添加了 visualrealtime 选项,用于以较慢的速度开始模拟。

  9. 添加了新的 cable 复合类型

    • 电缆元件通过球关节连接。

    • 参数 initial 指定起始边界处的关节:freeballnone

    • 边界体暴露的名称为 B_lastB_first

    • 顶点初始位置可以直接在 XML 中通过参数 vertex 指定。

    • 主体框架的方向曲线材料框架的方向。

  10. 添加了新的 cable 被动力插件

    • 可以使用参数 twistbend 分别设置扭转和弯曲刚度。

    • 无应力配置可以通过标志 flat 设置为初始配置或平面配置。

    • 新的 cable.xml 示例展示了缠绕的形成。

    • 新的 coil.xml 示例展示了弯曲的平衡配置。

    • 新的 belt.xml 示例展示了扭转和各向异性之间的相互作用。

    • 添加了使用悬臂梁精确解的测试。

Python 绑定#

  1. named accessor 对象添加了 idname 属性。这提供了更符合 Python 习惯的 API 访问 mj_name2idmj_id2name

  2. MjData.contact 的长度现在是 ncon,而不是 nconmax,这使得它无需检查 ncon 即可直接用作迭代器。

  3. 修复了当 Python 可调用对象安装为回调函数时发生的内存泄漏 (#527)。

版本 2.2.2(2022 年 9 月 7 日)#

通用#

  1. 添加了 adhesion actuators,模拟真空夹具和生物粘附附属肢体。

  2. 添加了相关的示例模型和视频

  3. 添加了 mj_jacSubtreeCom,用于计算子树质心的平移雅可比矩阵。

  4. weld 约束添加了 torquescaleanchor 属性。torquescale 设置约束施加的扭矩与力的比值,anchor 设置应用焊接扭力矩的点。有关更多详细信息,请参阅 weld

  5. mjNEQDATA,即 mjModel.eq_data 中相等约束参数的行长度,从 7 增加到 11。

  6. 添加了 connectweld 约束的锚点可视化(在 simulate 中通过 'N' 键激活)。

  7. 添加了 weld.xml,展示了新焊接属性的不同用法。

  8. 通过为带有 site 传动的执行器添加参考站点,现在可以实现笛卡尔 6D 末端执行器控制。请参阅 actuator 文档中新 refsite 属性的描述以及 refsite.xml 示例模型。

  9. 添加了 autolimits 编译器选项。如果设置为 true,则关节和肌腱的 limited 属性以及执行器的 ctrllimitedforcelimitedactlimited 属性将自动设置为 true(如果定义了相应的范围),否则设置为 false

    如果 autolimits="false"(默认值),则定义了 range 属性但未指定 limited 属性的模型将编译失败。未来的版本将把 autolimits 的默认值更改为 true,此编译错误允许用户捕获未来的行为更改。

    注意

    这是一个破坏性更改。在定义了范围但未指定 limited 的模型中,明确将 limited 设置为 false 或删除范围以保持模型当前的行为。

  10. 添加了所有格式良好的网格的惯性矩计算。此选项通过将编译器标志 exactmeshinertia 设置为 true 来激活(默认为 false)。此默认值将来可能会更改。

  11. geom 添加了参数 shellinertia,用于将推断的惯量定位在边界(壳)上。目前仅支持网格。

  12. 对于从中推断体积惯量的网格,如果网格面的方向不一致,则会引发错误。如果发生这种情况,请使用 MeshLab 或 Blender 等工具修复网格。

  13. 添加了悬挂肌腱的悬链线可视化。视频中显示的模型可在此处找到。

  14. visual/global 添加了 azimuthelevation 属性,定义了模型加载时自由相机的初始方向。

  15. 添加了 mjv_defaultFreeCamera,它设置了默认的自由相机,尊重上述属性。

  16. simulate 现在支持通过文件部分的按钮或 Ctrl-P 截屏。

  17. 改进了 simulate 中的时间同步,特别是如果实际实时系数与请求的系数不同(例如,如果时间步长太小,模拟无法跟上实时),则报告实际实时系数。

  18. 添加了传感器的禁用标志。

  19. mju_mulQuatmju_mulQuatAxis 支持原地计算。例如
    mju_mulQuat(a, a, b); 将四元数 a 设置为 ab 的乘积。

  20. mjd_transitionFD 添加了传感器矩阵(请注意这是一个 API 更改)。

已删除/已弃用功能#

  1. 删除了 distance 约束。

Bug 修复#

  1. 修复了反射中某些透明几何体的渲染。

  2. 修复了 intvelocity 默认值解析。

版本 2.2.1(2022 年 7 月 18 日)#

通用#

  1. 添加了 mjd_transitionFD,用于计算状态转移矩阵和控制转移矩阵的高效有限差分近似,详细信息请参阅此处

  2. 添加了椭球体流体模型的导数。

  3. keyframes 添加了 ctrl 属性。

  4. 添加了 clock 传感器,用于测量时间

  5. 为皮肤添加了可视化组。

  6. freeball 关节以及带有 site 传动的执行器添加了执行器可视化。

  7. 添加了执行器激活的可视化。

  8. 添加了 <actuator-intvelocity> 执行器快捷方式,用于“集成速度”执行器,此处记录了该快捷方式。

  9. 添加了 <actuator-damper> 执行器快捷方式,用于主动阻尼执行器,此处记录了该快捷方式。

  10. mju_rotVecMatmju_rotVecMatT 现在支持原地乘法。

  11. mjData.ctrl 值不再原地限制,不受引擎影响。

  12. mjData 的缓冲区中的数组现在对齐到 64 字节边界,而不是 8 字节。

  13. 在构建时使用 Address Sanitizer (ASAN)Memory Sanitizer (MSAN) 添加了内存中毒。这使得 ASAN 可以检测对 mjModel.buffermjData.buffer 中不在数组内的区域的读写,并且 MSAN 可以检测 mj_resetData 后对 mjData 中未初始化字段的读取。

  14. 添加了一个连杆机构示例模型

Bug 修复#

  1. 激活限制未应用于隐式积分器

  2. 对方向指定器进行更严格的解析。在此更改之前,如果指定包含 quat替代指定器,例如 <geom ... quat=".1 .2 .3 .4" euler="10 20 30">,则会忽略 quat 并且仅使用 euler。在此更改之后,将抛出解析错误。

  3. 对 XML 属性进行更严格的解析。在此更改之前,错误的 XML 片段,如 <geom size="1/2 3 4">,会被解析为 size="1 0 0",并且不会抛出错误。现在会抛出错误。

  4. 尝试通过 XML 加载 NaN,例如 <geom size="1 NaN 4">,虽然允许用于调试目的,但现在会打印警告。

  5. 修复了 mj_loadModel 中的空指针解引用 bug。

  6. 修复了从 MJB 加载无效模型时发生的内存泄漏。

  7. 计算 mjModel 缓冲区大小时避免整数溢出。

  8. mjWARN_BADCTRL 添加了缺失的警告字符串。

打包#

  1. 更改了 MacOS 打包方式,以便嵌入在 MuJoCo.app 中的 mujoco.framework 副本可用于外部构建应用程序。

版本 2.2.0(2022 年 5 月 23 日)#

开源#

  1. MuJoCo 现在是完全开源的软件。新增的顶级目录包括

    a. src/: 所有源文件。子目录对应于编程章节引言中描述的模块

    • src/engine/: 核心引擎。

    • src/xml/: XML 解析器。

    • src/user/: 模型编译器。

    • src/visualize/: 抽象可视化器。

    • src/ui/: UI 框架。

    1. test/: 测试和相应的资产文件。

    2. dist/: 与打包和二进制分发相关的文件。

  2. 添加了贡献者指南风格指南

通用#

  1. 添加了平滑(无约束)动力学力关于速度的解析导数

    • 由递归牛顿-欧拉算法计算的向心力和科里奥利力。

    • 阻尼和流体阻力被动力。

    • 执行力。

  2. 添加了 implicit 积分器。使用上述解析导数,添加了一个新的速度隐式积分器。该积分器在稳定性和计算成本方面介于欧拉积分器和龙格-库塔积分器之间。它对于使用流体阻力(例如用于飞行或游泳)的模型以及使用速度执行器的模型最有用。有关更多详细信息,请参阅数值积分部分。

  3. 通用执行器添加了 actlimitedactrange 属性,用于限制执行器内部状态(激活)。此限制对于集成速度执行器非常有用,详细信息请参阅激活限制部分。

  4. mjData 字段 qfrc_unc(无约束力)和 qacc_unc(无约束加速度)已分别重命名为 qfrc_smoothqacc_smooth。虽然“无约束”很精确,“平滑”比“unc”更容易理解。

  5. 公共头文件已从 /include 移动到 /include/mujoco/,这与大多数其他开源项目的目录结构一致。鼓励开发人员通过 #include <mujoco/filename.h> 在自己的代码库中包含 MuJoCo 公共头文件。

  6. shadowsize属性指定的默认阴影分辨率从 1024 增加到 4096。

  7. 保存的 XML 现在使用 2 个空格缩进。

Bug 修复#

  1. 分割渲染的抗锯齿已禁用。在此更改之前,如果 offsamples 属性大于 0(默认值为 4),则与多个几何体重叠的像素将接收平均分割 ID,导致 ID 不正确或不存在。在此更改之后,分割渲染期间将忽略 offsamples

  2. 实验性 multiCCD 功能的启用标志的值已与其他启用标志按顺序排列。顺序性在 simulate UI 和其他地方被假定。

  3. 修复了使用 mj_saveLastXML 保存带有 OBJ 网格的模型时网格重复的问题。

版本 2.1.5(2022 年 4 月 13 日)#

通用#

  1. 添加了一个实验性功能:多接触凸碰撞检测,通过启用标志激活。请参阅此处的完整描述。

Bug 修复#

  1. Linux 上的 GLAD 初始化逻辑现在调用 dlopen 来加载 GL 平台动态库,如果进程的全局符号表中尚不存在 *GetProcAddress 函数。特别是,使用 GLFW 设置渲染上下文但未明确链接 libGLX.so 的进程(例如 Python 解释器)现在可以正常工作,而不是在调用 mjr_makeContext 时因 gladLoadGL 错误而失败。

  2. 在 Python 绑定中,用于标量字段(例如执行器的 ctrl 字段)的命名索引器现在返回形状为 (1,) 的 NumPy 数组,而不是 ()。这使得为这些字段赋值更简单直观。

版本 2.1.4(2022 年 4 月 4 日)#

通用#

  1. MuJoCo 现在使用 GLAD 管理 OpenGL API 访问,而不是 GLEW。在 Linux 上,不再需要根据是使用 GLX、EGL 还是 OSMesa 来链接不同的 GL 处理库。相反,用户只需使用 GLX、EGL 或 OSMesa 创建 GL 上下文,mjr_makeContext 将检测正在使用哪一个。

  2. 添加了接触框架的可视化。这在编写或修改碰撞函数时非常有用,此时接触的 x 轴和 y 轴的实际方向可能很重要。

二进制构建#

  1. Linux 和 Windows 上不再提供 _nogl 动态库。切换到 GLAD 后,我们可以在调用 mjr_makeContext 时解析 OpenGL 符号,而不是在加载库时。因此,MuJoCo 库不再对 OpenGL 有明确的动态依赖,并且可以在没有 OpenGL 的系统上使用。

模拟#

  1. 修复了 simulate 中的一个 bug,即在未加载模型时按下“[”或“]”会导致崩溃。

  2. 接触框架可视化已添加到 Simulate GUI 中。

  3. 将“set key”、“reset to key”分别重命名为“save key”和“load key”。

  4. 更改了 F6 和 F7 的绑定,从不太有用的“垂直同步”和“忙等待”更改为更有用的帧和标签循环。

Bug 修复#

  1. mj_resetDatasolver_nnz 字段归零。

  2. 删除了 mju_quat2mat 中针对单位四元数的特殊分支。之前,如果四元数的实部等于 1.0,mju_quat2mat 会跳过所有计算。对于非常小的角度(例如在有限差分时),余弦在双精度下可能精确评估为 1.0,而正弦仍为非零。

版本 2.1.3(2022 年 3 月 23 日)#

通用#

  1. simulate 现在支持循环切换相机(使用 [] 键)。

  2. mjVIS_STATIC 切换所有静态主体,而不仅仅是世界的直接子项。

Python 绑定#

  1. MjrContext 添加了 free() 方法。

  2. 枚举现在支持与数字进行算术和按位运算。

Bug 修复#

  1. 修复了 2.1.2 中引入的平面渲染 bug。这破坏了 dm_control 中的迷宫环境。

版本 2.1.2(2022 年 3 月 15 日)#

新模块#

  1. 添加了新的Python 绑定,可通过 pip install mujoco 安装,并作为 import mujoco 导入。

  2. 添加了新的Unity 插件

  3. 添加了一个新的 introspect 模块,它为 MuJoCo 的公共 API 提供了反射能力,目前描述函数和枚举。虽然用 Python 实现,但该模块预计对于针对多种语言的自动代码生成非常有用。(此模块不随 mujoco Python 绑定包一起提供。)

API 变更#

  1. mjtNum 浮点类型的定义移至新的头文件 mjtnum.h

  2. 将头文件 mujoco_export.h 重命名为 mjexport.h

  3. 添加了 mj_printFormattedData,它接受浮点数的格式字符串,例如增加精度。

通用#

  1. MuJoCo 可以加载 OBJ 网格文件。

    1. 不支持包含顶点数大于 4 的多边形的网格。

    2. 在包含多个对象组的 OBJ 文件中,第一个组之后的所有组都将被忽略。

    3. 添加了(发布后,不包含在 2.1.2 存档中)纹理化的马克杯示例模型

      _images/mug.png
  2. frameposframequatframexaxisframeyaxisframezaxisframelinvelframeangvel 传感器添加了可选的参考框架规范。参考框架通过新的 reftyperefname 属性指定。

  3. 用户参数的大小现在自动推断。

    1. 顶级 size 子句中用户参数的声明(例如 nuser_body, nuser_jnt 等)现在接受值 -1,这是默认值。这将自动将值设置为模型中定义的关联 user 属性的最大长度。

    2. 设置小于 -1 的值将导致编译器错误(之前是段错误)。

    3. 设置的值小于模型中定义的某个 user 属性的长度将导致错误(之前忽略了附加值)。

  4. mjvScene 中的最大光源数量从 8 增加到 100。

  5. 保存的 XML 文件仅在原始 XML 中包含显式的inertial元素时才包含它们。编译器inertiafromgeom机制自动推断的惯量保持未指定状态。

  6. 用户选择的几何体总是渲染为不透明的。这在交互式可视化器中很有用。

  7. 静态几何体现在遵守其几何体组进行可视化。在此更改之前,静态几何体的渲染只能通过mjVIS_STATIC可视化标志来切换。在此更改之后,需要同时启用几何体组和可视化标志才能渲染几何体。

  8. mujoco.h 中函数声明中的指针参数,如果代表固定长度数组,现在拼写为具有范围的数组,例如 mjtNum quat[4] 而不是 mjtNum* quat。从 C 和 C++ 的角度来看,这是一个非更改,因为函数签名中的数组类型会衰减为指针类型。但是,这允许自动生成的代码知道预期的输入形状。

  9. 实验性无状态流体交互模型。如此处所述,流体阻力使用根据身体惯量计算的大小。虽然有时很方便,但这很少是好的近似。在新模型中,力作用于几何体而非身体,并有几个用户可设置的参数。该模型通过设置一个新属性来激活:<geom fluidshape="ellipsoid"/>。参数的简要描述在此处,但模型的完整描述及其参数留待此功能脱离实验状态后再提供。

Bug 修复#

  1. mj_loadXMLmj_saveLastXML 现在与区域设置无关。Unity 插件现在应该对使用逗号作为小数分隔符的用户正常工作。

  2. VFS 中的 XML 资产不再需要以空字符结尾。相反,文件大小由相应的 VFS 条目的 size 参数决定。

  3. 修复了使用皮肤时 mjrContext 中的顶点缓冲区对象内存泄漏。

  4. 相机四元数现在在 XML 编译期间标准化。

二进制构建#

  1. Windows 二进制文件现在使用 Clang 构建。

版本 2.1.1(2021 年 12 月 16 日)#

API 变更#

  1. 添加了 mj_printFormattedModel,它接受浮点数的格式字符串,例如增加精度。

  2. 添加了 mj_versionString,它返回表示 MuJoCo 二进制版本的易读字符串。

  3. 将私有 API 结构体定义中开头的下划线转换为末尾的下划线,以符合保留标识符指令,请参阅C 标准:第 7.1.3 节

    注意

    这是一个轻微的破坏性更改。引用私有实例的代码将中断。要修复,请将开头的下划线替换为末尾的下划线,例如 _mjModelmjModel_

通用#

  1. 更安全的字符串处理:将 strcatstrcpysprintf 替换为 strncatstrncpysnprintf

  2. 更改了缩进从 4 个空格到 2 个空格,K&R 大括号风格,为单行条件语句添加了大括号。

Bug 修复#

  1. 修复了 PGS 求解器中从未初始化内存读取的 bug。

  2. 计算出的胶囊惯量现在是精确的。在此更改之前,编译器inertiafromgeom 机制计算的胶囊质量和惯量近似为圆柱体,该圆柱体由胶囊的圆柱中间部分形成,两端延伸半个胶囊半径。现在,胶囊惯量使用平行轴定理计算,应用于两个半球形端盖。

    注意

    这是一个轻微的破坏性更改。具有自动计算的胶囊惯量的模型的模拟将具有数值差异,导致例如黄金值测试失败。

  3. 修复了与 forcetorque 传感器相关的 bug。在此更改之前,F/T 传感器报告的力矩忽略了树外约束力矩,但接触产生的力矩除外。现在,力矩传感器正确地考虑了 connectweld 约束的影响。

    注意

    位于运动树之外(即在没有祖先关系的身体之间)的空间肌腱产生的力仍然不被力矩传感器考虑。这仍然是未来的工作项。

代码示例#

  1. testspeed: 添加了伪随机控制噪声注入,默认开启。这是为了避免陷入固定的接触配置,从而提供不切实际的计时测量。

  2. simulate:

    1. 添加了慢于实时功能,通过“+”和“-”键控制。

    2. 添加了滑动条,用于向控制器注入布朗噪声。

    3. 添加了“打印相机”按钮,用于打印带有当前相机姿态的 MJCF 子句。

    4. 重新加载同一个模型文件时,相机姿态不会重置。

更新依赖#

  1. TinyXML 已被 TinyXML2 6.2.0 替换。

  2. qhull 已升级到 8.0.2 版本。

  3. libCCD 已升级到 1.4 版本。

  4. 在 Linux 上,libstdc++ 已被 libc++ 替换。

二进制构建#

  1. MacOS 打包。我们现在提供原生支持 Apple Silicon 和 Intel CPU 的 Universal 二进制文件。

    1. MuJoCo 库现在被打包成一个框架包 (Framework Bundle),使其更容易集成到 Xcode 项目(包括 Swift 项目)中。鼓励开发人员使用 -framework mujoco 标志编译和链接 MuJoCo,但所有头文件和 libmujoco.2.1.1.dylib 库仍可直接在框架内部访问。

    2. 示例应用程序现在被打包成一个名为 MuJoCo.app 的应用程序包。通过 GUI 启动时,该包会启动 simulate 可执行文件。其他预编译的示例程序也随该包一起分发(在 MuJoCo.app/Contents/MacOS 中),可以通过命令行启动。

    3. 二进制文件已签名,磁盘映像已公证。

  2. Windows 二进制文件和库已签名。

  3. Linux 和 macOS 上启用了链接时优化 (LTO),在三个测试模型(cloth.xmlhumanoid.xmlhumanoid100.xml)上基准测试时,平均速度提高了约 20%。

  4. Linux 二进制文件现在使用 LLVM/Clang 构建,而不是 GCC。

  5. 还提供了 AArch64(即 ARM64)Linux 构建。

  6. 私有符号不再从 Linux 和 MacOS 上的共享库中剥离。

示例模型#

  1. 清理 model/ 目录。

    1. 重新组织到包含所有依赖项的子目录中。

    2. 在 XML 注释中添加了描述,清理了 XML。

    3. 删除了一些复合模型:grid1grid1pingrid2softcylindersoftellipsoid

  2. docs/images/models/ 中添加了描述性动画

humanoid particle

版本 2.1.0(2021 年 10 月 18 日)#

新功能#

  1. 关键帧现在具有 mocap_posmocap_quat 字段(XML 中的 mpos 和 quat 属性),允许将 mocap 姿态存储在关键帧中。

  2. 新的实用函数:mju_insertionSortInt(整数插入排序)和 mju_sigmoid(从两个半二次函数构造 Sigmoid)。

通用#

  1. 虚拟文件系统 (VFS) 中的预分配大小增加到 2000 和 1000,以便支持更大的项目。

  2. mjuiItem 联合中的 C 结构体现在被命名,以实现兼容性。

  3. 修复:mjcb_contactfilter 类型是 mjfConFilt(之前是 mjfGeneric)。

  4. 修复:mjCModel 中的传感器数组未被清除。

  5. 清理了跨平台代码(内部更改,通过 API 不可见)。

  6. 修复了 XML texcoord 数据解析中的一个 bug(与顶点数量有关)。

  7. 修复了 simulate.cc 中与 nkey(关键帧数量)相关的 bug。

  8. 在存在大量非碰撞几何体(contype==0 and conaffinity==0)时加速了碰撞检测。

UI#

  1. 图表选择类型从 int 更改为 float

  2. 启用选择和高亮时,图表现在显示数据坐标。

  3. mjMAXUIMULTI 更改为 35,mjMAXUITEXT 更改为 300,mjMAXUIRECT 更改为 25。

  4. 添加了可折叠子部分,实现为带有状态的分隔符:mjSEPCLOSED 折叠,mjSEPCLOSED+1 展开。

  5. 添加了 mjITEM_RADIOLINE 项目类型。

  6. 添加了函数 mjui_addToSection,用于简化 UI 部分构建。

  7. mjvFigure 添加了子图标题。

渲染#

  1. render_gl2 防止轴范围计算中的非有限浮点数据。

  2. render_gl2 从后往前绘制线条,以便更好地显示。

  3. 添加了函数 mjr_label(用于文本标签)。

  4. 如果 ngeom==0mjr_render 会立即退出,以避免未初始化场景(例如 frustrum==0)导致的错误。

  5. mjr_render 中添加了裁剪框,因此我们不会在每一帧清除整个窗口。

许可证管理器#

  1. 移除了整个许可证管理器。函数 mj_activatemj_deactivate 仍然存在以实现向后兼容性,但现在它们什么都不做,并且不再需要调用它们。

  2. 移除了远程许可证证书函数 mj_certXXX

更早版本#

更早版本的更新日志请参阅 roboti.us