mujoco-mojo 2.3.4__tar.gz → 2.3.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (392) hide show
  1. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/.pre-commit-config.yaml +6 -0
  2. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/PKG-INFO +2 -1
  3. mujoco_mojo-2.3.5/docs/user-guides/pose-context.md +57 -0
  4. mujoco_mojo-2.3.5/docs/user-guides/pose_context_example.py +65 -0
  5. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/mkdocs.yml +16 -14
  6. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/pyproject.toml +1 -0
  7. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/__init__.py +7 -1
  8. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/__init__.py +4 -0
  9. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco.py +27 -2
  10. mujoco_mojo-2.3.5/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tactile.py +18 -0
  11. mujoco_mojo-2.3.5/src/mujoco_mojo/mjcf/pose_context.py +134 -0
  12. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/runtime/__init__.py +4 -0
  13. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/runtime/load.py +262 -21
  14. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/runtime/runtime_manager.py +14 -2
  15. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_chart.html +6 -6
  16. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_header.html +6 -6
  17. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_media_player.html +6 -7
  18. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_series_panel.html +8 -6
  19. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/trial-viewer.js +18 -2
  20. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/trial-viewer.ts +39 -17
  21. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/proximity.py +67 -8
  22. mujoco_mojo-2.3.5/tests/mjcf/pose_graph_test.py +239 -0
  23. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/runtime/loads_test.py +372 -1
  24. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/utils/proximity_test.py +171 -0
  25. mujoco_mojo-2.3.4/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tactile.py +0 -18
  26. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/.gitattributes +0 -0
  27. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/.github/workflows/docs.yml +0 -0
  28. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/.github/workflows/release.yml +0 -0
  29. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/.gitignore +0 -0
  30. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/.python-version +0 -0
  31. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/.vscode/settings.json +0 -0
  32. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/LICENSE +0 -0
  33. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/README.md +0 -0
  34. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/TODO.md +0 -0
  35. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/about.md +0 -0
  36. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/dark-hero-logo.png +0 -0
  37. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/dark-hero-logo.svg +0 -0
  38. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/dark-logo.svg +0 -0
  39. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/light-hero-logo.svg +0 -0
  40. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/light-logo.svg +0 -0
  41. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/logo.svg +0 -0
  42. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/mesh/bunny_original.jpg +0 -0
  43. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/mesh/bunny_with_coacd.jpg +0 -0
  44. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/mesh/bunny_without_coacd.jpg +0 -0
  45. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/mesh/frustums.jpg +0 -0
  46. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/mesh/proximity/convex_hull_wireframe.jpg +0 -0
  47. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/mesh/proximity/real_wireframe.jpg +0 -0
  48. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/mesh/with_coacd.jpg +0 -0
  49. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/mesh/without_coacd.jpg +0 -0
  50. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/user-guides/dark-export-options.jpg +0 -0
  51. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/user-guides/dark-monitor-view.jpg +0 -0
  52. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/user-guides/dark-mosaic-view.jpg +0 -0
  53. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/user-guides/dark-notes-editor.jpg +0 -0
  54. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/user-guides/dark-plot-editor.jpg +0 -0
  55. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/user-guides/dark-selector-bar.jpg +0 -0
  56. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/user-guides/dark-shapes-editor.jpg +0 -0
  57. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/user-guides/generate-result.jpg +0 -0
  58. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/user-guides/light-export-options.jpg +0 -0
  59. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/user-guides/light-monitor-view.jpg +0 -0
  60. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/user-guides/light-mosaic-view.jpg +0 -0
  61. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/user-guides/light-notes-editor.jpg +0 -0
  62. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/user-guides/light-plot-editor.jpg +0 -0
  63. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/user-guides/light-selector-bar.jpg +0 -0
  64. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/user-guides/light-shapes-editor.jpg +0 -0
  65. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/assets/user-guides/runtime-anim.gif +0 -0
  66. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/index.md +0 -0
  67. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/javascripts/favicon-switcher.js +0 -0
  68. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/javascripts/mojo-highlighter.js +0 -0
  69. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/javascripts/tablesort.js +0 -0
  70. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/stylesheets/extra.css +0 -0
  71. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/user-guides/MOJO_RUNTIME_REPORT.md +0 -0
  72. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/user-guides/dojo.md +0 -0
  73. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/user-guides/generate-script.md +0 -0
  74. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/user-guides/getting-started.md +0 -0
  75. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/user-guides/init.md +0 -0
  76. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/user-guides/monitor.md +0 -0
  77. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/user-guides/monte_carlo_example.py +0 -0
  78. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/user-guides/mosaic.md +0 -0
  79. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/user-guides/optimization.md +0 -0
  80. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/user-guides/optimization_example.py +0 -0
  81. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/user-guides/reloaded.md +0 -0
  82. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/user-guides/running-jobs.md +0 -0
  83. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/docs/user-guides/runtime-script.md +0 -0
  84. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/examples/boxes_and_springs_monte_carlo.py +0 -0
  85. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/examples/boxes_and_springs_optimization.py +0 -0
  86. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/examples/tennis_racket_theorem.py +0 -0
  87. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/requirements.txt +0 -0
  88. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/scripts/copy_docs_examples_to_examples.py +0 -0
  89. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/scripts/fix_smart_quotes.py +0 -0
  90. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/scripts/gen_ref_pages.py +0 -0
  91. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/scripts/gen_ts_models.py +0 -0
  92. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/scripts/templating/filestomake.txt +0 -0
  93. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/scripts/templating/make_sensors.py +0 -0
  94. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/scripts/templating/sensor_template.py +0 -0
  95. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/__about__.py +0 -0
  96. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/base.py +0 -0
  97. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/meta.py +0 -0
  98. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mj_state.py +0 -0
  99. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/defaults.py +0 -0
  100. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/dependency_path.py +0 -0
  101. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/extension.py +0 -0
  102. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/meta/__init__.py +0 -0
  103. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/meta/frame.py +0 -0
  104. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/meta/include.py +0 -0
  105. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/meta/replicate.py +0 -0
  106. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/__init__.py +0 -0
  107. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/actuator.py +0 -0
  108. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/__init__.py +0 -0
  109. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/adhesion.py +0 -0
  110. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/base.py +0 -0
  111. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/cylinder.py +0 -0
  112. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/damper.py +0 -0
  113. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/dcmotor.py +0 -0
  114. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/general.py +0 -0
  115. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/intvelocity.py +0 -0
  116. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/motor.py +0 -0
  117. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/muscle.py +0 -0
  118. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/plugin.py +0 -0
  119. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/position.py +0 -0
  120. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/velocity.py +0 -0
  121. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/asset.py +0 -0
  122. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/__init__.py +0 -0
  123. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/hfield.py +0 -0
  124. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/material.py +0 -0
  125. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/material_attr/__init__.py +0 -0
  126. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/material_attr/layer.py +0 -0
  127. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/mesh.py +0 -0
  128. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/model.py +0 -0
  129. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/texture.py +0 -0
  130. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/body.py +0 -0
  131. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/__init__.py +0 -0
  132. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/attach.py +0 -0
  133. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/camera.py +0 -0
  134. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite.py +0 -0
  135. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/__init__.py +0 -0
  136. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/geom.py +0 -0
  137. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/joint.py +0 -0
  138. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/site.py +0 -0
  139. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/skin.py +0 -0
  140. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp.py +0 -0
  141. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/__init__.py +0 -0
  142. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/contact.py +0 -0
  143. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/edge.py +0 -0
  144. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/elasticity.py +0 -0
  145. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/pin.py +0 -0
  146. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/free_joint.py +0 -0
  147. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/geom.py +0 -0
  148. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/inertial.py +0 -0
  149. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/joint.py +0 -0
  150. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/light.py +0 -0
  151. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/plugin.py +0 -0
  152. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/site.py +0 -0
  153. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/compiler.py +0 -0
  154. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/compiler_attr/__init__.py +0 -0
  155. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/compiler_attr/lengthrange.py +0 -0
  156. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/contact.py +0 -0
  157. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/contact_attr/__init__.py +0 -0
  158. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/contact_attr/exclude.py +0 -0
  159. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/contact_attr/pair.py +0 -0
  160. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/deformable.py +0 -0
  161. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/__init__.py +0 -0
  162. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex.py +0 -0
  163. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex_attr/__init__.py +0 -0
  164. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex_attr/contact.py +0 -0
  165. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex_attr/edge.py +0 -0
  166. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex_attr/elasticity.py +0 -0
  167. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/skin.py +0 -0
  168. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/skin_attr/__init__.py +0 -0
  169. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/skin_attr/bone.py +0 -0
  170. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/equality.py +0 -0
  171. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/__init__.py +0 -0
  172. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/connect.py +0 -0
  173. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/equality_base.py +0 -0
  174. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/flex.py +0 -0
  175. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/flexstrain.py +0 -0
  176. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/flexvert.py +0 -0
  177. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/joint.py +0 -0
  178. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/tendon.py +0 -0
  179. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/weld.py +0 -0
  180. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/keyframe.py +0 -0
  181. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/keyframe_attr/__init__.py +0 -0
  182. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/keyframe_attr/key.py +0 -0
  183. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/option.py +0 -0
  184. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/option_attr/__init__.py +0 -0
  185. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/option_attr/flag.py +0 -0
  186. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor.py +0 -0
  187. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/__init__.py +0 -0
  188. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/accelerometer.py +0 -0
  189. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/actuatorfrc.py +0 -0
  190. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/actuatorpos.py +0 -0
  191. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/actuatorvel.py +0 -0
  192. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/ballangvel.py +0 -0
  193. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/ballquat.py +0 -0
  194. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/base.py +0 -0
  195. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/base_collision.py +0 -0
  196. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/camprojection.py +0 -0
  197. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/clock.py +0 -0
  198. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/contact.py +0 -0
  199. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/distance.py +0 -0
  200. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/e_kinetic.py +0 -0
  201. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/e_potential.py +0 -0
  202. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/force.py +0 -0
  203. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/frameangacc.py +0 -0
  204. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/frameangvel.py +0 -0
  205. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framelinacc.py +0 -0
  206. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framelinvel.py +0 -0
  207. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framepos.py +0 -0
  208. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framequat.py +0 -0
  209. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framexaxis.py +0 -0
  210. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/frameyaxis.py +0 -0
  211. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framezaxis.py +0 -0
  212. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/fromto.py +0 -0
  213. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/gyro.py +0 -0
  214. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/insidesite.py +0 -0
  215. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointactuatorfrc.py +0 -0
  216. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointlimitfrc.py +0 -0
  217. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointlimitpos.py +0 -0
  218. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointlimitvel.py +0 -0
  219. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointpos.py +0 -0
  220. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointvel.py +0 -0
  221. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/magnetometer.py +0 -0
  222. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/normal.py +0 -0
  223. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/plugin.py +0 -0
  224. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/rangefinder.py +0 -0
  225. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/subtreeangmom.py +0 -0
  226. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/subtreecom.py +0 -0
  227. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/subtreelinvel.py +0 -0
  228. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonactuatorfrc.py +0 -0
  229. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonlimitfrc.py +0 -0
  230. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonlimitpos.py +0 -0
  231. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonlimitvel.py +0 -0
  232. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonpos.py +0 -0
  233. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonvel.py +0 -0
  234. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/torque.py +0 -0
  235. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/touch.py +0 -0
  236. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/user.py +0 -0
  237. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/velocimeter.py +0 -0
  238. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/size.py +0 -0
  239. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/statistic.py +0 -0
  240. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/tendon.py +0 -0
  241. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/__init__.py +0 -0
  242. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/fixed.py +0 -0
  243. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/fixed_attr/__init__.py +0 -0
  244. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/fixed_attr/joint.py +0 -0
  245. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial.py +0 -0
  246. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial_attr/__init__.py +0 -0
  247. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial_attr/geom.py +0 -0
  248. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial_attr/pulley.py +0 -0
  249. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial_attr/site.py +0 -0
  250. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/tendon_base.py +0 -0
  251. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/visual.py +0 -0
  252. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/__init__.py +0 -0
  253. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/global_.py +0 -0
  254. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/headlight.py +0 -0
  255. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/map.py +0 -0
  256. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/quality.py +0 -0
  257. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/rgba.py +0 -0
  258. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/scale.py +0 -0
  259. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/orientation.py +0 -0
  260. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/plugin.py +0 -0
  261. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/pose.py +0 -0
  262. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/position.py +0 -0
  263. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mjcf/xml_model.py +0 -0
  264. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/mojo_model.py +0 -0
  265. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/runtime/signal_manager.py +0 -0
  266. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/runtime/video_recorder.py +0 -0
  267. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/settings.py +0 -0
  268. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/stochas/__init__.py +0 -0
  269. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/templates/__init__.py +0 -0
  270. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/templates/monte_carlo.py +0 -0
  271. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/templates/optimization.py +0 -0
  272. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/templates/reloaded.sh +0 -0
  273. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/templates/run_mc.sh +0 -0
  274. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/templates/run_opt.sh +0 -0
  275. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/typing.py +0 -0
  276. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/__init__.py +0 -0
  277. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/color.py +0 -0
  278. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/dataframe.py +0 -0
  279. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/defaults.py +0 -0
  280. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/filters/__init__.py +0 -0
  281. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/filters/filters.py +0 -0
  282. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/interp.py +0 -0
  283. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/__init__.py +0 -0
  284. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/cli.py +0 -0
  285. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/__init__.py +0 -0
  286. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/lab_executor.py +0 -0
  287. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/main.py +0 -0
  288. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/plot_config.py +0 -0
  289. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/routers/__init__.py +0 -0
  290. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/routers/monitor.py +0 -0
  291. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/routers/morph.py +0 -0
  292. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/routers/mosaic.py +0 -0
  293. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/routers/sensai.py +0 -0
  294. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/sensai/__init__.py +0 -0
  295. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/sensai/agent.py +0 -0
  296. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/shared.py +0 -0
  297. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/__init__.py +0 -0
  298. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/base.html +0 -0
  299. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/error.html +0 -0
  300. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/monitor.html +0 -0
  301. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/morph.html +0 -0
  302. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/mosaic.html +0 -0
  303. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/partials/_sensai.html +0 -0
  304. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_json_editor.html +0 -0
  305. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_lab_trigger.html +0 -0
  306. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_macros.html +0 -0
  307. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_overlays.html +0 -0
  308. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_signal_lab.html +0 -0
  309. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_trial_status.html +0 -0
  310. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/__init__.py +0 -0
  311. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/chime.mp3 +0 -0
  312. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/dark-logo.svg +0 -0
  313. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/__init__.py +0 -0
  314. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/main.js +0 -0
  315. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/monitor.js +0 -0
  316. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/mosaic.js +0 -0
  317. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/sensai.js +0 -0
  318. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/toast.d.ts +0 -0
  319. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/toast.d.ts.map +0 -0
  320. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/toast.js +0 -0
  321. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/light-logo.svg +0 -0
  322. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/main.css +0 -0
  323. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/build.mjs +0 -0
  324. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/package-lock.json +0 -0
  325. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/package.json +0 -0
  326. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/cm-bundle.ts +0 -0
  327. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/lib/format.ts +0 -0
  328. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/lib/options.ts +0 -0
  329. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/lib/plot-config.generated.ts +0 -0
  330. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/lib/toast.ts +0 -0
  331. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/models.ts +0 -0
  332. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/monitor.ts +0 -0
  333. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/mosaic.ts +0 -0
  334. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/sensai.ts +0 -0
  335. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/store.ts +0 -0
  336. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/types/global.d.ts +0 -0
  337. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/tsconfig.json +0 -0
  338. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/__init__.py +0 -0
  339. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/alpine.min.js +0 -0
  340. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/codemirror.bundle.js +0 -0
  341. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/confetti.browser.min.js +0 -0
  342. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/iro.min.js +0 -0
  343. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/litegraph.min.css +0 -0
  344. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/litegraph.min.js +0 -0
  345. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/lz-string.min.js +0 -0
  346. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/plotly-3.4.0.min.js +0 -0
  347. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/tailwind.min.js +0 -0
  348. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/dojo/templates/trial_viewer.html +0 -0
  349. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/layers/reloaded.py +0 -0
  350. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/log.py +0 -0
  351. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/proximity_mixin.py +0 -0
  352. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/runner.py +0 -0
  353. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/statusing.py +0 -0
  354. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/utils/utils.py +0 -0
  355. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/src/mujoco_mojo/visualization.py +0 -0
  356. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/.gitignore +0 -0
  357. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/make_skybox.py +0 -0
  358. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/meshes/ball.stl +0 -0
  359. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/meshes/bunny2.stl +0 -0
  360. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/meshes/cup.stl +0 -0
  361. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/mjcf/body_test.py +0 -0
  362. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/mjcf/equality_test.py +0 -0
  363. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/mjcf/inertial_test.py +0 -0
  364. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/mjcf/joint_test.py +0 -0
  365. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/mjcf/mesh.py +0 -0
  366. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/mjcf/mujoco_test.py +0 -0
  367. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/mjcf/orientation_test.py +0 -0
  368. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/mjcf/pos_test.py +0 -0
  369. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/mjcf/pose_test.py +0 -0
  370. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/mjcf/site_test.py +0 -0
  371. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/mjcf/visualization_test.py +0 -0
  372. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/mjcf/xml_model_test.py +0 -0
  373. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/model_with_skybox.xml +0 -0
  374. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/monte_carlo_test/asset_image.png +0 -0
  375. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/monte_carlo_test/monte_carlo.py +0 -0
  376. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/monte_carlo_test/overrides.json +0 -0
  377. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/monte_carlo_test/running_with_slurm.sh +0 -0
  378. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/runtime/conftest.py +0 -0
  379. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/runtime/mojo_model_test.py +0 -0
  380. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/runtime/monte_carlo_bumper.py +0 -0
  381. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/runtime/optimizer_bumper.py +0 -0
  382. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/runtime/runtime_manager_test.py +0 -0
  383. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/runtime/settings_test.py +0 -0
  384. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/runtime/signal_manager_test.py +0 -0
  385. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/smoke_test.py +0 -0
  386. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/test_writer.py +0 -0
  387. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/utils/color_test.py +0 -0
  388. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/utils/dataframe_test.py +0 -0
  389. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/utils/filter_test.py +0 -0
  390. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/utils/interp_test.py +0 -0
  391. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/tests/utils/utils_test.py +0 -0
  392. {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.5}/uv.lock +0 -0
