antioch-py 2.0.6__py3-none-any.whl → 3.0.12__py3-none-any.whl

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.

Potentially problematic release.


This version of antioch-py might be problematic. Click here for more details.

Files changed (109) hide show
  1. antioch/__init__.py +101 -0
  2. antioch/{module/execution.py → execution.py} +1 -1
  3. antioch/{module/input.py → input.py} +2 -4
  4. antioch/{module/module.py → module.py} +17 -34
  5. antioch/{module/node.py → node.py} +17 -16
  6. {antioch_py-2.0.6.dist-info → antioch_py-3.0.12.dist-info}/METADATA +8 -11
  7. antioch_py-3.0.12.dist-info/RECORD +61 -0
  8. {antioch_py-2.0.6.dist-info → antioch_py-3.0.12.dist-info}/WHEEL +1 -1
  9. antioch_py-3.0.12.dist-info/licenses/LICENSE +21 -0
  10. common/ark/__init__.py +6 -16
  11. common/ark/ark.py +23 -60
  12. common/ark/hardware.py +13 -37
  13. common/ark/kinematics.py +1 -1
  14. common/ark/module.py +22 -0
  15. common/ark/node.py +46 -3
  16. common/ark/scheduler.py +2 -29
  17. common/ark/sim.py +1 -1
  18. {antioch/module → common/ark}/token.py +17 -0
  19. common/assets/rigging.usd +0 -0
  20. common/constants.py +83 -4
  21. common/core/__init__.py +37 -24
  22. common/core/auth.py +87 -114
  23. common/core/container.py +261 -0
  24. common/core/registry.py +131 -152
  25. common/core/rome.py +251 -0
  26. common/core/telemetry.py +176 -0
  27. common/core/types.py +219 -0
  28. common/message/__init__.py +19 -3
  29. common/message/annotation.py +174 -23
  30. common/message/array.py +25 -1
  31. common/message/camera.py +23 -1
  32. common/message/color.py +32 -6
  33. common/message/detection.py +40 -0
  34. common/message/foxglove.py +20 -0
  35. common/message/frame.py +71 -7
  36. common/message/image.py +58 -9
  37. common/message/imu.py +24 -4
  38. common/message/joint.py +69 -10
  39. common/message/log.py +52 -7
  40. common/message/pir.py +22 -5
  41. common/message/plot.py +57 -0
  42. common/message/point.py +55 -6
  43. common/message/point_cloud.py +55 -19
  44. common/message/pose.py +59 -19
  45. common/message/quaternion.py +105 -92
  46. common/message/radar.py +195 -29
  47. common/message/twist.py +34 -0
  48. common/message/types.py +40 -5
  49. common/message/vector.py +180 -245
  50. common/sim/__init__.py +49 -0
  51. common/sim/objects.py +460 -0
  52. common/sim/state.py +11 -0
  53. common/utils/comms.py +30 -12
  54. common/utils/logger.py +26 -7
  55. antioch/message.py +0 -87
  56. antioch/module/__init__.py +0 -53
  57. antioch/session/__init__.py +0 -150
  58. antioch/session/ark.py +0 -504
  59. antioch/session/asset.py +0 -65
  60. antioch/session/error.py +0 -80
  61. antioch/session/record.py +0 -158
  62. antioch/session/scene.py +0 -1521
  63. antioch/session/session.py +0 -220
  64. antioch/session/task.py +0 -323
  65. antioch/session/views/__init__.py +0 -40
  66. antioch/session/views/animation.py +0 -189
  67. antioch/session/views/articulation.py +0 -245
  68. antioch/session/views/basis_curve.py +0 -186
  69. antioch/session/views/camera.py +0 -92
  70. antioch/session/views/collision.py +0 -75
  71. antioch/session/views/geometry.py +0 -74
  72. antioch/session/views/ground_plane.py +0 -63
  73. antioch/session/views/imu.py +0 -73
  74. antioch/session/views/joint.py +0 -64
  75. antioch/session/views/light.py +0 -175
  76. antioch/session/views/pir_sensor.py +0 -140
  77. antioch/session/views/radar.py +0 -73
  78. antioch/session/views/rigid_body.py +0 -282
  79. antioch/session/views/xform.py +0 -119
  80. antioch_py-2.0.6.dist-info/RECORD +0 -99
  81. antioch_py-2.0.6.dist-info/entry_points.txt +0 -2
  82. common/core/agent.py +0 -296
  83. common/core/task.py +0 -36
  84. common/rome/__init__.py +0 -9
  85. common/rome/client.py +0 -430
  86. common/rome/error.py +0 -16
  87. common/session/__init__.py +0 -54
  88. common/session/environment.py +0 -31
  89. common/session/sim.py +0 -240
  90. common/session/views/__init__.py +0 -263
  91. common/session/views/animation.py +0 -73
  92. common/session/views/articulation.py +0 -184
  93. common/session/views/basis_curve.py +0 -102
  94. common/session/views/camera.py +0 -147
  95. common/session/views/collision.py +0 -59
  96. common/session/views/geometry.py +0 -102
  97. common/session/views/ground_plane.py +0 -41
  98. common/session/views/imu.py +0 -66
  99. common/session/views/joint.py +0 -81
  100. common/session/views/light.py +0 -96
  101. common/session/views/pir_sensor.py +0 -115
  102. common/session/views/radar.py +0 -82
  103. common/session/views/rigid_body.py +0 -236
  104. common/session/views/viewport.py +0 -21
  105. common/session/views/xform.py +0 -39
  106. common/utils/usd.py +0 -12
  107. /antioch/{module/clock.py → clock.py} +0 -0
  108. {antioch_py-2.0.6.dist-info → antioch_py-3.0.12.dist-info}/top_level.txt +0 -0
  109. /common/message/{base.py → message.py} +0 -0
