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.
Files changed (249) hide show
  1. metriplane-0.2.1/LICENSE +21 -0
  2. metriplane-0.2.1/NOTICE +4 -0
  3. metriplane-0.2.1/PKG-INFO +249 -0
  4. metriplane-0.2.1/README.md +212 -0
  5. metriplane-0.2.1/integrations/__init__.py +2 -0
  6. metriplane-0.2.1/integrations/isaac/__init__.py +2 -0
  7. metriplane-0.2.1/integrations/isaac/metriplane_isaac_replay.py +52 -0
  8. metriplane-0.2.1/integrations/isaac/metriplane_to_usd.py +240 -0
  9. metriplane-0.2.1/integrations/omniverse/__init__.py +2 -0
  10. metriplane-0.2.1/integrations/omniverse/metriplane_usd_replay.py +36 -0
  11. metriplane-0.2.1/integrations/ros2/metriplane_ros/launch/bridge.launch.py +31 -0
  12. metriplane-0.2.1/integrations/ros2/metriplane_ros/metriplane_ros/__init__.py +4 -0
  13. metriplane-0.2.1/integrations/ros2/metriplane_ros/metriplane_ros/bridge_node.py +127 -0
  14. metriplane-0.2.1/integrations/ros2/metriplane_ros/metriplane_ros/msg_adapters.py +57 -0
  15. metriplane-0.2.1/integrations/ros2/metriplane_ros/setup.py +29 -0
  16. metriplane-0.2.1/integrations/ros2/metriplane_ros/tests/test_msg_adapters.py +57 -0
  17. metriplane-0.2.1/metriplane/__init__.py +8 -0
  18. metriplane-0.2.1/metriplane/assistant/__init__.py +4 -0
  19. metriplane-0.2.1/metriplane/assistant/answer.py +154 -0
  20. metriplane-0.2.1/metriplane/assistant/citations.py +37 -0
  21. metriplane-0.2.1/metriplane/assistant/cli.py +47 -0
  22. metriplane-0.2.1/metriplane/assistant/intents.py +40 -0
  23. metriplane-0.2.1/metriplane/assistant/models.py +47 -0
  24. metriplane-0.2.1/metriplane/assistant/providers.py +16 -0
  25. metriplane-0.2.1/metriplane/assistant/retrieval.py +107 -0
  26. metriplane-0.2.1/metriplane/atlas/__init__.py +6 -0
  27. metriplane-0.2.1/metriplane/atlas/bench.py +40 -0
  28. metriplane-0.2.1/metriplane/atlas/bundles.py +202 -0
  29. metriplane-0.2.1/metriplane/atlas/cli.py +394 -0
  30. metriplane-0.2.1/metriplane/atlas/connectors.py +85 -0
  31. metriplane-0.2.1/metriplane/atlas/dashboard.py +177 -0
  32. metriplane-0.2.1/metriplane/atlas/domain_packs.py +102 -0
  33. metriplane-0.2.1/metriplane/atlas/edge.py +61 -0
  34. metriplane-0.2.1/metriplane/atlas/event_ledger.py +47 -0
  35. metriplane-0.2.1/metriplane/atlas/evidence_lake.py +169 -0
  36. metriplane-0.2.1/metriplane/atlas/freeze.py +87 -0
  37. metriplane-0.2.1/metriplane/atlas/improvement.py +66 -0
  38. metriplane-0.2.1/metriplane/atlas/models.py +253 -0
  39. metriplane-0.2.1/metriplane/atlas/multicell.py +47 -0
  40. metriplane-0.2.1/metriplane/atlas/pilot.py +73 -0
  41. metriplane-0.2.1/metriplane/atlas/privacy.py +91 -0
  42. metriplane-0.2.1/metriplane/atlas/process_model.py +237 -0
  43. metriplane-0.2.1/metriplane/atlas/protocol.py +64 -0
  44. metriplane-0.2.1/metriplane/atlas/query.py +78 -0
  45. metriplane-0.2.1/metriplane/atlas/reality_graph.py +163 -0
  46. metriplane-0.2.1/metriplane/atlas/regression.py +149 -0
  47. metriplane-0.2.1/metriplane/atlas/reports.py +219 -0
  48. metriplane-0.2.1/metriplane/atlas/runtime.py +312 -0
  49. metriplane-0.2.1/metriplane/atlas/training.py +66 -0
  50. metriplane-0.2.1/metriplane/atlas/usd.py +112 -0
  51. metriplane-0.2.1/metriplane/atlas/validation.py +14 -0
  52. metriplane-0.2.1/metriplane/backends/aruco_backend.py +43 -0
  53. metriplane-0.2.1/metriplane/calibration/__init__.py +9 -0
  54. metriplane-0.2.1/metriplane/calibration/camera.py +70 -0
  55. metriplane-0.2.1/metriplane/calibration/intrinsics.py +264 -0
  56. metriplane-0.2.1/metriplane/camera/rtsp.py +40 -0
  57. metriplane-0.2.1/metriplane/camera/usb.py +40 -0
  58. metriplane-0.2.1/metriplane/camera/usb_multi.py +223 -0
  59. metriplane-0.2.1/metriplane/camera/v4l_resolve.py +51 -0
  60. metriplane-0.2.1/metriplane/camera_trust/__init__.py +4 -0
  61. metriplane-0.2.1/metriplane/camera_trust/analyzer.py +176 -0
  62. metriplane-0.2.1/metriplane/camera_trust/cli.py +33 -0
  63. metriplane-0.2.1/metriplane/camera_trust/export.py +20 -0
  64. metriplane-0.2.1/metriplane/camera_trust/models.py +39 -0
  65. metriplane-0.2.1/metriplane/camera_trust/recommendations.py +41 -0
  66. metriplane-0.2.1/metriplane/cli.py +459 -0
  67. metriplane-0.2.1/metriplane/compute/__init__.py +15 -0
  68. metriplane-0.2.1/metriplane/compute/cpu_numpy.py +80 -0
  69. metriplane-0.2.1/metriplane/compute/gpu_cupy.py +133 -0
  70. metriplane-0.2.1/metriplane/compute/interface.py +141 -0
  71. metriplane-0.2.1/metriplane/compute/select.py +186 -0
  72. metriplane-0.2.1/metriplane/config/__init__.py +40 -0
  73. metriplane-0.2.1/metriplane/config/models.py +16 -0
  74. metriplane-0.2.1/metriplane/config/profile.py +56 -0
  75. metriplane-0.2.1/metriplane/config.py +592 -0
  76. metriplane-0.2.1/metriplane/contracts/__init__.py +4 -0
  77. metriplane-0.2.1/metriplane/contracts/cli.py +91 -0
  78. metriplane-0.2.1/metriplane/contracts/engine.py +367 -0
  79. metriplane-0.2.1/metriplane/contracts/evaluate.py +27 -0
  80. metriplane-0.2.1/metriplane/contracts/expectations.py +66 -0
  81. metriplane-0.2.1/metriplane/contracts/load.py +32 -0
  82. metriplane-0.2.1/metriplane/contracts/models.py +110 -0
  83. metriplane-0.2.1/metriplane/contracts/validate.py +36 -0
  84. metriplane-0.2.1/metriplane/counterfactuals/__init__.py +4 -0
  85. metriplane-0.2.1/metriplane/counterfactuals/cli.py +69 -0
  86. metriplane-0.2.1/metriplane/counterfactuals/evaluator.py +139 -0
  87. metriplane-0.2.1/metriplane/counterfactuals/models.py +43 -0
  88. metriplane-0.2.1/metriplane/counterfactuals/report.py +52 -0
  89. metriplane-0.2.1/metriplane/counterfactuals/rule_sweep.py +47 -0
  90. metriplane-0.2.1/metriplane/counterfactuals/transforms.py +72 -0
  91. metriplane-0.2.1/metriplane/exporters/__init__.py +4 -0
  92. metriplane-0.2.1/metriplane/exporters/base.py +72 -0
  93. metriplane-0.2.1/metriplane/exporters/kafka.py +51 -0
  94. metriplane-0.2.1/metriplane/exporters/mqtt.py +52 -0
  95. metriplane-0.2.1/metriplane/exporters/parquet.py +112 -0
  96. metriplane-0.2.1/metriplane/exporters/webhook.py +40 -0
  97. metriplane-0.2.1/metriplane/fleet/__init__.py +4 -0
  98. metriplane-0.2.1/metriplane/fleet/agent.py +119 -0
  99. metriplane-0.2.1/metriplane/fleet/exporters.py +65 -0
  100. metriplane-0.2.1/metriplane/fleet/heartbeat.py +28 -0
  101. metriplane-0.2.1/metriplane/forecasting/__init__.py +4 -0
  102. metriplane-0.2.1/metriplane/forecasting/engine.py +214 -0
  103. metriplane-0.2.1/metriplane/forecasting/export.py +25 -0
  104. metriplane-0.2.1/metriplane/forecasting/models.py +40 -0
  105. metriplane-0.2.1/metriplane/forecasting/projector.py +30 -0
  106. metriplane-0.2.1/metriplane/forecasting/velocity.py +78 -0
  107. metriplane-0.2.1/metriplane/fusion/__init__.py +4 -0
  108. metriplane-0.2.1/metriplane/fusion/fuse_xy.py +49 -0
  109. metriplane-0.2.1/metriplane/fusion/kalman_cv.py +132 -0
  110. metriplane-0.2.1/metriplane/launcher.py +824 -0
  111. metriplane-0.2.1/metriplane/logging.py +10 -0
  112. metriplane-0.2.1/metriplane/mapping/__init__.py +4 -0
  113. metriplane-0.2.1/metriplane/mapping/planar.py +135 -0
  114. metriplane-0.2.1/metriplane/mapping/planar_multi.py +79 -0
  115. metriplane-0.2.1/metriplane/metrics.py +312 -0
  116. metriplane-0.2.1/metriplane/models.py +12 -0
  117. metriplane-0.2.1/metriplane/observability/__init__.py +6 -0
  118. metriplane-0.2.1/metriplane/observability/timing.py +460 -0
  119. metriplane-0.2.1/metriplane/overlay.py +123 -0
  120. metriplane-0.2.1/metriplane/pipeline/__init__.py +24 -0
  121. metriplane-0.2.1/metriplane/pipeline/bounded_queue.py +289 -0
  122. metriplane-0.2.1/metriplane/pipeline/runtime_threaded.py +233 -0
  123. metriplane-0.2.1/metriplane/preview/live_preview.py +81 -0
  124. metriplane-0.2.1/metriplane/provenance/__init__.py +4 -0
  125. metriplane-0.2.1/metriplane/provenance/run_provenance.py +369 -0
  126. metriplane-0.2.1/metriplane/recording/__init__.py +4 -0
  127. metriplane-0.2.1/metriplane/recording/jsonl.py +40 -0
  128. metriplane-0.2.1/metriplane/replay/compare_determinism.py +277 -0
  129. metriplane-0.2.1/metriplane/replay/engine.py +169 -0
  130. metriplane-0.2.1/metriplane/run.py +1323 -0
  131. metriplane-0.2.1/metriplane/run_fusion.py +992 -0
  132. metriplane-0.2.1/metriplane/runner/__init__.py +11 -0
  133. metriplane-0.2.1/metriplane/runner/allowlist.py +393 -0
  134. metriplane-0.2.1/metriplane/runner/cli_command_center.py +42 -0
  135. metriplane-0.2.1/metriplane/runner/command_center_api.py +284 -0
  136. metriplane-0.2.1/metriplane/runner/executor.py +328 -0
  137. metriplane-0.2.1/metriplane/runner/operator_api.py +1241 -0
  138. metriplane-0.2.1/metriplane/runner/service.py +378 -0
  139. metriplane-0.2.1/metriplane/schema.py +56 -0
  140. metriplane-0.2.1/metriplane/sentinel/__init__.py +4 -0
  141. metriplane-0.2.1/metriplane/sentinel/bundles.py +259 -0
  142. metriplane-0.2.1/metriplane/sentinel/cli_incidents.py +141 -0
  143. metriplane-0.2.1/metriplane/sentinel/cli_query.py +98 -0
  144. metriplane-0.2.1/metriplane/sentinel/cli_registry.py +47 -0
  145. metriplane-0.2.1/metriplane/sentinel/cli_rules.py +61 -0
  146. metriplane-0.2.1/metriplane/sentinel/cli_runtime.py +105 -0
  147. metriplane-0.2.1/metriplane/sentinel/config.py +56 -0
  148. metriplane-0.2.1/metriplane/sentinel/engine.py +232 -0
  149. metriplane-0.2.1/metriplane/sentinel/events.py +100 -0
  150. metriplane-0.2.1/metriplane/sentinel/export.py +21 -0
  151. metriplane-0.2.1/metriplane/sentinel/incidents.py +114 -0
  152. metriplane-0.2.1/metriplane/sentinel/registry.py +65 -0
  153. metriplane-0.2.1/metriplane/sentinel/rules.py +81 -0
  154. metriplane-0.2.1/metriplane/sentinel/runtime.py +250 -0
  155. metriplane-0.2.1/metriplane/sentinel/status.py +23 -0
  156. metriplane-0.2.1/metriplane/state.py +30 -0
  157. metriplane-0.2.1/metriplane/streaming/ws_server.py +69 -0
  158. metriplane-0.2.1/metriplane/streaming/ws_thread.py +66 -0
  159. metriplane-0.2.1/metriplane/system/fault_injection.py +73 -0
  160. metriplane-0.2.1/metriplane/system/health.py +32 -0
  161. metriplane-0.2.1/metriplane/system/health_registry.py +131 -0
  162. metriplane-0.2.1/metriplane/testing/__init__.py +4 -0
  163. metriplane-0.2.1/metriplane/testing/cli.py +39 -0
  164. metriplane-0.2.1/metriplane/testing/compare.py +86 -0
  165. metriplane-0.2.1/metriplane/testing/hash.py +29 -0
  166. metriplane-0.2.1/metriplane/testing/load_expected.py +24 -0
  167. metriplane-0.2.1/metriplane/testing/models.py +59 -0
  168. metriplane-0.2.1/metriplane/testing/report.py +51 -0
  169. metriplane-0.2.1/metriplane/testing/runner.py +115 -0
  170. metriplane-0.2.1/metriplane/time/clock.py +82 -0
  171. metriplane-0.2.1/metriplane/trace/__init__.py +4 -0
  172. metriplane-0.2.1/metriplane/trace/cli_traces.py +62 -0
  173. metriplane-0.2.1/metriplane/trace/store.py +217 -0
  174. metriplane-0.2.1/metriplane/tracking.py +45 -0
  175. metriplane-0.2.1/metriplane/video_overlay.py +226 -0
  176. metriplane-0.2.1/metriplane/zone_analytics.py +230 -0
  177. metriplane-0.2.1/metriplane/zones.py +142 -0
  178. metriplane-0.2.1/metriplane.egg-info/PKG-INFO +249 -0
  179. metriplane-0.2.1/metriplane.egg-info/SOURCES.txt +247 -0
  180. metriplane-0.2.1/metriplane.egg-info/dependency_links.txt +1 -0
  181. metriplane-0.2.1/metriplane.egg-info/entry_points.txt +3 -0
  182. metriplane-0.2.1/metriplane.egg-info/requires.txt +22 -0
  183. metriplane-0.2.1/metriplane.egg-info/top_level.txt +2 -0
  184. metriplane-0.2.1/pyproject.toml +92 -0
  185. metriplane-0.2.1/setup.cfg +4 -0
  186. metriplane-0.2.1/tests/test_assistant_answer.py +60 -0
  187. metriplane-0.2.1/tests/test_assistant_citations.py +54 -0
  188. metriplane-0.2.1/tests/test_assistant_intents.py +34 -0
  189. metriplane-0.2.1/tests/test_assistant_retrieval.py +56 -0
  190. metriplane-0.2.1/tests/test_atlas_core.py +224 -0
  191. metriplane-0.2.1/tests/test_atlas_late_phases.py +159 -0
  192. metriplane-0.2.1/tests/test_camera_trust_analyzer.py +51 -0
  193. metriplane-0.2.1/tests/test_camera_trust_models.py +37 -0
  194. metriplane-0.2.1/tests/test_camera_trust_recommendations.py +47 -0
  195. metriplane-0.2.1/tests/test_cli_doctor.py +36 -0
  196. metriplane-0.2.1/tests/test_compute_select.py +16 -0
  197. metriplane-0.2.1/tests/test_contract_cli.py +60 -0
  198. metriplane-0.2.1/tests/test_contract_engine.py +168 -0
  199. metriplane-0.2.1/tests/test_contract_loader.py +62 -0
  200. metriplane-0.2.1/tests/test_contract_models.py +85 -0
  201. metriplane-0.2.1/tests/test_counterfactual_evaluator.py +116 -0
  202. metriplane-0.2.1/tests/test_counterfactual_models.py +41 -0
  203. metriplane-0.2.1/tests/test_counterfactual_rule_sweep.py +50 -0
  204. metriplane-0.2.1/tests/test_counterfactual_transforms.py +71 -0
  205. metriplane-0.2.1/tests/test_edge_latency.py +29 -0
  206. metriplane-0.2.1/tests/test_evidence_bundles.py +149 -0
  207. metriplane-0.2.1/tests/test_exporters.py +83 -0
  208. metriplane-0.2.1/tests/test_fault_injection.py +27 -0
  209. metriplane-0.2.1/tests/test_fleet_agent.py +84 -0
  210. metriplane-0.2.1/tests/test_forecasting_engine.py +136 -0
  211. metriplane-0.2.1/tests/test_forecasting_projector.py +38 -0
  212. metriplane-0.2.1/tests/test_forecasting_runtime.py +44 -0
  213. metriplane-0.2.1/tests/test_forecasting_velocity.py +75 -0
  214. metriplane-0.2.1/tests/test_gpu_equivalence_extended.py +71 -0
  215. metriplane-0.2.1/tests/test_health_registry.py +35 -0
  216. metriplane-0.2.1/tests/test_incident_engine.py +110 -0
  217. metriplane-0.2.1/tests/test_launcher.py +611 -0
  218. metriplane-0.2.1/tests/test_list_cameras.py +379 -0
  219. metriplane-0.2.1/tests/test_m9_4_provenance.py +60 -0
  220. metriplane-0.2.1/tests/test_mapping_planar.py +29 -0
  221. metriplane-0.2.1/tests/test_metrics_cors.py +216 -0
  222. metriplane-0.2.1/tests/test_metriplane_bench.py +89 -0
  223. metriplane-0.2.1/tests/test_object_registry.py +133 -0
  224. metriplane-0.2.1/tests/test_operator_alignment.py +236 -0
  225. metriplane-0.2.1/tests/test_operator_camera_resolve.py +161 -0
  226. metriplane-0.2.1/tests/test_operator_command_center_api.py +110 -0
  227. metriplane-0.2.1/tests/test_operator_command_center_endpoints.py +161 -0
  228. metriplane-0.2.1/tests/test_operator_config_schema.py +239 -0
  229. metriplane-0.2.1/tests/test_operator_python_exe.py +444 -0
  230. metriplane-0.2.1/tests/test_physical_compare.py +86 -0
  231. metriplane-0.2.1/tests/test_physical_expected_models.py +69 -0
  232. metriplane-0.2.1/tests/test_physical_regression_runner.py +77 -0
  233. metriplane-0.2.1/tests/test_placeholder.py +5 -0
  234. metriplane-0.2.1/tests/test_query_cli.py +164 -0
  235. metriplane-0.2.1/tests/test_record_replay.py +12 -0
  236. metriplane-0.2.1/tests/test_release_fixture_integrity.py +60 -0
  237. metriplane-0.2.1/tests/test_ros2_msg_adapters.py +56 -0
  238. metriplane-0.2.1/tests/test_ros2_packaging.py +77 -0
  239. metriplane-0.2.1/tests/test_rule_engine.py +258 -0
  240. metriplane-0.2.1/tests/test_schema.py +16 -0
  241. metriplane-0.2.1/tests/test_sentinel_config.py +46 -0
  242. metriplane-0.2.1/tests/test_sentinel_events.py +215 -0
  243. metriplane-0.2.1/tests/test_sentinel_export.py +89 -0
  244. metriplane-0.2.1/tests/test_sentinel_status.py +61 -0
  245. metriplane-0.2.1/tests/test_trace_store.py +136 -0
  246. metriplane-0.2.1/tests/test_usd_export_adapter.py +82 -0
  247. metriplane-0.2.1/tests/test_ws_server_import.py +7 -0
  248. metriplane-0.2.1/tests/test_zone_analytics.py +55 -0
  249. metriplane-0.2.1/tests/test_zones.py +20 -0