@@ -46,6 +46,12 @@ repos:
46
46
  rev: v1.1.408
47
47
  hooks:
48
48
  - id: pyright
49
+ - id: pyright
50
+ name: Pyright (docs examples)
51
+ args: [docs/user-guides]
52
+ pass_filenames: false
53
+ always_run: true
54
+ stages: [pre-commit]
49
55
  - repo: local
50
56
  hooks:
51
57
  - id: act-test
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mujoco-mojo
3
- Version: 2.3.4
3
+ Version: 2.3.5
4
4
  Summary: A complete MJCF lifecycle and trial orchestration suite for MuJoCo, powered by Pydantic v2.
5
5
  Project-URL: Homepage, https://github.com/Hydrowelder/mujoco-mojo
6
6
  Project-URL: Documentation, https://hydrowelder.github.io/mujoco-mojo/
@@ -45,6 +45,7 @@ Requires-Dist: pybind11-stubgen>=2.5.5
45
45
  Requires-Dist: pydantic-settings>=2.14.1
46
46
  Requires-Dist: pydantic>=2.12.5
47
47
  Requires-Dist: python-fcl>=0.7.0.11
48
+ Requires-Dist: pytransform3d>=3.15.0
48
49
  Requires-Dist: rich>=14.3.3
49
50
  Requires-Dist: rtree>=1.4.1
