更新日志#
版本 3.3.2 (2025 年 4 月 28 日)#
MJX#
添加了逆动力学。
添加了肌腱促动器力传感器。
版本 3.3.1 (2025 年 4 月 9 日)#
破坏性 API 变更
用于切换 内部弹性体接触 的标志的默认值从“true”更改为“false”。此功能已被证明对用户来说是反直觉的。
所有附着函数(
mjs_attachBody
、mjs_attachFrame
、mjs_attachToSite
、mjs_attachFrameToSite
)均已移除,并由单个函数 mjs_attach 取代。
通用#
MJX#
添加了肌腱促动器力限制。
Bug 修复#
mj_jacDot 缺少一个考虑雅可比矩阵计算参考点运动的项,现已修复。
修复了将 mjSpec 附着到框架或站点时,子世界体(worldbody)中元素的父框架设置不正确的错误。
修复了在不支持 ARB_clip_control 的平台(例如 MacOS)上阴影渲染闪烁的错误。与 @aftersomemath 协作修复。
Python 绑定#
版本 3.3.0 (2025 年 2 月 26 日)#
功能推广#
引入了一种新型的快速可变形体,通过将 flexcomp/dof 设置为“trilinear”来激活。这种 可变形 弹性体对象具有与常规弹性体相同的碰撞几何形状,但自由度少得多。不是每个顶点有 3 个自由度,而是只有边界框的角点可以自由移动,内部顶点的位置通过对 8 个角点进行三线性插值计算得出,整个弹性体对象总共有 24 个自由度(如果某些角点被固定,则更少)。这限制了弹性体可实现的变形类型,但能实现更快的仿真。例如,请参见右侧视频,比较 完整 和 三线性 弹性体模型化可变形夹持器垫。


