spatialdds 0.6.0__tar.gz → 0.7.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 (246) hide show
  1. {spatialdds-0.6.0/spatialdds.egg-info → spatialdds-0.7.1}/PKG-INFO +189 -22
  2. spatialdds-0.6.0/PKG-INFO → spatialdds-0.7.1/README.md +181 -42
  3. {spatialdds-0.6.0 → spatialdds-0.7.1}/pyproject.toml +26 -9
  4. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/__init__.py +26 -9
  5. spatialdds-0.7.1/spatialdds/artifacts/idl/anchors.idl +68 -0
  6. spatialdds-0.7.1/spatialdds/artifacts/idl/argeo.idl +125 -0
  7. spatialdds-0.7.1/spatialdds/artifacts/idl/common.idl +174 -0
  8. spatialdds-0.7.1/spatialdds/artifacts/idl/events.idl +362 -0
  9. spatialdds-0.7.1/spatialdds/artifacts/idl/lidar.idl +126 -0
  10. spatialdds-0.7.1/spatialdds/artifacts/idl/mapping.idl +322 -0
  11. spatialdds-0.7.1/spatialdds/artifacts/idl/provisional/owm.idl +153 -0
  12. spatialdds-0.7.1/spatialdds/artifacts/idl/provisional/radio.idl +142 -0
  13. spatialdds-0.7.1/spatialdds/artifacts/idl/provisional/rf_beam.idl +148 -0
  14. spatialdds-0.7.1/spatialdds/artifacts/idl/rad.idl +241 -0
  15. spatialdds-0.7.1/spatialdds/artifacts/idl/semantics.idl +212 -0
  16. spatialdds-0.7.1/spatialdds/artifacts/idl/slam_frontend.idl +103 -0
  17. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/idl/types.idl +6 -0
  18. spatialdds-0.7.1/spatialdds/artifacts/idl/vio.idl +112 -0
  19. spatialdds-0.7.1/spatialdds/artifacts/idl/vision.idl +165 -0
  20. spatialdds-0.7.1/spatialdds/artifacts/openapi.html +17 -0
  21. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/openapi.yaml +71 -2
  22. spatialdds-0.7.1/spatialdds/artifacts/registry.json +561 -0
  23. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_vision_CamIntrinsics.json +1 -0
  24. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_vision_VisionFrame.json +1 -0
  25. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_vision_VisionMeta.json +2 -0
  26. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/serializer_tables.json +1 -0
  27. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/client.py +5 -28
  28. spatialdds-0.7.1/spatialdds/dds/__init__.py +79 -0
  29. spatialdds-0.7.1/spatialdds/dds/_extra.py +22 -0
  30. spatialdds-0.7.1/spatialdds/dds/_participant.py +1026 -0
  31. spatialdds-0.7.1/spatialdds/dds/blob.py +128 -0
  32. spatialdds-0.7.1/spatialdds/dds/codec.py +183 -0
  33. spatialdds-0.7.1/spatialdds/dds/qos.py +68 -0
  34. spatialdds-0.7.1/spatialdds/dds/record.py +107 -0
  35. spatialdds-0.7.1/spatialdds/dds/registry.py +324 -0
  36. spatialdds-0.7.1/spatialdds/dds/types/__init__.py +12 -0
  37. spatialdds-0.7.1/spatialdds/dds/types/_field_aliases.py +26 -0
  38. spatialdds-0.7.1/spatialdds/dds/types/builtin/__init__.py +11 -0
  39. spatialdds-0.7.1/spatialdds/dds/types/builtin/_types.py +28 -0
  40. spatialdds-0.7.1/spatialdds/dds/types/spatial/__init__.py +33 -0
  41. spatialdds-0.7.1/spatialdds/dds/types/spatial/anchors/__init__.py +20 -0
  42. spatialdds-0.7.1/spatialdds/dds/types/spatial/anchors/_anchors.py +102 -0
  43. spatialdds-0.7.1/spatialdds/dds/types/spatial/argeo/__init__.py +22 -0
  44. spatialdds-0.7.1/spatialdds/dds/types/spatial/argeo/_argeo.py +97 -0
  45. spatialdds-0.7.1/spatialdds/dds/types/spatial/common/__init__.py +27 -0
  46. spatialdds-0.7.1/spatialdds/dds/types/spatial/common/_types.py +104 -0
  47. spatialdds-0.7.1/spatialdds/dds/types/spatial/core/GnssService/__init__.py +17 -0
  48. spatialdds-0.7.1/spatialdds/dds/types/spatial/core/GnssService/_core.py +27 -0
  49. spatialdds-0.7.1/spatialdds/dds/types/spatial/core/__init__.py +40 -0
  50. spatialdds-0.7.1/spatialdds/dds/types/spatial/core/_core.py +338 -0
  51. spatialdds-0.7.1/spatialdds/dds/types/spatial/disco/__init__.py +34 -0
  52. spatialdds-0.7.1/spatialdds/dds/types/spatial/disco/_discovery.py +252 -0
  53. spatialdds-0.7.1/spatialdds/dds/types/spatial/events/__init__.py +29 -0
  54. spatialdds-0.7.1/spatialdds/dds/types/spatial/events/_events.py +164 -0
  55. spatialdds-0.7.1/spatialdds/dds/types/spatial/events/enums/__init__.py +19 -0
  56. spatialdds-0.7.1/spatialdds/dds/types/spatial/events/enums/crossing_direction_enum/__init__.py +11 -0
  57. spatialdds-0.7.1/spatialdds/dds/types/spatial/events/enums/crossing_direction_enum/_events.py +25 -0
  58. spatialdds-0.7.1/spatialdds/dds/types/spatial/events/enums/event_state_enum/__init__.py +11 -0
  59. spatialdds-0.7.1/spatialdds/dds/types/spatial/events/enums/event_state_enum/_events.py +26 -0
  60. spatialdds-0.7.1/spatialdds/dds/types/spatial/events/enums/event_type_enum/__init__.py +11 -0
  61. spatialdds-0.7.1/spatialdds/dds/types/spatial/events/enums/event_type_enum/_events.py +36 -0
  62. spatialdds-0.7.1/spatialdds/dds/types/spatial/events/enums/severity_enum/__init__.py +11 -0
  63. spatialdds-0.7.1/spatialdds/dds/types/spatial/events/enums/severity_enum/_events.py +26 -0
  64. spatialdds-0.7.1/spatialdds/dds/types/spatial/events/enums/zone_kind_enum/__init__.py +11 -0
  65. spatialdds-0.7.1/spatialdds/dds/types/spatial/events/enums/zone_kind_enum/_events.py +31 -0
  66. spatialdds-0.7.1/spatialdds/dds/types/spatial/mapping/__init__.py +30 -0
  67. spatialdds-0.7.1/spatialdds/dds/types/spatial/mapping/_mapping.py +168 -0
  68. spatialdds-0.7.1/spatialdds/dds/types/spatial/mapping/enums/__init__.py +19 -0
  69. spatialdds-0.7.1/spatialdds/dds/types/spatial/mapping/enums/alignment_method/__init__.py +11 -0
  70. spatialdds-0.7.1/spatialdds/dds/types/spatial/mapping/enums/alignment_method/_mapping.py +31 -0
  71. spatialdds-0.7.1/spatialdds/dds/types/spatial/mapping/enums/edge_type/__init__.py +11 -0
  72. spatialdds-0.7.1/spatialdds/dds/types/spatial/mapping/enums/edge_type/_mapping.py +34 -0
  73. spatialdds-0.7.1/spatialdds/dds/types/spatial/mapping/enums/map_event_kind/__init__.py +11 -0
  74. spatialdds-0.7.1/spatialdds/dds/types/spatial/mapping/enums/map_event_kind/_mapping.py +29 -0
  75. spatialdds-0.7.1/spatialdds/dds/types/spatial/mapping/enums/map_kind/__init__.py +11 -0
  76. spatialdds-0.7.1/spatialdds/dds/types/spatial/mapping/enums/map_kind/_mapping.py +32 -0
  77. spatialdds-0.7.1/spatialdds/dds/types/spatial/mapping/enums/map_status/__init__.py +11 -0
  78. spatialdds-0.7.1/spatialdds/dds/types/spatial/mapping/enums/map_status/_mapping.py +27 -0
  79. spatialdds-0.7.1/spatialdds/dds/types/spatial/owm/__init__.py +22 -0
  80. spatialdds-0.7.1/spatialdds/dds/types/spatial/owm/_owm.py +103 -0
  81. spatialdds-0.7.1/spatialdds/dds/types/spatial/semantics/__init__.py +22 -0
  82. spatialdds-0.7.1/spatialdds/dds/types/spatial/semantics/_semantics.py +174 -0
  83. spatialdds-0.7.1/spatialdds/dds/types/spatial/sensing/__init__.py +21 -0
  84. spatialdds-0.7.1/spatialdds/dds/types/spatial/sensing/common/__init__.py +34 -0
  85. spatialdds-0.7.1/spatialdds/dds/types/spatial/sensing/common/_common.py +192 -0
  86. spatialdds-0.7.1/spatialdds/dds/types/spatial/sensing/lidar/__init__.py +32 -0
  87. spatialdds-0.7.1/spatialdds/dds/types/spatial/sensing/lidar/_lidar.py +135 -0
  88. spatialdds-0.7.1/spatialdds/dds/types/spatial/sensing/rad/__init__.py +33 -0
  89. spatialdds-0.7.1/spatialdds/dds/types/spatial/sensing/rad/_rad.py +191 -0
  90. spatialdds-0.7.1/spatialdds/dds/types/spatial/sensing/radio/__init__.py +22 -0
  91. spatialdds-0.7.1/spatialdds/dds/types/spatial/sensing/radio/_radio.py +141 -0
  92. spatialdds-0.7.1/spatialdds/dds/types/spatial/sensing/rf_beam/__init__.py +25 -0
  93. spatialdds-0.7.1/spatialdds/dds/types/spatial/sensing/rf_beam/_rf_beam.py +117 -0
  94. spatialdds-0.7.1/spatialdds/dds/types/spatial/sensing/vision/__init__.py +36 -0
  95. spatialdds-0.7.1/spatialdds/dds/types/spatial/sensing/vision/_vision.py +171 -0
  96. spatialdds-0.7.1/spatialdds/dds/types/spatial/slam_frontend/__init__.py +22 -0
  97. spatialdds-0.7.1/spatialdds/dds/types/spatial/slam_frontend/_slam_frontend.py +144 -0
  98. spatialdds-0.7.1/spatialdds/dds/types/spatial/vio/__init__.py +20 -0
  99. spatialdds-0.7.1/spatialdds/dds/types/spatial/vio/_vio.py +134 -0
  100. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/demo/fountain-anchors.mcap +0 -0
  101. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/errors.py +1 -1
  102. spatialdds-0.7.1/spatialdds/events.py +57 -0
  103. spatialdds-0.7.1/spatialdds/frames.py +222 -0
  104. spatialdds-0.7.1/spatialdds/recency.py +119 -0
  105. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/records.py +127 -11
  106. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/serve.py +12 -9
  107. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/server/gateway.py +151 -21
  108. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/server/gw_http.py +15 -1
  109. spatialdds-0.7.1/spatialdds/server/mcapmeta.py +19 -0
  110. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/server/pin.py +91 -17
  111. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/server/publish.py +15 -7
  112. spatialdds-0.6.0/README.md → spatialdds-0.7.1/spatialdds.egg-info/PKG-INFO +209 -18
  113. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds.egg-info/SOURCES.txt +91 -0
  114. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds.egg-info/requires.txt +5 -0
  115. spatialdds-0.6.0/spatialdds/artifacts/openapi.html +0 -17
  116. {spatialdds-0.6.0 → spatialdds-0.7.1}/setup.cfg +0 -0
  117. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/idl/core.idl +0 -0
  118. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/idl/discovery.idl +0 -0
  119. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/builtin_Time.json +0 -0
  120. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_anchors_AnchorDelta.json +0 -0
  121. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_anchors_AnchorEntry.json +0 -0
  122. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_anchors_AnchorSet.json +0 -0
  123. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_anchors_AnchorSetRequest.json +0 -0
  124. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_anchors_AnchorSetResponse.json +0 -0
  125. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_argeo_NodeGeo.json +0 -0
  126. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_argeo_QualityRequirements.json +0 -0
  127. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_argeo_VpsRequest.json +0 -0
  128. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_argeo_VpsResponse.json +0 -0
  129. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_common_AssetRef.json +0 -0
  130. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_common_FrameRef.json +0 -0
  131. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_common_KV.json +0 -0
  132. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_common_MetaKV.json +0 -0
  133. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_common_Vec2.json +0 -0
  134. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_Aabb3.json +0 -0
  135. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_BlobChunk.json +0 -0
  136. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_BlobRef.json +0 -0
  137. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_ComponentRef.json +0 -0
  138. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_Edge.json +0 -0
  139. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_EntityBinding.json +0 -0
  140. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_FrameTransform.json +0 -0
  141. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_FramedPose.json +0 -0
  142. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_GeoAnchor.json +0 -0
  143. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_GeoPose.json +0 -0
  144. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_NavSatStatus.json +0 -0
  145. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_Node.json +0 -0
  146. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_PlannedTrajectory.json +0 -0
  147. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_PlannedWaypoint.json +0 -0
  148. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_PoseSE3.json +0 -0
  149. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_SnapshotRequest.json +0 -0
  150. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_SnapshotResponse.json +0 -0
  151. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_TileKey.json +0 -0
  152. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_TileMeta.json +0 -0
  153. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_TilePatch.json +0 -0
  154. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_Announce.json +0 -0
  155. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_Capabilities.json +0 -0
  156. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_ContentAnnounce.json +0 -0
  157. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_CoverageElement.json +0 -0
  158. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_CoverageFilter.json +0 -0
  159. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_CoverageHint.json +0 -0
  160. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_CoverageQuery.json +0 -0
  161. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_CoverageResponse.json +0 -0
  162. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_Depart.json +0 -0
  163. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_KV.json +0 -0
  164. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_ProfileSupport.json +0 -0
  165. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_ServiceSummary.json +0 -0
  166. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_TopicMeta.json +0 -0
  167. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_Transform.json +0 -0
  168. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_ValidityWindow.json +0 -0
  169. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_events_CrossingLine.json +0 -0
  170. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_events_SpatialEvent.json +0 -0
  171. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_events_SpatialZone.json +0 -0
  172. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_events_ZoneState.json +0 -0
  173. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_mapping_Edge.json +0 -0
  174. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_mapping_MapAlignment.json +0 -0
  175. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_mapping_MapEvent.json +0 -0
  176. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_mapping_MapMeta.json +0 -0
  177. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_mapping_MapQuality.json +0 -0
  178. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_owm_Entity.json +0 -0
  179. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_owm_ModelCommand.json +0 -0
  180. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_owm_ModelPose.json +0 -0
  181. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_semantics_Detection2D.json +0 -0
  182. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_semantics_Detection2DSet.json +0 -0
  183. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_semantics_Detection3D.json +0 -0
  184. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_semantics_Detection3DSet.json +0 -0
  185. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_semantics_FusedTrack.json +0 -0
  186. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_semantics_FusedTrackSet.json +0 -0
  187. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_semantics_Keypoint3D.json +0 -0
  188. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_semantics_KeypointLink.json +0 -0
  189. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_common_Axis.json +0 -0
  190. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_common_FrameHeader.json +0 -0
  191. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_common_FrameQuality.json +0 -0
  192. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_common_Linspace.json +0 -0
  193. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_common_ROI.json +0 -0
  194. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_common_ROIReply.json +0 -0
  195. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_common_ROIRequest.json +0 -0
  196. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_common_StreamMeta.json +0 -0
  197. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_lidar_LidarDetection.json +0 -0
  198. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_lidar_LidarDetectionSet.json +0 -0
  199. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_lidar_LidarFrame.json +0 -0
  200. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_lidar_LidarMeta.json +0 -0
  201. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_rad_RadDetection.json +0 -0
  202. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_rad_RadDetectionSet.json +0 -0
  203. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_rad_RadSensorMeta.json +0 -0
  204. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_rad_RadTensorFrame.json +0 -0
  205. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_rad_RadTensorMeta.json +0 -0
  206. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_radio_RadioObservation.json +0 -0
  207. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_radio_RadioScan.json +0 -0
  208. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_radio_RadioSensorMeta.json +0 -0
  209. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_rf_beam_RfBeamArraySet.json +0 -0
  210. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_rf_beam_RfBeamFrame.json +0 -0
  211. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_rf_beam_RfBeamMeta.json +0 -0
  212. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_vision_Keypoint2D.json +0 -0
  213. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_vision_Track2D.json +0 -0
  214. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_vision_VisionDetections.json +0 -0
  215. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_slam_frontend_CameraInfo.json +0 -0
  216. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_slam_frontend_Feature2D.json +0 -0
  217. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_slam_frontend_FeatureMatch.json +0 -0
  218. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_slam_frontend_KeyframeFeatures.json +0 -0
  219. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_slam_frontend_Landmark.json +0 -0
  220. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_slam_frontend_MatchSet.json +0 -0
  221. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_slam_frontend_TrackObs.json +0 -0
  222. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_slam_frontend_Tracklet.json +0 -0
  223. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_vio_FusedState.json +0 -0
  224. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_vio_ImuInfo.json +0 -0
  225. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_vio_ImuSample.json +0 -0
  226. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_vio_MagnetometerSample.json +0 -0
  227. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_vio_SensorFusionSample.json +0 -0
  228. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/canonical.py +0 -0
  229. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/canonjson.py +0 -0
  230. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/demo/assets/duck.gltf +0 -0
  231. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/demo/assets/fountain-label.txt +0 -0
  232. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/demo/assets/fountain-marker.gltf +0 -0
  233. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/demo/manifests/content-fountain-label.json +0 -0
  234. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/demo/manifests/content-fountain-marker.json +0 -0
  235. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/journal.py +0 -0
  236. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/server/__init__.py +0 -0
  237. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/server/commands.py +0 -0
  238. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/server/idlmodel.py +0 -0
  239. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/server/limits.py +0 -0
  240. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/server/tenancy.py +0 -0
  241. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/server/webjson.py +0 -0
  242. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/server/xcdr2.py +0 -0
  243. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/tokens.py +0 -0
  244. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds.egg-info/dependency_links.txt +0 -0
  245. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds.egg-info/entry_points.txt +0 -0
  246. {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds.egg-info/top_level.txt +0 -0
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: spatialdds
3
- Version: 0.6.0
4
- Summary: SpatialDDS over plain HTTPS and a WebSocket: a client for the web binding (Appendix N), and the reference registry behind one command.
3
+ Version: 0.7.1
4
+ Summary: SpatialDDS for programs: a client for the web binding (Appendix N), a native DDS participant, and the reference registry behind one command.
5
5
  Author: Open AR Cloud
6
6
  License: Apache-2.0
7
- Project-URL: Homepage, https://github.com/OpenArCloud/spatialdds-web
7
+ Project-URL: Homepage, https://github.com/OpenArCloud/spatialdds-py
8
8
  Project-URL: Specification, https://github.com/OpenArCloud/SpatialDDS-spec
9
- Keywords: spatialdds,spatial,geopose,anchors,registry,openarcloud
9
+ Keywords: spatialdds,spatial,geopose,anchors,registry,dds,cyclonedds,openarcloud
10
10
  Classifier: Development Status :: 3 - Alpha
11
11
  Classifier: Intended Audience :: Developers
12
12
  Classifier: License :: OSI Approved :: Apache Software License
@@ -21,15 +21,20 @@ Provides-Extra: server
21
21
  Requires-Dist: aiohttp>=3.8; extra == "server"
22
22
  Requires-Dist: mcap>=1.1; extra == "server"
23
23
  Requires-Dist: jsonschema>=4.0; extra == "server"
24
+ Provides-Extra: dds
25
+ Requires-Dist: cyclonedds<12,>=11.0.1; extra == "dds"
26
+ Requires-Dist: mcap>=1.1; extra == "dds"
27
+ Requires-Dist: jsonschema>=4.0; extra == "dds"
24
28
 
25
29
  # spatialdds
26
30
 
27
- SpatialDDS over plain HTTPS and a WebSocket: a client for programs, and the
28
- reference registry behind one command.
31
+ SpatialDDS for programs: a client over plain HTTPS and a WebSocket, a native
32
+ DDS participant, and the reference registry behind one command.
29
33
 
30
34
  ```sh
31
35
  pip install spatialdds # the client: two dependencies
32
36
  pip install "spatialdds[server]" # and the registry
37
+ pip install "spatialdds[dds]" # and a native DDS participant
33
38
  pip install "./lib/spatialdds[server]" # from a checkout of this repo
34
39
  ```
35
40
 
@@ -39,14 +44,132 @@ package is the step after that, when a program wants native values instead of
39
44
  canonical JSON, bytes it can trust, refusals it can act on, and records it did
40
45
  not have to assemble member by member.
41
46
 
42
- **Implements Appendix N as of SpatialDDS-spec `9c3e1f2`.** Package versions and
43
- specification versions move independently; `spatialdds.SPEC_COMMIT` is the one
44
- that says what the wire looks like.
47
+ **Implements Appendix N as of SpatialDDS-spec `v1.8` (`4b5652c`).** Package
48
+ versions and specification versions move independently; `spatialdds.SPEC_TAG`
49
+ and `spatialdds.SPEC_COMMIT` are the ones that say what the wire looks like.
45
50
 
46
51
  The source, the reference gateway, the recordings and every gate behind the
47
- claims on this page are at [https://github.com/OpenArCloud/spatialdds-web](https://github.com/OpenArCloud/spatialdds-web). Every code block below is executed
52
+ claims on this page are at [https://github.com/OpenArCloud/spatialdds-py](https://github.com/OpenArCloud/spatialdds-py). Every code block below is executed
48
53
  by one of those gates on every run, against an endpoint started for it.
49
54
 
55
+ ## A native participant, over DDS
56
+
57
+ The same package speaks SpatialDDS natively, beside `sd.connect`. Install the
58
+ `[dds]` extra (it brings cyclonedds), and a participant is a plain program:
59
+ an entity with an announce, pose updates, and a clean withdrawal on exit.
60
+
61
+ <!-- native: participant -->
62
+ ```python
63
+ import spatialdds as sd
64
+
65
+ with sd.participant("bare-scene", domain=42, service_id="svc:duck",
66
+ authority="registry.example") as p:
67
+ frame = sd.frame("map/bare-scene", convention="ENU", meters_per_unit=1.0)
68
+ duck = p.writer("model_entity", qos_profile="MAP_META", on_exit="withdraw")
69
+ pose = p.writer("model_pose", qos_profile=sd.dds.Profile(
70
+ "DUCK_POSE", reliability="BEST_EFFORT", durability="VOLATILE"))
71
+ p.announce("OTHER", coverage=sd.circle(30.2849, -97.7341, 50))
72
+ duck.write(sd.entity("ent:duck", frame_ref=frame, source_id="svc:duck"))
73
+ for i in p.loop(hz=5):
74
+ pose.write(sd.model_pose("ent:duck", position=(i * 0.1, 0, 0),
75
+ source_id="svc:duck"))
76
+ if i == 9:
77
+ break
78
+ print("stopped; the duck was withdrawn on the way out")
79
+ ```
80
+
81
+ ```console
82
+ stopped; the duck was withdrawn on the way out
83
+ ```
84
+
85
+ Anyone on the domain sees it, through the same four events the web client's
86
+ `subscribe()` yields:
87
+
88
+ <!-- native: reader -->
89
+ ```python
90
+ import spatialdds as sd
91
+
92
+ with sd.participant("bare-scene", domain=42) as p:
93
+ for ev in p.reader("model_entity", qos_profile="MAP_META").events(timeout=5):
94
+ if isinstance(ev, sd.Sample):
95
+ print("Sample", ev.key, ev.data.state.name)
96
+ elif isinstance(ev, sd.Dispose):
97
+ print("Dispose", ev.key, repr(ev.reason))
98
+ else:
99
+ print(type(ev).__name__)
100
+ ```
101
+
102
+ ```console
103
+ EndOfReplay
104
+ Sample ent:duck ACTIVE
105
+ Sample ent:duck RETIRED
106
+ Dispose ent:duck 'the participant stopped'
107
+ ```
108
+
109
+ What it asks of you, and what it will not guess:
110
+
111
+ | you say | or it refuses |
112
+ | --- | --- |
113
+ | `scene`, and `domain` (or `SPATIALDDS_DDS_DOMAIN`) | always: there is no default scene, and DDS's domain 0 is not a choice anyone made |
114
+ | `service_id` and `authority` | to write or announce |
115
+ | `qos_profile` | where the §3.3.2 row names none, as `model_entity`'s and `model_pose`'s do; the refusal lists the §3.3.3 profiles that fit, or pass a `sd.dds.Profile(...)` extension |
116
+ | `on_exit="keep"` or `"withdraw"` | on every latched, keyed writer: whether a record outlives its writer is a claim only you can make |
117
+ | `withdraw(key, reason=...)` | with an empty reason |
118
+
119
+ And what it does without being asked:
120
+
121
+ - **Writers never autodispose.** A participant that crashes reaches every
122
+ reader as `Liveliness(alive=False)` once its lease runs out. It is never a
123
+ `Dispose`, which is only ever somebody's `withdraw()`: a terminal sample,
124
+ then the dispose, with the reason.
125
+ - **A clean stop departs.** Each writer does what its `on_exit` said. Then the
126
+ announce sends its terminal sample, its dispose and a `Depart`, and every
127
+ writer waits for its acknowledgements.
128
+ - **The announce is kept fresh.** `tick()`, which `loop()` calls, refreshes it
129
+ every `ttl_sec / 3`, and its `topics` are the writers you opened. `floor_hz=`
130
+ keeps a stationary publisher's records fresh too.
131
+ - **Every sample is validated** against the published JSON Schema before it is
132
+ written.
133
+
134
+ For a program that already owns its loop, or reads lanes beyond its own
135
+ scene:
136
+
137
+ - **`reader.take()`** returns what has arrived, now, without blocking: the
138
+ same events as `events()`, with the same single `EndOfReplay`. It is for a
139
+ tick, a framework's timer, or a request handler.
140
+ - **`topic=`** on `writer()` and `reader()` gives the whole name, for another
141
+ scene's lane or one the spec names only by example. It is held to §3.3.1's
142
+ grammar, and a templated type to its template. `history=` sets a reader's
143
+ own cache, for a reply reader that must keep every reply.
144
+ - **`ignore_local=True`** on a reader drops the participant's own writes, for
145
+ a bridge that writes and reads one lane. **`matched()`** and
146
+ **`wait_matched()`** on writers and readers count the other side.
147
+ - **`p.announce(transforms=...)`** carries the service's frame placement.
148
+ `service_id=` and `topics=` announce several services from one
149
+ participant.
150
+ - **`p.relay()`** re-publishes other services' announces. It uses a writer of
151
+ its own and marks each with a `relayed_by` hint naming the relay, so it
152
+ never speaks as the asserter.
153
+ - **`sd.dds.class_for(name)`** is the generated class for a registered type
154
+ name, a well-known message or a dotted identity.
155
+
156
+ `Sample.data` is the typed sample (`sd.dds.types` carries every type in the
157
+ pinned IDL). `sd.dds.to_json(sample)` is its N.1 form, produced by the gateway's
158
+ own codec, so a native sample and a served one cannot disagree.
159
+
160
+ Without the extra, `import spatialdds` is unchanged, and `sd.participant`
161
+ raises `sd.MissingExtra` naming it. Two modules are pure Python and need
162
+ nothing:
163
+
164
+ - `sd.frames`: one copy of the ENU↔ECEF arithmetic, with composition that
165
+ never guesses a position;
166
+ - `sd.Recency`: learned per-key idle thresholds for fast lanes.
167
+
168
+ `sd.events` holds the four event classes both transports share; `sd.dds` is the
169
+ layer itself. Request and reply (VPS, coverage queries) is documented as a
170
+ convention, not built, until 1.9 settles it:
171
+ [REQUEST-REPLY.md](https://github.com/OpenArCloud/spatialdds-py/blob/main/docs/REQUEST-REPLY.md).
172
+
50
173
  ## Your own registry, in one command
51
174
 
52
175
  ```sh
@@ -133,9 +256,9 @@ limits {'max_fps': 10}
133
256
  ```
134
257
 
135
258
  Every one of those is something a service operator knows and a library cannot
136
- guess. [The mytown walkthrough](https://github.com/OpenArCloud/spatialdds-web/blob/main/docs/MYTOWN.md) publishes that
259
+ guess. [The mytown walkthrough](https://github.com/OpenArCloud/spatialdds-py/blob/main/docs/MYTOWN.md) publishes that
137
260
  and prints the whole served document;
138
- [`gates/builders.py`](https://github.com/OpenArCloud/spatialdds-web/blob/main/gates/builders.py) rebuilds that
261
+ [`gates/builders.py`](https://github.com/OpenArCloud/spatialdds-py/blob/main/gates/builders.py) rebuilds that
139
262
  repository's hand-authored `austin-vps` and duck records through these calls
140
263
  and compares them member by member, which is what makes "every member is
141
264
  reachable from an argument" a check rather than a claim.
@@ -147,7 +270,7 @@ and the byte count itself: a hash nobody typed is a hash a reader can trust.
147
270
  else hosts, and the hash comes from whoever has the bytes. Pass no hash and
148
271
  the reference carries no integrity claim, which costs a reader one thing:
149
272
  `fetch_asset()` raises rather than reporting a check it could not perform
150
- ([finding 31](https://github.com/OpenArCloud/spatialdds-web/blob/main/WEB-BINDING-FINDINGS.md)).
273
+ ([finding 31](https://github.com/OpenArCloud/spatialdds-py/blob/main/WEB-BINDING-FINDINGS.md)).
151
274
  `publish_content` takes either, or a path, or bytes, or a URL.
152
275
 
153
276
  The builders are also usable on their own: `sd.service_announce`,
@@ -179,7 +302,7 @@ they never fill is **identity**: `provider_id` and `org` are yours to state,
179
302
  because a library that invented a provider id would be inventing provenance.
180
303
 
181
304
  `GeoAnchor.checksum` is required by 1.8 and specified by nobody
182
- (spatialdds-web finding 31). The builder fills it with the SHA-256 of the
305
+ (spatialdds-py finding 31). The builder fills it with the SHA-256 of the
183
306
  record's own canonical JSON with `checksum` emptied -- a convention, chosen
184
307
  because a reader can recompute it from what was served. If the specification
185
308
  settles the semantics, this changes.
@@ -313,7 +436,7 @@ call goes away and the bar is one line.
313
436
  | `sd.asset(path_or_bytes, media_type=)` / `sd.asset_ref(url, hash=, media_type=)` | an asset hashed from its bytes, or a reference to one hosted elsewhere |
314
437
  | `sd.records` | the builders, listed above |
315
438
  | `sd.lift(fqn, doc)` | the lift on its own, for JSON you already have |
316
- | `sd.SPEC_COMMIT`, `sd.APPENDIX_N`, `sd.__version__` | what this speaks |
439
+ | `sd.SPEC_TAG`, `sd.SPEC_COMMIT`, `sd.APPENDIX_N`, `sd.__version__` | what this speaks |
317
440
 
318
441
  `ep.near()` picks a geohash precision whose cell covers the radius, encodes the
319
442
  centre and eight points around the query circle so the covering cells are found
@@ -346,7 +469,7 @@ One family, built from the endpoint's own N.8 problem documents — `status`,
346
469
 
347
470
  That last one is the unusual one and it is deliberate. SpatialDDS counts "a
348
471
  checksum field in the body" as a §7.5.2 integrity signal, but nothing specifies
349
- what such a field digests or in what form (spatialdds-web finding 31). Where a
472
+ what such a field digests or in what form (spatialdds-py finding 31). Where a
350
473
  declared value does not parse as a SHA-256 of the asset's bytes, this library
351
474
  raises rather than reporting a check it did not perform.
352
475
 
@@ -471,6 +594,41 @@ explicitly was tried first and is what missed two paths.
471
594
 
472
595
  If your clients are not browsers, nothing here changes anything for you.
473
596
 
597
+ ## New in 0.7.1: for programs that own their loop
598
+
599
+ Everything SpatialDDS-demo's adoption found missing, and nothing removed:
600
+ `reader.take()`, `topic=` and `history=`, `ignore_local=`, `matched()` and
601
+ `wait_matched()`, announces that carry placement and speak for several
602
+ services, `p.relay()`, and `sd.dds.class_for()`. They are described with the
603
+ native participant at the top of this page. Nothing in 0.7.0 changed
604
+ behaviour. Details are in the
605
+ [changelog](https://github.com/OpenArCloud/spatialdds-py/blob/main/lib/spatialdds/CHANGELOG.md).
606
+
607
+ ## New in 0.7.0: a native participant, and the v1.8 tag
608
+
609
+ - **The package speaks DDS natively.** `sd.participant(...)`, under the `[dds]`
610
+ extra, is described at the top of this page. It takes the conventions as
611
+ code and leaves the program a plain program.
612
+ - **One pin, the `v1.8` tag**, for everything vendored: the schemas, the IDL,
613
+ the native bindings and the registry its QoS comes from.
614
+ - **Four-segment topics.** The gateway now serves them at their well-known
615
+ paths, where it used to drop them.
616
+ - **Recordings carry their disposes.** A recording's withdrawals are served
617
+ with their reasons.
618
+
619
+ Two changes may need a line of yours:
620
+
621
+ - **`sd.topic()` derives durability from a registered `qos_profile`.** It used
622
+ to say `TRANSIENT_LOCAL` whatever the profile was. For a templated type
623
+ (`model_entity`) it uses the template's name.
624
+ - **`sd.Sample` and friends moved to `spatialdds.events`.** They are
625
+ re-exported where they were.
626
+
627
+ The repository is now
628
+ [spatialdds-py](https://github.com/OpenArCloud/spatialdds-py), and the package
629
+ name is unchanged. Details are in the
630
+ [changelog](https://github.com/OpenArCloud/spatialdds-py/blob/main/lib/spatialdds/CHANGELOG.md).
631
+
474
632
  ## New in 0.6.0: lanes, hardening, OpenAPI
475
633
 
476
634
  One registry can now take several publishers. Each one holds a token scoped to
@@ -489,14 +647,23 @@ Two changes may need a line of yours:
489
647
  `…/ut-austin-south-mall/…`.
490
648
 
491
649
  The security fixes, the limits table and the details are in the
492
- [changelog](https://github.com/OpenArCloud/spatialdds-web/blob/main/lib/spatialdds/CHANGELOG.md).
650
+ [changelog](https://github.com/OpenArCloud/spatialdds-py/blob/main/lib/spatialdds/CHANGELOG.md).
651
+
652
+ ## Not in 0.7.1
653
+
654
+ Stated so nobody waits for them:
493
655
 
494
- ## Not in 0.6.0
656
+ - no async API;
657
+ - no caching beyond ETag revalidation;
658
+ - no retry policy;
659
+ - no client-side command helper;
660
+ - no request/reply machinery in the native layer. VPS and coverage queries are
661
+ a documented convention until 1.9 settles their shape, and 0.7.1 makes
662
+ their lanes reachable;
663
+ - no C++ or other-language port.
495
664
 
496
- Stated so nobody waits for them: no async API, no caching beyond ETag
497
- revalidation, no retry policy, no MCAP tooling beyond the journal the server
498
- writes, no client-side command helper, and no DDS dependency of any kind. The
499
- wire is HTTP and a WebSocket.
665
+ The web client still has no DDS dependency of any kind: cyclonedds arrives
666
+ only with `[dds]`.
500
667
 
501
668
  0.4.0 added the N.6 command surface described above; 0.5.0 made it usable
502
669
  from an embedder with a live source, which is two releases for one capability
@@ -1,35 +1,12 @@
1
- Metadata-Version: 2.4
2
- Name: spatialdds
3
- Version: 0.6.0
4
- Summary: SpatialDDS over plain HTTPS and a WebSocket: a client for the web binding (Appendix N), and the reference registry behind one command.
5
- Author: Open AR Cloud
6
- License: Apache-2.0
7
- Project-URL: Homepage, https://github.com/OpenArCloud/spatialdds-web
8
- Project-URL: Specification, https://github.com/OpenArCloud/SpatialDDS-spec
9
- Keywords: spatialdds,spatial,geopose,anchors,registry,openarcloud
10
- Classifier: Development Status :: 3 - Alpha
11
- Classifier: Intended Audience :: Developers
12
- Classifier: License :: OSI Approved :: Apache Software License
13
- Classifier: Programming Language :: Python :: 3
14
- Classifier: Programming Language :: Python :: 3 :: Only
15
- Classifier: Topic :: Scientific/Engineering :: GIS
16
- Requires-Python: >=3.9
17
- Description-Content-Type: text/markdown
18
- Requires-Dist: requests>=2.25
19
- Requires-Dist: websockets>=12
20
- Provides-Extra: server
21
- Requires-Dist: aiohttp>=3.8; extra == "server"
22
- Requires-Dist: mcap>=1.1; extra == "server"
23
- Requires-Dist: jsonschema>=4.0; extra == "server"
24
-
25
1
  # spatialdds
26
2
 
27
- SpatialDDS over plain HTTPS and a WebSocket: a client for programs, and the
28
- reference registry behind one command.
3
+ SpatialDDS for programs: a client over plain HTTPS and a WebSocket, a native
4
+ DDS participant, and the reference registry behind one command.
29
5
 
30
6
  ```sh
31
7
  pip install spatialdds # the client: two dependencies
32
8
  pip install "spatialdds[server]" # and the registry
9
+ pip install "spatialdds[dds]" # and a native DDS participant
33
10
  pip install "./lib/spatialdds[server]" # from a checkout of this repo
34
11
  ```
35
12
 
@@ -39,14 +16,132 @@ package is the step after that, when a program wants native values instead of
39
16
  canonical JSON, bytes it can trust, refusals it can act on, and records it did
40
17
  not have to assemble member by member.
41
18
 
42
- **Implements Appendix N as of SpatialDDS-spec `9c3e1f2`.** Package versions and
43
- specification versions move independently; `spatialdds.SPEC_COMMIT` is the one
44
- that says what the wire looks like.
19
+ **Implements Appendix N as of SpatialDDS-spec `v1.8` (`4b5652c`).** Package
20
+ versions and specification versions move independently; `spatialdds.SPEC_TAG`
21
+ and `spatialdds.SPEC_COMMIT` are the ones that say what the wire looks like.
45
22
 
46
23
  The source, the reference gateway, the recordings and every gate behind the
47
- claims on this page are at [https://github.com/OpenArCloud/spatialdds-web](https://github.com/OpenArCloud/spatialdds-web). Every code block below is executed
24
+ claims on this page are at [https://github.com/OpenArCloud/spatialdds-py](https://github.com/OpenArCloud/spatialdds-py). Every code block below is executed
48
25
  by one of those gates on every run, against an endpoint started for it.
49
26
 
27
+ ## A native participant, over DDS
28
+
29
+ The same package speaks SpatialDDS natively, beside `sd.connect`. Install the
30
+ `[dds]` extra (it brings cyclonedds), and a participant is a plain program:
31
+ an entity with an announce, pose updates, and a clean withdrawal on exit.
32
+
33
+ <!-- native: participant -->
34
+ ```python
35
+ import spatialdds as sd
36
+
37
+ with sd.participant("bare-scene", domain=42, service_id="svc:duck",
38
+ authority="registry.example") as p:
39
+ frame = sd.frame("map/bare-scene", convention="ENU", meters_per_unit=1.0)
40
+ duck = p.writer("model_entity", qos_profile="MAP_META", on_exit="withdraw")
41
+ pose = p.writer("model_pose", qos_profile=sd.dds.Profile(
42
+ "DUCK_POSE", reliability="BEST_EFFORT", durability="VOLATILE"))
43
+ p.announce("OTHER", coverage=sd.circle(30.2849, -97.7341, 50))
44
+ duck.write(sd.entity("ent:duck", frame_ref=frame, source_id="svc:duck"))
45
+ for i in p.loop(hz=5):
46
+ pose.write(sd.model_pose("ent:duck", position=(i * 0.1, 0, 0),
47
+ source_id="svc:duck"))
48
+ if i == 9:
49
+ break
50
+ print("stopped; the duck was withdrawn on the way out")
51
+ ```
52
+
53
+ ```console
54
+ stopped; the duck was withdrawn on the way out
55
+ ```
56
+
57
+ Anyone on the domain sees it, through the same four events the web client's
58
+ `subscribe()` yields:
59
+
60
+ <!-- native: reader -->
61
+ ```python
62
+ import spatialdds as sd
63
+
64
+ with sd.participant("bare-scene", domain=42) as p:
65
+ for ev in p.reader("model_entity", qos_profile="MAP_META").events(timeout=5):
66
+ if isinstance(ev, sd.Sample):
67
+ print("Sample", ev.key, ev.data.state.name)
68
+ elif isinstance(ev, sd.Dispose):
69
+ print("Dispose", ev.key, repr(ev.reason))
70
+ else:
71
+ print(type(ev).__name__)
72
+ ```
73
+
74
+ ```console
75
+ EndOfReplay
76
+ Sample ent:duck ACTIVE
77
+ Sample ent:duck RETIRED
78
+ Dispose ent:duck 'the participant stopped'
79
+ ```
80
+
81
+ What it asks of you, and what it will not guess:
82
+
83
+ | you say | or it refuses |
84
+ | --- | --- |
85
+ | `scene`, and `domain` (or `SPATIALDDS_DDS_DOMAIN`) | always: there is no default scene, and DDS's domain 0 is not a choice anyone made |
86
+ | `service_id` and `authority` | to write or announce |
87
+ | `qos_profile` | where the §3.3.2 row names none, as `model_entity`'s and `model_pose`'s do; the refusal lists the §3.3.3 profiles that fit, or pass a `sd.dds.Profile(...)` extension |
88
+ | `on_exit="keep"` or `"withdraw"` | on every latched, keyed writer: whether a record outlives its writer is a claim only you can make |
89
+ | `withdraw(key, reason=...)` | with an empty reason |
90
+
91
+ And what it does without being asked:
92
+
93
+ - **Writers never autodispose.** A participant that crashes reaches every
94
+ reader as `Liveliness(alive=False)` once its lease runs out. It is never a
95
+ `Dispose`, which is only ever somebody's `withdraw()`: a terminal sample,
96
+ then the dispose, with the reason.
97
+ - **A clean stop departs.** Each writer does what its `on_exit` said. Then the
98
+ announce sends its terminal sample, its dispose and a `Depart`, and every
99
+ writer waits for its acknowledgements.
100
+ - **The announce is kept fresh.** `tick()`, which `loop()` calls, refreshes it
101
+ every `ttl_sec / 3`, and its `topics` are the writers you opened. `floor_hz=`
102
+ keeps a stationary publisher's records fresh too.
103
+ - **Every sample is validated** against the published JSON Schema before it is
104
+ written.
105
+
106
+ For a program that already owns its loop, or reads lanes beyond its own
107
+ scene:
108
+
109
+ - **`reader.take()`** returns what has arrived, now, without blocking: the
110
+ same events as `events()`, with the same single `EndOfReplay`. It is for a
111
+ tick, a framework's timer, or a request handler.
112
+ - **`topic=`** on `writer()` and `reader()` gives the whole name, for another
113
+ scene's lane or one the spec names only by example. It is held to §3.3.1's
114
+ grammar, and a templated type to its template. `history=` sets a reader's
115
+ own cache, for a reply reader that must keep every reply.
116
+ - **`ignore_local=True`** on a reader drops the participant's own writes, for
117
+ a bridge that writes and reads one lane. **`matched()`** and
118
+ **`wait_matched()`** on writers and readers count the other side.
119
+ - **`p.announce(transforms=...)`** carries the service's frame placement.
120
+ `service_id=` and `topics=` announce several services from one
121
+ participant.
122
+ - **`p.relay()`** re-publishes other services' announces. It uses a writer of
123
+ its own and marks each with a `relayed_by` hint naming the relay, so it
124
+ never speaks as the asserter.
125
+ - **`sd.dds.class_for(name)`** is the generated class for a registered type
126
+ name, a well-known message or a dotted identity.
127
+
128
+ `Sample.data` is the typed sample (`sd.dds.types` carries every type in the
129
+ pinned IDL). `sd.dds.to_json(sample)` is its N.1 form, produced by the gateway's
130
+ own codec, so a native sample and a served one cannot disagree.
131
+
132
+ Without the extra, `import spatialdds` is unchanged, and `sd.participant`
133
+ raises `sd.MissingExtra` naming it. Two modules are pure Python and need
134
+ nothing:
135
+
136
+ - `sd.frames`: one copy of the ENU↔ECEF arithmetic, with composition that
137
+ never guesses a position;
138
+ - `sd.Recency`: learned per-key idle thresholds for fast lanes.
139
+
140
+ `sd.events` holds the four event classes both transports share; `sd.dds` is the
141
+ layer itself. Request and reply (VPS, coverage queries) is documented as a
142
+ convention, not built, until 1.9 settles it:
143
+ [REQUEST-REPLY.md](https://github.com/OpenArCloud/spatialdds-py/blob/main/docs/REQUEST-REPLY.md).
144
+
50
145
  ## Your own registry, in one command
51
146
 
52
147
  ```sh
@@ -133,9 +228,9 @@ limits {'max_fps': 10}
133
228
  ```
134
229
 
135
230
  Every one of those is something a service operator knows and a library cannot
136
- guess. [The mytown walkthrough](https://github.com/OpenArCloud/spatialdds-web/blob/main/docs/MYTOWN.md) publishes that
231
+ guess. [The mytown walkthrough](https://github.com/OpenArCloud/spatialdds-py/blob/main/docs/MYTOWN.md) publishes that
137
232
  and prints the whole served document;
138
- [`gates/builders.py`](https://github.com/OpenArCloud/spatialdds-web/blob/main/gates/builders.py) rebuilds that
233
+ [`gates/builders.py`](https://github.com/OpenArCloud/spatialdds-py/blob/main/gates/builders.py) rebuilds that
139
234
  repository's hand-authored `austin-vps` and duck records through these calls
140
235
  and compares them member by member, which is what makes "every member is
141
236
  reachable from an argument" a check rather than a claim.
@@ -147,7 +242,7 @@ and the byte count itself: a hash nobody typed is a hash a reader can trust.
147
242
  else hosts, and the hash comes from whoever has the bytes. Pass no hash and
148
243
  the reference carries no integrity claim, which costs a reader one thing:
149
244
  `fetch_asset()` raises rather than reporting a check it could not perform
150
- ([finding 31](https://github.com/OpenArCloud/spatialdds-web/blob/main/WEB-BINDING-FINDINGS.md)).
245
+ ([finding 31](https://github.com/OpenArCloud/spatialdds-py/blob/main/WEB-BINDING-FINDINGS.md)).
151
246
  `publish_content` takes either, or a path, or bytes, or a URL.
152
247
 
153
248
  The builders are also usable on their own: `sd.service_announce`,
@@ -179,7 +274,7 @@ they never fill is **identity**: `provider_id` and `org` are yours to state,
179
274
  because a library that invented a provider id would be inventing provenance.
180
275
 
181
276
  `GeoAnchor.checksum` is required by 1.8 and specified by nobody
182
- (spatialdds-web finding 31). The builder fills it with the SHA-256 of the
277
+ (spatialdds-py finding 31). The builder fills it with the SHA-256 of the
183
278
  record's own canonical JSON with `checksum` emptied -- a convention, chosen
184
279
  because a reader can recompute it from what was served. If the specification
185
280
  settles the semantics, this changes.
@@ -313,7 +408,7 @@ call goes away and the bar is one line.
313
408
  | `sd.asset(path_or_bytes, media_type=)` / `sd.asset_ref(url, hash=, media_type=)` | an asset hashed from its bytes, or a reference to one hosted elsewhere |
314
409
  | `sd.records` | the builders, listed above |
315
410
  | `sd.lift(fqn, doc)` | the lift on its own, for JSON you already have |
316
- | `sd.SPEC_COMMIT`, `sd.APPENDIX_N`, `sd.__version__` | what this speaks |
411
+ | `sd.SPEC_TAG`, `sd.SPEC_COMMIT`, `sd.APPENDIX_N`, `sd.__version__` | what this speaks |
317
412
 
318
413
  `ep.near()` picks a geohash precision whose cell covers the radius, encodes the
319
414
  centre and eight points around the query circle so the covering cells are found
@@ -346,7 +441,7 @@ One family, built from the endpoint's own N.8 problem documents — `status`,
346
441
 
347
442
  That last one is the unusual one and it is deliberate. SpatialDDS counts "a
348
443
  checksum field in the body" as a §7.5.2 integrity signal, but nothing specifies
349
- what such a field digests or in what form (spatialdds-web finding 31). Where a
444
+ what such a field digests or in what form (spatialdds-py finding 31). Where a
350
445
  declared value does not parse as a SHA-256 of the asset's bytes, this library
351
446
  raises rather than reporting a check it did not perform.
352
447
 
@@ -471,6 +566,41 @@ explicitly was tried first and is what missed two paths.
471
566
 
472
567
  If your clients are not browsers, nothing here changes anything for you.
473
568
 
569
+ ## New in 0.7.1: for programs that own their loop
570
+
571
+ Everything SpatialDDS-demo's adoption found missing, and nothing removed:
572
+ `reader.take()`, `topic=` and `history=`, `ignore_local=`, `matched()` and
573
+ `wait_matched()`, announces that carry placement and speak for several
574
+ services, `p.relay()`, and `sd.dds.class_for()`. They are described with the
575
+ native participant at the top of this page. Nothing in 0.7.0 changed
576
+ behaviour. Details are in the
577
+ [changelog](https://github.com/OpenArCloud/spatialdds-py/blob/main/lib/spatialdds/CHANGELOG.md).
578
+
579
+ ## New in 0.7.0: a native participant, and the v1.8 tag
580
+
581
+ - **The package speaks DDS natively.** `sd.participant(...)`, under the `[dds]`
582
+ extra, is described at the top of this page. It takes the conventions as
583
+ code and leaves the program a plain program.
584
+ - **One pin, the `v1.8` tag**, for everything vendored: the schemas, the IDL,
585
+ the native bindings and the registry its QoS comes from.
586
+ - **Four-segment topics.** The gateway now serves them at their well-known
587
+ paths, where it used to drop them.
588
+ - **Recordings carry their disposes.** A recording's withdrawals are served
589
+ with their reasons.
590
+
591
+ Two changes may need a line of yours:
592
+
593
+ - **`sd.topic()` derives durability from a registered `qos_profile`.** It used
594
+ to say `TRANSIENT_LOCAL` whatever the profile was. For a templated type
595
+ (`model_entity`) it uses the template's name.
596
+ - **`sd.Sample` and friends moved to `spatialdds.events`.** They are
597
+ re-exported where they were.
598
+
599
+ The repository is now
600
+ [spatialdds-py](https://github.com/OpenArCloud/spatialdds-py), and the package
601
+ name is unchanged. Details are in the
602
+ [changelog](https://github.com/OpenArCloud/spatialdds-py/blob/main/lib/spatialdds/CHANGELOG.md).
603
+
474
604
  ## New in 0.6.0: lanes, hardening, OpenAPI
475
605
 
476
606
  One registry can now take several publishers. Each one holds a token scoped to
@@ -489,14 +619,23 @@ Two changes may need a line of yours:
489
619
  `…/ut-austin-south-mall/…`.
490
620
 
491
621
  The security fixes, the limits table and the details are in the
492
- [changelog](https://github.com/OpenArCloud/spatialdds-web/blob/main/lib/spatialdds/CHANGELOG.md).
622
+ [changelog](https://github.com/OpenArCloud/spatialdds-py/blob/main/lib/spatialdds/CHANGELOG.md).
623
+
624
+ ## Not in 0.7.1
625
+
626
+ Stated so nobody waits for them:
493
627
 
494
- ## Not in 0.6.0
628
+ - no async API;
629
+ - no caching beyond ETag revalidation;
630
+ - no retry policy;
631
+ - no client-side command helper;
632
+ - no request/reply machinery in the native layer. VPS and coverage queries are
633
+ a documented convention until 1.9 settles their shape, and 0.7.1 makes
634
+ their lanes reachable;
635
+ - no C++ or other-language port.
495
636
 
496
- Stated so nobody waits for them: no async API, no caching beyond ETag
497
- revalidation, no retry policy, no MCAP tooling beyond the journal the server
498
- writes, no client-side command helper, and no DDS dependency of any kind. The
499
- wire is HTTP and a WebSocket.
637
+ The web client still has no DDS dependency of any kind: cyclonedds arrives
638
+ only with `[dds]`.
500
639
 
501
640
  0.4.0 added the N.6 command surface described above; 0.5.0 made it usable
502
641
  from an embedder with a live source, which is two releases for one capability