50
51
  Requires-Dist: scipy-stubs[scipy]>=1.17.0.2
@@ -0,0 +1,57 @@
1
+ # Pose Context
2
+
3
+ !!! abstract
4
+ MJCF poses are always relative to a parent body. **Pose Context** lets you express any element's pose relative to a frame on a different branch of the kinematic tree, without walking the chain manually.
5
+
6
+ ---
7
+
8
+ ## The Problem
9
+
10
+ When building a kinematic tree, every body and site stores its pose relative to its immediate parent. If you want to place a site on `gripper` at the same world location as `target_site` on `base` (two separate branches) there is no direct MJCF mechanism for it. You would have to compose the full transform chain by hand.
11
+
12
+ ```python
13
+ --8<-- "docs/user-guides/pose_context_example.py:build-tree"
14
+ ```
15
+
16
+ ---
17
+
18
+ ## One-Shot Resolution
19
+
20
+ For a single pose, `Mujoco.local_pose(frame, relative_to)` resolves the pose in one call. The result is a concrete `PoseQuat` you can assign directly to any MJCF element.
21
+
22
+ ```python
23
+ --8<-- "docs/user-guides/pose_context_example.py:one-shot"
24
+ ```
25
+
26
+ `frame` and `relative_to` accept any object that carries a `pose` attribute: `Body`, any site type, `Frame`, `Camera`, `Light`, and so on.
27
+
28
+ ???+ warning "Warning: Match relative_to to the element's parent"
29
+ `relative_to` must be the direct parent body of the element that will receive the resolved pose. If you assign the result to a site on `arm` but pass `relative_to=gripper`, the pose will be mathematically correct in the wrong coordinate frame and the element will appear in the wrong location.
30
+
31
+ ???+ warning "Warning: Tree must be complete"
32
+ Both `frame` and `relative_to` must be part of `mojo_model.mjcf.worldbody` at the time of the call. This is the same requirement MuJoCo has for compiling the model - anything not attached to the world will not appear in `MjModel`.
33
+
34
+ ---
35
+
36
+ ## Deferred Resolution with `PoseRef`
37
+
38
+ `PoseRef` stores the `frame` and `relative_to` pair and resolves lazily by passing `mojo_model.mjcf` to `.to_quat()`. This is useful when you want to define references early and resolve them later, or apply the same reference in multiple places.
39
+
40
+ ```python
41
+ --8<-- "docs/user-guides/pose_context_example.py:batch"
42
+ ```
43
+
44
+ ---
45
+
46
+ ## Using `Frame` as a Reference
47
+
48
+ MJCF `Frame` elements are coordinate transforms that disappear at compile time, accumulating into their children. They are fully supported as `frame` or `relative_to` arguments.
49
+
50
+ ```python
51
+ --8<-- "docs/user-guides/pose_context_example.py:frame-ref"
52
+ ```
53
+
54
+ ---
55
+
56
+ !!! success
57
+ You can now place elements precisely anywhere in the kinematic tree without manually composing transform chains. Use `local_pose` for quick one-off resolutions and `PoseRef` when you want to define the reference early and resolve it later in your generate function.
@@ -0,0 +1,65 @@
1
+ import numpy as np
2
+
3
+ import mujoco_mojo as mojo
4
+
5
+ # --8<-- [start:build-tree]
6
+ # `base` and `gripper` are separate bodies, both direct children of worldbody.
7
+ # Neither is a parent of the other (they are on different branches of the tree).
8
+ base = mojo.Body(
9
+ name=mojo.BodyName("base"), pose=mojo.PoseQuat(pos=np.array([1.0, 0.0, 0.0]))
10
+ )
11
+
12
+ # `target_site` is on `base`, so its pose ([0, 0, 0.5]) is local to `base`.
13
+ # Its world position is therefore [1.0, 0.0, 0.5].
14
+ target_site = mojo.SiteSphere(
15
+ name=mojo.SiteName("target"), pose=mojo.PoseQuat(pos=np.array([0.0, 0.0, 0.5]))
16
+ )
17
+ base.sites.append(target_site)
18
+
19
+ # `gripper` is on a completely different branch. We want to place a site on
20
+ # it at the same world position as `target_site`, but MJCF only accepts poses
21
+ # relative to the direct parent body. There is no built-in way to say
22
+ # "put this site wherever target_site is" across branches.
23
+ gripper = mojo.Body(
24
+ name=mojo.BodyName("gripper"), pose=mojo.PoseQuat(pos=np.array([-1.0, 0.0, 0.0]))
25
+ )
26
+
27
+ mojo_model = mojo.MojoModel()
28
+ mojo_model.mjcf.worldbody = mojo.WorldBody()
29
+ mojo_model.mjcf.worldbody.bodies.extend([base, gripper])
30
+ # --8<-- [end:build-tree]
31
+
32
+
33
+ # --8<-- [start:one-shot]
34
+ # local_pose takes the objects themselves (not their pose values) because it
35
+ # needs to walk each object's parent chain up to worldbody to compose the
36
+ # full world-space transform. A bare PoseQuat contains no tree context.
37
+ # relative_to must match the parent body of whatever element receives this pose.
38
+ local_pose = mojo_model.mjcf.local_pose(frame=target_site, relative_to=gripper)
39
+
40
+ mirror = mojo.SiteSphere(name=mojo.SiteName("mirror"), pose=local_pose)
41
+ gripper.sites.append(mirror)
42
+ # --8<-- [end:one-shot]
43
+
44
+
45
+ # --8<-- [start:batch]
46
+ # PoseRef stores the reference and resolves it on demand via the mjcf model
47
+ contact_site = mojo.SiteSphere(
48
+ name=mojo.SiteName("contact"),
49
+ pose=mojo.PoseRef(frame=target_site, relative_to=gripper).to_quat(mojo_model.mjcf),
50
+ )
51
+ origin_in_gripper = mojo.PoseRef(frame=base, relative_to=gripper).to_quat(
52
+ mojo_model.mjcf
53
+ )
54
+ # --8<-- [end:batch]
55
+
56
+
57
+ # --8<-- [start:frame-ref]
58
+ # Frame elements are also valid references
59
+ alignment_frame = mojo.Frame(pose=mojo.PoseQuat(pos=np.array([0.0, 0.5, 0.0])))
60
+ base.frames.append(alignment_frame)
61
+
62
+ frame_in_gripper = mojo.PoseRef(frame=alignment_frame, relative_to=gripper).to_quat(
63
+ mojo_model.mjcf
64
+ )
65
+ # --8<-- [end:frame-ref]
@@ -14,20 +14,22 @@ watch:
14
14
  nav:
