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.
- {spatialdds-0.6.0/spatialdds.egg-info → spatialdds-0.7.1}/PKG-INFO +189 -22
- spatialdds-0.6.0/PKG-INFO → spatialdds-0.7.1/README.md +181 -42
- {spatialdds-0.6.0 → spatialdds-0.7.1}/pyproject.toml +26 -9
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/__init__.py +26 -9
- spatialdds-0.7.1/spatialdds/artifacts/idl/anchors.idl +68 -0
- spatialdds-0.7.1/spatialdds/artifacts/idl/argeo.idl +125 -0
- spatialdds-0.7.1/spatialdds/artifacts/idl/common.idl +174 -0
- spatialdds-0.7.1/spatialdds/artifacts/idl/events.idl +362 -0
- spatialdds-0.7.1/spatialdds/artifacts/idl/lidar.idl +126 -0
- spatialdds-0.7.1/spatialdds/artifacts/idl/mapping.idl +322 -0
- spatialdds-0.7.1/spatialdds/artifacts/idl/provisional/owm.idl +153 -0
- spatialdds-0.7.1/spatialdds/artifacts/idl/provisional/radio.idl +142 -0
- spatialdds-0.7.1/spatialdds/artifacts/idl/provisional/rf_beam.idl +148 -0
- spatialdds-0.7.1/spatialdds/artifacts/idl/rad.idl +241 -0
- spatialdds-0.7.1/spatialdds/artifacts/idl/semantics.idl +212 -0
- spatialdds-0.7.1/spatialdds/artifacts/idl/slam_frontend.idl +103 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/idl/types.idl +6 -0
- spatialdds-0.7.1/spatialdds/artifacts/idl/vio.idl +112 -0
- spatialdds-0.7.1/spatialdds/artifacts/idl/vision.idl +165 -0
- spatialdds-0.7.1/spatialdds/artifacts/openapi.html +17 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/openapi.yaml +71 -2
- spatialdds-0.7.1/spatialdds/artifacts/registry.json +561 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_vision_CamIntrinsics.json +1 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_vision_VisionFrame.json +1 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_vision_VisionMeta.json +2 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/serializer_tables.json +1 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/client.py +5 -28
- spatialdds-0.7.1/spatialdds/dds/__init__.py +79 -0
- spatialdds-0.7.1/spatialdds/dds/_extra.py +22 -0
- spatialdds-0.7.1/spatialdds/dds/_participant.py +1026 -0
- spatialdds-0.7.1/spatialdds/dds/blob.py +128 -0
- spatialdds-0.7.1/spatialdds/dds/codec.py +183 -0
- spatialdds-0.7.1/spatialdds/dds/qos.py +68 -0
- spatialdds-0.7.1/spatialdds/dds/record.py +107 -0
- spatialdds-0.7.1/spatialdds/dds/registry.py +324 -0
- spatialdds-0.7.1/spatialdds/dds/types/__init__.py +12 -0
- spatialdds-0.7.1/spatialdds/dds/types/_field_aliases.py +26 -0
- spatialdds-0.7.1/spatialdds/dds/types/builtin/__init__.py +11 -0
- spatialdds-0.7.1/spatialdds/dds/types/builtin/_types.py +28 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/__init__.py +33 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/anchors/__init__.py +20 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/anchors/_anchors.py +102 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/argeo/__init__.py +22 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/argeo/_argeo.py +97 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/common/__init__.py +27 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/common/_types.py +104 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/core/GnssService/__init__.py +17 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/core/GnssService/_core.py +27 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/core/__init__.py +40 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/core/_core.py +338 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/disco/__init__.py +34 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/disco/_discovery.py +252 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/events/__init__.py +29 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/events/_events.py +164 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/events/enums/__init__.py +19 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/events/enums/crossing_direction_enum/__init__.py +11 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/events/enums/crossing_direction_enum/_events.py +25 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/events/enums/event_state_enum/__init__.py +11 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/events/enums/event_state_enum/_events.py +26 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/events/enums/event_type_enum/__init__.py +11 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/events/enums/event_type_enum/_events.py +36 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/events/enums/severity_enum/__init__.py +11 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/events/enums/severity_enum/_events.py +26 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/events/enums/zone_kind_enum/__init__.py +11 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/events/enums/zone_kind_enum/_events.py +31 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/mapping/__init__.py +30 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/mapping/_mapping.py +168 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/mapping/enums/__init__.py +19 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/mapping/enums/alignment_method/__init__.py +11 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/mapping/enums/alignment_method/_mapping.py +31 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/mapping/enums/edge_type/__init__.py +11 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/mapping/enums/edge_type/_mapping.py +34 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/mapping/enums/map_event_kind/__init__.py +11 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/mapping/enums/map_event_kind/_mapping.py +29 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/mapping/enums/map_kind/__init__.py +11 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/mapping/enums/map_kind/_mapping.py +32 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/mapping/enums/map_status/__init__.py +11 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/mapping/enums/map_status/_mapping.py +27 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/owm/__init__.py +22 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/owm/_owm.py +103 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/semantics/__init__.py +22 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/semantics/_semantics.py +174 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/sensing/__init__.py +21 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/sensing/common/__init__.py +34 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/sensing/common/_common.py +192 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/sensing/lidar/__init__.py +32 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/sensing/lidar/_lidar.py +135 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/sensing/rad/__init__.py +33 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/sensing/rad/_rad.py +191 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/sensing/radio/__init__.py +22 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/sensing/radio/_radio.py +141 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/sensing/rf_beam/__init__.py +25 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/sensing/rf_beam/_rf_beam.py +117 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/sensing/vision/__init__.py +36 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/sensing/vision/_vision.py +171 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/slam_frontend/__init__.py +22 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/slam_frontend/_slam_frontend.py +144 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/vio/__init__.py +20 -0
- spatialdds-0.7.1/spatialdds/dds/types/spatial/vio/_vio.py +134 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/demo/fountain-anchors.mcap +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/errors.py +1 -1
- spatialdds-0.7.1/spatialdds/events.py +57 -0
- spatialdds-0.7.1/spatialdds/frames.py +222 -0
- spatialdds-0.7.1/spatialdds/recency.py +119 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/records.py +127 -11
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/serve.py +12 -9
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/server/gateway.py +151 -21
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/server/gw_http.py +15 -1
- spatialdds-0.7.1/spatialdds/server/mcapmeta.py +19 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/server/pin.py +91 -17
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/server/publish.py +15 -7
- spatialdds-0.6.0/README.md → spatialdds-0.7.1/spatialdds.egg-info/PKG-INFO +209 -18
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds.egg-info/SOURCES.txt +91 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds.egg-info/requires.txt +5 -0
- spatialdds-0.6.0/spatialdds/artifacts/openapi.html +0 -17
- {spatialdds-0.6.0 → spatialdds-0.7.1}/setup.cfg +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/idl/core.idl +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/idl/discovery.idl +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/builtin_Time.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_anchors_AnchorDelta.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_anchors_AnchorEntry.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_anchors_AnchorSet.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_anchors_AnchorSetRequest.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_anchors_AnchorSetResponse.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_argeo_NodeGeo.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_argeo_QualityRequirements.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_argeo_VpsRequest.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_argeo_VpsResponse.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_common_AssetRef.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_common_FrameRef.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_common_KV.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_common_MetaKV.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_common_Vec2.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_Aabb3.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_BlobChunk.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_BlobRef.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_ComponentRef.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_Edge.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_EntityBinding.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_FrameTransform.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_FramedPose.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_GeoAnchor.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_GeoPose.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_NavSatStatus.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_Node.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_PlannedTrajectory.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_PlannedWaypoint.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_PoseSE3.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_SnapshotRequest.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_SnapshotResponse.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_TileKey.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_TileMeta.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_core_TilePatch.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_Announce.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_Capabilities.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_ContentAnnounce.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_CoverageElement.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_CoverageFilter.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_CoverageHint.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_CoverageQuery.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_CoverageResponse.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_Depart.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_KV.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_ProfileSupport.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_ServiceSummary.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_TopicMeta.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_Transform.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_disco_ValidityWindow.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_events_CrossingLine.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_events_SpatialEvent.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_events_SpatialZone.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_events_ZoneState.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_mapping_Edge.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_mapping_MapAlignment.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_mapping_MapEvent.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_mapping_MapMeta.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_mapping_MapQuality.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_owm_Entity.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_owm_ModelCommand.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_owm_ModelPose.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_semantics_Detection2D.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_semantics_Detection2DSet.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_semantics_Detection3D.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_semantics_Detection3DSet.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_semantics_FusedTrack.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_semantics_FusedTrackSet.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_semantics_Keypoint3D.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_semantics_KeypointLink.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_common_Axis.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_common_FrameHeader.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_common_FrameQuality.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_common_Linspace.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_common_ROI.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_common_ROIReply.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_common_ROIRequest.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_common_StreamMeta.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_lidar_LidarDetection.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_lidar_LidarDetectionSet.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_lidar_LidarFrame.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_lidar_LidarMeta.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_rad_RadDetection.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_rad_RadDetectionSet.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_rad_RadSensorMeta.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_rad_RadTensorFrame.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_rad_RadTensorMeta.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_radio_RadioObservation.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_radio_RadioScan.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_radio_RadioSensorMeta.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_rf_beam_RfBeamArraySet.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_rf_beam_RfBeamFrame.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_rf_beam_RfBeamMeta.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_vision_Keypoint2D.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_vision_Track2D.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_sensing_vision_VisionDetections.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_slam_frontend_CameraInfo.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_slam_frontend_Feature2D.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_slam_frontend_FeatureMatch.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_slam_frontend_KeyframeFeatures.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_slam_frontend_Landmark.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_slam_frontend_MatchSet.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_slam_frontend_TrackObs.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_slam_frontend_Tracklet.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_vio_FusedState.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_vio_ImuInfo.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_vio_ImuSample.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_vio_MagnetometerSample.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/artifacts/schemas/spatial_vio_SensorFusionSample.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/canonical.py +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/canonjson.py +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/demo/assets/duck.gltf +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/demo/assets/fountain-label.txt +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/demo/assets/fountain-marker.gltf +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/demo/manifests/content-fountain-label.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/demo/manifests/content-fountain-marker.json +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/journal.py +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/server/__init__.py +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/server/commands.py +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/server/idlmodel.py +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/server/limits.py +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/server/tenancy.py +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/server/webjson.py +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/server/xcdr2.py +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds/tokens.py +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds.egg-info/dependency_links.txt +0 -0
- {spatialdds-0.6.0 → spatialdds-0.7.1}/spatialdds.egg-info/entry_points.txt +0 -0
- {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.
|
|
4
|
-
Summary: SpatialDDS
|
|
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-
|
|
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
|
|
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 `
|
|
43
|
-
specification versions move independently; `spatialdds.
|
|
44
|
-
that
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
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
|
-
|
|
497
|
-
|
|
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
|
|
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 `
|
|
43
|
-
specification versions move independently; `spatialdds.
|
|
44
|
-
that
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
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
|
-
|
|
497
|
-
|
|
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
|