@@ -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.
@@ -0,0 +1,4 @@
1
+ MetriPlane
2
+ Copyright (c) 2025-2026 Miko Parkkinen
3
+
4
+ MetriPlane is released under the MIT License. See LICENSE.
@@ -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
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/Miko997/metriplane/blob/main/LICENSE)
52
+ [![PyPI version](https://img.shields.io/pypi/v/metriplane.svg)](https://pypi.org/project/metriplane/)
53
+ [![Research release: v0.2.0](https://img.shields.io/badge/research%20release-v0.2.0-blue)](https://github.com/Miko997/metriplane/releases/tag/v0.2.0)
54
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.20736619.svg)](https://doi.org/10.5281/zenodo.20736619)
55
+ [![Website](https://img.shields.io/badge/website-metriplane.com-2ea44f)](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
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/Miko997/metriplane/blob/main/LICENSE)
15
+ [![PyPI version](https://img.shields.io/pypi/v/metriplane.svg)](https://pypi.org/project/metriplane/)
16
+ [![Research release: v0.2.0](https://img.shields.io/badge/research%20release-v0.2.0-blue)](https://github.com/Miko997/metriplane/releases/tag/v0.2.0)
17
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.20736619.svg)](https://doi.org/10.5281/zenodo.20736619)
18
+ [![Website](https://img.shields.io/badge/website-metriplane.com-2ea44f)](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,2 @@
1
+ # SPDX-FileCopyrightText: 2025-2026 Miko Parkkinen
2
+ # SPDX-License-Identifier: MIT
@@ -0,0 +1,2 @@
1
+ # SPDX-FileCopyrightText: 2025-2026 Miko Parkkinen
2
+ # SPDX-License-Identifier: MIT
@@ -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())