15
15
  - Home: index.md
16
16
  - User Guide:
17
- # - user-guide.md
18
- - Getting Started: user-guides/getting-started.md
19
- - Initializing a Project: user-guides/init.md
20
- - Generate Script: user-guides/generate-script.md
21
- - Runtime Script: user-guides/runtime-script.md
22
- - Running Jobs:
23
- - user-guides/running-jobs.md
24
- - Example Report: user-guides/MOJO_RUNTIME_REPORT.md
25
- - Dojo Dashboard:
26
- - user-guides/dojo.md
27
- - Monitor: user-guides/monitor.md
28
- - Mosaic: user-guides/mosaic.md
29
- - Optimization: user-guides/optimization.md
30
- - Reloaded: user-guides/reloaded.md
17
+ - Workflow:
18
+ - Getting Started: user-guides/getting-started.md
19
+ - Initializing a Project: user-guides/init.md
20
+ - Generate Script: user-guides/generate-script.md
21
+ - Runtime Script: user-guides/runtime-script.md
22
+ - Running Jobs:
23
+ - user-guides/running-jobs.md
24
+ - Example Report: user-guides/MOJO_RUNTIME_REPORT.md
25
+ - Features:
26
+ - Dojo Dashboard:
27
+ - user-guides/dojo.md
28
+ - Monitor: user-guides/monitor.md
29
+ - Mosaic: user-guides/mosaic.md
30
+ - Optimization: user-guides/optimization.md
31
+ - Reloaded: user-guides/reloaded.md
32
+ - Pose Context: user-guides/pose-context.md
31
33
  - Code Reference:
