mujoco-mojo 2.3.4__tar.gz → 2.3.6__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.
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/.pre-commit-config.yaml +6 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/PKG-INFO +2 -1
- mujoco_mojo-2.3.6/docs/user-guides/pose-context.md +57 -0
- mujoco_mojo-2.3.6/docs/user-guides/pose_context_example.py +65 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/mkdocs.yml +16 -14
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/pyproject.toml +1 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/__init__.py +7 -1
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/__init__.py +4 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco.py +27 -2
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/geom.py +2 -2
- mujoco_mojo-2.3.6/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tactile.py +18 -0
- mujoco_mojo-2.3.6/src/mujoco_mojo/mjcf/pose_context.py +134 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/runtime/__init__.py +6 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/runtime/load.py +270 -27
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/runtime/runtime_manager.py +3 -2
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/runtime/signal_manager.py +8 -0
- mujoco_mojo-2.3.6/src/mujoco_mojo/templates/dojo.sh +4 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/templates/reloaded.sh +1 -1
- mujoco_mojo-2.3.6/src/mujoco_mojo/templates/run_mc.sh +11 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/templates/run_opt.sh +0 -1
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/filters/__init__.py +12 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/filters/filters.py +97 -3
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/cli.py +10 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/lab_executor.py +13 -1
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/routers/mosaic.py +11 -10
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/base.html +10 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_chart.html +9 -9
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_header.html +6 -6
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_media_player.html +9 -10
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_series_panel.html +12 -10
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_signal_lab.html +244 -68
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_trial_status.html +2 -2
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/main.js +29 -3
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/trial-viewer.js +71 -12
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/models.ts +1 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/store.ts +49 -5
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/trial-viewer.ts +122 -29
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/types/global.d.ts +27 -4
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/reloaded.py +206 -71
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/proximity.py +67 -8
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/runner.py +2 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/statusing.py +1 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/utils.py +22 -1
- mujoco_mojo-2.3.6/tests/mjcf/pose_graph_test.py +239 -0
- mujoco_mojo-2.3.6/tests/one_off/proximity/dojo.sh +4 -0
- mujoco_mojo-2.3.6/tests/one_off/proximity/reloaded.sh +10 -0
- mujoco_mojo-2.3.4/src/mujoco_mojo/templates/run_mc.sh → mujoco_mojo-2.3.6/tests/one_off/proximity/run.sh +0 -0
- mujoco_mojo-2.3.6/tests/one_off/proximity/simulation.py +145 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/runtime/loads_test.py +372 -1
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/runtime/runtime_manager_test.py +6 -4
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/utils/filter_test.py +60 -2
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/utils/proximity_test.py +171 -0
- mujoco_mojo-2.3.4/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tactile.py +0 -18
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/.gitattributes +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/.github/workflows/docs.yml +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/.github/workflows/release.yml +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/.gitignore +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/.python-version +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/.vscode/settings.json +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/LICENSE +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/README.md +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/TODO.md +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/about.md +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/dark-hero-logo.png +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/dark-hero-logo.svg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/dark-logo.svg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/light-hero-logo.svg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/light-logo.svg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/logo.svg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/mesh/bunny_original.jpg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/mesh/bunny_with_coacd.jpg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/mesh/bunny_without_coacd.jpg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/mesh/frustums.jpg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/mesh/proximity/convex_hull_wireframe.jpg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/mesh/proximity/real_wireframe.jpg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/mesh/with_coacd.jpg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/mesh/without_coacd.jpg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/user-guides/dark-export-options.jpg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/user-guides/dark-monitor-view.jpg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/user-guides/dark-mosaic-view.jpg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/user-guides/dark-notes-editor.jpg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/user-guides/dark-plot-editor.jpg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/user-guides/dark-selector-bar.jpg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/user-guides/dark-shapes-editor.jpg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/user-guides/generate-result.jpg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/user-guides/light-export-options.jpg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/user-guides/light-monitor-view.jpg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/user-guides/light-mosaic-view.jpg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/user-guides/light-notes-editor.jpg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/user-guides/light-plot-editor.jpg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/user-guides/light-selector-bar.jpg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/user-guides/light-shapes-editor.jpg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/assets/user-guides/runtime-anim.gif +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/index.md +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/javascripts/favicon-switcher.js +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/javascripts/mojo-highlighter.js +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/javascripts/tablesort.js +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/stylesheets/extra.css +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/user-guides/MOJO_RUNTIME_REPORT.md +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/user-guides/dojo.md +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/user-guides/generate-script.md +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/user-guides/getting-started.md +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/user-guides/init.md +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/user-guides/monitor.md +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/user-guides/monte_carlo_example.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/user-guides/mosaic.md +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/user-guides/optimization.md +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/user-guides/optimization_example.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/user-guides/reloaded.md +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/user-guides/running-jobs.md +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/docs/user-guides/runtime-script.md +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/examples/boxes_and_springs_monte_carlo.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/examples/boxes_and_springs_optimization.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/examples/tennis_racket_theorem.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/requirements.txt +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/scripts/copy_docs_examples_to_examples.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/scripts/fix_smart_quotes.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/scripts/gen_ref_pages.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/scripts/gen_ts_models.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/scripts/templating/filestomake.txt +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/scripts/templating/make_sensors.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/scripts/templating/sensor_template.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/__about__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/base.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/meta.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mj_state.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/defaults.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/dependency_path.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/extension.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/meta/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/meta/frame.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/meta/include.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/meta/replicate.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/actuator.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/adhesion.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/base.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/cylinder.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/damper.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/dcmotor.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/general.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/intvelocity.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/motor.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/muscle.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/plugin.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/position.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/velocity.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/asset.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/hfield.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/material.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/material_attr/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/material_attr/layer.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/mesh.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/model.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/texture.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/body.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/attach.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/camera.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/geom.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/joint.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/site.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/skin.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/contact.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/edge.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/elasticity.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/pin.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/free_joint.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/inertial.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/joint.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/light.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/plugin.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/site.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/compiler.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/compiler_attr/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/compiler_attr/lengthrange.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/contact.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/contact_attr/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/contact_attr/exclude.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/contact_attr/pair.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/deformable.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex_attr/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex_attr/contact.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex_attr/edge.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex_attr/elasticity.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/skin.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/skin_attr/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/skin_attr/bone.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/equality.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/connect.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/equality_base.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/flex.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/flexstrain.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/flexvert.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/joint.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/tendon.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/weld.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/keyframe.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/keyframe_attr/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/keyframe_attr/key.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/option.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/option_attr/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/option_attr/flag.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/accelerometer.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/actuatorfrc.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/actuatorpos.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/actuatorvel.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/ballangvel.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/ballquat.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/base.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/base_collision.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/camprojection.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/clock.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/contact.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/distance.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/e_kinetic.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/e_potential.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/force.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/frameangacc.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/frameangvel.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framelinacc.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framelinvel.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framepos.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framequat.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framexaxis.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/frameyaxis.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framezaxis.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/fromto.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/gyro.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/insidesite.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointactuatorfrc.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointlimitfrc.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointlimitpos.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointlimitvel.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointpos.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointvel.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/magnetometer.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/normal.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/plugin.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/rangefinder.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/subtreeangmom.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/subtreecom.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/subtreelinvel.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonactuatorfrc.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonlimitfrc.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonlimitpos.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonlimitvel.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonpos.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonvel.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/torque.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/touch.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/user.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/velocimeter.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/size.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/statistic.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/tendon.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/fixed.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/fixed_attr/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/fixed_attr/joint.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial_attr/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial_attr/geom.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial_attr/pulley.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial_attr/site.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/tendon_base.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/visual.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/global_.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/headlight.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/map.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/quality.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/rgba.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/scale.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/orientation.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/plugin.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/pose.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/position.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mjcf/xml_model.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/mojo_model.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/runtime/video_recorder.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/settings.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/stochas/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/templates/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/templates/monte_carlo.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/templates/optimization.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/typing.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/color.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/dataframe.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/defaults.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/interp.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/main.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/plot_config.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/routers/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/routers/monitor.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/routers/morph.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/routers/sensai.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/sensai/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/sensai/agent.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/shared.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/error.html +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/monitor.html +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/morph.html +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/mosaic.html +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/partials/_sensai.html +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_json_editor.html +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_lab_trigger.html +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_macros.html +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_overlays.html +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/chime.mp3 +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/dark-logo.svg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/monitor.js +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/mosaic.js +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/sensai.js +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/toast.d.ts +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/toast.d.ts.map +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/toast.js +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/light-logo.svg +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/main.css +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/build.mjs +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/package-lock.json +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/package.json +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/cm-bundle.ts +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/lib/format.ts +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/lib/options.ts +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/lib/plot-config.generated.ts +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/lib/toast.ts +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/monitor.ts +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/mosaic.ts +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/sensai.ts +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/tsconfig.json +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/__init__.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/alpine.min.js +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/codemirror.bundle.js +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/confetti.browser.min.js +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/iro.min.js +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/litegraph.min.css +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/litegraph.min.js +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/lz-string.min.js +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/plotly-3.4.0.min.js +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/tailwind.min.js +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/layers/dojo/templates/trial_viewer.html +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/log.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/utils/proximity_mixin.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/src/mujoco_mojo/visualization.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/.gitignore +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/make_skybox.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/meshes/ball.stl +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/meshes/bunny2.stl +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/meshes/cup.stl +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/mjcf/body_test.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/mjcf/equality_test.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/mjcf/inertial_test.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/mjcf/joint_test.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/mjcf/mesh.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/mjcf/mujoco_test.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/mjcf/orientation_test.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/mjcf/pos_test.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/mjcf/pose_test.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/mjcf/site_test.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/mjcf/visualization_test.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/mjcf/xml_model_test.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/model_with_skybox.xml +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/monte_carlo_test/asset_image.png +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/monte_carlo_test/monte_carlo.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/monte_carlo_test/overrides.json +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/monte_carlo_test/running_with_slurm.sh +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/runtime/conftest.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/runtime/mojo_model_test.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/runtime/monte_carlo_bumper.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/runtime/optimizer_bumper.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/runtime/settings_test.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/runtime/signal_manager_test.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/smoke_test.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/test_writer.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/utils/color_test.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/utils/dataframe_test.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/utils/interp_test.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/tests/utils/utils_test.py +0 -0
- {mujoco_mojo-2.3.4 → mujoco_mojo-2.3.6}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mujoco-mojo
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.6
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
|
@@ -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:
|
|
@@ -7,11 +7,11 @@ import numpy as np
|
|
|
7
7
|
import trimesh
|
|
8
8
|
from pydantic import ConfigDict, Field
|
|
9
9
|
|
|
10
|
+
from mujoco_mojo.mj_state import MjState
|
|
10
11
|
from mujoco_mojo.mjcf.defaults import SOLIMP_DEFAULT, SOLREF_DEFAULT
|
|
11
12
|
from mujoco_mojo.mjcf.plugin import Plugin
|
|
12
13
|
from mujoco_mojo.mjcf.pose import AnyPose, PoseQuat
|
|
13
14
|
from mujoco_mojo.mjcf.xml_model import XMLModel
|
|
14
|
-
from mujoco_mojo.mj_state import MjState
|
|
15
15
|
from mujoco_mojo.typing import (
|
|
16
16
|
FluidShape,
|
|
17
17
|
GeomName,
|
|
@@ -262,7 +262,7 @@ class GeomBase(XMLModel):
|
|
|
262
262
|
signal_manager: SignalManager,
|
|
263
263
|
attrs: list[
|
|
264
264
|
Literal["xpos", "xmat", "xvelp", "xvelr", "xaccp", "xaccr", "quat"]
|
|
265
|
-
] = ["xpos", "quat"],
|
|
265
|
+
] = ["xpos", "xvelp", "xvelr", "xaccp", "xaccr", "quat"],
|
|
266
266
|
):
|
|
267
267
|
"""
|
|
268
268
|
Registers specific geom attributes for logging.
|
|
@@ -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,9 +1,12 @@
|
|
|
1
1
|
from .load import (
|
|
2
2
|
GeneralLoad,
|
|
3
|
+
JointFriction,
|
|
4
|
+
JointLoad,
|
|
3
5
|
Load,
|
|
4
6
|
PointToPointForce,
|
|
5
7
|
ScalarForce,
|
|
6
8
|
ScalarTorque,
|
|
9
|
+
SiteLoad,
|
|
7
10
|
VectorForce,
|
|
8
11
|
VectorTorque,
|
|
9
12
|
)
|
|
@@ -13,12 +16,15 @@ from .video_recorder import VideoRecorder
|
|
|
13
16
|
|
|
14
17
|
__all__ = [
|
|
15
18
|
"GeneralLoad",
|
|
19
|
+
"JointFriction",
|
|
20
|
+
"JointLoad",
|
|
16
21
|
"Load",
|
|
17
22
|
"PointToPointForce",
|
|
18
23
|
"RuntimeManager",
|
|
19
24
|
"ScalarForce",
|
|
20
25
|
"ScalarTorque",
|
|
21
26
|
"SignalManager",
|
|
27
|
+
"SiteLoad",
|
|
22
28
|
"VectorForce",
|
|
23
29
|
"VectorTorque",
|
|
24
30
|
"VideoRecorder",
|