metriplane 0.2.1__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.
- metriplane-0.2.1/LICENSE +21 -0
- metriplane-0.2.1/NOTICE +4 -0
- metriplane-0.2.1/PKG-INFO +249 -0
- metriplane-0.2.1/README.md +212 -0
- metriplane-0.2.1/integrations/__init__.py +2 -0
- metriplane-0.2.1/integrations/isaac/__init__.py +2 -0
- metriplane-0.2.1/integrations/isaac/metriplane_isaac_replay.py +52 -0
- metriplane-0.2.1/integrations/isaac/metriplane_to_usd.py +240 -0
- metriplane-0.2.1/integrations/omniverse/__init__.py +2 -0
- metriplane-0.2.1/integrations/omniverse/metriplane_usd_replay.py +36 -0
- metriplane-0.2.1/integrations/ros2/metriplane_ros/launch/bridge.launch.py +31 -0
- metriplane-0.2.1/integrations/ros2/metriplane_ros/metriplane_ros/__init__.py +4 -0
- metriplane-0.2.1/integrations/ros2/metriplane_ros/metriplane_ros/bridge_node.py +127 -0
- metriplane-0.2.1/integrations/ros2/metriplane_ros/metriplane_ros/msg_adapters.py +57 -0
- metriplane-0.2.1/integrations/ros2/metriplane_ros/setup.py +29 -0
- metriplane-0.2.1/integrations/ros2/metriplane_ros/tests/test_msg_adapters.py +57 -0
- metriplane-0.2.1/metriplane/__init__.py +8 -0
- metriplane-0.2.1/metriplane/assistant/__init__.py +4 -0
- metriplane-0.2.1/metriplane/assistant/answer.py +154 -0
- metriplane-0.2.1/metriplane/assistant/citations.py +37 -0
- metriplane-0.2.1/metriplane/assistant/cli.py +47 -0
- metriplane-0.2.1/metriplane/assistant/intents.py +40 -0
- metriplane-0.2.1/metriplane/assistant/models.py +47 -0
- metriplane-0.2.1/metriplane/assistant/providers.py +16 -0
- metriplane-0.2.1/metriplane/assistant/retrieval.py +107 -0
- metriplane-0.2.1/metriplane/atlas/__init__.py +6 -0
- metriplane-0.2.1/metriplane/atlas/bench.py +40 -0
- metriplane-0.2.1/metriplane/atlas/bundles.py +202 -0
- metriplane-0.2.1/metriplane/atlas/cli.py +394 -0
- metriplane-0.2.1/metriplane/atlas/connectors.py +85 -0
- metriplane-0.2.1/metriplane/atlas/dashboard.py +177 -0
- metriplane-0.2.1/metriplane/atlas/domain_packs.py +102 -0
- metriplane-0.2.1/metriplane/atlas/edge.py +61 -0
- metriplane-0.2.1/metriplane/atlas/event_ledger.py +47 -0
- metriplane-0.2.1/metriplane/atlas/evidence_lake.py +169 -0
- metriplane-0.2.1/metriplane/atlas/freeze.py +87 -0
- metriplane-0.2.1/metriplane/atlas/improvement.py +66 -0
- metriplane-0.2.1/metriplane/atlas/models.py +253 -0
- metriplane-0.2.1/metriplane/atlas/multicell.py +47 -0
- metriplane-0.2.1/metriplane/atlas/pilot.py +73 -0
- metriplane-0.2.1/metriplane/atlas/privacy.py +91 -0
- metriplane-0.2.1/metriplane/atlas/process_model.py +237 -0
- metriplane-0.2.1/metriplane/atlas/protocol.py +64 -0
- metriplane-0.2.1/metriplane/atlas/query.py +78 -0
- metriplane-0.2.1/metriplane/atlas/reality_graph.py +163 -0
- metriplane-0.2.1/metriplane/atlas/regression.py +149 -0
- metriplane-0.2.1/metriplane/atlas/reports.py +219 -0
- metriplane-0.2.1/metriplane/atlas/runtime.py +312 -0
- metriplane-0.2.1/metriplane/atlas/training.py +66 -0
- metriplane-0.2.1/metriplane/atlas/usd.py +112 -0
- metriplane-0.2.1/metriplane/atlas/validation.py +14 -0
- metriplane-0.2.1/metriplane/backends/aruco_backend.py +43 -0
- metriplane-0.2.1/metriplane/calibration/__init__.py +9 -0
- metriplane-0.2.1/metriplane/calibration/camera.py +70 -0
- metriplane-0.2.1/metriplane/calibration/intrinsics.py +264 -0
- metriplane-0.2.1/metriplane/camera/rtsp.py +40 -0
- metriplane-0.2.1/metriplane/camera/usb.py +40 -0
- metriplane-0.2.1/metriplane/camera/usb_multi.py +223 -0
- metriplane-0.2.1/metriplane/camera/v4l_resolve.py +51 -0
- metriplane-0.2.1/metriplane/camera_trust/__init__.py +4 -0
- metriplane-0.2.1/metriplane/camera_trust/analyzer.py +176 -0
- metriplane-0.2.1/metriplane/camera_trust/cli.py +33 -0
- metriplane-0.2.1/metriplane/camera_trust/export.py +20 -0
- metriplane-0.2.1/metriplane/camera_trust/models.py +39 -0
- metriplane-0.2.1/metriplane/camera_trust/recommendations.py +41 -0
- metriplane-0.2.1/metriplane/cli.py +459 -0
- metriplane-0.2.1/metriplane/compute/__init__.py +15 -0
- metriplane-0.2.1/metriplane/compute/cpu_numpy.py +80 -0
- metriplane-0.2.1/metriplane/compute/gpu_cupy.py +133 -0
- metriplane-0.2.1/metriplane/compute/interface.py +141 -0
- metriplane-0.2.1/metriplane/compute/select.py +186 -0
- metriplane-0.2.1/metriplane/config/__init__.py +40 -0
- metriplane-0.2.1/metriplane/config/models.py +16 -0
- metriplane-0.2.1/metriplane/config/profile.py +56 -0
- metriplane-0.2.1/metriplane/config.py +592 -0
- metriplane-0.2.1/metriplane/contracts/__init__.py +4 -0
- metriplane-0.2.1/metriplane/contracts/cli.py +91 -0
- metriplane-0.2.1/metriplane/contracts/engine.py +367 -0
- metriplane-0.2.1/metriplane/contracts/evaluate.py +27 -0
- metriplane-0.2.1/metriplane/contracts/expectations.py +66 -0
- metriplane-0.2.1/metriplane/contracts/load.py +32 -0
- metriplane-0.2.1/metriplane/contracts/models.py +110 -0
- metriplane-0.2.1/metriplane/contracts/validate.py +36 -0
- metriplane-0.2.1/metriplane/counterfactuals/__init__.py +4 -0
- metriplane-0.2.1/metriplane/counterfactuals/cli.py +69 -0
- metriplane-0.2.1/metriplane/counterfactuals/evaluator.py +139 -0
- metriplane-0.2.1/metriplane/counterfactuals/models.py +43 -0
- metriplane-0.2.1/metriplane/counterfactuals/report.py +52 -0
- metriplane-0.2.1/metriplane/counterfactuals/rule_sweep.py +47 -0
- metriplane-0.2.1/metriplane/counterfactuals/transforms.py +72 -0
- metriplane-0.2.1/metriplane/exporters/__init__.py +4 -0
- metriplane-0.2.1/metriplane/exporters/base.py +72 -0
- metriplane-0.2.1/metriplane/exporters/kafka.py +51 -0
- metriplane-0.2.1/metriplane/exporters/mqtt.py +52 -0
- metriplane-0.2.1/metriplane/exporters/parquet.py +112 -0
- metriplane-0.2.1/metriplane/exporters/webhook.py +40 -0
- metriplane-0.2.1/metriplane/fleet/__init__.py +4 -0
- metriplane-0.2.1/metriplane/fleet/agent.py +119 -0
- metriplane-0.2.1/metriplane/fleet/exporters.py +65 -0
- metriplane-0.2.1/metriplane/fleet/heartbeat.py +28 -0
- metriplane-0.2.1/metriplane/forecasting/__init__.py +4 -0
- metriplane-0.2.1/metriplane/forecasting/engine.py +214 -0
- metriplane-0.2.1/metriplane/forecasting/export.py +25 -0
- metriplane-0.2.1/metriplane/forecasting/models.py +40 -0
- metriplane-0.2.1/metriplane/forecasting/projector.py +30 -0
- metriplane-0.2.1/metriplane/forecasting/velocity.py +78 -0
- metriplane-0.2.1/metriplane/fusion/__init__.py +4 -0
- metriplane-0.2.1/metriplane/fusion/fuse_xy.py +49 -0
- metriplane-0.2.1/metriplane/fusion/kalman_cv.py +132 -0
- metriplane-0.2.1/metriplane/launcher.py +824 -0
- metriplane-0.2.1/metriplane/logging.py +10 -0
- metriplane-0.2.1/metriplane/mapping/__init__.py +4 -0
- metriplane-0.2.1/metriplane/mapping/planar.py +135 -0
- metriplane-0.2.1/metriplane/mapping/planar_multi.py +79 -0
- metriplane-0.2.1/metriplane/metrics.py +312 -0
- metriplane-0.2.1/metriplane/models.py +12 -0
- metriplane-0.2.1/metriplane/observability/__init__.py +6 -0
- metriplane-0.2.1/metriplane/observability/timing.py +460 -0
- metriplane-0.2.1/metriplane/overlay.py +123 -0
- metriplane-0.2.1/metriplane/pipeline/__init__.py +24 -0
- metriplane-0.2.1/metriplane/pipeline/bounded_queue.py +289 -0
- metriplane-0.2.1/metriplane/pipeline/runtime_threaded.py +233 -0
- metriplane-0.2.1/metriplane/preview/live_preview.py +81 -0
- metriplane-0.2.1/metriplane/provenance/__init__.py +4 -0
- metriplane-0.2.1/metriplane/provenance/run_provenance.py +369 -0
- metriplane-0.2.1/metriplane/recording/__init__.py +4 -0
- metriplane-0.2.1/metriplane/recording/jsonl.py +40 -0
- metriplane-0.2.1/metriplane/replay/compare_determinism.py +277 -0
- metriplane-0.2.1/metriplane/replay/engine.py +169 -0
- metriplane-0.2.1/metriplane/run.py +1323 -0
- metriplane-0.2.1/metriplane/run_fusion.py +992 -0
- metriplane-0.2.1/metriplane/runner/__init__.py +11 -0
- metriplane-0.2.1/metriplane/runner/allowlist.py +393 -0
- metriplane-0.2.1/metriplane/runner/cli_command_center.py +42 -0
- metriplane-0.2.1/metriplane/runner/command_center_api.py +284 -0
- metriplane-0.2.1/metriplane/runner/executor.py +328 -0
- metriplane-0.2.1/metriplane/runner/operator_api.py +1241 -0
- metriplane-0.2.1/metriplane/runner/service.py +378 -0
- metriplane-0.2.1/metriplane/schema.py +56 -0
- metriplane-0.2.1/metriplane/sentinel/__init__.py +4 -0
- metriplane-0.2.1/metriplane/sentinel/bundles.py +259 -0
- metriplane-0.2.1/metriplane/sentinel/cli_incidents.py +141 -0
- metriplane-0.2.1/metriplane/sentinel/cli_query.py +98 -0
- metriplane-0.2.1/metriplane/sentinel/cli_registry.py +47 -0
- metriplane-0.2.1/metriplane/sentinel/cli_rules.py +61 -0
- metriplane-0.2.1/metriplane/sentinel/cli_runtime.py +105 -0
- metriplane-0.2.1/metriplane/sentinel/config.py +56 -0
- metriplane-0.2.1/metriplane/sentinel/engine.py +232 -0
- metriplane-0.2.1/metriplane/sentinel/events.py +100 -0
- metriplane-0.2.1/metriplane/sentinel/export.py +21 -0
- metriplane-0.2.1/metriplane/sentinel/incidents.py +114 -0
- metriplane-0.2.1/metriplane/sentinel/registry.py +65 -0
- metriplane-0.2.1/metriplane/sentinel/rules.py +81 -0
- metriplane-0.2.1/metriplane/sentinel/runtime.py +250 -0
- metriplane-0.2.1/metriplane/sentinel/status.py +23 -0
- metriplane-0.2.1/metriplane/state.py +30 -0
- metriplane-0.2.1/metriplane/streaming/ws_server.py +69 -0
- metriplane-0.2.1/metriplane/streaming/ws_thread.py +66 -0
- metriplane-0.2.1/metriplane/system/fault_injection.py +73 -0
- metriplane-0.2.1/metriplane/system/health.py +32 -0
- metriplane-0.2.1/metriplane/system/health_registry.py +131 -0
- metriplane-0.2.1/metriplane/testing/__init__.py +4 -0
- metriplane-0.2.1/metriplane/testing/cli.py +39 -0
- metriplane-0.2.1/metriplane/testing/compare.py +86 -0
- metriplane-0.2.1/metriplane/testing/hash.py +29 -0
- metriplane-0.2.1/metriplane/testing/load_expected.py +24 -0
- metriplane-0.2.1/metriplane/testing/models.py +59 -0
- metriplane-0.2.1/metriplane/testing/report.py +51 -0
- metriplane-0.2.1/metriplane/testing/runner.py +115 -0
- metriplane-0.2.1/metriplane/time/clock.py +82 -0
- metriplane-0.2.1/metriplane/trace/__init__.py +4 -0
- metriplane-0.2.1/metriplane/trace/cli_traces.py +62 -0
- metriplane-0.2.1/metriplane/trace/store.py +217 -0
- metriplane-0.2.1/metriplane/tracking.py +45 -0
- metriplane-0.2.1/metriplane/video_overlay.py +226 -0
- metriplane-0.2.1/metriplane/zone_analytics.py +230 -0
- metriplane-0.2.1/metriplane/zones.py +142 -0
- metriplane-0.2.1/metriplane.egg-info/PKG-INFO +249 -0
- metriplane-0.2.1/metriplane.egg-info/SOURCES.txt +247 -0
- metriplane-0.2.1/metriplane.egg-info/dependency_links.txt +1 -0
- metriplane-0.2.1/metriplane.egg-info/entry_points.txt +3 -0
- metriplane-0.2.1/metriplane.egg-info/requires.txt +22 -0
- metriplane-0.2.1/metriplane.egg-info/top_level.txt +2 -0
- metriplane-0.2.1/pyproject.toml +92 -0
- metriplane-0.2.1/setup.cfg +4 -0
- metriplane-0.2.1/tests/test_assistant_answer.py +60 -0
- metriplane-0.2.1/tests/test_assistant_citations.py +54 -0
- metriplane-0.2.1/tests/test_assistant_intents.py +34 -0
- metriplane-0.2.1/tests/test_assistant_retrieval.py +56 -0
- metriplane-0.2.1/tests/test_atlas_core.py +224 -0
- metriplane-0.2.1/tests/test_atlas_late_phases.py +159 -0
- metriplane-0.2.1/tests/test_camera_trust_analyzer.py +51 -0
- metriplane-0.2.1/tests/test_camera_trust_models.py +37 -0
- metriplane-0.2.1/tests/test_camera_trust_recommendations.py +47 -0
- metriplane-0.2.1/tests/test_cli_doctor.py +36 -0
- metriplane-0.2.1/tests/test_compute_select.py +16 -0
- metriplane-0.2.1/tests/test_contract_cli.py +60 -0
- metriplane-0.2.1/tests/test_contract_engine.py +168 -0
- metriplane-0.2.1/tests/test_contract_loader.py +62 -0
- metriplane-0.2.1/tests/test_contract_models.py +85 -0
- metriplane-0.2.1/tests/test_counterfactual_evaluator.py +116 -0
- metriplane-0.2.1/tests/test_counterfactual_models.py +41 -0
- metriplane-0.2.1/tests/test_counterfactual_rule_sweep.py +50 -0
- metriplane-0.2.1/tests/test_counterfactual_transforms.py +71 -0
- metriplane-0.2.1/tests/test_edge_latency.py +29 -0
- metriplane-0.2.1/tests/test_evidence_bundles.py +149 -0
- metriplane-0.2.1/tests/test_exporters.py +83 -0
- metriplane-0.2.1/tests/test_fault_injection.py +27 -0
- metriplane-0.2.1/tests/test_fleet_agent.py +84 -0
- metriplane-0.2.1/tests/test_forecasting_engine.py +136 -0
- metriplane-0.2.1/tests/test_forecasting_projector.py +38 -0
- metriplane-0.2.1/tests/test_forecasting_runtime.py +44 -0
- metriplane-0.2.1/tests/test_forecasting_velocity.py +75 -0
- metriplane-0.2.1/tests/test_gpu_equivalence_extended.py +71 -0
- metriplane-0.2.1/tests/test_health_registry.py +35 -0
- metriplane-0.2.1/tests/test_incident_engine.py +110 -0
- metriplane-0.2.1/tests/test_launcher.py +611 -0
- metriplane-0.2.1/tests/test_list_cameras.py +379 -0
- metriplane-0.2.1/tests/test_m9_4_provenance.py +60 -0
- metriplane-0.2.1/tests/test_mapping_planar.py +29 -0
- metriplane-0.2.1/tests/test_metrics_cors.py +216 -0
- metriplane-0.2.1/tests/test_metriplane_bench.py +89 -0
- metriplane-0.2.1/tests/test_object_registry.py +133 -0
- metriplane-0.2.1/tests/test_operator_alignment.py +236 -0
- metriplane-0.2.1/tests/test_operator_camera_resolve.py +161 -0
- metriplane-0.2.1/tests/test_operator_command_center_api.py +110 -0
- metriplane-0.2.1/tests/test_operator_command_center_endpoints.py +161 -0
- metriplane-0.2.1/tests/test_operator_config_schema.py +239 -0
- metriplane-0.2.1/tests/test_operator_python_exe.py +444 -0
- metriplane-0.2.1/tests/test_physical_compare.py +86 -0
- metriplane-0.2.1/tests/test_physical_expected_models.py +69 -0
- metriplane-0.2.1/tests/test_physical_regression_runner.py +77 -0
- metriplane-0.2.1/tests/test_placeholder.py +5 -0
- metriplane-0.2.1/tests/test_query_cli.py +164 -0
- metriplane-0.2.1/tests/test_record_replay.py +12 -0
- metriplane-0.2.1/tests/test_release_fixture_integrity.py +60 -0
- metriplane-0.2.1/tests/test_ros2_msg_adapters.py +56 -0
- metriplane-0.2.1/tests/test_ros2_packaging.py +77 -0
- metriplane-0.2.1/tests/test_rule_engine.py +258 -0
- metriplane-0.2.1/tests/test_schema.py +16 -0
- metriplane-0.2.1/tests/test_sentinel_config.py +46 -0
- metriplane-0.2.1/tests/test_sentinel_events.py +215 -0
- metriplane-0.2.1/tests/test_sentinel_export.py +89 -0
- metriplane-0.2.1/tests/test_sentinel_status.py +61 -0
- metriplane-0.2.1/tests/test_trace_store.py +136 -0
- metriplane-0.2.1/tests/test_usd_export_adapter.py +82 -0
- metriplane-0.2.1/tests/test_ws_server_import.py +7 -0
- metriplane-0.2.1/tests/test_zone_analytics.py +55 -0
- metriplane-0.2.1/tests/test_zones.py +20 -0
metriplane-0.2.1/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025-2026 Miko Parkkinen
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
metriplane-0.2.1/NOTICE
ADDED
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: metriplane
|
|
3
|
+
Version: 0.2.1
|
|
4
|
+
Summary: Open-source physical observability for workcell evidence, replay, and regression testing.
|
|
5
|
+
Author: Miko Parkkinen
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://www.metriplane.com/
|
|
8
|
+
Project-URL: Documentation, https://github.com/Miko997/metriplane/tree/main/docs
|
|
9
|
+
Project-URL: Repository, https://github.com/Miko997/metriplane
|
|
10
|
+
Project-URL: Issues, https://github.com/Miko997/metriplane/issues
|
|
11
|
+
Project-URL: Changelog, https://github.com/Miko997/metriplane/blob/main/CHANGELOG.md
|
|
12
|
+
Keywords: robotics,physical observability,digital twins,reproducibility,workcells
|
|
13
|
+
Classifier: Development Status :: 3 - Alpha
|
|
14
|
+
Classifier: Intended Audience :: Science/Research
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Topic :: Scientific/Engineering
|
|
18
|
+
Requires-Python: >=3.12
|
|
19
|
+
Description-Content-Type: text/markdown
|
|
20
|
+
License-File: LICENSE
|
|
21
|
+
License-File: NOTICE
|
|
22
|
+
Requires-Dist: numpy>=1.26
|
|
23
|
+
Requires-Dist: opencv-contrib-python-headless>=4.8
|
|
24
|
+
Requires-Dist: PyYAML>=6.0
|
|
25
|
+
Requires-Dist: websockets>=12.0
|
|
26
|
+
Requires-Dist: pydantic>=2.0
|
|
27
|
+
Provides-Extra: gpu-cuda12x
|
|
28
|
+
Requires-Dist: cupy-cuda12x>=13.0.0; platform_system == "Linux" and extra == "gpu-cuda12x"
|
|
29
|
+
Provides-Extra: gpu-cuda13x
|
|
30
|
+
Requires-Dist: cupy-cuda13x>=13.0.0; platform_system == "Linux" and extra == "gpu-cuda13x"
|
|
31
|
+
Requires-Dist: cuda-toolkit>=13.0.0; platform_system == "Linux" and extra == "gpu-cuda13x"
|
|
32
|
+
Provides-Extra: gpu
|
|
33
|
+
Provides-Extra: plots
|
|
34
|
+
Requires-Dist: pandas>=2.2; extra == "plots"
|
|
35
|
+
Requires-Dist: matplotlib>=3.8; extra == "plots"
|
|
36
|
+
Dynamic: license-file
|
|
37
|
+
|
|
38
|
+
<!--
|
|
39
|
+
SPDX-FileCopyrightText: 2025-2026 Miko Parkkinen
|
|
40
|
+
SPDX-License-Identifier: MIT
|
|
41
|
+
-->
|
|
42
|
+
|
|
43
|
+
<p align="center">
|
|
44
|
+
<img src="https://raw.githubusercontent.com/Miko997/metriplane/main/docs/assets/metriplane-hero.jpg" alt="Metriplane — replayable physical evidence for workcells" width="100%">
|
|
45
|
+
</p>
|
|
46
|
+
|
|
47
|
+
# Metriplane
|
|
48
|
+
|
|
49
|
+
Open-source workcell black box for replayable physical evidence.
|
|
50
|
+
|
|
51
|
+
[](https://github.com/Miko997/metriplane/blob/main/LICENSE)
|
|
52
|
+
[](https://pypi.org/project/metriplane/)
|
|
53
|
+
[](https://github.com/Miko997/metriplane/releases/tag/v0.2.0)
|
|
54
|
+
[](https://doi.org/10.5281/zenodo.20736619)
|
|
55
|
+
[](https://www.metriplane.com/)
|
|
56
|
+
|
|
57
|
+
## Official Links
|
|
58
|
+
|
|
59
|
+
- Official site: https://www.metriplane.com/
|
|
60
|
+
- Python package: https://pypi.org/project/metriplane/
|
|
61
|
+
- 3-minute v0.2.0 demo: https://www.youtube.com/watch?v=7U5nbBbGGbw
|
|
62
|
+
- v0.2.0 release: https://github.com/Miko997/metriplane/releases/tag/v0.2.0
|
|
63
|
+
- Zenodo DOI: https://doi.org/10.5281/zenodo.20736619
|
|
64
|
+
- External reproduction issue: https://github.com/Miko997/metriplane/issues/6
|
|
65
|
+
- Short feedback form: https://docs.google.com/forms/d/e/1FAIpQLSfnMZ4b3fSVVtwA89hZt3A09gf85eLfhW00FDD76TGRLNpirQ/viewform
|
|
66
|
+
|
|
67
|
+
## Summary
|
|
68
|
+
|
|
69
|
+
Metriplane's frozen v0.2.0 research artifact is an open-source physical-observability system for bounded workcells. It converts replayed or calibrated workcell state into physical event logs, Cell Truth Reports, portable evidence bundles, local bundle verification, and generated regression checks. The v0.2.1 packaging release makes the core Python package and command-line interfaces installable from PyPI without changing the frozen v0.2.0 paper evidence.
|
|
70
|
+
|
|
71
|
+
## Install from PyPI
|
|
72
|
+
|
|
73
|
+
Metriplane requires Python 3.12 or newer.
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
python3.12 -m venv .venv
|
|
77
|
+
source .venv/bin/activate
|
|
78
|
+
python -m pip install --upgrade pip
|
|
79
|
+
python -m pip install "metriplane==0.2.1"
|
|
80
|
+
|
|
81
|
+
metriplane doctor
|
|
82
|
+
metriplane atlas protocol export --out metriplane-protocol
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
The PyPI distribution contains the core Python packages and command-line entry
|
|
86
|
+
points. Repository assets are intentionally not embedded in the wheel:
|
|
87
|
+
|
|
88
|
+
- checked-in demo datasets and domain-pack configurations
|
|
89
|
+
- the local web dashboard
|
|
90
|
+
- maintainer helper scripts
|
|
91
|
+
- frozen paper evidence and reproduction records
|
|
92
|
+
|
|
93
|
+
Use the exact source checkout in the reproduction section below when a command
|
|
94
|
+
refers to `datasets/`, `configs/`, `web/`, `tools/`, or `evidence/`.
|
|
95
|
+
When run from the wheel, doctor warnings about those source-checkout paths are
|
|
96
|
+
expected and do not mean the package installation failed.
|
|
97
|
+
|
|
98
|
+
## Why this exists
|
|
99
|
+
|
|
100
|
+
Robotics teams often need more than raw logs after an incident. Metriplane explores a structured evidence layer where replayed workcell state becomes an inspectable incident bundle, a verification target, and a generated regression check.
|
|
101
|
+
|
|
102
|
+
## Evidence Workflow
|
|
103
|
+
|
|
104
|
+
```text
|
|
105
|
+
replayed workcell state
|
|
106
|
+
→ physical event
|
|
107
|
+
→ incident
|
|
108
|
+
→ Cell Truth Report
|
|
109
|
+
→ evidence bundle
|
|
110
|
+
→ bundle verification
|
|
111
|
+
→ generated regression check
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Current v0.2.0 Evidence Result
|
|
115
|
+
|
|
116
|
+
The author-run evidence package included in the archived release records:
|
|
117
|
+
|
|
118
|
+
- 580 tests passed
|
|
119
|
+
- deterministic replay pass=true
|
|
120
|
+
- 6 physical events
|
|
121
|
+
- 1 incident
|
|
122
|
+
- 35.0 second missing-tool delay
|
|
123
|
+
- bundle verify: pass=true
|
|
124
|
+
- generated regression check: PASS
|
|
125
|
+
|
|
126
|
+
## Quick Reproduction Path
|
|
127
|
+
|
|
128
|
+
The core SoftwareX reproduction is camera-free, uses the exact `v0.2.0` tag,
|
|
129
|
+
and writes rerun outputs to temporary directories rather than the archived
|
|
130
|
+
evidence package.
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
git clone --branch v0.2.0 --depth 1 https://github.com/Miko997/metriplane.git
|
|
134
|
+
cd metriplane
|
|
135
|
+
|
|
136
|
+
python3 -m venv .venv
|
|
137
|
+
source .venv/bin/activate
|
|
138
|
+
python -m pip install --upgrade pip
|
|
139
|
+
python -m pip install -e .
|
|
140
|
+
|
|
141
|
+
python -m metriplane.cli doctor
|
|
142
|
+
|
|
143
|
+
RUNS=/tmp/metriplane-softwarex-runs \
|
|
144
|
+
./tools/mp.sh deterministic-replay datasets/demo/session_001.jsonl
|
|
145
|
+
|
|
146
|
+
metriplane atlas validate-pack configs/domain_packs/assembly_cell
|
|
147
|
+
metriplane atlas run \
|
|
148
|
+
--session-jsonl datasets/demo/atlas/assembly_cell_missing_tool.jsonl \
|
|
149
|
+
--pack configs/domain_packs/assembly_cell \
|
|
150
|
+
--out /tmp/metriplane-softwarex-atlas \
|
|
151
|
+
--overwrite
|
|
152
|
+
|
|
153
|
+
metriplane atlas bundle verify \
|
|
154
|
+
/tmp/metriplane-softwarex-atlas/evidence_bundles/INC-0001.zip
|
|
155
|
+
|
|
156
|
+
metriplane atlas test \
|
|
157
|
+
/tmp/metriplane-softwarex-atlas/regression_tests/INC-0001.yaml \
|
|
158
|
+
--json
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
The full maintainer gate is separate from the core artifact path and adds test
|
|
162
|
+
and browser dependencies:
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
python -m pip install -e .
|
|
166
|
+
python -m pip install pytest playwright
|
|
167
|
+
python -m playwright install chromium --with-deps
|
|
168
|
+
PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 python -m pytest -q
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## What Metriplane Is
|
|
172
|
+
|
|
173
|
+
- observe-only
|
|
174
|
+
- local-first
|
|
175
|
+
- replay-first, camera-compatible
|
|
176
|
+
- bounded workcell scoped
|
|
177
|
+
- research-software oriented
|
|
178
|
+
- focused on evidence, not robot control
|
|
179
|
+
|
|
180
|
+
## What Metriplane Does Not Claim
|
|
181
|
+
|
|
182
|
+
- no robot or machine control
|
|
183
|
+
- no safety certification
|
|
184
|
+
- no quality-release approval
|
|
185
|
+
- no people recognition
|
|
186
|
+
- no marker-free tracking claim
|
|
187
|
+
- no full 3D reconstruction claim
|
|
188
|
+
- no production-factory deployment validation
|
|
189
|
+
- no factory-wide deployment readiness
|
|
190
|
+
|
|
191
|
+
## Relationship to ROS Bags and Logs
|
|
192
|
+
|
|
193
|
+
Robotics teams often debug incidents using recorded sensor data, ROS bags, logs, traces, and simulation replays. Those artifacts are valuable raw evidence. Metriplane is not a replacement for ROS bags or logs. It explores the next structured layer: incident context, evidence bundle, verification result, and generated regression check.
|
|
194
|
+
|
|
195
|
+
## External Feedback
|
|
196
|
+
|
|
197
|
+
External technical feedback and public discussion links are collected on the official site:
|
|
198
|
+
|
|
199
|
+
https://www.metriplane.com/feedback/
|
|
200
|
+
|
|
201
|
+
## Citation / DOI
|
|
202
|
+
|
|
203
|
+
If you use or evaluate Metriplane v0.2.0, cite the archived release:
|
|
204
|
+
|
|
205
|
+
https://doi.org/10.5281/zenodo.20736619
|
|
206
|
+
|
|
207
|
+
## Reproducibility and Archived Release
|
|
208
|
+
|
|
209
|
+
The SoftwareX manuscript evaluates the archived Metriplane v0.2.0 release.
|
|
210
|
+
Reproduction commands, expected outputs, and evidence provenance are documented
|
|
211
|
+
in [docs/softwarex_reproducibility.md](https://github.com/Miko997/metriplane/blob/v0.2.0/docs/softwarex_reproducibility.md).
|
|
212
|
+
|
|
213
|
+
## Repository Orientation
|
|
214
|
+
|
|
215
|
+
The public Python package and command-line entry points remain named `metriplane`.
|
|
216
|
+
|
|
217
|
+
| Area | Path | Purpose |
|
|
218
|
+
|---|---|---|
|
|
219
|
+
| Package | `metriplane/` | Python package and CLI implementation |
|
|
220
|
+
| Domain packs | `configs/domain_packs/` | Workcell-specific Atlas configuration |
|
|
221
|
+
| Demo datasets | `datasets/demo/` | Checked-in replay inputs for reproduction |
|
|
222
|
+
| Evidence | `evidence/` | Release evidence, manifests, and experiment artifacts |
|
|
223
|
+
| Tools | `tools/` | Supported local helper scripts |
|
|
224
|
+
| Docs | `docs/` | Technical documentation and runbooks |
|
|
225
|
+
| Web UI | `web/` | Local operator and review interfaces |
|
|
226
|
+
|
|
227
|
+
## Canonical SoftwareX Commands
|
|
228
|
+
|
|
229
|
+
Use the **Quick Reproduction Path** above for the camera-free core artifact.
|
|
230
|
+
The same commands, expected outputs, evidence provenance, and the separate
|
|
231
|
+
maintainer-gate sequence are maintained in
|
|
232
|
+
[docs/softwarex_reproducibility.md](https://github.com/Miko997/metriplane/blob/v0.2.0/docs/softwarex_reproducibility.md) and the
|
|
233
|
+
[review kit](https://github.com/Miko997/metriplane/blob/v0.2.0/docs/review_kit/00_start_here.md).
|
|
234
|
+
|
|
235
|
+
## Documentation
|
|
236
|
+
|
|
237
|
+
- Atlas evidence workflow: [docs/atlas/README.md](https://github.com/Miko997/metriplane/blob/main/docs/atlas/README.md)
|
|
238
|
+
- Physical observability scope: [docs/physical_observability.md](https://github.com/Miko997/metriplane/blob/main/docs/physical_observability.md)
|
|
239
|
+
- Development setup: [docs/development.md](https://github.com/Miko997/metriplane/blob/main/docs/development.md)
|
|
240
|
+
- Prerequisites: [docs/PREREQUISITES.md](https://github.com/Miko997/metriplane/blob/main/docs/PREREQUISITES.md)
|
|
241
|
+
- SoftwareX reproducibility: [docs/softwarex_reproducibility.md](https://github.com/Miko997/metriplane/blob/v0.2.0/docs/softwarex_reproducibility.md)
|
|
242
|
+
- Evidence matrix: [docs/eval/evidence_matrix.md](https://github.com/Miko997/metriplane/blob/main/docs/eval/evidence_matrix.md)
|
|
243
|
+
- Integration notes: [docs/INTEGRATIONS.md](https://github.com/Miko997/metriplane/blob/main/docs/INTEGRATIONS.md)
|
|
244
|
+
- PyPI release runbook: [docs/releasing.md](https://github.com/Miko997/metriplane/blob/main/docs/releasing.md)
|
|
245
|
+
- Previous detailed README archive: [docs/archive/README_pre_website_refresh.md](https://github.com/Miko997/metriplane/blob/main/docs/archive/README_pre_website_refresh.md)
|
|
246
|
+
|
|
247
|
+
## License
|
|
248
|
+
|
|
249
|
+
MIT License. See [LICENSE](https://github.com/Miko997/metriplane/blob/main/LICENSE).
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
SPDX-FileCopyrightText: 2025-2026 Miko Parkkinen
|
|
3
|
+
SPDX-License-Identifier: MIT
|
|
4
|
+
-->
|
|
5
|
+
|
|
6
|
+
<p align="center">
|
|
7
|
+
<img src="https://raw.githubusercontent.com/Miko997/metriplane/main/docs/assets/metriplane-hero.jpg" alt="Metriplane — replayable physical evidence for workcells" width="100%">
|
|
8
|
+
</p>
|
|
9
|
+
|
|
10
|
+
# Metriplane
|
|
11
|
+
|
|
12
|
+
Open-source workcell black box for replayable physical evidence.
|
|
13
|
+
|
|
14
|
+
[](https://github.com/Miko997/metriplane/blob/main/LICENSE)
|
|
15
|
+
[](https://pypi.org/project/metriplane/)
|
|
16
|
+
[](https://github.com/Miko997/metriplane/releases/tag/v0.2.0)
|
|
17
|
+
[](https://doi.org/10.5281/zenodo.20736619)
|
|
18
|
+
[](https://www.metriplane.com/)
|
|
19
|
+
|
|
20
|
+
## Official Links
|
|
21
|
+
|
|
22
|
+
- Official site: https://www.metriplane.com/
|
|
23
|
+
- Python package: https://pypi.org/project/metriplane/
|
|
24
|
+
- 3-minute v0.2.0 demo: https://www.youtube.com/watch?v=7U5nbBbGGbw
|
|
25
|
+
- v0.2.0 release: https://github.com/Miko997/metriplane/releases/tag/v0.2.0
|
|
26
|
+
- Zenodo DOI: https://doi.org/10.5281/zenodo.20736619
|
|
27
|
+
- External reproduction issue: https://github.com/Miko997/metriplane/issues/6
|
|
28
|
+
- Short feedback form: https://docs.google.com/forms/d/e/1FAIpQLSfnMZ4b3fSVVtwA89hZt3A09gf85eLfhW00FDD76TGRLNpirQ/viewform
|
|
29
|
+
|
|
30
|
+
## Summary
|
|
31
|
+
|
|
32
|
+
Metriplane's frozen v0.2.0 research artifact is an open-source physical-observability system for bounded workcells. It converts replayed or calibrated workcell state into physical event logs, Cell Truth Reports, portable evidence bundles, local bundle verification, and generated regression checks. The v0.2.1 packaging release makes the core Python package and command-line interfaces installable from PyPI without changing the frozen v0.2.0 paper evidence.
|
|
33
|
+
|
|
34
|
+
## Install from PyPI
|
|
35
|
+
|
|
36
|
+
Metriplane requires Python 3.12 or newer.
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
python3.12 -m venv .venv
|
|
40
|
+
source .venv/bin/activate
|
|
41
|
+
python -m pip install --upgrade pip
|
|
42
|
+
python -m pip install "metriplane==0.2.1"
|
|
43
|
+
|
|
44
|
+
metriplane doctor
|
|
45
|
+
metriplane atlas protocol export --out metriplane-protocol
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
The PyPI distribution contains the core Python packages and command-line entry
|
|
49
|
+
points. Repository assets are intentionally not embedded in the wheel:
|
|
50
|
+
|
|
51
|
+
- checked-in demo datasets and domain-pack configurations
|
|
52
|
+
- the local web dashboard
|
|
53
|
+
- maintainer helper scripts
|
|
54
|
+
- frozen paper evidence and reproduction records
|
|
55
|
+
|
|
56
|
+
Use the exact source checkout in the reproduction section below when a command
|
|
57
|
+
refers to `datasets/`, `configs/`, `web/`, `tools/`, or `evidence/`.
|
|
58
|
+
When run from the wheel, doctor warnings about those source-checkout paths are
|
|
59
|
+
expected and do not mean the package installation failed.
|
|
60
|
+
|
|
61
|
+
## Why this exists
|
|
62
|
+
|
|
63
|
+
Robotics teams often need more than raw logs after an incident. Metriplane explores a structured evidence layer where replayed workcell state becomes an inspectable incident bundle, a verification target, and a generated regression check.
|
|
64
|
+
|
|
65
|
+
## Evidence Workflow
|
|
66
|
+
|
|
67
|
+
```text
|
|
68
|
+
replayed workcell state
|
|
69
|
+
→ physical event
|
|
70
|
+
→ incident
|
|
71
|
+
→ Cell Truth Report
|
|
72
|
+
→ evidence bundle
|
|
73
|
+
→ bundle verification
|
|
74
|
+
→ generated regression check
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Current v0.2.0 Evidence Result
|
|
78
|
+
|
|
79
|
+
The author-run evidence package included in the archived release records:
|
|
80
|
+
|
|
81
|
+
- 580 tests passed
|
|
82
|
+
- deterministic replay pass=true
|
|
83
|
+
- 6 physical events
|
|
84
|
+
- 1 incident
|
|
85
|
+
- 35.0 second missing-tool delay
|
|
86
|
+
- bundle verify: pass=true
|
|
87
|
+
- generated regression check: PASS
|
|
88
|
+
|
|
89
|
+
## Quick Reproduction Path
|
|
90
|
+
|
|
91
|
+
The core SoftwareX reproduction is camera-free, uses the exact `v0.2.0` tag,
|
|
92
|
+
and writes rerun outputs to temporary directories rather than the archived
|
|
93
|
+
evidence package.
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
git clone --branch v0.2.0 --depth 1 https://github.com/Miko997/metriplane.git
|
|
97
|
+
cd metriplane
|
|
98
|
+
|
|
99
|
+
python3 -m venv .venv
|
|
100
|
+
source .venv/bin/activate
|
|
101
|
+
python -m pip install --upgrade pip
|
|
102
|
+
python -m pip install -e .
|
|
103
|
+
|
|
104
|
+
python -m metriplane.cli doctor
|
|
105
|
+
|
|
106
|
+
RUNS=/tmp/metriplane-softwarex-runs \
|
|
107
|
+
./tools/mp.sh deterministic-replay datasets/demo/session_001.jsonl
|
|
108
|
+
|
|
109
|
+
metriplane atlas validate-pack configs/domain_packs/assembly_cell
|
|
110
|
+
metriplane atlas run \
|
|
111
|
+
--session-jsonl datasets/demo/atlas/assembly_cell_missing_tool.jsonl \
|
|
112
|
+
--pack configs/domain_packs/assembly_cell \
|
|
113
|
+
--out /tmp/metriplane-softwarex-atlas \
|
|
114
|
+
--overwrite
|
|
115
|
+
|
|
116
|
+
metriplane atlas bundle verify \
|
|
117
|
+
/tmp/metriplane-softwarex-atlas/evidence_bundles/INC-0001.zip
|
|
118
|
+
|
|
119
|
+
metriplane atlas test \
|
|
120
|
+
/tmp/metriplane-softwarex-atlas/regression_tests/INC-0001.yaml \
|
|
121
|
+
--json
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
The full maintainer gate is separate from the core artifact path and adds test
|
|
125
|
+
and browser dependencies:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
python -m pip install -e .
|
|
129
|
+
python -m pip install pytest playwright
|
|
130
|
+
python -m playwright install chromium --with-deps
|
|
131
|
+
PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 python -m pytest -q
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## What Metriplane Is
|
|
135
|
+
|
|
136
|
+
- observe-only
|
|
137
|
+
- local-first
|
|
138
|
+
- replay-first, camera-compatible
|
|
139
|
+
- bounded workcell scoped
|
|
140
|
+
- research-software oriented
|
|
141
|
+
- focused on evidence, not robot control
|
|
142
|
+
|
|
143
|
+
## What Metriplane Does Not Claim
|
|
144
|
+
|
|
145
|
+
- no robot or machine control
|
|
146
|
+
- no safety certification
|
|
147
|
+
- no quality-release approval
|
|
148
|
+
- no people recognition
|
|
149
|
+
- no marker-free tracking claim
|
|
150
|
+
- no full 3D reconstruction claim
|
|
151
|
+
- no production-factory deployment validation
|
|
152
|
+
- no factory-wide deployment readiness
|
|
153
|
+
|
|
154
|
+
## Relationship to ROS Bags and Logs
|
|
155
|
+
|
|
156
|
+
Robotics teams often debug incidents using recorded sensor data, ROS bags, logs, traces, and simulation replays. Those artifacts are valuable raw evidence. Metriplane is not a replacement for ROS bags or logs. It explores the next structured layer: incident context, evidence bundle, verification result, and generated regression check.
|
|
157
|
+
|
|
158
|
+
## External Feedback
|
|
159
|
+
|
|
160
|
+
External technical feedback and public discussion links are collected on the official site:
|
|
161
|
+
|
|
162
|
+
https://www.metriplane.com/feedback/
|
|
163
|
+
|
|
164
|
+
## Citation / DOI
|
|
165
|
+
|
|
166
|
+
If you use or evaluate Metriplane v0.2.0, cite the archived release:
|
|
167
|
+
|
|
168
|
+
https://doi.org/10.5281/zenodo.20736619
|
|
169
|
+
|
|
170
|
+
## Reproducibility and Archived Release
|
|
171
|
+
|
|
172
|
+
The SoftwareX manuscript evaluates the archived Metriplane v0.2.0 release.
|
|
173
|
+
Reproduction commands, expected outputs, and evidence provenance are documented
|
|
174
|
+
in [docs/softwarex_reproducibility.md](https://github.com/Miko997/metriplane/blob/v0.2.0/docs/softwarex_reproducibility.md).
|
|
175
|
+
|
|
176
|
+
## Repository Orientation
|
|
177
|
+
|
|
178
|
+
The public Python package and command-line entry points remain named `metriplane`.
|
|
179
|
+
|
|
180
|
+
| Area | Path | Purpose |
|
|
181
|
+
|---|---|---|
|
|
182
|
+
| Package | `metriplane/` | Python package and CLI implementation |
|
|
183
|
+
| Domain packs | `configs/domain_packs/` | Workcell-specific Atlas configuration |
|
|
184
|
+
| Demo datasets | `datasets/demo/` | Checked-in replay inputs for reproduction |
|
|
185
|
+
| Evidence | `evidence/` | Release evidence, manifests, and experiment artifacts |
|
|
186
|
+
| Tools | `tools/` | Supported local helper scripts |
|
|
187
|
+
| Docs | `docs/` | Technical documentation and runbooks |
|
|
188
|
+
| Web UI | `web/` | Local operator and review interfaces |
|
|
189
|
+
|
|
190
|
+
## Canonical SoftwareX Commands
|
|
191
|
+
|
|
192
|
+
Use the **Quick Reproduction Path** above for the camera-free core artifact.
|
|
193
|
+
The same commands, expected outputs, evidence provenance, and the separate
|
|
194
|
+
maintainer-gate sequence are maintained in
|
|
195
|
+
[docs/softwarex_reproducibility.md](https://github.com/Miko997/metriplane/blob/v0.2.0/docs/softwarex_reproducibility.md) and the
|
|
196
|
+
[review kit](https://github.com/Miko997/metriplane/blob/v0.2.0/docs/review_kit/00_start_here.md).
|
|
197
|
+
|
|
198
|
+
## Documentation
|
|
199
|
+
|
|
200
|
+
- Atlas evidence workflow: [docs/atlas/README.md](https://github.com/Miko997/metriplane/blob/main/docs/atlas/README.md)
|
|
201
|
+
- Physical observability scope: [docs/physical_observability.md](https://github.com/Miko997/metriplane/blob/main/docs/physical_observability.md)
|
|
202
|
+
- Development setup: [docs/development.md](https://github.com/Miko997/metriplane/blob/main/docs/development.md)
|
|
203
|
+
- Prerequisites: [docs/PREREQUISITES.md](https://github.com/Miko997/metriplane/blob/main/docs/PREREQUISITES.md)
|
|
204
|
+
- SoftwareX reproducibility: [docs/softwarex_reproducibility.md](https://github.com/Miko997/metriplane/blob/v0.2.0/docs/softwarex_reproducibility.md)
|
|
205
|
+
- Evidence matrix: [docs/eval/evidence_matrix.md](https://github.com/Miko997/metriplane/blob/main/docs/eval/evidence_matrix.md)
|
|
206
|
+
- Integration notes: [docs/INTEGRATIONS.md](https://github.com/Miko997/metriplane/blob/main/docs/INTEGRATIONS.md)
|
|
207
|
+
- PyPI release runbook: [docs/releasing.md](https://github.com/Miko997/metriplane/blob/main/docs/releasing.md)
|
|
208
|
+
- Previous detailed README archive: [docs/archive/README_pre_website_refresh.md](https://github.com/Miko997/metriplane/blob/main/docs/archive/README_pre_website_refresh.md)
|
|
209
|
+
|
|
210
|
+
## License
|
|
211
|
+
|
|
212
|
+
MIT License. See [LICENSE](https://github.com/Miko997/metriplane/blob/main/LICENSE).
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# SPDX-FileCopyrightText: 2025-2026 Miko Parkkinen
|
|
3
|
+
# SPDX-License-Identifier: MIT
|
|
4
|
+
|
|
5
|
+
"""Open a Metriplane USD replay inside Isaac Sim (requires Isaac/omni.isaac).
|
|
6
|
+
|
|
7
|
+
This is a thin loader: it exports the .usda (via metriplane_to_usd) if needed, then opens
|
|
8
|
+
it in an Isaac Sim stage. It is intentionally guarded so importing this module never fails
|
|
9
|
+
on machines without NVIDIA software.
|
|
10
|
+
|
|
11
|
+
Usage (inside an Isaac Sim Python environment):
|
|
12
|
+
python integrations/isaac/metriplane_isaac_replay.py --run-dir runs/<id>
|
|
13
|
+
"""
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
import argparse
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def open_in_isaac(usda_path: str | Path) -> None: # pragma: no cover - needs Isaac
|
|
21
|
+
try:
|
|
22
|
+
from omni.isaac.kit import SimulationApp
|
|
23
|
+
except Exception as e:
|
|
24
|
+
raise SystemExit(
|
|
25
|
+
"Isaac Sim not available in this environment. Export the .usda with "
|
|
26
|
+
"metriplane_to_usd.py and open it manually in Omniverse/Isaac.\n"
|
|
27
|
+
f"(import error: {e})")
|
|
28
|
+
sim = SimulationApp({"headless": False})
|
|
29
|
+
import omni.usd
|
|
30
|
+
omni.usd.get_context().open_stage(str(usda_path))
|
|
31
|
+
while sim.is_running():
|
|
32
|
+
sim.update()
|
|
33
|
+
sim.close()
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def main(argv: list[str] | None = None) -> int: # pragma: no cover
|
|
37
|
+
p = argparse.ArgumentParser("metriplane_isaac_replay")
|
|
38
|
+
p.add_argument("--run-dir", required=True)
|
|
39
|
+
p.add_argument("--usda", default=None)
|
|
40
|
+
args = p.parse_args(argv)
|
|
41
|
+
|
|
42
|
+
usda = args.usda
|
|
43
|
+
if usda is None:
|
|
44
|
+
from integrations.isaac.metriplane_to_usd import write_usda_replay
|
|
45
|
+
usda = str(Path(args.run_dir) / "isaac" / "metriplane_replay.usda")
|
|
46
|
+
write_usda_replay(run_dir=args.run_dir, output_path=usda)
|
|
47
|
+
open_in_isaac(usda)
|
|
48
|
+
return 0
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
if __name__ == "__main__":
|
|
52
|
+
raise SystemExit(main())
|