32
34
  - mujoco_mojo:
33
35
  - MojoModel: reference/mujoco_mojo/mojo_model.md
@@ -44,6 +44,7 @@ dependencies = [
44
44
  "filelock>=3.29.0",
45
45
  "pydantic-settings>=2.14.1",
46
46
  "tomli-w>=1.2.0",
47
+ "pytransform3d>=3.15.0",
47
48
  ]
48
49
  classifiers = [
49
50
  "Development Status :: 4 - Beta",
@@ -31,6 +31,7 @@ compatibility patch that ships alongside the stubs:
31
31
  from mujoco_mojo.__about__ import __version__ # noqa: F401
32
32
 
33
33
  from . import utils
34
+ from .mj_state import MjState
34
35
  from .mjcf import (
35
36
  Actuator,
36
37
  ActuatorAdhesion,
@@ -93,6 +94,7 @@ from .mjcf import (
93
94
  GeomPlane,
94
95
  GeomSDF,
95
96
  GeomSphere,
97
+ HasPose,
96
98
  HField,
97
99
  Inertial,
98
100
  Joint,
@@ -117,8 +119,10 @@ from .mjcf import (
117
119
  Plugin,
118
120
  Pos,
119
121
  PoseAxisAngle,
122
+ PoseContext,
120
123
  PoseEuler,
121
124
  PoseQuat,
125
+ PoseRef,
122
126
  PoseXYAxes,
123
127
  PoseZAxis,
124
128
  Quat,
@@ -198,7 +202,6 @@ from .mjcf import (
198
202
  XYAxes,
199
203
  ZAxis,
200
204
  )
201
- from .mj_state import MjState
202
205
  from .mojo_model import MojoModel, UserData
203
206
  from .stochas import (
204
207
  NOMINAL_TRIAL_NUM,
@@ -426,6 +429,7 @@ __all__ = [
426
429
  "GridLayoutStr",
427
430
  "HField",
428
431
  "HFieldName",
432
+ "HasPose",
429
433
  "Inertia",
430
434
  "InertiaFromGeom",
431
435
  "InertiaGroupRange",
@@ -485,8 +489,10 @@ __all__ = [
485
489
  "PoissonDistribution",
486
490
  "Pos",
487
491
  "PoseAxisAngle",
492
+ "PoseContext",
488
493
  "PoseEuler",
489
494
  "PoseQuat",
495
+ "PoseRef",
490
496
  "PoseXYAxes",
491
497
  "PoseZAxis",
492
498
  "ProximityType",
@@ -165,6 +165,7 @@ from .orientation import (
165
165
  )
166
166
  from .plugin import Plugin
167
167
  from .pose import AnyPose, PoseAxisAngle, PoseEuler, PoseQuat, PoseXYAxes, PoseZAxis
168
+ from .pose_context import HasPose, PoseContext, PoseRef
168
169
  from .position import Pos
169
170
 
170
171
  __all__ = [
@@ -230,6 +231,7 @@ __all__ = [
230
231
  "GeomSDF",
231
232
  "GeomSphere",
232
233
  "HField",
234
+ "HasPose",
233
235
  "Inertial",
234
236
  "Joint",
235
237
  "Key",
@@ -253,8 +255,10 @@ __all__ = [
253
255
  "Plugin",
254
256
  "Pos",
255
257
  "PoseAxisAngle",
258
+ "PoseContext",
256
259
  "PoseEuler",
257
260
  "PoseQuat",
261
+ "PoseRef",
258
262
  "PoseXYAxes",
259
263
  "PoseZAxis",
260
264
  "Quat",
@@ -5,9 +5,8 @@ from pathlib import Path
5
5
  import mujoco
6
6
  from pydantic import Field
7
7
 
8
- from mujoco_mojo.mj_state import MjState
9
-
10
8
  import mujoco_mojo.utils.utils as utils
9
+ from mujoco_mojo.mj_state import MjState
11
10
  from mujoco_mojo.mjcf.defaults import DEFAULT_ANGLE, DEFAULT_EULERSEQ
12
11
  from mujoco_mojo.mjcf.extension import Extension
13
12
  from mujoco_mojo.mjcf.mujoco_attr.actuator import Actuator
@@ -24,6 +23,8 @@ from mujoco_mojo.mjcf.mujoco_attr.size import Size
24
23
  from mujoco_mojo.mjcf.mujoco_attr.statistic import Statistic
25
24
  from mujoco_mojo.mjcf.mujoco_attr.tendon import Tendon
26
25
  from mujoco_mojo.mjcf.mujoco_attr.visual import Visual
26
+ from mujoco_mojo.mjcf.pose import PoseQuat
27
+ from mujoco_mojo.mjcf.pose_context import HasPose, PoseContext
27
28
  from mujoco_mojo.mjcf.xml_model import XMLModel
28
29
  from mujoco_mojo.typing import Angle, EulerSeq, ModelName
29
30
  from mujoco_mojo.utils.log import get_logger
@@ -244,6 +245,30 @@ class Mujoco(XMLModel):
244
245
  )
245
246
  )
246
247
 
248
+ @property
249
+ def pose_context(self) -> PoseContext:
250
+ """
251
+ Builds a PoseContext from the current worldbody tree.
252
+
253
+ Raises ValueError if worldbody is not set.
254
+ """
255
+ if self.worldbody is None:
256
+ raise ValueError("Cannot build pose graph: worldbody is not set.")
257
+ return PoseContext(self.worldbody)
258
+
259
+ def local_pose(
260
+ self,
261
+ frame: HasPose,
262
+ relative_to: HasPose,
263
+ ) -> PoseQuat:
264
+ """
265
+ Returns the pose of `frame` expressed in `relative_to`'s coordinate system.
266
+
267
+ Always walks the live worldbody tree, so the result reflects the current
268
+ state of the model regardless of any modifications since the last call.
269
+ """
270
+ return self.pose_context.local_pose(frame, relative_to)
271
+
247
272
  def prep_for_sim(self, save_path: Path | None = None) -> MjState:
248
273
  """Creates an MjState (MjModel + MjData) from the Mujoco instance."""
249
274
  if save_path:
@@ -0,0 +1,18 @@
1
+ from mujoco_mojo.mjcf.mujoco_attr.sensor_attr.base import SensorBase
2
+ from mujoco_mojo.typing import GeomName, MeshName
3
+
4
+ __all__ = ["SensorTactile"]
5
+
6
+
7
+ class SensorTactile(SensorBase):
8
+ """The tactile sensor returns the maximum penetration depth and the sliding velocities in the tangent frame at given points between the geom associated with the sensor and the SDF geoms in contact with it. The sensor is associated with a geom and a mesh. It is activated by the contact between its associated geom and other geoms. The vertices of the mesh, when positioned in the geom frame, are the points at which sensor values are computed, so the dimension of the output is 3 times the number of vertices in the mesh. The mesh must have 3 normal vectors per vertex, which are used to compute the tangent frame. If the penetration depth is positive (no contact), then all values are 0 for the corresponding vertex. Only contacts with geoms of type SDF contribute to the sensor output. The sensor can be visualized by enabling the visualization of contact points."""
9
+
10
+ tag = "tactile"
11
+
12
+ attributes = ("name", "user", "geom", "mesh")
13
+
14
+ geom: GeomName
15
+ """Name of the geom to associate the tactile sensor with."""
16
+
17
+ mesh: MeshName
18
+ """Name of the mesh to associate the tactile sensor with. The mesh will be created by the sensor."""
@@ -0,0 +1,134 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass, field
4
+ from typing import TYPE_CHECKING, Protocol, runtime_checkable
5
+
6
+ import numpy as np
7
+ from pytransform3d.transform_manager import TransformManager
8
+
9
+ from mujoco_mojo.mjcf.orientation import Quat
10
+ from mujoco_mojo.mjcf.pose import AnyPose, PoseQuat
11
+ from mujoco_mojo.utils.log import get_logger
12
+
13
+ if TYPE_CHECKING:
14
+ from mujoco_mojo.mjcf.meta.frame import Frame
15
+ from mujoco_mojo.mjcf.mujoco import Mujoco
16
+ from mujoco_mojo.mjcf.mujoco_attr.body import Body, WorldBody
17
+
18
+ __all__ = ["HasPose", "PoseContext", "PoseRef"]
19
+
20
+ logger = get_logger(__name__)
21
+
22
+ _WORLD = "__world__"
23
+
24
+
25
+ @runtime_checkable
26
+ class HasPose(Protocol):
27
+ """Structural type for any MJCF element that carries a pose."""
28
+
29
+ pose: AnyPose
30
+
31
+
32
+ def _to_T(posed: HasPose) -> np.ndarray:
33
+ T = np.eye(4)
34
+ T[:3, :3] = posed.pose.as_matrix()
35
+ T[:3, 3] = np.asarray(posed.pose.pos, dtype=float)
36
+ return T
37
+
38
+
39
+ def _from_T(T: np.ndarray) -> PoseQuat:
40
+ return Quat.from_matrix(T[:3, :3]).as_pose(pos=T[:3, 3])
41
+
42
+
43
+ class PoseContext:
44
+ """
45
+ Graph of all posed elements in a WorldBody tree for cross-branch pose resolution.
46
+
47
+ Every element with a pose (`Body`, any site type, `Frame`, `Camera`, `Light`, etc.) is registered as a node keyed by Python object identity, so no naming is required.
48
+
49
+ Attributes:
50
+ _tm: internal pytransform3d `TransformManager` storing pairwise 4x4 transforms.
51
+ _registered: set of `id()` values for every element registered during the tree walk.
52
+
53
+ """
54
+
55
+ def __init__(self, worldbody: WorldBody) -> None:
56
+ self._tm = TransformManager()
57
+ self._registered: set[int] = set()
58
+ self._build(worldbody)
59
+
60
+ def _key(self, obj: object) -> str:
61
+ self._registered.add(id(obj))
62
+ return str(id(obj))
63
+
64
+ def _register_posed_children(self, parent_obj: object, parent_key: str) -> None:
65
+ """Registers sites, cameras, and lights of a body as child frames."""
66
+ for attr in ("sites", "cameras", "lights"):
67
+ for child in getattr(parent_obj, attr, ()):
68
+ logger.debug(
69
+ "registering %s %s", attr[:-1], getattr(child, "name", id(child))
70
+ )
71
+ self._tm.add_transform(self._key(child), parent_key, _to_T(child))
72
+
73
+ def _walk_frames(self, frm: Frame, parent_key: str) -> None:
74
+ """Recursively registers a Frame and its nested frames."""
75
+ logger.debug("registering frame %s", getattr(frm, "name", id(frm)))
76
+ frm_key = self._key(frm)
77
+ self._tm.add_transform(frm_key, parent_key, _to_T(frm))
78
+ for nested in frm.frames:
79
+ self._walk_frames(nested, frm_key)
80
+
81
+ def _build(self, worldbody: WorldBody) -> None:
82
+ """Walks the full worldbody tree and registers every posed element."""
83
+ logger.debug("building pose context from worldbody")
84
+ wb_key = self._key(worldbody)
85
+ self._tm.add_transform(wb_key, _WORLD, np.eye(4))
86
+ self._register_posed_children(worldbody, wb_key)
87
+ for frm in worldbody.frames:
88
+ self._walk_frames(frm, wb_key)
89
+ for body in worldbody.bodies:
90
+ self._walk(body, wb_key)
91
+
92
+ def _walk(self, body: Body, parent_key: str) -> None:
93
+ """Recursively registers a body and all its descendants."""
94
+ logger.debug("registering body %s", getattr(body, "name", id(body)))
95
+ body_key = self._key(body)
96
+ self._tm.add_transform(body_key, parent_key, _to_T(body))
97
+ self._register_posed_children(body, body_key)
98
+ for frm in body.frames:
99
+ self._walk_frames(frm, body_key)
100
+ for child in body.bodies:
101
+ self._walk(child, body_key)
102
+
103
+ def local_pose(self, frame: HasPose, relative_to: HasPose) -> PoseQuat:
104
+ """Returns the pose of `frame` expressed in `relative_to`'s coordinate system."""
105
+ if id(frame) not in self._registered:
106
+ msg = "frame is not registered in the pose context. Ensure it is part of the worldbody tree before resolving poses."
107
+ logger.error(msg)
108
+ raise ValueError(msg)
109
+ if id(relative_to) not in self._registered:
110
+ msg = "relative_to is not registered in the pose context. Ensure it is part of the worldbody tree before resolving poses."
111
+ logger.error(msg)
112
+ raise ValueError(msg)
113
+ try:
114
+ T = self._tm.get_transform(str(id(frame)), str(id(relative_to)))
115
+ except Exception as exc:
116
+ msg = f"Cannot resolve transform from frame to relative_to: {exc}"
117
+ logger.error(msg)
118
+ raise ValueError(msg) from exc
119
+ return _from_T(T)
120
+
121
+
122
+ @dataclass(frozen=True)
123
+ class PoseRef:
124
+ """Deferred pose reference resolved via `Mujoco.local_pose`. `relative_to` must be the direct parent body of the element receiving the resolved pose."""
125
+
126
+ frame: HasPose = field()
127
+ """The element whose world-space pose you want to resolve."""
128
+
129
+ relative_to: HasPose = field()
130
+ """The element whose local coordinate system the result is expressed in. Must be the parent body of whatever element receives the resolved pose."""
131
+
132
+ def to_quat(self, mjcf: Mujoco) -> PoseQuat:
133
+ """Resolves this reference to a concrete `PoseQuat` in `relative_to`'s coordinate system."""
134
+ return mjcf.local_pose(self.frame, self.relative_to)
@@ -1,5 +1,7 @@
1
1
  from .load import (
2
2
  GeneralLoad,
3
+ JointFriction,
4
+ JointLoad,
3
5
  Load,
4
6
  PointToPointForce,
5
7
  ScalarForce,
@@ -13,6 +15,8 @@ from .video_recorder import VideoRecorder
13
15
 
14
16
  __all__ = [
15
17
  "GeneralLoad",
18
+ "JointFriction",
19
+ "JointLoad",
16
20
  "Load",
17
21
  "PointToPointForce",
18
22
  "RuntimeManager",