antioch/__init__.py CHANGED
@@ -0,0 +1,101 @@
1
+ from antioch.clock import Clock
2
+ from antioch.execution import Execution
3
+ from antioch.input import NodeInputBuffer
4
+ from antioch.module import Module
5
+ from antioch.node import Node
6
+ from common.ark import Environment
7
+ from common.ark.token import Token, TokenType
8
+ from common.message import (
9
+ Array,
10
+ Bool,
11
+ CameraInfo,
12
+ CircleAnnotation,
13
+ Color,
14
+ DeserializationError,
15
+ Float,
16
+ FrameTransform,
17
+ FrameTransforms,
18
+ Image,
19
+ ImageAnnotations,
20
+ ImageEncoding,
21
+ Int,
22
+ JointState,
23
+ JointStates,
24
+ JointTarget,
25
+ JointTargets,
26
+ Log,
27
+ LogLevel,
28
+ Message,
29
+ MessageError,
30
+ MismatchError,
31
+ Point2,
32
+ Point3,
33
+ PointCloud,
34
+ PointsAnnotation,
35
+ PointsAnnotationType,
36
+ Pose,
37
+ Quaternion,
38
+ RadarScan,
39
+ SerializationError,
40
+ String,
41
+ TextAnnotation,
42
+ Vector2,
43
+ Vector3,
44
+ )
45
+
46
+ __all__ = [
47
+ # Core
48
+ "Clock",
49
+ "Environment",
50
+ "Execution",
51
+ "Module",
52
+ "Node",
53
+ "NodeInputBuffer",
54
+ "Token",
55
+ "TokenType",
56
+ # Base types
57
+ "Message",
58
+ "MessageError",
59
+ "DeserializationError",
60
+ "SerializationError",
61
+ "MismatchError",
62
+ # Primitive types
63
+ "Array",
64
+ "Bool",
65
+ "Float",
66
+ "Int",
67
+ "String",
68
+ # Geometry types
69
+ "Point2",
70
+ "Point3",
71
+ "Vector2",
72
+ "Vector3",
73
+ "Pose",
74
+ "Quaternion",
75
+ # Color
76
+ "Color",
77
+ # Camera types
78
+ "CameraInfo",
79
+ "Image",
80
+ "ImageEncoding",
81
+ # Joint types
82
+ "JointState",
83
+ "JointStates",
84
+ "JointTarget",
85
+ "JointTargets",
86
+ # Sensor types
87
+ "RadarScan",
88
+ "PointCloud",
89
+ # Logging
90
+ "Log",
91
+ "LogLevel",
92
+ # Annotations
93
+ "CircleAnnotation",
94
+ "ImageAnnotations",
95
+ "PointsAnnotation",
96
+ "PointsAnnotationType",
97
+ "TextAnnotation",
98
+ # Frame transforms
99
+ "FrameTransform",
100
+ "FrameTransforms",
101
+ ]
@@ -1,9 +1,9 @@
1
1
  import time
2
2
  from typing import TypeVar, overload
3
3
 
4
- from antioch.module.token import Token, TokenType
5
4
  from common.ark.module import ModuleParameter
6
5
  from common.ark.node import NodeOutput
6
+ from common.ark.token import Token, TokenType
7
7
  from common.message import Image, ImuSample, JointStates, JointTargets, Message, PirStatus, RadarScan