通用#
通过暴露
viewport
属性、set_figures
方法和clear_figures
方法,在 MuJoCo 查看器中添加了对自定义绘图的支持。分离了 弹性体 的碰撞和变形网格。这使得软体计算的成本固定,同时保留了高分辨率碰撞的精度。
改进了原生渲染器中的阴影渲染。
将
introspect
移至python/introspect
。
破坏性 API 变更
如上所述,原生凸碰撞检测流程现在是默认设置,这可能会破坏一些工作流程。在这种情况下,将 nativeccd 设置为“disable”以恢复旧的行为。
添加了 mjs_setDeepCopy API 函数。当深拷贝标志为 0 时,附加模型将不会将其复制到父级,因此附加后可以使用子级的原始引用来修改父级。默认行为是执行此类浅拷贝。通过将深拷贝标志设置为 1,可以恢复附加时创建子模型深拷贝的旧行为。
网格惯性推断的变更
以前,为了指定质量位于表面上,任何几何体类型都可以使用 geom/shellinertia。现在,如果几何体是网格,则此属性将被忽略;而是使用资产中的 asset/mesh/inertia 属性指定网格的惯性推断。
以前,如果体积惯性计算失败(例如由于网格非常平坦),编译器会静默回退到表面惯性计算。现在,编译器将抛出一条有意义的错误信息。
移除了复合体类型
grid
。用户应改为使用 flexcomp。
MJX#
添加了对具有内部球体和圆柱体包裹的空间肌腱的支持。
修复了盒-盒碰撞的错误 #2356。
Python 绑定#
为
mujoco.rollout
添加了一个教学 Colab 笔记本,这是一个用于多线程仿真展开(rollouts)的 Python 模块。可在此处获取。
由 @aftersomemath 贡献。
版本 3.2.7 (2025 年 1 月 14 日)#
Python 绑定#
rollout 现在具有原生多线程特性。如果传入长度为
nthread
的MjData
实例序列,rollout
将自动创建一个线程池并并行计算。线程池可以在多次调用中重用,但此时不能从多个线程同时调用该函数。要同时运行多个线程化的 rollout,请使用封装了线程池的新类Rollout
。由 @aftersomemath 贡献。修复了使用
mjpython
时造成的全局命名空间污染(#2265)。
通用#
破坏性 API 变更(次要)
字段
mjData.qLDiagSqrtInv
已移除。此字段仅用于对偶求解器。现在按需计算,而非无条件计算。相关地,为 mj_solveM2 添加了相应的参数。
减少了 PGS 求解器的 A 矩阵 的内存占用。这是 MuJoCo 中最后一个剩余的密集内存分配,从而可以显著减少 动态内存分配启发式方法。
Bug 修复#
版本 3.2.6 (2024 年 12 月 2 日)#
通用#
MJX#
添加了肌肉促动器。
Python 绑定#
Bug 修复#
版本 3.2.5 (2024 年 11 月 4 日)#
功能推广#
通用#
MJX#
添加了
apply_ft
、jac
和xfrc_accumulate
作为公共函数。添加了
TOUCH
传感器。添加了对
eq_active
的支持。修复了 #2173。添加了射线与椭球体的相交计算。
Bug 修复#
文档#
API 参考 中的函数头现在链接到它们在 GitHub 中的源代码定义。
版本 3.2.4 (2024 年 10 月 15 日)#
通用#
牛顿求解器不再需要
nv*nv
内存分配,从而允许更大的模型。例如,参见 100_humanoids.xml。仍有两个二次内存分配需要完全稀疏化:mjData.actuator_moment
和 PGS 求解器使用的矩阵。移除了 solid 和 membrane 插件,并将相关的计算移入引擎。参见 3D 示例模型 和 2D 示例模型,了解以前需要这些插件的弹性体对象示例。
用 mjs_activatePlugin 取代了函数
mjs_setActivePlugins
。
MJX#
Python 绑定#
移除了对 Python 3.8 的支持,因其已 在上游被弃用。
Bug 修复#
版本 3.2.3 (2024 年 9 月 16 日)#
通用#
破坏性 API 变更
运行时选项
mpr_tolerance
和mpr_iterations
已在 XML 和 mjOption 结构体中重命名为 ccd_tolerance 和 ccd_iterations。这是因为新的凸碰撞检测流程(见下文)不使用 MPR 算法。这些选项的语义保持不变。函数
mjs_findMesh
和mjs_findKeyframe
已被mjs_findElement
取代,该函数允许查找任何对象类型。
添加了一种定义 连接 和 焊接 等式约束的新方法,使用两个站点(site)。当基础配置中不满足约束的假设时,新的语义非常有用。在这种情况下,站点将在仿真开始时“自动对齐”。此外,在运行时更改站点位置(
mjModel.site_pos
)和方向(mjModel.site_quat
)将正确修改约束定义。右侧视频展示了使用新语义的 示例模型。引入了自由关节对齐,这是一项适用于具有自由关节且无子体(简单自由浮动体)的刚体的优化:自动将刚体框架与惯性框架对齐。此功能可以使用 freejoint/align 属性单独切换,或使用编译器 alignfree 属性全局切换。对齐操作将相关的 6x6 惯性子矩阵对角化,从而使自由刚体的仿真更快、更稳定。
虽然此优化是严格的改进,但它改变了关节自由度的语义。因此,在旧版本(例如,在 关键帧 中)保存的
qpos
和qvel
值将失效。由于这种潜在的破坏性,全局编译器属性当前默认为“false”,但在未来的版本中可能会更改为“true”。建议所有新模型使用对齐的自由关节。添加了一个 mjSpec 选项,可以直接从缓冲区创建纹理。
所有几何体类型现在都支持 壳(表面)惯性。
附加子模型时,关键帧 现在将正确合并到父模型中,但仅在第一次附加时合并。
添加了 mjtSameFrame 枚举,其中包含刚体及其子级可能的框架对齐方式。这些对齐方式用于 mj_kinematics 中的计算快捷方式。
MJX#
向
mjx.Data
添加了efc_pos
(#1388)。添加了位置相关的传感器:
MAGNETOMETER
、CAMPROJECTION
、RANGEFINDER
、JOINTPOS
、ACTUATORPOS
、BALLQUAT
、FRAMEPOS
、FRAMEXAXIS
、FRAMEYAXIS
、FRAMEZAXIS
、FRAMEQUAT
、SUBTREECOM
、CLOCK
。添加了速度相关的传感器:
VELOCIMETER
、GYRO
、JOINTVEL
、ACTUATORVEL
、BALLANGVEL
、FRAMELINVEL
、FRAMEANGVEL
、SUBTREELINVEL
、SUBTREEANGMOM
。添加了加速度/力相关的传感器:
ACCELEROMETER
、FORCE
、TORQUE
、ACTUATORFRC
、JOINTACTFRC
、FRAMELINACC
、FRAMEANGACC
。更改了默认策略,以避免将未使用的(仅限 MuJoCo 的)数组放置在设备上。
向
mjx.make_data
添加了device
参数,使其与mjx.put_model
和mjx.put_data
保持一致。添加了对 implicitfast 集成 的支持,除了 流体阻力 以外的所有情况。
修复了稀疏质量矩阵的
qLDiagInv
尺寸不正确的错误。添加了对关节和肌腱 摩擦损耗 的支持。
添加了对使用两个站点进行 连接 等式约束的支持。
添加了对具有站点包裹的 空间肌腱 的支持。
Bug 修复#
修复了 3.1.7 中引入的网格边界体积层次结构性能回归问题(#1875,由 @michael-ahn 贡献)。
修复了一个错误,对于同时具有肌肉和无状态促动器并使用隐式积分器之一的模型,会计算出错误的导数。
修复了肌腱缠绕球体的错误。在此修复之前,肌腱如果缠绕带有外部放置的 侧站点 的球体,可能会跳到球体内部而不是缠绕在其外部。
修复了在模型 附加 期间导致 meshdir 和 texturedir 被覆盖的错误,从而阻止了资产位于不同目录的模型附加。
Python 绑定#
版本 3.2.2 (2024 年 8 月 8 日)#
通用#
将纹理和材质限制增加回 1000。3.2.0 版本无意中将此限制降低到 100,破坏了一些现有模型(#1877)。
版本 3.2.1 (2024 年 8 月 5 日)#
通用#
MJX#
向
mjx.Model
和mjx.Data
添加了更多字段,以进一步与相应的 MuJoCo 结构体兼容。添加了对 固定肌腱 的支持。
添加了对肌腱长度限制的支持(mjtConstraint 中的
mjCNSTR_LIMIT_TENDON
)。添加了对肌腱等式约束的支持(mjtEq 中的
mjEQ_TENDON
)。添加了对肌腱促动器传动的支持(mjtTrn 中的
mjTRN_TENDON
)。
Python 绑定#
在
mujoco.spec.from_file
、mujoco.spec.from_string
和mujoco.spec.compile
中添加了对资产字典参数的支持。
Bug 修复#
修复了隐式积分器未考虑禁用促动器的错误(#1838)。
版本 3.2.0 (2024 年 7 月 15 日)#
新特性#
通用#
破坏性 API 变更
移除了已弃用的
mj_makeEmptyFileVFS
和mj_findFileVFS
函数。常数mjMAXVFS
和mjMAXVFSNAME
也已移除,因为它们不再需要。迁移:使用 mj_addBufferVFS 直接将缓冲区复制到 VFS 文件中。
调用 mj_defaultVFS 可能会在 VFS 内部分配内存,必须调用相应的 mj_deleteVFS 来释放任何内部分配的内存。
已弃用
mju_rotVecMat
和mju_rotVecMatT
,推荐使用 mju_mulMatVec3 和 mju_mulMatTVec3。这些函数名和参数顺序与 API 的其余部分更一致。旧函数已从 Python 绑定中移除,并将在下一个版本中从 C API 中移除。从促动器插件中移除了
actuator_actdim
回调。它们现在具有actdim
属性,必须与将状态写入act
数组的促动器一起使用。这修复了在具有有状态促动器插件的模型中使用关键帧时发生的崩溃。提供错误的 actdim 值时,PID 插件将报错。
添加了对正交相机(orthographic cameras)的支持。固定相机和自由相机均可使用此功能,分别通过 camera/orthographic 和 global/orthographic 属性设置。
添加了 maxhullvert,网格凸包中的最大顶点数。
添加了 mj_setKeyframe,用于将当前状态保存到模型关键帧中。
在 URDF 解析器中添加了对
ball
关节的支持(URDF 中的“spherical”)。将之前硬编码在 mjtnum.h 中的
mjUSEDOUBLE
替换为编译时标志mjUSESINGLE
。如果未定义此符号,MuJoCo 将像往常一样使用双精度浮点数。如果定义了mjUSESINGLE
,MuJoCo 将使用单精度浮点数。参见 mjtNum。相关地,修复了阻止使用单精度构建的各种类型错误。
mjData.qpos
和mjData.mocap_quat
中的四元数不再由 mj_kinematics 原地归一化。而是在使用时进行归一化。在第一步之后,mjData.qpos
中的四元数将被归一化。编译器中的网格加载通常是加载过程中最慢的部分,现在已改为多线程。
MJX#
添加了对 椭圆摩擦锥 的支持。
修复了导致某些困难约束设置的线搜索解不够最优的错误。
修复了牛顿求解器中有时导致梯度不够最优的错误。
Simulate(仿真)#
添加了改进的教程视频。
改进了布朗噪声生成器。
如果模型加载时间超过 0.25 秒,现在会显示加载时间。
Python 绑定#
修复了对
mujoco.MjData
实例使用copy.deepcopy()
时造成的内存泄漏(#1572)。
Bug 修复#
版本 3.1.6 (2024 年 6 月 3 日)#
通用#
MJX#
Bug 修复#
修复了启用 fusestatic 时可能导致碰撞被忽略的错误,这在使用 URDF 导入时经常发生。修复了 #1069、#1577。
修复了导致 SDF 迭代可视化写入超出存储它们的向量大小的错误。修复了 #1539。
版本 3.1.5 (2024 年 5 月 7 日)#
通用#
在 MuJoCo 编译器中启用了内部缓存,从而加快了重新编译速度。目前,已处理的纹理、高度场和 OBJ 网格会被缓存。尚未支持 Unity 环境。
添加了
mjModel.mesh_scale
:应用于资产顶点的缩放比例,由 scale 属性指定。添加了原生渲染器忽略但可供外部渲染器使用的视觉属性
light/bulbradius 属性及对应的
mjModel.light_bulbradius
字段。material/metallic 属性及对应的
mjModel.material_metallic
字段。material/roughness 属性及对应的
mjModel.material_roughness
字段。
mj_stackAllocNum 和 mj_stackAllocInt 的
size
参数类型从int
更改为size_t
。在 flexcomp 中添加了对 gmsh 格式版本 2.2 表面网格的支持。
MJX#
破坏性 API 变更
移除了已弃用的
mjx.device_get_into
和mjx.device_put
函数,因为它们缺少关键的新功能。迁移:请使用
mjx.get_data_into
代替mjx.device_get_into
,使用mjx.put_data
代替mjx.device_put
。
添加了圆柱体平面碰撞。
向
mjx.Data
添加了efc_type
,向mjx.Contact
添加了dim
和efc_address
。向
mjx.Contact
添加了geom
,并将geom1
和geom2
标记为已弃用。向
mjx.Data
添加了ne
、nf
、nl
、nefc
和ncon
,以匹配mujoco.MjData
。根据上面添加的字段,移除了
mjx.get_params
、mjx.ncon
和mjx.count_constraints
。更改了设备上网格的组织方式,以加快当一个网格被复制用于许多几何体时的碰撞检测。
修复了在宽阶段碰撞检测中胶囊体可能被忽略的错误。
使用 SDF 添加了圆柱体碰撞。
添加了对所有 condim 的支持:1、3、4、6。
添加了对
id2name
和name2id
的支持函数,它们是 mj_id2name 和 mj_name2id 的 MJX 版本。添加了对 gravcomp 和 actuatorgravcomp 的支持。
修复了
mjx.ray
中射线-网格测试有时允许负距离的错误。添加了一个新的 可微分物理教程,演示了如何使用从 MJX 物理步骤自动导出的解析梯度来训练运动策略。由 @Andrew-Luo1 贡献。
Bug 修复#
灯光的默认值没有被保存,现已修复。
在保存 XML 时,防止主体名称覆盖框架名称。此 Bug 在 3.1.4 中引入。
修复了 mj_saveModel 的 Python 绑定中的错误:
buffer
参数在文档中标记为可选,但实际上并非可选。修复了阻止内存分配大于 2.15 GB 的错误。修复了 #1606。
版本 3.1.4 (2024 年 4 月 10 日)#
通用#
破坏性 API 变更
移除了原生向传感器添加噪声的功能。请注意,
mjModel.sensor_noise
字段和 相应的属性 得以保留,现在作为用户保存标准差信息的便捷位置供其自行使用。移除此功能是因为没有机制为随机噪声生成器设置种子。
它不是线程安全的,即使提供了种子,在多个线程上采样也会导致不可重现的结果。
此功能被视为引擎的越权行为。添加噪声应由用户负责。
我们不知道有人实际使用此功能。
迁移:请自行向传感器值添加噪声。
添加了 actuatorgravcomp 关节属性。启用此属性后,关节上的重力补偿力将被视为由促动器施加。详细信息请参阅属性文档。演示机械臂笛卡尔促动器的示例模型 refsite.xml 已更新为使用此属性。
添加了对 gmsh 格式 2.2、四面体网格的支持,该网格例如由 fTetwild 生成。
添加了 mju_euler2Quat,用于将欧拉角序列转换为四元数。
MJX#
改进了凸碰撞的 SAT 性能。
修复了球体/胶囊体-凸体深度穿透的错误。
修复了
mjx.put_data
生成的mjx.Data
的 treedef 与mjx.make_data
不同的错误。对于凸网格碰撞的 margin/gap,抛出错误,因为尚不支持。
添加了椭球体平面碰撞。
添加了对 userdata 的支持。
使用有符号距离函数(SDF)添加了椭球体-椭球体和椭球体-胶囊体碰撞。
Simulate(仿真)#
修复了启用标志字符串顺序中的错误。在此更改之前,使用 Simulate UI 切换 invdiscrete 或(现已移除的)
sensornoise
标志实际上会切换另一个标志。
Python 绑定#
版本 3.1.3 (2024 年 3 月 5 日)#
通用#
向 位置 和 积分速度 促动器添加了 inheritrange 属性,可以方便地根据传动目标(关节或肌腱)的范围设置促动器的 ctrlrange 或 actrange(分别)。详细信息请参阅 position/inheritrange。
已弃用
mj_makeEmptyFileVFS
,推荐使用 mj_addBufferVFS。mjVFS 现在计算其内部文件缓冲区的校验和。mj_addBufferVFS 在 mjVFS 中分配一个具有给定名称的空缓冲区,并将数据缓冲区复制到其中,合并并替换了已弃用的分两步过程:先调用mj_makeEmptyFileVFS
,然后直接复制到给定的 mjVFS 内部文件缓冲区。添加了 mj_angmomMat,用于计算
3 x nv
角动量矩阵 \(H(q)\),提供了从广义速度到子树角动量 \(h = H \dot q\) 的线性映射。由 @v-r-a 贡献。
MJX#
提高了获取和放置设备数据的性能。
使用
tobytes()
进行 numpy 数组序列化,这比转换为元组快几个数量级。当数组形状未更改时,避免重新分配主机
mjData
数组。加快了包含大量几何体的模型中
mjx.ncon
的计算速度。当
nc
可以从mjx.Data
中推导出来时,避免在mjx.get_data_into
中调用mjx.ncon
。
修复了阻止
mjx-viewer
运行的错误。更新了mjx-viewer
以使用更新的mjx.get_data_into
函数调用。修复了
mjx.euler
中在使用密集质量矩阵时应用错误阻尼的错误。修复了
mjx.solve
中在使用 mjtSolver 中的mjSOL_NEWTON
时导致收敛缓慢的错误。向
mjx.Model
添加了对 mjOption.impratio 的支持。添加了对
mjx.Model
和mjx.Data
中相机的支持。修复了 #1422。添加了使用 top_k 和边界球体的宽阶段实现。
Python 绑定#
修复了
mjContact
结构体的geom
、vert
、elem
和flex
数组成员以及mjrContext
结构体的所有数组成员绑定中不正确的数据类型。
版本 3.1.2 (2024 年 2 月 5 日)#
通用#
改进了 discardvisual 编译器标志,该标志现在会丢弃所有仅用于可视化的资产。详细信息请参阅 discardvisual。
移除了用于中阶段碰撞检测的 计时器,现在已并入窄阶段计时器。这是因为单独计时这两个阶段需要在碰撞函数内部使用细粒度计时器;这些函数非常小且快速,以至于计时器本身会产生可测量的成本。
向
visual/global
添加了标志 bvactive,允许用户关闭活动边界体积的可视化(此 更新日志项 中的红/绿框)。对于具有非常高分辨率网格的模型,此可视化所需的计算可能会降低仿真速度。修复了 #1279。在 visual/rgba 中添加了 包围体 和 活动包围体 的颜色。
MJX#
添加了 dyntype
filterexact
。添加了 site 传输。
更新了 MJX colab 教程,使其包含更稳定的四足机器人环境。
添加了
mjx.ray
,它镜像了用于平面、球体、胶囊体、盒子和网格的 mj_ray。添加了镜像 mj_isSparse 的
mjx.is_sparse
和镜像 mj_fullM 的mjx.full_m
。添加了通过 jacobian: [dense, sparse, auto], “auto” 指定稀疏或密集质量矩阵的支持。
当存在非零摩擦损失时,抛出“未实现”错误。修复了 #1344。
Python 绑定#
改进了 rollout 模块的实现。请注意以下更改是破坏性的,依赖代码需要修改。
使用 mjSTATE_FULLPHYSICS 作为状态规范,通过检查时间来启用散度检测。
允许用户为 用户输入 字段的任何组合作为控制指定用户定义的控制规范。
输出不再被压缩,并且始终具有 dim=3。
错误修复#
修复了在 flex 不在 worldbody 中时阻止将 pin 与插件一起使用的错误。修复了 #1270。
修复了 muscle model 中的一个错误,该错误导致长度范围下限之外的值非零。修复了 #1342。
版本 3.1.1(2023 年 12 月 18 日)#
错误修复#
版本 3.1.0(2023 年 12 月 12 日)#
通用#
通过使用线搜索和新的优化目标函数,改进了带符号距离函数 (SDF) 碰撞的收敛性。这减少了寻找接触点所需的初始点数量,并且对于非常小或非常大的 geom 尺寸更加鲁棒。
在 position 和 intvelocity 促动器中添加了 kv 属性,用于指定促动器应用的阻尼。这可用于实现参考速度为 0 的 PD 控制器。使用此属性时,建议使用 implicitfast 或 implicit integrators。
插件#
MJX#
在 MJX 中添加了
site_xpos
和site_xmat
。添加了
put_data
、put_model
、get_data
以替换将被弃用的device_put
和device_get_into
。这些新函数可以正确转换中间计算(如efc_J
)的结果字段。
错误修复#
修复了可移动参考站点(refsite)的笛卡尔坐标促动问题,例如在四足机器人上使用以主体为中心的笛卡尔坐标促动器时。在此修复之前,此类促动器可能导致动量不守恒。
修复了阻止将 flex 与 simulate 一起使用的错误。
修复了阻止弹性插件与固定 flex 顶点一起使用的错误。
发布针对 macOS 10.16 的 Python wheels,以支持设置了
SYSTEM_VERSION_COMPAT
的 x86_64 系统。最低支持版本仍为 11.0,但我们发布这些 wheels 以修复这些用户的兼容性问题。请参见 #1213。修复了网格的质量计算:使用正确的网格体积,而不是使用惯性框来近似。
版本 3.0.1(2023 年 11 月 15 日)#
通用#
在 mjData 中添加了
mjData.qfrc_passive
中总被动力场的子项:qfrc_{spring, damper, gravcomp, fluid}
。这些向量的总和等于qfrc_passive
。
添加了 actuatorgroupdisable 属性和关联的 mjOption.disableactuator 整数位字段,可用于在运行时根据其 group 禁用促动器集。修复了 #1092。请参见 Group disable。
将
mjMAXUIITEM
(Simulate 中每个部分的 UI 元素最大数量)增加到 200。
MJX#
添加了对牛顿解算器(mjtSolver 中的
mjSOL_NEWTON
)的支持。牛顿解算器显著加快了 GPU 上的模拟速度每秒步数,A100 上的共轭梯度法对比牛顿法# 模型
共轭梯度法 (CG)
牛顿法
加速比
640,000
1,020,000
1.6 倍
1,290,000
1,750,000
1.35 倍
215,000
270,000
1.25 倍
人型机器人是标准的 MuJoCo 人型机器人,Google Barkour 和 Shadow Hand 都可在 MuJoCo Menagerie 中获得。
添加了对关节等式约束(mjtEq 中的
mjEQ_JOINT
)的支持。修复了混合
jnt_limited
关节约束不正确的错误。使
device_put
类型验证更详细(修复了 #1113)。对于没有限制的关节,从
MJX
中移除了空的 EFC 行(修复了 #1117)。修复了
scan.body_tree
中的错误,该错误导致某些运动学树布局的平滑动力学不正确。
Python 绑定#
修复了 macOS
mjpython
启动器,使其可与 Apple 命令行工具中的 Python 解释器一起使用。修复了在使用插件的模型复制
mujoco.MjData
实例时发生的崩溃。在MjData
中引入了model
属性,该属性是对用于创建该MjData
实例的模型的引用。
模拟#
simulate:正确处理“暂停更新”、“全屏”和“垂直同步”按钮。
文档#
错误修复#
修复了与使用 torquescale 修改的焊接相关的错误。
版本 3.0.0(2023 年 10 月 18 日)#
新功能#
通过新的 MuJoCo XLA (MJX) (MJX) Python 模块添加了在 GPU 和 TPU 上的模拟。Python 用户现在可以在 Google TPU 或其自己的加速器硬件上以每秒数百万步的速度原生运行 MuJoCo 模拟。
MJX 旨在与设备上的强化学习算法配合使用。此 Colab notebook 演示了如何结合强化学习使用 MJX 训练人形机器人和四足机器人进行运动:
MJX API 与 MuJoCo 兼容,但在此版本中缺少一些功能。有关更多详细信息,请参见 MJX 功能对等性 的概述。
添加了新的带符号距离场 (SDF) 碰撞原语。SDF 可以采用任何形状,并且不限于凸形状。碰撞点通过梯度下降最小化两个碰撞 SDF 的最大值来找到。
添加了新的 SDF 插件,用于定义隐式几何体。该插件必须定义计算查询点处 SDF 及其梯度的函数。有关更多详细信息,请参见文档。
添加了新的低级模型元素
flex
,用于定义可变形对象。这些 单纯复形 可以是维度 1、2 或 3,分别对应于可拉伸的线、三角形或四面体。使用两个新的 MJCF 元素来定义 flex。顶层的 deformable 部分包含低级 flex 定义。flexcomp 元素类似于 composite,是一个创建可变形对象的便利宏,支持 GMSH 四面体文件格式。添加了 shell 被动力场插件,使用恒定的预计算 Hessian(余切算子)计算弯曲力。
注意:此功能仍在开发中,可能会发生变化。特别是,可变形对象功能目前可通过 deformable 和 composite 使用,并且两者都可以由第一方弹性插件修改。我们预计未来其中一些功能会得到统一。
添加了使用 mj_island 的约束孤岛发现。约束孤岛是不交互的约束和自由度的不相交集合。目前唯一支持孤岛的解算器是 CG。可以使用新的 enable flag 激活孤岛发现。如果启用了孤岛发现,geom、接触和肌腱将根据相应的孤岛着色,参见视频。目前对于具有可变形对象的模型(参见上一项)禁用了孤岛发现。
添加了 mjThreadPool 和 mjTask,允许在 MuJoCo 引擎管道中进行多线程操作。如果启用了引擎内部线程,以下操作将进行多线程处理
引擎内部线程正在进行中,目前仅在第一方代码中通过 testspeed 实用程序(使用
npoolthread
标志公开)可用。
通用#
破坏性 API 变更
移除了宏
mjMARKSTACK
和mjFREESTACK
。迁移:这些宏已被新函数 mj_markStack 和 mj_freeStack 取代。这些函数以完全封装的方式管理 mjData 栈(即,不会在调用点引入局部变量)。
将
mj_stackAlloc
重命名为 mj_stackAllocNum。新函数 mj_stackAllocByte 分配任意数量的字节,并包含一个附加参数来指定返回指针的对齐方式。迁移:分配
mjtNum
数组的功能现在通过 mj_stackAllocNum 提供。将 mjModel 和 mjData 中的
nstack
字段重命名为narena
。将narena
、pstack
和maxuse_stack
更改为计数字节数,而不是 mjtNum 的数量。更改了 mjData.solver,该数组用于收集解算器诊断信息。这个 mjSolverStat 结构数组现在长度为
mjNISLAND * mjNSOLVER
,被解释为一个矩阵。长度为mjNSOLVER
的每一行包含每个约束孤岛的独立解算器统计信息。如果解算器不使用孤岛,则仅填充第 0 行。新常量 mjNISLAND 设置为 20。
mjNSOLVER 从 1000 减少到 200。
添加了 mjData.solver_nisland:解算器运行的孤岛数量。
将
mjData.solver_iter
重命名为solver_niter
。此成员和mjData.solver_nnz
现在都是长度为mjNISLAND
的整数向量。
删除了
mjOption.collision
和相关的option/collision
属性。迁移
对于具有
<option collision="all"/>
的模型,删除该属性。对于具有
<option collision="dynamic"/>
的模型,删除所有 pair 元素。对于具有
<option collision="predefined"/>
的模型,首先删除模型中所有 contype 和 conaffinity 属性,然后通过以下方式将其全局设置为0
来禁用所有动态碰撞(通过 contype/conaffinity 确定):
<default> <geom contype="0" conaffinity="0"/> </default>
.
删除了 rope 和 cloth 复合对象。
迁移:用户应使用 cable 和 shell 弹性插件。
添加了 mjData.eq_active 用户输入变量,用于启用/禁用等式约束的状态。将
mjModel.eq_active
重命名为 mjModel.eq_active0,该属性现在表示“mjData.eq_active
的初始值”。修复了 #876。迁移:将对
mjModel.eq_active
的使用替换为mjData.eq_active
。将 autolimits 的默认值从“false”更改为“true”。这是一个小的破坏性更改。潜在的破坏适用于定义了“range”但未设置“limited”属性的元素。此类模型自版本 2.2.2(2022 年 7 月)起无法加载。
添加了新的 dyntype,
filterexact
,它使用精确公式而不是欧拉积分更新一阶滤波器状态。添加了一个促动器属性 actearly,它对促动器力使用半隐式积分:使用下一步的促动器状态计算当前促动器力。
将上一版本中引入的
actuatorforcerange
和actuatorforcelimited
分别重命名为 actuatorfrcrange 和 actuatorfrclimited。添加了标志 invdiscrete,它为除
RK4
之外的所有 integrators 启用离散时间逆动力学。有关更多详细信息,请参见标志文档。添加了 ls_iterations 和 ls_tolerance 选项,用于调整 CG 和 Newton 解算器中的线搜索停止标准。这对于性能调优非常有用。
在 mjModel 中添加了
mesh_pos
和mesh_quat
字段,用于存储应用于网格资产的归一化变换。修复了 #409。添加了相机 resolution 属性和 camprojection 传感器。如果相机分辨率设置为正值,相机投影传感器将报告目标站点在相机图像上的投影位置,使用像素坐标。
添加了 camera 校准属性
新属性包括 resolution、focal、focalpixel、principal、principalpixel 和 sensorsize。
使用 mjVIS_CAMERA 可视化标志在指定这些属性时可视化校准的视锥体。请参见以下示例模型。
请注意,这些属性仅对离线渲染有效,不影响交互式可视化。
实现了反转 Z 渲染以获得更好的深度精度。添加了枚举 mjtDepthMap,其值为
mjDEPTH_ZERONEAR
和mjDEPTH_ZEROFAR
,可用于设置 mjrContext 中的新readDepthMap
属性,以控制 mjr_readPixels 返回的深度如何从znear
映射到zfar
。贡献 #978 由 Levi Burner 提供。删除了代码示例
testxml
。此实用程序提供的功能已在 WriteReadCompare 测试中实现。删除了代码示例
derivative
。功能由 mjd_transitionFD 提供。
Python 绑定#
模拟#
在 simulate 和托管的 Python viewer 中添加了状态历史机制。可以通过拖动历史滑块(更精确地)使用左右箭头键查看状态历史。参见屏幕截图
LOADING...
标签现在正确显示。贡献 #1070 由 Levi Burner 提供。
文档#
错误修复#
修复了在构建中间阶段碰撞树时导致 geom margin 被忽略的错误。
修复了为焊接等式约束生成
efc_diagApprox
中错误值的错误。
版本 2.3.7(2023 年 7 月 20 日)#
通用#
为球体-圆柱体接触添加了原始碰撞器,以前这对使用通用的凸体-凸体碰撞器。
添加了 joint-actuatorforcerange 用于夹紧关节处的总促动器力,以及 sensor-jointactuatorfrc 用于测量施加在关节上的总促动力。关节级促动器力夹紧最重要的用例是确保 Cartesian actuator 力可通过关节处的单个电机实现。详见 Force limits。
为地形、纹理和网格资源添加了可选的
content_type
属性。此属性支持格式化的 Media Type(以前称为 MIME 类型)字符串,用于确定资源文件的类型,而无需依赖于文件扩展名。添加了 mjv_connector,其功能与
mjv_makeConnector
相同,但具有更方便的“from-to”参数化。mjv_makeConnector
现已弃用。将支持的最旧 MacOS 版本从 10.12 升级到 11。MacOS 11 是 Apple 仍在维护的最旧版本。
Python 绑定#
模型#
添加了简单的汽车示例模型。
版本 2.3.6(2023 年 6 月 20 日)#
注意
MuJoCo 2.3.6 是正式支持 Python 3.7 的最后一个版本。
模型#
错误修复#
修复了在体积无效时导致网格包围盒和坐标系计算不正确的错误。在这种情况下,如果 shellinertia 等于
true
,MuJoCo 现在才接受非封闭几何体。修复了用于计算肌腱阻尼和流体力的导数的稀疏雅可比乘法逻辑,该逻辑影响了 implicit 和 implicitfast 积分器的行为。
修复了 mj_ray,使其与 geom 可视化约定一致
平面和地形场尊重
geom_group
和flg_static
参数。在此更改之前,射线会无条件地与平面和地形场相交。flg_static
现在适用于所有静态 geom,而不仅仅是那些直接属于世界体的 geom。
插件#
添加了触控网格传感器插件。有关详细信息,请参见文档,以及相关的touch_grid.xml示例模型。该插件包括场景内可视化。
模拟#
在 simulate UI 中添加了可视化选项卡,对应于 visual MJCF 元素的成员。在 GUI 中修改值后,保存的 XML 将包含新值。mjStatistic 中可修改的成员(extent、meansize 和 center)由编译器计算,因此没有默认值。为了使这些属性出现在保存的 XML 中,必须在加载的 XML 中指定一个值。

增加了默认间距中 UI 元素的文本宽度。[之前/之后]
通用#
添加了 mj_getState 和 mj_setState 函数,用于获取和设置模拟状态,将其表示为浮点数的连接向量。详情请参见 状态 部分。
添加了 mjContact.solreffriction,允许在使用 elliptic friction cones 时,对接触的法向轴和摩擦轴使用不同的 solref 参数。此属性对于弹性摩擦碰撞是必需的,参见相关的示例模型,模拟弹性橡胶球的旋转反冲行为。这是一个高级选项,目前仅由显式 接触对 支持,使用 solreffriction 属性。
添加了 mjd_inverseFD,用于有限差分逆动力学导数。
添加了用于处理带宽稠密“箭头”矩阵的函数。这种矩阵在进行直接轨迹优化时很常见。详情请参见 mju_cholFactorBand 文档。
添加了 mj_multiRay 函数,用于与从单点发出的多条射线相交。这比多次调用 mj_ray 快得多。
现在,射线-网格碰撞速度提高了多达 10 倍,使用了网格面的包围体层级结构。
将
mjMAXUIITEM
(Simulate 中每个部分的 UI 元素最大数量)增加到 100。添加了资源提供程序的文档。
更改了 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} \]
为肌肉促动器添加了可选的 tausmooth 属性。当其值为正时,肌肉激活/去激活的时间常数 \(\tau\) 使用 mju_sigmoid 在 Millard 等人 (2013) 肌肉模型给出的两个极值之间以宽度为 tausmooth 的范围内平滑过渡。更多详情请参见 Muscle actuators。与此相关,mju_muscleDynamics 现在接受 3 个参数而不是 2 个,新增了平滑宽度参数。
将公共 C 宏定义从 mujoco.h 移至名为 mjmacro.h 的新公共头文件中。新文件包含在 mujoco.h 中,因此此更改不会破坏现有用户代码。
为 地址清理器 (ASAN) 和 内存清理器 (MSAN) 添加了检测内存错误的插桩,这些错误可能在使用
mjData
栈和竞技场分配内存时发生。从
mj_printData
的输出中移除了pstack
和parena
,因为这些是mjData
分配器的实现细节,受检测构建中的诊断填充影响。删除了
mj_activate
和mj_deactivate
函数。这些函数是为了与 MuJoCo 闭源时的旧用户代码兼容而保留的,但自开源以来一直是空操作函数。
版本 2.3.5(2023 年 4 月 25 日)#
错误修复#
修复了当使用 mjVFS 时阻止从磁盘读取 OBJ 和 PNG 文件的资源加载错误。
修复了在 Python 被动查看器中应用鼠标扰动时 macOS 上偶尔出现的段错误。
插件#
版本 2.3.4(2023 年 4 月 20 日)#
注意
此版本受到资源加载错误的影响,当使用 mjVFS
时,会阻止从磁盘读取 OBJ 和 PNG 文件。建议用户跳过此版本,直接使用版本 2.3.5。
通用#
删除了 compiler/coordinate 属性的“全局”设置。此很少使用的设置使编译器逻辑复杂化并阻止了未来的改进。为了转换使用此选项的旧模型,请在 MuJoCo 2.3.3 或更早版本中加载并保存它们。

添加了 visual-global 标志 ellipsoidinertia,以使用椭球而不是默认的盒子可视化等效的物体惯性。
在 mjData 中添加了中相和宽相碰撞统计信息。
添加了 引擎插件 的文档。
在
introspect
模块中添加了结构体信息。添加了一种名为 资源提供程序 的新扩展机制。这种可扩展机制允许 MuJoCo 从本地操作系统文件系统或 虚拟文件系统 以外的数据源读取资源。
Python 绑定#
macOS 上的离屏渲染不再限制在主线程。这是通过使用低级 Core OpenGL (CGL) API 创建 OpenGL 上下文实现的,而不是通过依赖 Cocoa 的 NSOpenGL 的 GLFW。由此产生的上下文不绑定到 Cocoa 窗口,因此也不绑定到主线程。
修复了
viewer.launch_passive
和viewer.launch_repl
中的竞态条件。这些函数之前可能在内部调用mj_forward
之前返回。这允许用户代码继续执行,并可能与内部mj_forward
同时修改物理状态,导致例如MuJoCo 栈溢出错误或段错误。viewer.launch_passive
函数现在返回一个句柄,可用于与查看器交互。被动查看器现在还需要对其句柄进行显式调用sync
以获取对物理状态的任何更新。这是为了避免可能导致视觉伪影的竞态条件。详情请参见文档。由于其功能已被
launch_passive
取代,viewer.launch_repl
函数已被移除。添加了少量通过新
introspect
元数据发现的缺失结构体字段。
错误修复#
修复了新 implicitfast 积分器中椭球体流体模型力处理中的错误。
移除了 mj_copyData 中不必要的整个竞技场复制,这会显著降低复制操作的速度。
- 使 shellinertia 忽略
exactmeshinertia
,后者 仅用于旧版体积计算(#759)。
- 使 shellinertia 忽略
版本 2.3.3(2023 年 3 月 20 日)#
通用#
改进了隐式积分
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 |

添加了碰撞中相,用于在体对中修剪 geom,更多详细信息请参见文档。这基于体惯性系中的静态 AABB 包围体层次结构(BVH 二叉树)。右侧的 GIF 截自此较长视频。
除非明确请求,否则
mjd_transitionFD
函数不再触发传感器计算。纠正了 mjLROpt 结构体中
inteval
属性的拼写为interval
。网格纹理和法线映射现在是每个三角形 3 个,而不是每个顶点 1 个。网格顶点不再像以前那样被重复以规避此限制。
稀疏约束雅可比矩阵的非零元素现在已预先计数并用于矩阵内存分配。例如,来自 humanoid100 模型的约束雅可比矩阵以前需要约 500,000 个
mjtNum
,现在只需要约 6000 个。现在可以使用 CG 解算器加载和运行非常大的模型。修改了 mju_error 和 mju_warning,使其成为可变参数函数(支持类似 printf 的参数)。函数 mju_error_i、mju_error_s、mju_warning_i 和 mju_warning_s 现已弃用。
实现了一个高性能的
mju_sqrMatTDSparse
函数,该函数不需要密集内存分配。添加了
mj_stackAllocInt
,以获取在 mjData 栈上分配 int 的正确大小。减少了 10% - 15% 的栈内存使用。
Python 绑定#
修复了使用
viewer.launch_repl
时发生的 IPython 历史记录损坏问题。launch_repl
函数现在提供了 IPython 交互式 shell 会话的无缝延续,并且不再被视为实验性功能。添加了
viewer.launch_passive
,它以被动、非阻塞模式启动交互式查看器。对launch_passive
的调用会立即返回,允许用户代码继续执行,查看器会自动反映物理状态的任何更改。(请注意,此功能目前处于实验/测试阶段,尚未在我们的查看器文档中描述。)添加了 macOS 的
mjpython
启动器,这是viewer.launch_passive
在该系统上运行所必需的。从关节索引器中移除了
efc_
字段。自引入竞技场内存以来,这些字段的动态大小会根据活动约束的数量在时间步之间发生变化,从而破坏了关节和efc_
行之间的严格对应关系。在
mjVisual
和mjvPerturb
结构体的绑定中添加了许多缺失的字段。
模拟#
实现了 macOS 上 损坏的垂直同步 的解决方法,以便在启用垂直同步切换时帧率能够正确限制。

添加了接触可视化的可选标签,指示哪两个几何体正在接触(如果定义了名称则显示名称,否则显示 ID)。这在杂乱的场景中非常有用。
版本 2.3.2(2023 年 2 月 7 日)#
通用#
已实现性能更高的 mju_transposeSparse 函数,无需密集内存分配。对于来自 humanoid100.xml 模型中的约束雅可比矩阵,此函数速度提升 35%。
函数 mj_name2id 现在使用哈希函数而非线性搜索实现,以提高性能。
Geom 名称现在从 URDF 中解析。任何重复名称都将被忽略。
mj_printData
输出现在包含接触的 geom 名称。
Bug 修复#
修复了一个 bug:对于 shellinertia 等于
true
的情况,网格方向会被壳惯量的主要成分覆盖,而顶点坐标却使用体积惯量旋转。现在,在壳体情况下也使用体积惯量方向。修复了使用边界框拟合选项 fitaabb 时,网格到原始体拟合中的未对齐 bug。

Python 查看器中的
launch_repl
功能已修复。在
mjd_transitionFD
中正确设置time
,以支持时间相关的用户代码。修复了存在
user
类型传感器时,传感器数据维度验证的 bug。修复了在模型编译期间遇到空的
nsensordata
回调时,插件错误消息不正确的 bug。在
mj_fwdConstraint
提前返回时,正确结束计时器 (TM_END
)。修复了
mj_deleteFileVFS
中的无限循环 bug。
模拟#
将 simulate 传感器图 y 轴精度增加 1 位 (#719)。
除非正在可视化惯量,否则身体标签现在绘制在身体框架而不是惯量框架处。
插件#
reset
回调现在接收实例特定的plugin_state
和plugin_data
作为参数,而不是整个mjData
。由于reset
是在调用任何物理前向传递之前在mj_resetData
内部调用的,因此在此阶段读取mjData
中的任何内容都是错误的。将
mjpPlugin
中的capabilities
字段重命名为capabilityflags
,以更清楚地表明这是一个位字段。
版本 2.3.1(2022 年 12 月 6 日)#
Python 绑定#
现在可以通过
mujoco
Python 包将simulate
GUI 作为mujoco.viewer
提供。详细信息请参阅文档。(由 Levi Burner 贡献)MuJoCo 教程 Colab 中的
Renderer
类现在可直接在原生 Python 绑定中使用。
通用#
肌腱 springlength 属性现在可以接受两个值。给定两个非递减值,springlength 指定弹簧刚度的死区范围。如果肌腱长度在这两个值之间,则力为 0。如果长度超出此范围,则力的行为类似于常规弹簧,弹簧静止长度对应于最近的 springlength 值。这可用于创建由弹簧而非约束强制执行限制的肌腱,这更便宜且更容易分析。请参阅 tendon_springlength.xml 示例模型。
注意
这是一个轻微的 API 破坏性变更。
mjModel.tendon_lengthspring
的大小现在是ntendon x 2
,而不是ntendon x 1
。删除了无状态执行器必须在有状态执行器之前的要求。
添加了 mju_fill、mju_symmetrize 和 mju_eye 实用函数。
为 body 添加了 gravcomp 属性,实现了重力补偿和浮力。请参阅 balloons.xml 示例模型。
将
cable
插件库重命名为elasticity
。为 general actuators 添加了 actdim 属性。值大于 1 仅允许用于 dyntype user,因为原生激活动力学都是标量。向 engine_forward_test.cc 添加了实现二阶激活动力学的示例测试。
改进了粒子 composite 类型,现在允许用户指定几何体和多个关节。请参阅两个新示例:particle_free.xml 和 particle_free2d.xml。
非 AVX 配置的性能改进
使用 restrict 使
mj_solveLD
速度提升 14%。请参阅 engine_core_smooth_benchmark_test。使用手动循环展开使
mju_dotSparse
速度提升 50%。请参阅 engine_util_sparse_benchmark_test。
添加新的固态被动力插件
这是一个与 composite 粒子兼容的新力场。
生成四面体网格,其粒子质量集中在顶点。
使用分段常应变模型,该模型等同于有限元,但以无坐标公式表示。这意味着除了边缘伸长之外,所有量都可以预先计算,就像在质量-弹簧模型中一样。
仅适用于小应变(大位移但小变形)。四面体在大载荷下可能会倒转。
添加了 API 函数
mj_loadPluginLibrary
和mj_loadAllPluginLibraries
。第一个函数与 POSIX 系统上的dlopen
以及 Windows 上的LoadLibraryA
相同。第二个函数扫描指定目录以查找所有动态库文件并加载找到的每个库。这些函数打开的动态库在加载时被假定注册一个或多个 MuJoCo 插件。向插件添加了一个可选的
visualize
回调,该回调在mjv_updateScene
期间调用。此回调允许自定义插件可视化。例如,启用 Cable 插件的应力可视化。user 类型的传感器不再需要 objtype、objname 和 needstage。如果未指定,objtype 现在是 mjOBJ_UNKNOWN。
user
传感器 datatype 默认值现在是 “real”,needstage 默认值现在是 “acc”。添加了在 URDF 导入中对胶囊体的支持。
在 macOS 上,在 Apple Silicon 机器上通过 Rosetta 2 翻译运行时,会发出信息性错误消息。预构建的 MuJoCo 二进制文件在 x86-64 机器上使用 AVX 指令,而 Rosetta 2 不支持此指令。(在此版本之前,用户只会收到神秘的“非法指令”消息。)
Bug 修复#
修复了
mj_addFileVFS
中导致文件路径被忽略的 bug(在 2.1.4 中引入)。
模拟#
将
simulate
应用程序搜索插件的目录从plugin
重命名为mujoco_plugin
。鼠标力扰动现在应用于选择点,而不是身体质心。
版本 2.3.0(2022 年 10 月 18 日)#
通用#
mjData
中的contact
数组和以efc_
为前缀的数组已从buffer
移至新的arena
内存空间。创建mjData
时,这些数组不再分配固定大小的内存。相反,每次调用 mj_forward 时(具体来说,在 mj_collision 和 mj_makeConstraint 中)都会确定精确的内存需求,并从arena
空间分配数组。stack
现在也与其可用内存共享arena
。此更改减少了不使用 PGS 求解器的模型中mjData
的内存占用,并且将来会允许显著减少内存。详细信息请参阅内存分配部分。添加了 colab notebook 教程,展示如何使用线性二次调节器在一条腿上平衡人形机器人。该 notebook 使用 MuJoCo 的原生 Python 绑定,并包含一个草稿
Renderer
类,方便在 Python 中进行渲染。
自己动手试试:人形机器人模型更新:- 添加了两个关键帧(单腿站立和蹲下)。- 增加了最大髋部屈曲角度。- 添加了在髋部高度屈曲角度时连接髋部和膝盖的腿筋。- 一般美观性改进,包括改进的默认设置使用和更好的命名方案。
添加了 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 分解后收敛,与问题大小无关。
添加了 mju_mulVecMatVec,用于将一个方阵 \(M\) 与向量 \(x\) 和 \(y\) 两侧相乘。该函数返回 \(x^TMy\)。
添加了新的插件 API。插件允许开发人员在不修改核心引擎代码的情况下扩展 MuJoCo 的功能。插件机制旨在取代现有的回调,尽管这些回调仍将作为简单用例和向后兼容性的选项保留一段时间。新机制管理有状态插件,并支持来自不同来源的多个插件,允许以模块化方式引入 MuJoCo 扩展,而不是作为全局覆盖。请注意,新机制目前除了代码之外没有文档记录,因为我们正在内部测试它。如果您有兴趣使用插件机制,请先与我们联系。
添加了 assetdir 编译器选项,它设置了 meshdir 和 texturedir 的值。后两个属性中的值优先于 assetdir。
添加了 visual 的 realtime 选项,用于以较慢的速度开始模拟。
添加了新的 cable 复合类型
电缆元件通过球关节连接。
参数 initial 指定起始边界处的关节:free、ball 或 none。
边界体暴露的名称为 B_last 和 B_first。
顶点初始位置可以直接在 XML 中通过参数 vertex 指定。
主体框架的方向是曲线材料框架的方向。
添加了新的 cable 被动力插件
可以使用参数 twist 和 bend 分别设置扭转和弯曲刚度。
无应力配置可以通过标志 flat 设置为初始配置或平面配置。
新的 cable.xml 示例展示了缠绕的形成。
新的 coil.xml 示例展示了弯曲的平衡配置。
新的 belt.xml 示例展示了扭转和各向异性之间的相互作用。
添加了使用悬臂梁精确解的测试。
Python 绑定#
为 named accessor 对象添加了
id
和name
属性。这提供了更符合 Python 习惯的 API 访问mj_name2id
和mj_id2name
。MjData.contact
的长度现在是ncon
,而不是nconmax
,这使得它无需检查ncon
即可直接用作迭代器。修复了当 Python 可调用对象安装为回调函数时发生的内存泄漏 (#527)。
版本 2.2.2(2022 年 9 月 7 日)#
通用#
添加了 adhesion actuators,模拟真空夹具和生物粘附附属肢体。
添加了相关的示例模型和视频
添加了 mj_jacSubtreeCom,用于计算子树质心的平移雅可比矩阵。
为 weld 约束添加了 torquescale 和 anchor 属性。torquescale 设置约束施加的扭矩与力的比值,anchor 设置应用焊接扭力矩的点。有关更多详细信息,请参阅 weld。
将
mjNEQDATA
,即mjModel.eq_data
中相等约束参数的行长度,从 7 增加到 11。添加了 connect 和 weld 约束的锚点可视化(在
simulate
中通过 'N' 键激活)。添加了 weld.xml,展示了新焊接属性的不同用法。
通过为带有 site 传动的执行器添加参考站点,现在可以实现笛卡尔 6D 末端执行器控制。请参阅 actuator 文档中新 refsite 属性的描述以及 refsite.xml 示例模型。
添加了 autolimits 编译器选项。如果设置为
true
,则关节和肌腱的 limited 属性以及执行器的 ctrllimited、forcelimited 和 actlimited 属性将自动设置为true
(如果定义了相应的范围),否则设置为false
。如果
autolimits="false"
(默认值),则定义了 range 属性但未指定 limited 属性的模型将编译失败。未来的版本将把 autolimits 的默认值更改为true
,此编译错误允许用户捕获未来的行为更改。注意
这是一个破坏性更改。在定义了范围但未指定 limited 的模型中,明确将 limited 设置为
false
或删除范围以保持模型当前的行为。添加了所有格式良好的网格的惯性矩计算。此选项通过将编译器标志 exactmeshinertia 设置为
true
来激活(默认为false
)。此默认值将来可能会更改。为 geom 添加了参数 shellinertia,用于将推断的惯量定位在边界(壳)上。目前仅支持网格。
对于从中推断体积惯量的网格,如果网格面的方向不一致,则会引发错误。如果发生这种情况,请使用 MeshLab 或 Blender 等工具修复网格。
添加了悬挂肌腱的悬链线可视化。视频中显示的模型可在此处找到。
为 visual/global 添加了
azimuth
和elevation
属性,定义了模型加载时自由相机的初始方向。添加了
mjv_defaultFreeCamera
,它设置了默认的自由相机,尊重上述属性。simulate
现在支持通过文件部分的按钮或Ctrl-P
截屏。改进了 simulate 中的时间同步,特别是如果实际实时系数与请求的系数不同(例如,如果时间步长太小,模拟无法跟上实时),则报告实际实时系数。
添加了传感器的禁用标志。
mju_mulQuat 和 mju_mulQuatAxis 支持原地计算。例如
mju_mulQuat(a, a, b);
将四元数a
设置为a
和b
的乘积。向
mjd_transitionFD
添加了传感器矩阵(请注意这是一个 API 更改)。
已删除/已弃用功能#
删除了
distance
约束。
Bug 修复#
修复了反射中某些透明几何体的渲染。
修复了
intvelocity
默认值解析。
版本 2.2.1(2022 年 7 月 18 日)#
通用#
添加了
mjd_transitionFD
,用于计算状态转移矩阵和控制转移矩阵的高效有限差分近似,详细信息请参阅此处。添加了椭球体流体模型的导数。
为 keyframes 添加了
ctrl
属性。添加了
clock
传感器,用于测量时间。为皮肤添加了可视化组。
为
free
和ball
关节以及带有site
传动的执行器添加了执行器可视化。添加了执行器激活的可视化。
添加了
<actuator-intvelocity>
执行器快捷方式,用于“集成速度”执行器,此处记录了该快捷方式。添加了
<actuator-damper>
执行器快捷方式,用于主动阻尼执行器,此处记录了该快捷方式。mju_rotVecMat
和mju_rotVecMatT
现在支持原地乘法。mjData.ctrl
值不再原地限制,不受引擎影响。mjData 的缓冲区中的数组现在对齐到 64 字节边界,而不是 8 字节。
在构建时使用 Address Sanitizer (ASAN) 和 Memory Sanitizer (MSAN) 添加了内存中毒。这使得 ASAN 可以检测对
mjModel.buffer
和mjData.buffer
中不在数组内的区域的读写,并且 MSAN 可以检测mj_resetData
后对mjData
中未初始化字段的读取。添加了一个连杆机构示例模型。
Bug 修复#
对方向指定器进行更严格的解析。在此更改之前,如果指定包含
quat
和替代指定器,例如<geom ... quat=".1 .2 .3 .4" euler="10 20 30">
,则会忽略quat
并且仅使用euler
。在此更改之后,将抛出解析错误。对 XML 属性进行更严格的解析。在此更改之前,错误的 XML 片段,如
<geom size="1/2 3 4">
,会被解析为size="1 0 0"
,并且不会抛出错误。现在会抛出错误。尝试通过 XML 加载
NaN
,例如<geom size="1 NaN 4">
,虽然允许用于调试目的,但现在会打印警告。修复了
mj_loadModel
中的空指针解引用 bug。修复了从 MJB 加载无效模型时发生的内存泄漏。
计算
mjModel
缓冲区大小时避免整数溢出。为
mjWARN_BADCTRL
添加了缺失的警告字符串。
打包#
更改了 MacOS 打包方式,以便嵌入在
MuJoCo.app
中的mujoco.framework
副本可用于外部构建应用程序。
版本 2.2.0(2022 年 5 月 23 日)#
开源#
通用#
添加了平滑(无约束)动力学力关于速度的解析导数
由递归牛顿-欧拉算法计算的向心力和科里奥利力。
阻尼和流体阻力被动力。
执行力。
添加了
implicit
积分器。使用上述解析导数,添加了一个新的速度隐式积分器。该积分器在稳定性和计算成本方面介于欧拉积分器和龙格-库塔积分器之间。它对于使用流体阻力(例如用于飞行或游泳)的模型以及使用速度执行器的模型最有用。有关更多详细信息,请参阅数值积分部分。为通用执行器添加了 actlimited 和 actrange 属性,用于限制执行器内部状态(激活)。此限制对于集成速度执行器非常有用,详细信息请参阅激活限制部分。
mjData
字段qfrc_unc
(无约束力)和qacc_unc
(无约束加速度)已分别重命名为qfrc_smooth
和qacc_smooth
。虽然“无约束”很精确,“平滑”比“unc”更容易理解。公共头文件已从
/include
移动到/include/mujoco/
,这与大多数其他开源项目的目录结构一致。鼓励开发人员通过#include <mujoco/filename.h>
在自己的代码库中包含 MuJoCo 公共头文件。由shadowsize属性指定的默认阴影分辨率从 1024 增加到 4096。
保存的 XML 现在使用 2 个空格缩进。
Bug 修复#
分割渲染的抗锯齿已禁用。在此更改之前,如果 offsamples 属性大于 0(默认值为 4),则与多个几何体重叠的像素将接收平均分割 ID,导致 ID 不正确或不存在。在此更改之后,分割渲染期间将忽略 offsamples。
实验性 multiCCD 功能的启用标志的值已与其他启用标志按顺序排列。顺序性在
simulate
UI 和其他地方被假定。修复了使用 mj_saveLastXML 保存带有 OBJ 网格的模型时网格重复的问题。
版本 2.1.5(2022 年 4 月 13 日)#
通用#
添加了一个实验性功能:多接触凸碰撞检测,通过启用标志激活。请参阅此处的完整描述。
Bug 修复#
Linux 上的 GLAD 初始化逻辑现在调用
dlopen
来加载 GL 平台动态库,如果进程的全局符号表中尚不存在*GetProcAddress
函数。特别是,使用 GLFW 设置渲染上下文但未明确链接libGLX.so
的进程(例如 Python 解释器)现在可以正常工作,而不是在调用mjr_makeContext
时因gladLoadGL
错误而失败。在 Python 绑定中,用于标量字段(例如执行器的
ctrl
字段)的命名索引器现在返回形状为(1,)
的 NumPy 数组,而不是()
。这使得为这些字段赋值更简单直观。
版本 2.1.4(2022 年 4 月 4 日)#
通用#
MuJoCo 现在使用 GLAD 管理 OpenGL API 访问,而不是 GLEW。在 Linux 上,不再需要根据是使用 GLX、EGL 还是 OSMesa 来链接不同的 GL 处理库。相反,用户只需使用 GLX、EGL 或 OSMesa 创建 GL 上下文,
mjr_makeContext
将检测正在使用哪一个。添加了接触框架的可视化。这在编写或修改碰撞函数时非常有用,此时接触的 x 轴和 y 轴的实际方向可能很重要。
二进制构建#
Linux 和 Windows 上不再提供
_nogl
动态库。切换到 GLAD 后,我们可以在调用mjr_makeContext
时解析 OpenGL 符号,而不是在加载库时。因此,MuJoCo 库不再对 OpenGL 有明确的动态依赖,并且可以在没有 OpenGL 的系统上使用。
模拟#
修复了 simulate 中的一个 bug,即在未加载模型时按下“[”或“]”会导致崩溃。
接触框架可视化已添加到 Simulate GUI 中。
将“set key”、“reset to key”分别重命名为“save key”和“load key”。
更改了 F6 和 F7 的绑定,从不太有用的“垂直同步”和“忙等待”更改为更有用的帧和标签循环。
Bug 修复#
mj_resetData
将solver_nnz
字段归零。删除了
mju_quat2mat
中针对单位四元数的特殊分支。之前,如果四元数的实部等于 1.0,mju_quat2mat
会跳过所有计算。对于非常小的角度(例如在有限差分时),余弦在双精度下可能精确评估为 1.0,而正弦仍为非零。
版本 2.1.3(2022 年 3 月 23 日)#
通用#
simulate
现在支持循环切换相机(使用[
和]
键)。mjVIS_STATIC
切换所有静态主体,而不仅仅是世界的直接子项。
Python 绑定#
为
MjrContext
添加了free()
方法。枚举现在支持与数字进行算术和按位运算。
Bug 修复#
修复了 2.1.2 中引入的平面渲染 bug。这破坏了 dm_control 中的迷宫环境。
版本 2.1.2(2022 年 3 月 15 日)#
新模块#
API 变更#
将
mjtNum
浮点类型的定义移至新的头文件 mjtnum.h。将头文件 mujoco_export.h 重命名为 mjexport.h。
添加了
mj_printFormattedData
,它接受浮点数的格式字符串,例如增加精度。
通用#
MuJoCo 可以加载 OBJ 网格文件。
不支持包含顶点数大于 4 的多边形的网格。
在包含多个对象组的 OBJ 文件中,第一个组之后的所有组都将被忽略。
添加了(发布后,不包含在 2.1.2 存档中)纹理化的马克杯示例模型
为 framepos、framequat、framexaxis、frameyaxis、framezaxis、framelinvel 和 frameangvel 传感器添加了可选的参考框架规范。参考框架通过新的 reftype 和 refname 属性指定。
用户参数的大小现在自动推断。
顶级 size 子句中用户参数的声明(例如 nuser_body, nuser_jnt 等)现在接受值 -1,这是默认值。这将自动将值设置为模型中定义的关联 user 属性的最大长度。
设置小于 -1 的值将导致编译器错误(之前是段错误)。
设置的值小于模型中定义的某个 user 属性的长度将导致错误(之前忽略了附加值)。
将 mjvScene 中的最大光源数量从 8 增加到 100。
保存的 XML 文件仅在原始 XML 中包含显式的inertial元素时才包含它们。编译器inertiafromgeom机制自动推断的惯量保持未指定状态。
用户选择的几何体总是渲染为不透明的。这在交互式可视化器中很有用。
静态几何体现在遵守其几何体组进行可视化。在此更改之前,静态几何体的渲染只能通过mjVIS_STATIC可视化标志来切换。在此更改之后,需要同时启用几何体组和可视化标志才能渲染几何体。
mujoco.h 中函数声明中的指针参数,如果代表固定长度数组,现在拼写为具有范围的数组,例如
mjtNum quat[4]
而不是mjtNum* quat
。从 C 和 C++ 的角度来看,这是一个非更改,因为函数签名中的数组类型会衰减为指针类型。但是,这允许自动生成的代码知道预期的输入形状。实验性无状态流体交互模型。如此处所述,流体阻力使用根据身体惯量计算的大小。虽然有时很方便,但这很少是好的近似。在新模型中,力作用于几何体而非身体,并有几个用户可设置的参数。该模型通过设置一个新属性来激活:
<geom fluidshape="ellipsoid"/>
。参数的简要描述在此处,但模型的完整描述及其参数留待此功能脱离实验状态后再提供。
Bug 修复#
mj_loadXML
和mj_saveLastXML
现在与区域设置无关。Unity 插件现在应该对使用逗号作为小数分隔符的用户正常工作。VFS 中的 XML 资产不再需要以空字符结尾。相反,文件大小由相应的 VFS 条目的 size 参数决定。
修复了使用皮肤时
mjrContext
中的顶点缓冲区对象内存泄漏。相机四元数现在在 XML 编译期间标准化。
二进制构建#
Windows 二进制文件现在使用 Clang 构建。
版本 2.1.1(2021 年 12 月 16 日)#
API 变更#
添加了
mj_printFormattedModel
,它接受浮点数的格式字符串,例如增加精度。添加了
mj_versionString
,它返回表示 MuJoCo 二进制版本的易读字符串。将私有 API 结构体定义中开头的下划线转换为末尾的下划线,以符合保留标识符指令,请参阅C 标准:第 7.1.3 节。
注意
这是一个轻微的破坏性更改。引用私有实例的代码将中断。要修复,请将开头的下划线替换为末尾的下划线,例如
_mjModel
→mjModel_
。
通用#
更安全的字符串处理:将
strcat
、strcpy
和sprintf
替换为strncat
、strncpy
和snprintf
。更改了缩进从 4 个空格到 2 个空格,K&R 大括号风格,为单行条件语句添加了大括号。
Bug 修复#
修复了 PGS 求解器中从未初始化内存读取的 bug。
计算出的胶囊惯量现在是精确的。在此更改之前,编译器的 inertiafromgeom 机制计算的胶囊质量和惯量近似为圆柱体,该圆柱体由胶囊的圆柱中间部分形成,两端延伸半个胶囊半径。现在,胶囊惯量使用平行轴定理计算,应用于两个半球形端盖。
注意
这是一个轻微的破坏性更改。具有自动计算的胶囊惯量的模型的模拟将具有数值差异,导致例如黄金值测试失败。
修复了与 force 和 torque 传感器相关的 bug。在此更改之前,F/T 传感器报告的力矩忽略了树外约束力矩,但接触产生的力矩除外。现在,力矩传感器正确地考虑了 connect 和 weld 约束的影响。
注意
位于运动树之外(即在没有祖先关系的身体之间)的空间肌腱产生的力仍然不被力矩传感器考虑。这仍然是未来的工作项。
代码示例#
testspeed
: 添加了伪随机控制噪声注入,默认开启。这是为了避免陷入固定的接触配置,从而提供不切实际的计时测量。simulate
:添加了慢于实时功能,通过“+”和“-”键控制。
添加了滑动条,用于向控制器注入布朗噪声。
添加了“打印相机”按钮,用于打印带有当前相机姿态的 MJCF 子句。
重新加载同一个模型文件时,相机姿态不会重置。
更新依赖#
TinyXML
已被TinyXML2
6.2.0 替换。qhull
已升级到 8.0.2 版本。libCCD
已升级到 1.4 版本。在 Linux 上,
libstdc++
已被libc++
替换。
二进制构建#
MacOS 打包。我们现在提供原生支持 Apple Silicon 和 Intel CPU 的 Universal 二进制文件。
MuJoCo 库现在被打包成一个框架包 (Framework Bundle),使其更容易集成到 Xcode 项目(包括 Swift 项目)中。鼓励开发人员使用
-framework mujoco
标志编译和链接 MuJoCo,但所有头文件和libmujoco.2.1.1.dylib
库仍可直接在框架内部访问。示例应用程序现在被打包成一个名为
MuJoCo.app
的应用程序包。通过 GUI 启动时,该包会启动simulate
可执行文件。其他预编译的示例程序也随该包一起分发(在MuJoCo.app/Contents/MacOS
中),可以通过命令行启动。二进制文件已签名,磁盘映像已公证。
Windows 二进制文件和库已签名。
Linux 和 macOS 上启用了链接时优化 (LTO),在三个测试模型(
cloth.xml
、humanoid.xml
和humanoid100.xml
)上基准测试时,平均速度提高了约 20%。Linux 二进制文件现在使用 LLVM/Clang 构建,而不是 GCC。
还提供了 AArch64(即 ARM64)Linux 构建。
私有符号不再从 Linux 和 MacOS 上的共享库中剥离。
示例模型#
清理
model/
目录。重新组织到包含所有依赖项的子目录中。
在 XML 注释中添加了描述,清理了 XML。
删除了一些复合模型:
grid1
、grid1pin
、grid2
、softcylinder
、softellipsoid
。
在
docs/images/models/
中添加了描述性动画
版本 2.1.0(2021 年 10 月 18 日)#
新功能#
关键帧现在具有
mocap_pos
和mocap_quat
字段(XML 中的 mpos 和 quat 属性),允许将 mocap 姿态存储在关键帧中。新的实用函数:
mju_insertionSortInt
(整数插入排序)和mju_sigmoid
(从两个半二次函数构造 Sigmoid)。
通用#
虚拟文件系统 (VFS) 中的预分配大小增加到 2000 和 1000,以便支持更大的项目。
mjuiItem
联合中的 C 结构体现在被命名,以实现兼容性。修复:
mjcb_contactfilter
类型是mjfConFilt
(之前是mjfGeneric
)。修复:
mjCModel
中的传感器数组未被清除。清理了跨平台代码(内部更改,通过 API 不可见)。
修复了 XML
texcoord
数据解析中的一个 bug(与顶点数量有关)。修复了 simulate.cc 中与
nkey
(关键帧数量)相关的 bug。在存在大量非碰撞几何体(
contype==0 and conaffinity==0
)时加速了碰撞检测。
UI#
图表选择类型从
int
更改为float
。启用选择和高亮时,图表现在显示数据坐标。
将
mjMAXUIMULTI
更改为 35,mjMAXUITEXT
更改为 300,mjMAXUIRECT
更改为 25。添加了可折叠子部分,实现为带有状态的分隔符:
mjSEPCLOSED
折叠,mjSEPCLOSED+1
展开。添加了
mjITEM_RADIOLINE
项目类型。添加了函数
mjui_addToSection
,用于简化 UI 部分构建。为
mjvFigure
添加了子图标题。
渲染#
render_gl2
防止轴范围计算中的非有限浮点数据。render_gl2
从后往前绘制线条,以便更好地显示。添加了函数
mjr_label
(用于文本标签)。如果
ngeom==0
,mjr_render
会立即退出,以避免未初始化场景(例如frustrum==0
)导致的错误。在
mjr_render
中添加了裁剪框,因此我们不会在每一帧清除整个窗口。
许可证管理器#
移除了整个许可证管理器。函数
mj_activate
和mj_deactivate
仍然存在以实现向后兼容性,但现在它们什么都不做,并且不再需要调用它们。移除了远程许可证证书函数
mj_certXXX
。
更早版本#
更早版本的更新日志请参阅 roboti.us。