antioch-py 2.0.6__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.
- antioch/__init__.py +0 -0
- antioch/message.py +87 -0
- antioch/module/__init__.py +53 -0
- antioch/module/clock.py +62 -0
- antioch/module/execution.py +278 -0
- antioch/module/input.py +127 -0
- antioch/module/module.py +218 -0
- antioch/module/node.py +357 -0
- antioch/module/token.py +42 -0
- antioch/session/__init__.py +150 -0
- antioch/session/ark.py +504 -0
- antioch/session/asset.py +65 -0
- antioch/session/error.py +80 -0
- antioch/session/record.py +158 -0
- antioch/session/scene.py +1521 -0
- antioch/session/session.py +220 -0
- antioch/session/task.py +323 -0
- antioch/session/views/__init__.py +40 -0
- antioch/session/views/animation.py +189 -0
- antioch/session/views/articulation.py +245 -0
- antioch/session/views/basis_curve.py +186 -0
- antioch/session/views/camera.py +92 -0
- antioch/session/views/collision.py +75 -0
- antioch/session/views/geometry.py +74 -0
- antioch/session/views/ground_plane.py +63 -0
- antioch/session/views/imu.py +73 -0
- antioch/session/views/joint.py +64 -0
- antioch/session/views/light.py +175 -0
- antioch/session/views/pir_sensor.py +140 -0
- antioch/session/views/radar.py +73 -0
- antioch/session/views/rigid_body.py +282 -0
- antioch/session/views/xform.py +119 -0
- antioch_py-2.0.6.dist-info/METADATA +115 -0
- antioch_py-2.0.6.dist-info/RECORD +99 -0
- antioch_py-2.0.6.dist-info/WHEEL +5 -0
- antioch_py-2.0.6.dist-info/entry_points.txt +2 -0
- antioch_py-2.0.6.dist-info/top_level.txt +2 -0
- common/__init__.py +0 -0
- common/ark/__init__.py +60 -0
- common/ark/ark.py +128 -0
- common/ark/hardware.py +121 -0
- common/ark/kinematics.py +31 -0
- common/ark/module.py +85 -0
- common/ark/node.py +94 -0
- common/ark/scheduler.py +439 -0
- common/ark/sim.py +33 -0
- common/assets/__init__.py +3 -0
- common/constants.py +47 -0
- common/core/__init__.py +52 -0
- common/core/agent.py +296 -0
- common/core/auth.py +305 -0
- common/core/registry.py +331 -0
- common/core/task.py +36 -0
- common/message/__init__.py +59 -0
- common/message/annotation.py +89 -0
- common/message/array.py +500 -0
- common/message/base.py +517 -0
- common/message/camera.py +91 -0
- common/message/color.py +139 -0
- common/message/frame.py +50 -0
- common/message/image.py +171 -0
- common/message/imu.py +14 -0
- common/message/joint.py +47 -0
- common/message/log.py +31 -0
- common/message/pir.py +16 -0
- common/message/point.py +109 -0
- common/message/point_cloud.py +63 -0
- common/message/pose.py +148 -0
- common/message/quaternion.py +273 -0
- common/message/radar.py +58 -0
- common/message/types.py +37 -0
- common/message/vector.py +786 -0
- common/rome/__init__.py +9 -0
- common/rome/client.py +430 -0
- common/rome/error.py +16 -0
- common/session/__init__.py +54 -0
- common/session/environment.py +31 -0
- common/session/sim.py +240 -0
- common/session/views/__init__.py +263 -0
- common/session/views/animation.py +73 -0
- common/session/views/articulation.py +184 -0
- common/session/views/basis_curve.py +102 -0
- common/session/views/camera.py +147 -0
- common/session/views/collision.py +59 -0
- common/session/views/geometry.py +102 -0
- common/session/views/ground_plane.py +41 -0
- common/session/views/imu.py +66 -0
- common/session/views/joint.py +81 -0
- common/session/views/light.py +96 -0
- common/session/views/pir_sensor.py +115 -0
- common/session/views/radar.py +82 -0
- common/session/views/rigid_body.py +236 -0
- common/session/views/viewport.py +21 -0
- common/session/views/xform.py +39 -0
- common/utils/__init__.py +4 -0
- common/utils/comms.py +571 -0
- common/utils/logger.py +123 -0
- common/utils/time.py +42 -0
- common/utils/usd.py +12 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
from antioch.session.session import Session, SessionContainer
|
|
2
|
+
from common.message import Pose, RadarScan
|
|
3
|
+
from common.session.views.radar import AddRadar, GetRadar, GetRadarResponse, GetRadarScan, RadarConfig
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Radar(SessionContainer):
|
|
7
|
+
"""
|
|
8
|
+
Radar view for time-synchronized scan data.
|
|
9
|
+
|
|
10
|
+
Example:
|
|
11
|
+
scene = Scene()
|
|
12
|
+
radar = scene.get_radar(name="my_ark/my_module/my_radar")
|
|
13
|
+
scan = radar.get_scan()
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
def __init__(self, path: str):
|
|
17
|
+
"""
|
|
18
|
+
Initialize Radar view.
|
|
19
|
+
|
|
20
|
+
:param path: USD path for the radar.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
super().__init__()
|
|
24
|
+
|
|
25
|
+
self._path = self._session.query_sim_rpc(
|
|
26
|
+
endpoint="get_radar",
|
|
27
|
+
payload=GetRadar(path=path),
|
|
28
|
+
response_type=GetRadarResponse,
|
|
29
|
+
).path
|
|
30
|
+
|
|
31
|
+
@classmethod
|
|
32
|
+
def add(
|
|
33
|
+
cls,
|
|
34
|
+
path: str,
|
|
35
|
+
config: RadarConfig,
|
|
36
|
+
world_pose: Pose | None,
|
|
37
|
+
local_pose: Pose | None,
|
|
38
|
+
) -> "Radar":
|
|
39
|
+
"""
|
|
40
|
+
Add radar to the scene.
|
|
41
|
+
|
|
42
|
+
:param path: USD path for the radar.
|
|
43
|
+
:param config: Radar configuration.
|
|
44
|
+
:param world_pose: Optional world pose.
|
|
45
|
+
:param local_pose: Optional local pose.
|
|
46
|
+
:return: The radar instance.
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
Session.get_current().query_sim_rpc(
|
|
50
|
+
endpoint="add_radar",
|
|
51
|
+
payload=AddRadar(
|
|
52
|
+
path=path,
|
|
53
|
+
config=config,
|
|
54
|
+
world_pose=world_pose,
|
|
55
|
+
local_pose=local_pose,
|
|
56
|
+
),
|
|
57
|
+
)
|
|
58
|
+
return cls(path)
|
|
59
|
+
|
|
60
|
+
def get_scan(self) -> RadarScan | None:
|
|
61
|
+
"""
|
|
62
|
+
Get radar scan data.
|
|
63
|
+
|
|
64
|
+
:return: Radar scan with detections, or None if scan data is not ready.
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
scan = self._session.query_sim_rpc(
|
|
68
|
+
endpoint="get_radar_scan",
|
|
69
|
+
payload=GetRadarScan(path=self._path),
|
|
70
|
+
response_type=RadarScan,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
return scan
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
from antioch.session.session import Session, SessionContainer
|
|
2
|
+
from common.message import Pose, Vector3
|
|
3
|
+
from common.session.sim import GetLocalPose, GetWorldPose, SetLocalPose, SetWorldPose
|
|
4
|
+
from common.session.views.rigid_body import (
|
|
5
|
+
AddRigidBody,
|
|
6
|
+
ApplyForce,
|
|
7
|
+
BodyCenterOfMass,
|
|
8
|
+
BodyInertia,
|
|
9
|
+
BodyMass,
|
|
10
|
+
BodyVelocity,
|
|
11
|
+
DisableGravity,
|
|
12
|
+
DisablePhysics,
|
|
13
|
+
EnableGravity,
|
|
14
|
+
EnablePhysics,
|
|
15
|
+
GetBodyCenterOfMass,
|
|
16
|
+
GetBodyInertia,
|
|
17
|
+
GetBodyMass,
|
|
18
|
+
GetBodyVelocity,
|
|
19
|
+
GetRigidBody,
|
|
20
|
+
GetRigidBodyResponse,
|
|
21
|
+
RigidBodyConfig,
|
|
22
|
+
SetBodyVelocity,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class RigidBody(SessionContainer):
|
|
27
|
+
"""
|
|
28
|
+
Ergonomic wrapper for rigid body operations.
|
|
29
|
+
|
|
30
|
+
Rigid bodies should be added using scene.add_rigid_body() or retrieved using scene.get_rigid_body().
|
|
31
|
+
|
|
32
|
+
Example:
|
|
33
|
+
scene = Scene()
|
|
34
|
+
|
|
35
|
+
# Add rigid body
|
|
36
|
+
body = scene.add_rigid_body(
|
|
37
|
+
path="/World/cube",
|
|
38
|
+
mass=1.0,
|
|
39
|
+
linear_velocity=[1.0, 0.0, 0.0]
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
# Set velocity with tuples/lists
|
|
43
|
+
body.set_velocity(
|
|
44
|
+
linear=(1.0, 0.0, 0.0),
|
|
45
|
+
angular=[0.0, 0.0, 1.0]
|
|
46
|
+
)
|
|
47
|
+
pose = body.get_world_pose()
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
def __init__(self, path: str):
|
|
51
|
+
"""
|
|
52
|
+
Initialize rigid body by resolving path and validating existence.
|
|
53
|
+
|
|
54
|
+
:param path: USD path for the rigid body.
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
super().__init__()
|
|
58
|
+
|
|
59
|
+
# Validate path
|
|
60
|
+
self._path = self._session.query_sim_rpc(
|
|
61
|
+
endpoint="get_rigid_body",
|
|
62
|
+
payload=GetRigidBody(path=path),
|
|
63
|
+
response_type=GetRigidBodyResponse,
|
|
64
|
+
).path
|
|
65
|
+
|
|
66
|
+
@classmethod
|
|
67
|
+
def add(
|
|
68
|
+
cls,
|
|
69
|
+
path: str,
|
|
70
|
+
config: RigidBodyConfig,
|
|
71
|
+
world_pose: Pose | None,
|
|
72
|
+
local_pose: Pose | None,
|
|
73
|
+
scale: Vector3 | None,
|
|
74
|
+
) -> "RigidBody":
|
|
75
|
+
"""
|
|
76
|
+
Add a rigid body to the scene.
|
|
77
|
+
|
|
78
|
+
:param path: USD path for the rigid body.
|
|
79
|
+
:param config: Rigid body configuration.
|
|
80
|
+
:param world_pose: Optional world pose.
|
|
81
|
+
:param local_pose: Optional local pose.
|
|
82
|
+
:param scale: Optional scale.
|
|
83
|
+
:return: The rigid body instance.
|
|
84
|
+
"""
|
|
85
|
+
|
|
86
|
+
Session.get_current().query_sim_rpc(
|
|
87
|
+
endpoint="add_rigid_body",
|
|
88
|
+
payload=AddRigidBody(
|
|
89
|
+
path=path,
|
|
90
|
+
config=config,
|
|
91
|
+
world_pose=world_pose,
|
|
92
|
+
local_pose=local_pose,
|
|
93
|
+
scale=scale,
|
|
94
|
+
),
|
|
95
|
+
)
|
|
96
|
+
return cls(path)
|
|
97
|
+
|
|
98
|
+
def get_velocity(self) -> BodyVelocity:
|
|
99
|
+
"""
|
|
100
|
+
Get the velocity of the rigid body.
|
|
101
|
+
|
|
102
|
+
:return: Linear and angular velocities.
|
|
103
|
+
"""
|
|
104
|
+
|
|
105
|
+
return self._session.query_sim_rpc(
|
|
106
|
+
endpoint="get_body_velocity",
|
|
107
|
+
payload=GetBodyVelocity(path=self._path),
|
|
108
|
+
response_type=BodyVelocity,
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
def set_velocity(
|
|
112
|
+
self,
|
|
113
|
+
linear: Vector3 | list[float] | tuple[float, float, float],
|
|
114
|
+
angular: Vector3 | list[float] | tuple[float, float, float],
|
|
115
|
+
) -> None:
|
|
116
|
+
"""
|
|
117
|
+
Set the velocity of the rigid body.
|
|
118
|
+
|
|
119
|
+
:param linear: Linear velocity as Vector3 (or list/tuple of 3 floats).
|
|
120
|
+
:param angular: Angular velocity as Vector3 (or list/tuple of 3 floats).
|
|
121
|
+
"""
|
|
122
|
+
|
|
123
|
+
self._session.query_sim_rpc(
|
|
124
|
+
endpoint="set_body_velocity",
|
|
125
|
+
payload=SetBodyVelocity(
|
|
126
|
+
path=self._path,
|
|
127
|
+
velocity=BodyVelocity(
|
|
128
|
+
linear=Vector3.from_any(linear),
|
|
129
|
+
angular=Vector3.from_any(angular),
|
|
130
|
+
),
|
|
131
|
+
),
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
def apply_force(
|
|
135
|
+
self,
|
|
136
|
+
force: Vector3 | list[float] | tuple[float, float, float],
|
|
137
|
+
is_global: bool = True,
|
|
138
|
+
) -> None:
|
|
139
|
+
"""
|
|
140
|
+
Apply force to the rigid body.
|
|
141
|
+
|
|
142
|
+
:param force: Force vector as Vector3 (or list/tuple of 3 floats).
|
|
143
|
+
:param is_global: Whether force is in global frame.
|
|
144
|
+
"""
|
|
145
|
+
|
|
146
|
+
self._session.query_sim_rpc(
|
|
147
|
+
endpoint="apply_force",
|
|
148
|
+
payload=ApplyForce(
|
|
149
|
+
path=self._path,
|
|
150
|
+
force=Vector3.from_any(force),
|
|
151
|
+
is_global=is_global,
|
|
152
|
+
),
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
def get_mass(self) -> float:
|
|
156
|
+
"""
|
|
157
|
+
Get the mass of the rigid body.
|
|
158
|
+
|
|
159
|
+
:return: Mass in kg.
|
|
160
|
+
"""
|
|
161
|
+
|
|
162
|
+
return self._session.query_sim_rpc(
|
|
163
|
+
endpoint="get_body_mass",
|
|
164
|
+
payload=GetBodyMass(path=self._path),
|
|
165
|
+
response_type=BodyMass,
|
|
166
|
+
).mass
|
|
167
|
+
|
|
168
|
+
def get_inertia(self) -> list[float]:
|
|
169
|
+
"""
|
|
170
|
+
Get the inertia tensor of the rigid body.
|
|
171
|
+
|
|
172
|
+
:return: Inertia tensor as 9 values (3x3 matrix flattened).
|
|
173
|
+
"""
|
|
174
|
+
|
|
175
|
+
return self._session.query_sim_rpc(
|
|
176
|
+
endpoint="get_body_inertia",
|
|
177
|
+
payload=GetBodyInertia(path=self._path),
|
|
178
|
+
response_type=BodyInertia,
|
|
179
|
+
).inertia
|
|
180
|
+
|
|
181
|
+
def get_center_of_mass(self) -> BodyCenterOfMass:
|
|
182
|
+
"""
|
|
183
|
+
Get the center of mass position and orientation.
|
|
184
|
+
|
|
185
|
+
:return: Center of mass position and orientation.
|
|
186
|
+
"""
|
|
187
|
+
|
|
188
|
+
return self._session.query_sim_rpc(
|
|
189
|
+
endpoint="get_body_center_of_mass",
|
|
190
|
+
payload=GetBodyCenterOfMass(path=self._path),
|
|
191
|
+
response_type=BodyCenterOfMass,
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
def enable_gravity(self) -> None:
|
|
195
|
+
"""
|
|
196
|
+
Enable gravity on the rigid body.
|
|
197
|
+
"""
|
|
198
|
+
|
|
199
|
+
self._session.query_sim_rpc(
|
|
200
|
+
endpoint="enable_gravity",
|
|
201
|
+
payload=EnableGravity(path=self._path),
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
def disable_gravity(self) -> None:
|
|
205
|
+
"""
|
|
206
|
+
Disable gravity on the rigid body.
|
|
207
|
+
"""
|
|
208
|
+
|
|
209
|
+
self._session.query_sim_rpc(
|
|
210
|
+
endpoint="disable_gravity",
|
|
211
|
+
payload=DisableGravity(path=self._path),
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
def enable_physics(self) -> None:
|
|
215
|
+
"""
|
|
216
|
+
Enable rigid body physics (make body dynamic).
|
|
217
|
+
"""
|
|
218
|
+
|
|
219
|
+
self._session.query_sim_rpc(
|
|
220
|
+
endpoint="enable_physics",
|
|
221
|
+
payload=EnablePhysics(path=self._path),
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
def disable_physics(self) -> None:
|
|
225
|
+
"""
|
|
226
|
+
Disable rigid body physics (make body kinematic).
|
|
227
|
+
"""
|
|
228
|
+
|
|
229
|
+
self._session.query_sim_rpc(
|
|
230
|
+
endpoint="disable_physics",
|
|
231
|
+
payload=DisablePhysics(path=self._path),
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
def get_world_pose(self) -> Pose:
|
|
235
|
+
"""
|
|
236
|
+
Get the world pose of the rigid body.
|
|
237
|
+
|
|
238
|
+
:return: World pose.
|
|
239
|
+
"""
|
|
240
|
+
|
|
241
|
+
return self._session.query_sim_rpc(
|
|
242
|
+
endpoint="get_rigid_body_world_pose",
|
|
243
|
+
payload=GetWorldPose(path=self._path),
|
|
244
|
+
response_type=Pose,
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
def get_local_pose(self) -> Pose:
|
|
248
|
+
"""
|
|
249
|
+
Get the local pose of the rigid body.
|
|
250
|
+
|
|
251
|
+
:return: Local pose.
|
|
252
|
+
"""
|
|
253
|
+
|
|
254
|
+
return self._session.query_sim_rpc(
|
|
255
|
+
endpoint="get_rigid_body_local_pose",
|
|
256
|
+
payload=GetLocalPose(path=self._path),
|
|
257
|
+
response_type=Pose,
|
|
258
|
+
)
|
|
259
|
+
|
|
260
|
+
def set_world_pose(self, pose: Pose | dict) -> None:
|
|
261
|
+
"""
|
|
262
|
+
Set the world pose of the rigid body.
|
|
263
|
+
|
|
264
|
+
:param pose: World pose as Pose (or dict with position/orientation lists).
|
|
265
|
+
"""
|
|
266
|
+
|
|
267
|
+
self._session.query_sim_rpc(
|
|
268
|
+
endpoint="set_rigid_body_world_pose",
|
|
269
|
+
payload=SetWorldPose(path=self._path, pose=Pose.from_any(pose)),
|
|
270
|
+
)
|
|
271
|
+
|
|
272
|
+
def set_local_pose(self, pose: Pose | dict) -> None:
|
|
273
|
+
"""
|
|
274
|
+
Set the local pose of the rigid body.
|
|
275
|
+
|
|
276
|
+
:param pose: Local pose as Pose (or dict with position/orientation lists).
|
|
277
|
+
"""
|
|
278
|
+
|
|
279
|
+
self._session.query_sim_rpc(
|
|
280
|
+
endpoint="set_rigid_body_local_pose",
|
|
281
|
+
payload=SetLocalPose(path=self._path, pose=Pose.from_any(pose)),
|
|
282
|
+
)
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
from antioch.session.session import Session, SessionContainer
|
|
2
|
+
from common.message import Pose, Vector3
|
|
3
|
+
from common.session.sim import GetLocalPose, GetWorldPose, SetLocalPose, SetWorldPose
|
|
4
|
+
from common.session.views.xform import AddXForm, GetXForm, GetXFormResponse
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class XForm(SessionContainer):
|
|
8
|
+
"""
|
|
9
|
+
Ergonomic wrapper for xform operations.
|
|
10
|
+
|
|
11
|
+
XForms should be added using scene.add_xform() or retrieved using scene.get_xform().
|
|
12
|
+
|
|
13
|
+
Example:
|
|
14
|
+
scene = Scene()
|
|
15
|
+
|
|
16
|
+
# Add xform
|
|
17
|
+
xform = scene.add_xform(
|
|
18
|
+
path="/World/container",
|
|
19
|
+
world_pose={"position": [1.0, 2.0, 3.0], "orientation": [1.0, 0.0, 0.0, 0.0]},
|
|
20
|
+
scale=[2.0, 2.0, 2.0]
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
pose = xform.get_world_pose()
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
def __init__(self, path: str):
|
|
27
|
+
"""
|
|
28
|
+
Initialize xform by resolving path and validating existence.
|
|
29
|
+
|
|
30
|
+
:param path: USD path for the xform.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
super().__init__()
|
|
34
|
+
|
|
35
|
+
# Validate path
|
|
36
|
+
self._path = self._session.query_sim_rpc(
|
|
37
|
+
endpoint="get_xform",
|
|
38
|
+
payload=GetXForm(path=path),
|
|
39
|
+
response_type=GetXFormResponse,
|
|
40
|
+
).path
|
|
41
|
+
|
|
42
|
+
@classmethod
|
|
43
|
+
def add(
|
|
44
|
+
cls,
|
|
45
|
+
path: str,
|
|
46
|
+
world_pose: Pose | None,
|
|
47
|
+
local_pose: Pose | None,
|
|
48
|
+
scale: Vector3 | None,
|
|
49
|
+
) -> "XForm":
|
|
50
|
+
"""
|
|
51
|
+
Add an xform to the scene.
|
|
52
|
+
|
|
53
|
+
:param path: USD path for the xform.
|
|
54
|
+
:param world_pose: Optional world pose.
|
|
55
|
+
:param local_pose: Optional local pose.
|
|
56
|
+
:param scale: Optional scale.
|
|
57
|
+
:return: The xform instance.
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
Session.get_current().query_sim_rpc(
|
|
61
|
+
endpoint="add_xform",
|
|
62
|
+
payload=AddXForm(
|
|
63
|
+
path=path,
|
|
64
|
+
world_pose=world_pose,
|
|
65
|
+
local_pose=local_pose,
|
|
66
|
+
scale=scale,
|
|
67
|
+
),
|
|
68
|
+
)
|
|
69
|
+
return cls(path)
|
|
70
|
+
|
|
71
|
+
def get_world_pose(self) -> Pose:
|
|
72
|
+
"""
|
|
73
|
+
Get the world pose of the xform.
|
|
74
|
+
|
|
75
|
+
:return: World pose.
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
return self._session.query_sim_rpc(
|
|
79
|
+
endpoint="get_xform_world_pose",
|
|
80
|
+
payload=GetWorldPose(path=self._path),
|
|
81
|
+
response_type=Pose,
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
def get_local_pose(self) -> Pose:
|
|
85
|
+
"""
|
|
86
|
+
Get the local pose of the xform.
|
|
87
|
+
|
|
88
|
+
:return: Local pose.
|
|
89
|
+
"""
|
|
90
|
+
|
|
91
|
+
return self._session.query_sim_rpc(
|
|
92
|
+
endpoint="get_xform_local_pose",
|
|
93
|
+
payload=GetLocalPose(path=self._path),
|
|
94
|
+
response_type=Pose,
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
def set_world_pose(self, pose: Pose | dict) -> None:
|
|
98
|
+
"""
|
|
99
|
+
Set the world pose of the xform.
|
|
100
|
+
|
|
101
|
+
:param pose: World pose as Pose (or dict with position/orientation lists).
|
|
102
|
+
"""
|
|
103
|
+
|
|
104
|
+
self._session.query_sim_rpc(
|
|
105
|
+
endpoint="set_xform_world_pose",
|
|
106
|
+
payload=SetWorldPose(path=self._path, pose=Pose.from_any(pose)),
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
def set_local_pose(self, pose: Pose | dict) -> None:
|
|
110
|
+
"""
|
|
111
|
+
Set the local pose of the xform.
|
|
112
|
+
|
|
113
|
+
:param pose: Local pose as Pose (or dict with position/orientation lists).
|
|
114
|
+
"""
|
|
115
|
+
|
|
116
|
+
self._session.query_sim_rpc(
|
|
117
|
+
endpoint="set_xform_local_pose",
|
|
118
|
+
payload=SetLocalPose(path=self._path, pose=Pose.from_any(pose)),
|
|
119
|
+
)
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: antioch-py
|
|
3
|
+
Version: 2.0.6
|
|
4
|
+
Summary: The Antioch Python SDK
|
|
5
|
+
Author-email: Antioch Robotics <support@antioch.dev>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://antioch.com
|
|
8
|
+
Keywords: robotics,simulation,middleware,sdk
|
|
9
|
+
Classifier: Development Status :: 4 - Beta
|
|
10
|
+
Classifier: Intended Audience :: Developers
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
13
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
14
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
15
|
+
Requires-Python: <3.13,>=3.12
|
|
16
|
+
Description-Content-Type: text/markdown
|
|
17
|
+
Requires-Dist: click>=8.0.0
|
|
18
|
+
Requires-Dist: click>=8.3.0
|
|
19
|
+
Requires-Dist: eclipse-zenoh>=1.5.0
|
|
20
|
+
Requires-Dist: google-cloud-artifact-registry>=1.16.1
|
|
21
|
+
Requires-Dist: httpx>=0.27.0
|
|
22
|
+
Requires-Dist: loguru>=0.7.3
|
|
23
|
+
Requires-Dist: msgpack==1.1.1
|
|
24
|
+
Requires-Dist: msgpack>=1.1.1
|
|
25
|
+
Requires-Dist: numpy==1.26.0
|
|
26
|
+
Requires-Dist: ormsgpack>=1.6.0
|
|
27
|
+
Requires-Dist: pydantic>=2.11.6
|
|
28
|
+
Requires-Dist: pydantic>=2.11.7
|
|
29
|
+
Requires-Dist: python-on-whales>=0.78.0
|
|
30
|
+
Requires-Dist: pyyaml>=6.0.2
|
|
31
|
+
Requires-Dist: requests>=2.32.0
|
|
32
|
+
Requires-Dist: scipy==1.15.3
|
|
33
|
+
Requires-Dist: sortedcontainers-stubs>=2.4.3
|
|
34
|
+
Requires-Dist: sortedcontainers>=2.4.0
|
|
35
|
+
Requires-Dist: tqdm>=4.67.1
|
|
36
|
+
|
|
37
|
+
# antioch-py
|
|
38
|
+
|
|
39
|
+
Python SDK for the [Antioch](https://antioch.com) autonomy simulation platform.
|
|
40
|
+
|
|
41
|
+
## Overview
|
|
42
|
+
|
|
43
|
+
The antioch-py package provides two components:
|
|
44
|
+
|
|
45
|
+
### Module SDK (`antioch.module`)
|
|
46
|
+
|
|
47
|
+
The Module SDK is a framework for building Antioch modules in Python. Modules are containerized components that run alongside your simulation, processing sensor data and producing outputs. Each module runs in its own Docker container and communicates with the simulation through the Antioch runtime. Install the SDK in your module's Dockerfile to read sensors, run inference, and publish results.
|
|
48
|
+
|
|
49
|
+
```python
|
|
50
|
+
from antioch.module import Execution, Module
|
|
51
|
+
|
|
52
|
+
def process_radar(execution: Execution) -> None:
|
|
53
|
+
scan = execution.read_radar("sensor")
|
|
54
|
+
if scan is not None and len(scan.detections) > 0:
|
|
55
|
+
execution.output("detections").set(scan)
|
|
56
|
+
|
|
57
|
+
if __name__ == "__main__":
|
|
58
|
+
module = Module()
|
|
59
|
+
module.register("radar_node", process_radar)
|
|
60
|
+
module.spin()
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Session SDK (`antioch.session`)
|
|
64
|
+
|
|
65
|
+
The Session SDK is a client library for orchestrating Antioch simulations. Use it from Python scripts or Jupyter notebooks to programmatically build scenes, load assets, spawn robots, control simulation playback, and record data. The Session SDK connects to your Antioch deployment and provides a high-level API for automation and experimentation.
|
|
66
|
+
|
|
67
|
+
```python
|
|
68
|
+
from antioch.session import Scene, Session, Task, TaskOutcome
|
|
69
|
+
|
|
70
|
+
session = Session()
|
|
71
|
+
scene = Scene()
|
|
72
|
+
|
|
73
|
+
# Load environment and robot
|
|
74
|
+
scene.add_asset(path="/World/environment", name="warehouse", version="1.0.0")
|
|
75
|
+
ark = scene.add_ark(name="my_robot", version="0.1.0")
|
|
76
|
+
|
|
77
|
+
# Run simulation
|
|
78
|
+
task = Task()
|
|
79
|
+
task.start(mcap_path="/tmp/recording.mcap")
|
|
80
|
+
|
|
81
|
+
scene.play()
|
|
82
|
+
scene.step(1_000_000) # step 1 second
|
|
83
|
+
scene.pause()
|
|
84
|
+
|
|
85
|
+
task.finish(outcome=TaskOutcome.SUCCESS)
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Installation
|
|
89
|
+
|
|
90
|
+
To install in your Python environment:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
pip install antioch-py
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
To install in your Python-based Docker image (e.g. for an Antioch module):
|
|
97
|
+
|
|
98
|
+
```dockerfile
|
|
99
|
+
FROM python:3.12-slim
|
|
100
|
+
|
|
101
|
+
RUN pip install antioch-py
|
|
102
|
+
|
|
103
|
+
COPY . /app
|
|
104
|
+
WORKDIR /app
|
|
105
|
+
|
|
106
|
+
CMD ["python", "module.py"]
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Documentation
|
|
110
|
+
|
|
111
|
+
Visit [antioch.com](https://antioch.com) for full documentation.
|
|
112
|
+
|
|
113
|
+
## License
|
|
114
|
+
|
|
115
|
+
MIT
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
antioch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
antioch/message.py,sha256=7YsmUA6H3Imikv6beUJilTpA8Nb5DCkeOwbRQwOLfGI,1463
|
|
3
|
+
antioch/module/__init__.py,sha256=nSbYXkicwbypnfyko2cN2JwvIzSntfVEYyP63VVPaGU,1008
|
|
4
|
+
antioch/module/clock.py,sha256=54NpvlbkFLtmiLGMXADGCkYbooUaKsDGN-xjjDqq7mw,2026
|
|
5
|
+
antioch/module/execution.py,sha256=bASbLFz3YqP7Ma5Pbga6W7ddNCQo3GzbjAlgrQXYWSw,7995
|
|
6
|
+
antioch/module/input.py,sha256=BGbJ6AOgm7gVTO6PBYs8B53q0v_YD3Jy2joM5M7kUlk,4317
|
|
7
|
+
antioch/module/module.py,sha256=6b9s_N1Tpr4Wtp8hXVxZHDzhfKgG2IHeOd8KE65TfMk,7581
|
|
8
|
+
antioch/module/node.py,sha256=1EDNzKbQINs4nKZiSdn_FEPg-3MyCKdC0b7pfucmLgk,14542
|
|
9
|
+
antioch/module/token.py,sha256=6KJbPMoaMqUrx8nfYzAgVTf8EaazT46g6KMC1zO97Pk,830
|
|
10
|
+
antioch/session/__init__.py,sha256=jZTav-Y9IyYqIpyloQuCkaPfRLKPGx-TWmwOrkteJn8,3891
|
|
11
|
+
antioch/session/ark.py,sha256=CF9zaRAZXiVLOkmZpBEaGG4-wydMZ7aUVOnXqnqYZ4U,19096
|
|
12
|
+
antioch/session/asset.py,sha256=G4wKHVxDkzLEtUap7b7jDF6Y_I4gdHiJ-b756QFBx54,2222
|
|
13
|
+
antioch/session/error.py,sha256=hEByLcsS8PPpK46prnz1GSWBx0ErGTnSkwBd29FUmWg,1685
|
|
14
|
+
antioch/session/record.py,sha256=acNeikDeWJFZLovgwbXGHTriqi5-szYjjrnt9s_cdUY,5527
|
|
15
|
+
antioch/session/scene.py,sha256=SsbRfmjvJbRm_jXaT8l_fjvJDWR7QH5USDHuEZWBvVg,58536
|
|
16
|
+
antioch/session/session.py,sha256=MxyWAC56SGC6BORzlw8Sxp4s4QBFuxPb7t0kScYDEtM,6626
|
|
17
|
+
antioch/session/task.py,sha256=ERji5YWU82TL5txBNTLQemJB7Y7xIqS5l76re7MUgvo,11831
|
|
18
|
+
antioch/session/views/__init__.py,sha256=81NjZdBs9HZX97Y2nMryfu644icbCLjucnP3_cccfSg,1156
|
|
19
|
+
antioch/session/views/animation.py,sha256=oID0fM3RSU1d3CVA5EiEizKJF18CfNla_1ta7YCQt40,5960
|
|
20
|
+
antioch/session/views/articulation.py,sha256=0akkhmBJhbJrNmmNwob-S2-t_21Jq9PipTesjYR6wLU,7870
|
|
21
|
+
antioch/session/views/basis_curve.py,sha256=YMz9pMgj4fLkjhr3QZz8_RBv_HnMN3ZcvLj32WseIlE,5685
|
|
22
|
+
antioch/session/views/camera.py,sha256=5S4shhmFqdJs39J00-E1pT7PobdfKWZfQfNbU6s-aNI,2613
|
|
23
|
+
antioch/session/views/collision.py,sha256=7FjbB4PBoE4LEWoLqJhHCkYp57Da7qWcrLAKCiULV9M,1962
|
|
24
|
+
antioch/session/views/geometry.py,sha256=8SyT5_tkJhtW4_VZsv-L6nXE8kRweeLzu-UP-KHABe4,2241
|
|
25
|
+
antioch/session/views/ground_plane.py,sha256=oTpGcATB5SirxD1eZUMCeD28eIeDJ6a7E1pFpj9E_xY,1762
|
|
26
|
+
antioch/session/views/imu.py,sha256=1EVLRptXSqs4YMJt_wiwXM-B95HzVQmx3MyRblTADMs,1889
|
|
27
|
+
antioch/session/views/joint.py,sha256=x_clYul4SsCIl0WQAW61w6sS0iDXompvZVEv_2YFG9c,1735
|
|
28
|
+
antioch/session/views/light.py,sha256=Q9Nn8o0PV9in8Q4eoobsbRxEPhn3xps57K7Z4QmGE8s,4698
|
|
29
|
+
antioch/session/views/pir_sensor.py,sha256=ynEpRz7rwATBAs29QPEcDOuEPxB_jjKnmH05N0KA_FA,4048
|
|
30
|
+
antioch/session/views/radar.py,sha256=P8rtNW_c5sgJ-XHMk5VjQ9T8Ot1j-ZPy5EaifC1ujvs,1924
|
|
31
|
+
antioch/session/views/rigid_body.py,sha256=NI-2bFnOLQqClQ3pOhzkggLAhClyKVBXyTmWXgqkZEU,7760
|
|
32
|
+
antioch/session/views/xform.py,sha256=BELykGHYhdZyHkCY6uakCnmJKwhyiDrCEGy9038GY_Y,3299
|
|
33
|
+
common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
34
|
+
common/constants.py,sha256=xlgBKdPoiDzAnWkeEsnktMJfXjBP5FTJkM3MGClTnuY,1085
|
|
35
|
+
common/ark/__init__.py,sha256=Lu2lJ5k7-vN6ZGeX2sYhRwzXEyt9kCyXtgsyvdIaCiU,1472
|
|
36
|
+
common/ark/ark.py,sha256=rToMvtpu634ylJbEfYlTD13Cb3udF_S4SfI8xQsL1P4,2376
|
|
37
|
+
common/ark/hardware.py,sha256=_9CPY_-o5yWgiB8x5pj7dwS8pH0hDCZwyWADCyf32dw,3061
|
|
38
|
+
common/ark/kinematics.py,sha256=G4wzFVyG_awFPJ8SKcZMZCBQkZkF5g6NQg4RhUjAGCs,753
|
|
39
|
+
common/ark/module.py,sha256=IwkoirFb4dZkfVpn3tjgChRy5S6hVPbrtR9XgJ5UIBI,1922
|
|
40
|
+
common/ark/node.py,sha256=PWESl7sDdY_Q6aA3CZMRTQ0SONlO9LkUmXhRbUhT8_g,2303
|
|
41
|
+
common/ark/scheduler.py,sha256=QGO_-ZewCvOHJ-w9BAJJQdco0-b-mbbzufpSX9b-mNo,15703
|
|
42
|
+
common/ark/sim.py,sha256=SQtZkf97QF91oLWkTUEhq62GYL3yk7-LLDDR-lXVKcA,900
|
|
43
|
+
common/assets/__init__.py,sha256=We71LsStYI5-hknGd2XHrvHg8G4k1dity887BnI5oPI,102
|
|
44
|
+
common/core/__init__.py,sha256=L8rvLHQd-mOCfDQ2WN9BZiMqU0skeTTkeQvpJ59ouqI,1110
|
|
45
|
+
common/core/agent.py,sha256=UJrZjLPLNLUIWe6-pDB3vE_hUD8JzUTwM87MRxjPYmg,7764
|
|
46
|
+
common/core/auth.py,sha256=TeJIhYm8buQLAkl3jORuGV03pP1MNOhetHunE9z2nsM,9347
|
|
47
|
+
common/core/registry.py,sha256=J2Ihhgr6aTfovm-zSiGEcyHB8iBcpFcZVw6vVYKFjNg,11399
|
|
48
|
+
common/core/task.py,sha256=eybV7yQ8nPYgQtYuse-QvoMJ87Msh6rAN_LUOTGmN94,629
|
|
49
|
+
common/message/__init__.py,sha256=O9HKA_9yJk1-bVhn7CRfY2Q_8H0nze7PjTRZB8fJIec,1747
|
|
50
|
+
common/message/annotation.py,sha256=BlzDYhioAK1ATFfgZozmaF7uOqFdSr7KBhe2m03Z2q4,1911
|
|
51
|
+
common/message/array.py,sha256=Fly7u8BE-_QRwnkmv3k6P2EI0FguEUIzF_tE-mFGT1Q,13971
|
|
52
|
+
common/message/base.py,sha256=kdBEmcHy6R9EV_QbarSwPWZE0n_Sar-gXK8g5ceT2-U,18080
|
|
53
|
+
common/message/camera.py,sha256=Xv3Y31ppg9fkjncMteHwgB3Dx7RNRWbnStoDFp-YnhM,3075
|
|
54
|
+
common/message/color.py,sha256=PsM-mD-LAitJJD4DCvMaSFGwXjFEiWgdcrqxFRj0wGI,3292
|
|
55
|
+
common/message/frame.py,sha256=J8J0EutQ3mfHvmGjna-7hhWgIyqHgkKPPjIgMMyxCUw,1674
|
|
56
|
+
common/message/image.py,sha256=aF_rU_sOSJQci6g_Wr5Sd16FUFnHm2kgurqWcPPKbaA,5296
|
|
57
|
+
common/message/imu.py,sha256=mwIu_dK64aixrnz6Hsg8v-vXVKUabLBNbfHe2KqbVPo,328
|
|
58
|
+
common/message/joint.py,sha256=V9qEILZVaWoAbKGT_V3wvSAvZzoJ7YmrcROkIdzmg5o,1051
|
|
59
|
+
common/message/log.py,sha256=VN1zCwrUtTPNiyakNjYPZuz3UDMtW19fhD1F1M8MTf8,552
|
|
60
|
+
common/message/pir.py,sha256=4HjYg-gefe0PGNNKtmXm4hV8BPKM-boARPkHgXkmTH8,719
|
|
61
|
+
common/message/point.py,sha256=oryHZEltba1z3GFRyb099oDddmiLE5SM4TKexgtBYaE,2229
|
|
62
|
+
common/message/point_cloud.py,sha256=e06e6-bGaN8VzwkCy4MltDZocnKP7Bbr14gBlUhXu-A,2035
|
|
63
|
+
common/message/pose.py,sha256=fcb0-xuIYWaaHHGC_iET9yma1fuicFvXJsaJaLO5XVI,4703
|
|
64
|
+
common/message/quaternion.py,sha256=Y6-XR3g7VaWVOkLoK6hE26wTYjnJFjrHIv9y17GM1EY,6897
|
|
65
|
+
common/message/radar.py,sha256=18w89hpq5tahh9V_49CWKXkU78b21xrTj_bH35u1UFE,2014
|
|
66
|
+
common/message/types.py,sha256=k2wtbozsyd4HhMBoDfPFMLyCAGmTxaOvVhzIr-wx3N0,480
|
|
67
|
+
common/message/vector.py,sha256=IrREGUi2zKTUmp5PG4YNiJKEM1zRXLl0fK9QuF7I06o,20302
|
|
68
|
+
common/rome/__init__.py,sha256=hfwUw5wbT-Ph-OFwGhiqw3XEeWaZwmLAs66LOYKqfzU,210
|
|
69
|
+
common/rome/client.py,sha256=6cFzqXilZWNndRAhJctqdPjQQbJM4a0BzoyGYZapIh0,15462
|
|
70
|
+
common/rome/error.py,sha256=oW8yI81o3hQghop4omFcMkXx4IbacGye38Iyw2VKihQ,294
|
|
71
|
+
common/session/__init__.py,sha256=q0sWg6gKU2dNX0IzBAXHTpwarg1eYwCjQYWmII2SW70,1131
|
|
72
|
+
common/session/environment.py,sha256=CVW00KXWF8L0L6ocUsZ2UWt-iqAiP0usFdhZsK43fak,714
|
|
73
|
+
common/session/sim.py,sha256=0eSxUwiHWh-siombwy3qX_e-oZ7KGbwIh-GvAxiGZAM,5717
|
|
74
|
+
common/session/views/__init__.py,sha256=AVqMcuR_rA2mO7JmttYcACnHXsNyIf4xvqmDBCXft30,6525
|
|
75
|
+
common/session/views/animation.py,sha256=Dz9bFMQeLGWaOgQ9GPOMjBBZ7uB2Nynk0ovQl9EDBfA,2407
|
|
76
|
+
common/session/views/articulation.py,sha256=DwJTQk8iU3vII9aEc9_CBtUEszD1uhfCAr2NNJP9SBA,5044
|
|
77
|
+
common/session/views/basis_curve.py,sha256=56ylRppXA6_pUWJvSS_XjgI5rxBtJ0v16zU7vM8RcnQ,3115
|
|
78
|
+
common/session/views/camera.py,sha256=H9Gt0K9DhoiBKxeSyljezj6Mn1-Rp4-vkf_4our3IPE,4458
|
|
79
|
+
common/session/views/collision.py,sha256=brMzJRsYXW9MAqmPMzovSBx73MM870V3hzfkL5yroFY,1360
|
|
80
|
+
common/session/views/geometry.py,sha256=7CBTugs8Onr7tddyzz5g5f3HY7rz_9tuIxYbRWbnFmM,3453
|
|
81
|
+
common/session/views/ground_plane.py,sha256=iHi7bx3qHveh94b88oPz7Yy9cjznc194T6Bx9I6SK1Q,1174
|
|
82
|
+
common/session/views/imu.py,sha256=usMm4yeqY_emcTQGjs2hC3Rk-tfen2dp0fIWTDADpxc,1593
|
|
83
|
+
common/session/views/joint.py,sha256=eP5fLAWqvaQ13xZrNkn79DdRERZMvVrP9emJYZ_J_KA,2098
|
|
84
|
+
common/session/views/light.py,sha256=IpqkSB6qZCfbe63GAJaPHdy4rJDNki8h-Hm-1kwDwHc,2284
|
|
85
|
+
common/session/views/pir_sensor.py,sha256=ykAylA5MK97u_8uyfOYDhoJxdhV023gxn-9EggS3_B8,4936
|
|
86
|
+
common/session/views/radar.py,sha256=kM3HcBriE1bQDwgafsRjInQOkEH05IUynJqutSZyT24,2426
|
|
87
|
+
common/session/views/rigid_body.py,sha256=19cjU2bZvaFzs8OoNsu4gzZHu97nJMUueBc6Wt0NUWk,4523
|
|
88
|
+
common/session/views/viewport.py,sha256=tPb1yCFd5nqCapkqSyWCEJ8joEk3fIIfZNr1uAbNAfM,682
|
|
89
|
+
common/session/views/xform.py,sha256=uxcmtFFGKLF-Jkln1r08CZuyLr7EI8DvdKYuyUFdieM,863
|
|
90
|
+
common/utils/__init__.py,sha256=9zRb7XayzCGRs4I94hWKJHyQ1MevlUiTzXsPNBLBX7Y,113
|
|
91
|
+
common/utils/comms.py,sha256=1lpnb9ra5I3xv-Eo0GFZ7nR4TjKseOeDNf9QMWQZbds,17283
|
|
92
|
+
common/utils/logger.py,sha256=VcZ4dduWut8xWPs-F5ye8RRrNdBehSSG3r1LAWc-IBY,3389
|
|
93
|
+
common/utils/time.py,sha256=kGDzObbaqWOep4vT1Y2W-BheunxdjYBI4V3Nfp4Ck3Q,790
|
|
94
|
+
common/utils/usd.py,sha256=to4VPtnamMDIQK-pwDIVfiuzUnNzEImj5szOar1NHiE,253
|
|
95
|
+
antioch_py-2.0.6.dist-info/METADATA,sha256=NszvfGjvH5If8-N-J4BfHPsxZfbWH01JFvvHFTKe9Lg,3485
|
|
96
|
+
antioch_py-2.0.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
97
|
+
antioch_py-2.0.6.dist-info/entry_points.txt,sha256=1bLTH5BXCOsQkS8k6L_wJ6Nj62j4aoU9Ey_PhWzsRRM,59
|
|
98
|
+
antioch_py-2.0.6.dist-info/top_level.txt,sha256=GtzNccsep3YdBt9VXQ7-ZFsFJFffr4hyZvqg0YqRqtw,15
|
|
99
|
+
antioch_py-2.0.6.dist-info/RECORD,,
|