8
8
  from common.utils.logger import Logger
9
9
  from common.utils.time import now_us
@@ -3,12 +3,10 @@ from threading import Lock
3
3
  import zenoh
4
4
  from sortedcontainers import SortedDict
5
5
 
6
- from antioch.module.token import Token, TokenType
7
6
  from common.ark.node import NodeInput
7
+ from common.ark.token import ARK_TOKEN_PATH, Token, TokenType
8
8
  from common.utils.comms import CommsSession
9
9
 
10
- TOKEN_INPUT_PATH = "_token/{path}"
11
-
12
10
 
13
11
  class NodeInputBuffer:
14
12
  """
@@ -33,7 +31,7 @@ class NodeInputBuffer:
33
31
  self._tokens: SortedDict[tuple[int, str, str], Token] = SortedDict()
34
32
 
35
33
  # Subscribe to token path with callback
36
- path = TOKEN_INPUT_PATH.format(path=config.path)
34
+ path = ARK_TOKEN_PATH.format(path=config.path)
37
35
  self._subscriber = comms.declare_callback_subscriber(path, self._on_token)
38
36
 
39
37
  def close(self) -> None:
@@ -4,35 +4,17 @@ import signal
4
4
  import threading
5
5
  from collections.abc import Callable
6
6
 
7
- from antioch.module.execution import Execution
8
- from antioch.module.node import Node
7
+ from antioch.execution import Execution
8
+ from antioch.node import Node
9
9
  from common.ark.ark import Ark, Environment
10
- from common.ark.module import ModuleParameter
11
- from common.message import Message
10
+ from common.ark.module import ModuleParameter, ModuleReady, ModuleStart
12
11
  from common.utils.comms import CommsSession
13
12
  from common.utils.logger import Logger
14
13
  from common.utils.time import now_us
15
14
 
16
- AGENT_MODULE_READY_PATH = "_agent/module_ready"
17
- AGENT_MODULE_START_PATH = "_agent/module_start"
18
-
19
-
20
- class ModuleReady(Message):
21
- """
22
- Module ready message sent during handshake.
23
- """
24
-
25
- _type = "antioch/agent/module_ready"
26
- module_name: str
27
-
28
-
29
- class ModuleStart(Message):
30
- """
31
- Module start message received during handshake.
32
- """
33
-
34
- _type = "antioch/agent/module_start"
35
- global_start_time_us: int
15
+ # Synchronization paths for module coordination
16
+ ARK_MODULE_READY_PATH = "_ark/module_ready"
17
+ ARK_MODULE_START_PATH = "_ark/module_start"
36
18
 
37
19
 
38
20
  class Module:
@@ -41,8 +23,8 @@ class Module:
41
23
  mode of operation:
42
24
 
43
25
  > Container Mode (default): The module runs inside a Kubernetes pod managed by the
44
- Antioch agent. Configuration is automatically loaded from environment variables
45
- set by the agent (_MODULE_NAME, _ARK, _ENVIRONMENT, _DEBUG).
26
+ Antioch runtime. Configuration is automatically loaded from environment variables
27
+ (_MODULE_NAME, _ARK, _ENVIRONMENT, _DEBUG).
46
28
 
47
29
  > Local Mode: The module runs standalone for testing and development. Configuration
48
30
  must be explicitly provided via constructor parameters (module_name, ark, environment,
@@ -53,8 +35,8 @@ class Module:
53
35
  before registering node callbacks.
54
36
 
55
37
  Users register node callbacks via register() and then call spin() to start execution.
56
- The Ark will not start until spin() is called, which begins the handshake with the
57
- agent and starts processing node callbacks.
38
+ The Ark will not start until spin() is called, which begins the synchronization
39
+ handshake and starts processing node callbacks.
58
40
 
59
41
  Example:
60
42
  # Container mode
@@ -142,8 +124,8 @@ class Module:
142
124
  """
143
125
 
144
126
  comms = CommsSession()
145
- logger = Logger(comms, self.module_name, debug=self.debug, print_logs=True)
146
- global_start_time_us = now_us() if self._is_local_mode else self._perform_agent_handshake(comms)
127
+ logger = Logger(base_channel=self.module_name, debug=self.debug, print_logs=True)
128
+ global_start_time_us = now_us() if self._is_local_mode else self._perform_startup_handshake(comms)
147
129
 
148
130
  # Validate node callbacks
149
131
  for node_name in self._node_callbacks:
@@ -174,6 +156,7 @@ class Module:
174
156
  self._shutdown_event.wait()
175
157
 
176
158
  logger.info("Module exiting")
159
+ logger.close()
177
160
  comms.close()
178
161
 
179
162
  def join(self, timeout: float | None = None) -> None:
@@ -190,9 +173,9 @@ class Module:
190
173
  for node in self._nodes.values():
191
174
  node.join(timeout=timeout)
192
175
 
193
- def _perform_agent_handshake(self, comms: CommsSession) -> int:
176
+ def _perform_startup_handshake(self, comms: CommsSession) -> int:
194
177
  """
195
- Perform handshake with agent to receive global start time.
178
+ Perform startup handshake to receive global start time.
196
179
 
197
180
  Publishes ready message and blocks waiting for start message containing
198
181
  the global start time for synchronization.
@@ -201,8 +184,8 @@ class Module:
201
184
  :return: Global start time in microseconds.
202
185
  """
203
186
 
204
- ready_publisher = comms.declare_publisher(AGENT_MODULE_READY_PATH)
205
- start_subscriber = comms.declare_subscriber(AGENT_MODULE_START_PATH)
187
+ ready_publisher = comms.declare_publisher(ARK_MODULE_READY_PATH)
188
+ start_subscriber = comms.declare_subscriber(ARK_MODULE_START_PATH)
206
189
  ready_publisher.publish(ModuleReady(module_name=self.module_name))
207
190
  start_msg = start_subscriber.recv(ModuleStart)
208
191
  return start_msg.global_start_time_us
@@ -2,22 +2,21 @@ import traceback
2
2
  from collections.abc import Callable
3
3
  from threading import Event, Thread
4
4
 
5
- from antioch.module.clock import Clock
6
- from antioch.module.execution import Execution
7
- from antioch.module.input import NodeInputBuffer
8
- from antioch.module.token import Token, TokenType
5
+ from antioch.clock import Clock
6
+ from antioch.execution import Execution
7
+ from antioch.input import NodeInputBuffer
9
8
  from common.ark.ark import Environment
10
9
  from common.ark.module import Module
11
- from common.ark.node import Node as NodeConfig
12
- from common.ark.scheduler import InputToken, NodeEdge, NodeStartEvent, OnlineScheduler
13
- from common.ark.sim import SimNodeComplete, SimNodeStart
10
+ from common.ark.node import Node as NodeConfig, NodeEdge, SimNodeComplete, SimNodeStart
11
+ from common.ark.scheduler import NodeStartEvent, OnlineScheduler
12
+ from common.ark.token import ARK_TOKEN_PATH, InputToken, Token, TokenType
14
13
  from common.utils.comms import CommsPublisher, CommsSession
15
14
  from common.utils.logger import Logger
16
15
  from common.utils.time import now_us
17
16
 
18
- TOKEN_OUTPUT_PATH = "_token/{path}"
19
- NODE_START_SUBSCRIBER_PATH = "_ark/node_start/{module}/{node}"
20
- NODE_COMPLETE_PUBLISHER_PATH = "_ark/node_complete/{module}/{node}"
17
+ # Synchronization paths for node coordination
18
+ ARK_NODE_START_PATH = "_ark/node_start/{module}/{node}"
19
+ ARK_NODE_COMPLETE_PATH = "_ark/node_complete/{module}/{node}"
21
20
 
22
21
 
23
22
  class Node:
@@ -67,8 +66,8 @@ class Node:
67
66
  self._callback = callback
68
67
 
69
68
  self._comms = CommsSession()
70
- self._logger = Logger(self._comms, module_name, debug=debug, print_logs=True)
71
- self._execution_logger = Logger(self._comms, module_name, debug=debug, print_logs=True)
69
+ self._logger = Logger(base_channel=module_name, debug=debug, print_logs=True)
70
+ self._execution_logger = Logger(base_channel=module_name, debug=debug, print_logs=True)
72
71
  self._shutdown_requested = Event()
73
72
 
74
73
  # Create input buffers for all inputs
@@ -79,7 +78,7 @@ class Node:
79
78
  # Create output publishers for all outputs
80
79
  self._output_publishers: dict[str, CommsPublisher] = {}
81
80
  for output_name, output_config in node_config.outputs.items():
82
- path = TOKEN_OUTPUT_PATH.format(path=output_config.path)
81
+ path = ARK_TOKEN_PATH.format(path=output_config.path)
83
82
  self._output_publishers[output_name] = self._comms.declare_publisher(path)
84
83
 
85
84
  # Create reusable execution context
@@ -115,7 +114,9 @@ class Node:
115
114
  for publisher in self._output_publishers.values():
116
115
  publisher.close()
117
116
 
118
- # Close comms session
117
+ # Close loggers and comms session
118
+ self._logger.close()
119
+ self._execution_logger.close()
119
120
  self._comms.close()
120
121
 
121
122
  def join(self, timeout: float | None = None) -> None:
@@ -135,8 +136,8 @@ class Node:
135
136
  for shutdown events.
136
137
  """
137
138
 
138
- start_path = NODE_START_SUBSCRIBER_PATH.format(module=self._module_name, node=self._node_name)
139
- complete_path = NODE_COMPLETE_PUBLISHER_PATH.format(module=self._module_name, node=self._node_name)
139
+ start_path = ARK_NODE_START_PATH.format(module=self._module_name, node=self._node_name)
140
+ complete_path = ARK_NODE_COMPLETE_PATH.format(module=self._module_name, node=self._node_name)
140
141
  start_subscriber = self._comms.declare_async_subscriber(start_path)
141
142
  complete_publisher = self._comms.declare_publisher(complete_path)
142
143
 
@@ -1,23 +1,24 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: antioch-py
3
- Version: 2.0.6
4
- Summary: The Antioch Python SDK
3
+ Version: 3.0.12
4
+ Summary: Antioch Python Module SDK
5
5
  Author-email: Antioch Robotics <support@antioch.dev>
6
6
  License-Expression: MIT
7
7
  Project-URL: Homepage, https://antioch.com
8
- Keywords: robotics,simulation,middleware,sdk
8
+ Keywords: robotics,simulation,middleware,sdk,modules
9
9
  Classifier: Development Status :: 4 - Beta
10
10
  Classifier: Intended Audience :: Developers
11
11
  Classifier: Programming Language :: Python :: 3
12
12
  Classifier: Programming Language :: Python :: 3.12
13
13
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
14
14
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
15
- Requires-Python: <3.13,>=3.12
15
+ Requires-Python: <3.13,>=3.10
16
16
  Description-Content-Type: text/markdown
17
+ License-File: LICENSE
17
18
  Requires-Dist: click>=8.0.0
18
- Requires-Dist: click>=8.3.0
19
+ Requires-Dist: docker>=7.0.0
19
20
  Requires-Dist: eclipse-zenoh>=1.5.0
20
- Requires-Dist: google-cloud-artifact-registry>=1.16.1
21
+ Requires-Dist: foxglove-sdk>=0.14.1
21
22
  Requires-Dist: httpx>=0.27.0
22
23
  Requires-Dist: loguru>=0.7.3
23
24
  Requires-Dist: msgpack==1.1.1
@@ -26,13 +27,11 @@ Requires-Dist: numpy==1.26.0
26
27
  Requires-Dist: ormsgpack>=1.6.0
27
28
  Requires-Dist: pydantic>=2.11.6
28
29
  Requires-Dist: pydantic>=2.11.7
29
- Requires-Dist: python-on-whales>=0.78.0
30
30
  Requires-Dist: pyyaml>=6.0.2
31
- Requires-Dist: requests>=2.32.0
32
31
  Requires-Dist: scipy==1.15.3
33
32
  Requires-Dist: sortedcontainers-stubs>=2.4.3
34
33
  Requires-Dist: sortedcontainers>=2.4.0
35
- Requires-Dist: tqdm>=4.67.1
34
+ Dynamic: license-file
36
35
 
37
36
  # antioch-py
38
37
 
@@ -78,9 +77,7 @@ ark = scene.add_ark(name="my_robot", version="0.1.0")
78
77
  task = Task()
79
78
  task.start(mcap_path="/tmp/recording.mcap")
80
79
 
81
- scene.play()
82
80
  scene.step(1_000_000) # step 1 second
83
- scene.pause()
84
81
 
85
82
  task.finish(outcome=TaskOutcome.SUCCESS)
86
83
  ```
@@ -0,0 +1,61 @@
1
+ antioch/__init__.py,sha256=KxotEtHzhA1vUI8JEMuhqqB00aBb__3wEa1amL6sdcw,1819
2
+ antioch/clock.py,sha256=54NpvlbkFLtmiLGMXADGCkYbooUaKsDGN-xjjDqq7mw,2026
3
+ antioch/execution.py,sha256=OtKfwpQLcomeB4ggJULnxPyPnI_saB0Q4x5RQ7ME8OE,7991
4
+ antioch/input.py,sha256=KYI6nYRBhZ7hunGV-1LWCikzkLvPqr3KBFWiB555Naw,4291
5
+ antioch/module.py,sha256=C3lW9vLjRdNIo3vJCEdd4Bwz1RYhN0nrREkz25NTBwI,7283
6
+ antioch/node.py,sha256=wL78xzJF2w_bdF5r57QynaC1TsytxgcP2z1JFJyLNAg,14568
7
+ antioch_py-3.0.12.dist-info/licenses/LICENSE,sha256=wR5vy6P03IcUnTO982QeoQxmIhvtE5NjTwza2BFQDmM,1069
8
+ common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ common/constants.py,sha256=m2or1GjetS7w19UkFr_0GWYvK2BjxAA2X8mRVVE_xsA,4419
10
+ common/ark/__init__.py,sha256=y0quQ-0Uia2b8-ASzLmMKttXlc6b1buo86xZ7Bbw56w,1353
11
+ common/ark/ark.py,sha256=RvyWE-40a_TFABq4EE2ggmPubA5Lsgk8ZlrKqCkhDfc,2186
12
+ common/ark/hardware.py,sha256=WuKRdHo-JYRQqTULMiSLw10jTq5fUTXADvxpgfzD7IE,2241
13
+ common/ark/kinematics.py,sha256=uBX6P64Cb-g3bH9_5AVtVpW6_LQbHtfIXp0J-edPZuY,737
14
+ common/ark/module.py,sha256=cJR1c9n341R3LswKkuDFbWzlfy7BBG1eo6smb9HvJbo,2420
15
+ common/ark/node.py,sha256=4RiZwOzXrk25w1pU4I6Yakez7tXJTHVRc4IaUt-dtRg,3291
16
+ common/ark/scheduler.py,sha256=iLrK7SBZD74g20kz3Dqa0Ihc2v_Mw9N2wRhGxNXTeQw,15219
17
+ common/ark/sim.py,sha256=2HStdimyo7qrwYU-Av9udlw_xnNYL9rwhA6DgVhReoI,896
18
+ common/ark/token.py,sha256=eB2VxLOBtSRQ8G4MCdnMUW38UkC5s8GFnr0_MYGehhU,1183
19
+ common/assets/__init__.py,sha256=We71LsStYI5-hknGd2XHrvHg8G4k1dity887BnI5oPI,102
20
+ common/assets/rigging.usd,sha256=7OmD3537Nw2pfXQd_NEpI4zot5-q5gjzKH1Vrn4Krgs,8256
21
+ common/core/__init__.py,sha256=qvhwio6hTSH_SMB7YRQqtMUxQBq0OqMmKN5PeJCPvQg,1546
22
+ common/core/auth.py,sha256=UBBBjm29YuIpbhwqYs-Osv-Pe1SHUz2jHvVRbePiT4M,8258
23
+ common/core/container.py,sha256=35YZdqMkUqwjeZUvXE0qtHOh_JmU9Hsh2zPnXltmml4,9170
24
+ common/core/registry.py,sha256=nkkyDVLPbzPVLorM0rKW6ZncM4YXPqFLwxncId5EFc0,11329
25
+ common/core/rome.py,sha256=xdy67kx7DeFhvXpS3Bew4bnvIFekntvELNr9mmQwobM,8575
26
+ common/core/telemetry.py,sha256=zRzWLlBlgVY-5LQkDUJsUe-AGco9q1a881eUMyQWsXM,5662
27
+ common/core/types.py,sha256=vqZ1M57IlvzH06UcZ5Cn_kXyaFR0MEvdY2F_aZ4_XKs,5491
28
+ common/message/__init__.py,sha256=FAGy2loUsjJfotQus3jMAUXtkHy-gxUAkBGhr8ebqgQ,2081
29
+ common/message/annotation.py,sha256=U7UxXjP2jCw3LwCiJ74pHQKynRQhXqFpieXPYGHIIHg,8364
30
+ common/message/array.py,sha256=IbEN7QZSMfE9q7WqmuFMRuklyGfg66Sym47P7dfYLuU,14523
31
+ common/message/camera.py,sha256=UcKilboVC_WaFBnu8Mw2Or_0XBwTTqjtnyTgzSxvizo,3624
32
+ common/message/color.py,sha256=fNbJzLwAJAk-9fULZiU4Iiya0HCm9WtUR8XtjOUOnzA,4192
33
+ common/message/detection.py,sha256=pYmyTrj3NITriS2a0aD3lYpyV5AqxVWyh7yV9TLhzv8,972
34
+ common/message/foxglove.py,sha256=PugU1xQbfZaX6OLBbQyglJ9EbcL0izH5gVWAsPSMa34,599
35
+ common/message/frame.py,sha256=XVQuGQKXQxnw-DWyDn_nJC8YWxf6S8REQ6mWLMXkEWc,3740
36
+ common/message/image.py,sha256=HEQO8rXQnbNlRjBLayHYvLW0NYlHSTXkdReQKfK11i8,6907
37
+ common/message/imu.py,sha256=H8bGAktsgi3wk6j9pyP1ejbz-TrsPGCPYk-kWn-zG80,1107
38
+ common/message/joint.py,sha256=DmMmwCUy6jpi-XKewsvypmoK3UeCpA8hqnwUUN-5bOA,3242
39
+ common/message/log.py,sha256=GxbwEcLI-ypqsa1caips-xhF7CHUgqh1KtmPVf0HIXY,2061
40
+ common/message/message.py,sha256=kdBEmcHy6R9EV_QbarSwPWZE0n_Sar-gXK8g5ceT2-U,18080
41
+ common/message/pir.py,sha256=kJFQUiVyLY6KRVl72IpysiBOW7Q9_6QMdBGYbMa7tpg,964
42
+ common/message/plot.py,sha256=T0T7fjINx3McLlBefktoTt_RFgOGmd3XRzhHxuS_mWs,1460
43
+ common/message/point.py,sha256=W6QKVA83iht1HeWpEEiYttOiDxLicRm7ZFmrHF4TtRw,3577
44
+ common/message/point_cloud.py,sha256=B7J648Eu-0CUG6FmYAhy4Dronw3p4fX3BplQrS6svl4,3016
45
+ common/message/pose.py,sha256=K_JQUdGywBrualum8yp3Pqr773WnCYhqQ1-fgu3vySI,6160
46
+ common/message/quaternion.py,sha256=AjITlZ0qz3NabrmbfKuRWQsGC8seJCGFk8MU06-GaGQ,8562
47
+ common/message/radar.py,sha256=QkCEkWdiTMMCOFbZEKr8PJ_T7sWgJjAUnzcQB_XI72o,7979
48
+ common/message/twist.py,sha256=ODoaJbelQU4qS20cTVed3poHdj6S0o8zx2HPvBkw8gI,974
49
+ common/message/types.py,sha256=DjPRfx-3TMQHdPDTsfjtW0JX_Gu9ywi6eNNs-527uqQ,1325
50
+ common/message/vector.py,sha256=eIB1xRg-Jn2IlOzsgcDouof4Qs7MBgl5JMSt2z2aEoY,18425
51
+ common/sim/__init__.py,sha256=N7qknBhXmu9mxbNwF9M7QlgEfmkXzlq8HId671JncPA,964
52
+ common/sim/objects.py,sha256=x1HElot0Sp_cltG-mM34Z3ZVmCx3056uLfj9Md6g89o,21576
53
+ common/sim/state.py,sha256=2JjMmEDu_MZoZKBx6NYCtNdBaWUD7pDIv0mxNew3r0E,197
54
+ common/utils/__init__.py,sha256=9zRb7XayzCGRs4I94hWKJHyQ1MevlUiTzXsPNBLBX7Y,113
55
+ common/utils/comms.py,sha256=plxwjVOIqT5D2jmT1KEnweiGTMAL_mMhYaB2ztSNPy0,18168
56
+ common/utils/logger.py,sha256=m8DaKzTJJ4vp4VM9IpNtqCbhypF-w1Gwh0x5nsL_hv0,4041
57
+ common/utils/time.py,sha256=kGDzObbaqWOep4vT1Y2W-BheunxdjYBI4V3Nfp4Ck3Q,790
58
+ antioch_py-3.0.12.dist-info/METADATA,sha256=DlqdSqPvuaKnk7-Lu-mFHc-D3Cd0GtqzTa4NJnK82QQ,3397
59
+ antioch_py-3.0.12.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
60
+ antioch_py-3.0.12.dist-info/top_level.txt,sha256=GtzNccsep3YdBt9VXQ7-ZFsFJFffr4hyZvqg0YqRqtw,15
61
+ antioch_py-3.0.12.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024-2026 Antioch
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.
common/ark/__init__.py CHANGED
@@ -1,29 +1,16 @@
1
- from common.ark.ark import (
2
- Ark,
3
- ArkInfo,
4
- ArkMetadata,
5
- ArkReference,
6
- ArkVersionReference,
7
- AssetReference,
8
- AssetVersionReference,
9
- Environment,
10
- Kinematics,
11
- )
1
+ from common.ark.ark import Ark, ArkInfo, ArkMetadata, Environment, Kinematics
12
2
  from common.ark.hardware import CameraHardware, Hardware, HardwareType, ImuHardware, PirHardware, RadarHardware
13
3
  from common.ark.kinematics import Joint, Link
14
4
  from common.ark.module import Module, ModuleImage, ModuleInfo, ModuleKind, ModuleParameter, ParamType
15
5
  from common.ark.node import HardwareAccessMode, Node, NodeInput, NodeOutput, NodeTimer
16
- from common.ark.scheduler import InputToken, NodeCompleteEvent, NodeEdge, NodeStartEvent, NodeState, OnlineScheduler, ScheduleEvent
6
+ from common.ark.scheduler import NodeCompleteEvent, NodeEdge, NodeStartEvent, NodeState, OnlineScheduler, ScheduleEvent
7
+ from common.ark.token import InputToken, Token, TokenType
17
8
 
18
9
  __all__ = [
19
10
  # Core Ark types
20
11
  "Ark",
21
12
  "ArkInfo",
22
13
  "ArkMetadata",
23
- "AssetReference",
24
- "AssetVersionReference",
25
- "ArkReference",
26
- "ArkVersionReference",
27
14
  "Environment",
28
15
  "Kinematics",
29
16
  # Module types
@@ -57,4 +44,7 @@ __all__ = [
57
44
  "ScheduleEvent",
58
45
  "NodeState",
59
46
  "OnlineScheduler",
47
+ # Token types
48
+ "Token",
49
+ "TokenType",
60
50
  ]
common/ark/ark.py CHANGED
@@ -2,7 +2,7 @@ from enum import Enum
2
2
 
3
3
  from common.ark.hardware import Hardware
4
4
  from common.ark.kinematics import Joint, Link
5
- from common.ark.module import Module
5
+ from common.ark.module import Module, ModuleImage
6
6
  from common.ark.scheduler import NodeEdge
7
7
  from common.message import Message
8
8
 
@@ -53,54 +53,6 @@ class Kinematics(Message):
53
53
  joints: list[Joint]
54
54
 
55
55
 
56
- class ArkVersionReference(Message):
57
- """
58
- Reference to an Ark version in the remote Ark registry.
59
- """
60
-
61
- version: str
62
- created_at: str
63
- updated_at: str
64
- full_path: str
65
- size_bytes: int
66
- asset_path: str | None = None
67
- asset_size_bytes: int | None = None
68
-
69
-
70
- class ArkReference(Message):
71
- """
72
- Reference to an Ark in the remote Ark registry.
73
- """
74
-
75
- name: str
76
- versions: list[ArkVersionReference]
77
- created_at: str
78
- updated_at: str
79
-
80
-
81
- class AssetVersionReference(Message):
82
- """
83
- Reference to a specific asset version.
84
- """
85
-
86
- version: str
87
- full_path: str
88
- size_bytes: int
89
- created_at: str
90
- updated_at: str
91
-
92
-
93
- class AssetReference(Message):
94
- """
95
- Reference to an asset with all its versions.
96
- """
97
-
98
- name: str
99
- versions: list[AssetVersionReference]
100
- created_at: str
101
- updated_at: str
102
-
103
-
104
56
  class Ark(Message):
105
57
  """
106
58
  Antioch Ark specification.
@@ -115,14 +67,25 @@ class Ark(Message):
115
67
  kinematics: Kinematics
116
68
  hardware: list[Hardware]
117
69
 
118
-
119
- if __name__ == "__main__":
120
- import argparse
121
-
122
- parser = argparse.ArgumentParser()
123
- parser.add_argument("ark_file", type=str, help="The Ark json file to serialize")
124
- args = parser.parse_args()
125
-
126
- with open(args.ark_file) as f:
127
- ark = Ark.model_validate_json(f.read())
128
- print(ark.to_json(2))
70
+ def collect_image_names(self, environment: Environment | None = None) -> list[str]:
71
+ """
72
+ Collect all Docker image names used by modules in this Ark.
73
+
74
+ :param environment: Filter images by environment (SIM or REAL). If None, collects all images.
75
+ :return: List of unique image names sorted alphabetically.
76
+ """
77
+
78
+ images: set[str] = set()
79
+ for module in self.modules:
80
+ if isinstance(module.image, str):
81
+ # Simple string image
82
+ if module.image:
83
+ images.add(module.image)
84
+ elif isinstance(module.image, ModuleImage):
85
+ # Hardware module with sim/real images
86
+ if environment in (None, Environment.SIM) and module.image.sim:
87
+ images.add(module.image.sim)
88
+ if environment in (None, Environment.REAL) and module.image.real:
89
+ images.add(module.image.real)
90
+
91
+ return sorted(images)