viam-sdk 0.54.2b0__py3-none-linux_armv6l.whl → 0.55.0__py3-none-linux_armv6l.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of viam-sdk might be problematic. Click here for more details.

Files changed (79) hide show
  1. viam/app/app_client.py +1 -1
  2. viam/components/camera/camera.py +15 -4
  3. viam/components/camera/client.py +13 -5
  4. viam/components/camera/service.py +12 -3
  5. viam/components/component_base.py +2 -2
  6. viam/gen/app/agent/v1/agent_pb2.py +1 -1
  7. viam/gen/app/cloudslam/v1/cloud_slam_pb2.py +1 -1
  8. viam/gen/app/data/v1/data_pb2.py +1 -1
  9. viam/gen/app/datapipelines/v1/data_pipelines_pb2.py +1 -1
  10. viam/gen/app/dataset/v1/dataset_pb2.py +1 -1
  11. viam/gen/app/datasync/v1/data_sync_pb2.py +1 -1
  12. viam/gen/app/mlinference/v1/ml_inference_pb2.py +1 -1
  13. viam/gen/app/mltraining/v1/ml_training_pb2.py +1 -1
  14. viam/gen/app/packages/v1/packages_pb2.py +1 -1
  15. viam/gen/app/v1/app_pb2.py +1 -1
  16. viam/gen/app/v1/billing_pb2.py +1 -1
  17. viam/gen/app/v1/end_user_pb2.py +1 -1
  18. viam/gen/app/v1/robot_pb2.py +1 -1
  19. viam/gen/common/v1/common_pb2.py +44 -42
  20. viam/gen/common/v1/common_pb2.pyi +38 -7
  21. viam/gen/component/arm/v1/arm_pb2.py +1 -1
  22. viam/gen/component/audioinput/v1/audioinput_pb2.py +1 -1
  23. viam/gen/component/base/v1/base_pb2.py +1 -1
  24. viam/gen/component/board/v1/board_pb2.py +1 -1
  25. viam/gen/component/button/v1/button_pb2.py +1 -1
  26. viam/gen/component/camera/v1/camera_pb2.py +1 -1
  27. viam/gen/component/encoder/v1/encoder_pb2.py +1 -1
  28. viam/gen/component/gantry/v1/gantry_pb2.py +1 -1
  29. viam/gen/component/generic/v1/generic_pb2.py +1 -1
  30. viam/gen/component/gripper/v1/gripper_pb2.py +1 -1
  31. viam/gen/component/inputcontroller/v1/input_controller_pb2.py +1 -1
  32. viam/gen/component/motor/v1/motor_pb2.py +1 -1
  33. viam/gen/component/movementsensor/v1/movementsensor_pb2.py +1 -1
  34. viam/gen/component/posetracker/v1/pose_tracker_pb2.py +1 -1
  35. viam/gen/component/powersensor/v1/powersensor_pb2.py +1 -1
  36. viam/gen/component/sensor/v1/sensor_pb2.py +1 -1
  37. viam/gen/component/servo/v1/servo_pb2.py +1 -1
  38. viam/gen/component/switch/v1/switch_pb2.py +1 -1
  39. viam/gen/component/testecho/v1/testecho_pb2.py +1 -1
  40. viam/gen/module/v1/module_pb2.py +1 -1
  41. viam/gen/proto/rpc/examples/echo/v1/echo_pb2.py +1 -1
  42. viam/gen/proto/rpc/examples/echoresource/v1/echoresource_pb2.py +1 -1
  43. viam/gen/proto/rpc/v1/auth_pb2.py +1 -1
  44. viam/gen/proto/rpc/webrtc/v1/grpc_pb2.py +1 -1
  45. viam/gen/proto/rpc/webrtc/v1/signaling_pb2.py +1 -1
  46. viam/gen/provisioning/v1/provisioning_pb2.py +1 -1
  47. viam/gen/robot/v1/robot_pb2.py +1 -1
  48. viam/gen/service/datamanager/v1/data_manager_pb2.py +1 -1
  49. viam/gen/service/discovery/v1/discovery_pb2.py +1 -1
  50. viam/gen/service/generic/v1/generic_pb2.py +1 -1
  51. viam/gen/service/mlmodel/v1/mlmodel_pb2.py +1 -1
  52. viam/gen/service/motion/v1/motion_pb2.py +1 -1
  53. viam/gen/service/navigation/v1/navigation_pb2.py +1 -1
  54. viam/gen/service/sensors/v1/sensors_pb2.py +1 -1
  55. viam/gen/service/shell/v1/shell_pb2.py +1 -1
  56. viam/gen/service/slam/v1/slam_pb2.py +1 -1
  57. viam/gen/service/vision/v1/vision_pb2.py +1 -1
  58. viam/gen/service/worldstatestore/__init__.py +0 -0
  59. viam/gen/service/worldstatestore/v1/__init__.py +0 -0
  60. viam/gen/service/worldstatestore/v1/world_state_store_grpc.py +55 -0
  61. viam/gen/service/worldstatestore/v1/world_state_store_pb2.py +39 -0
  62. viam/gen/service/worldstatestore/v1/world_state_store_pb2.pyi +171 -0
  63. viam/gen/stream/v1/stream_pb2.py +1 -1
  64. viam/gen/tagger/v1/tagger_pb2.py +1 -1
  65. viam/media/utils/pil/__init__.py +5 -1
  66. viam/media/video.py +70 -16
  67. viam/proto/common/__init__.py +2 -0
  68. viam/proto/service/worldstatestore/__init__.py +32 -0
  69. viam/services/vision/client.py +5 -1
  70. viam/services/vision/service.py +8 -8
  71. viam/services/worldstatestore/__init__.py +18 -0
  72. viam/services/worldstatestore/client.py +94 -0
  73. viam/services/worldstatestore/service.py +55 -0
  74. viam/services/worldstatestore/worldstatestore.py +90 -0
  75. viam/version_metadata.py +2 -2
  76. {viam_sdk-0.54.2b0.dist-info → viam_sdk-0.55.0.dist-info}/METADATA +1 -1
  77. {viam_sdk-0.54.2b0.dist-info → viam_sdk-0.55.0.dist-info}/RECORD +79 -69
  78. {viam_sdk-0.54.2b0.dist-info → viam_sdk-0.55.0.dist-info}/WHEEL +0 -0
  79. {viam_sdk-0.54.2b0.dist-info → viam_sdk-0.55.0.dist-info}/licenses/LICENSE +0 -0
@@ -4,7 +4,7 @@ from google.protobuf import descriptor_pool as _descriptor_pool
4
4
  from google.protobuf import runtime_version as _runtime_version
5
5
  from google.protobuf import symbol_database as _symbol_database
6
6
  from google.protobuf.internal import builder as _builder
7
- _runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 2, '', 'stream/v1/stream.proto')
7
+ _runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 3, '', 'stream/v1/stream.proto')
8
8
  _sym_db = _symbol_database.Default()
9
9
  DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16stream/v1/stream.proto\x12\x0fproto.stream.v1"\x14\n\x12ListStreamsRequest"+\n\x13ListStreamsResponse\x12\x14\n\x05names\x18\x01 \x03(\tR\x05names"&\n\x10AddStreamRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name"\x13\n\x11AddStreamResponse")\n\x13RemoveStreamRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name"\x16\n\x14RemoveStreamResponse":\n\nResolution\x12\x14\n\x05width\x18\x01 \x01(\x05R\x05width\x12\x16\n\x06height\x18\x02 \x01(\x05R\x06height"-\n\x17GetStreamOptionsRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name"Y\n\x18GetStreamOptionsResponse\x12=\n\x0bresolutions\x18\x01 \x03(\x0b2\x1b.proto.stream.v1.ResolutionR\x0bresolutions"j\n\x17SetStreamOptionsRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12;\n\nresolution\x18\x02 \x01(\x0b2\x1b.proto.stream.v1.ResolutionR\nresolution"\x1a\n\x18SetStreamOptionsResponse2\xec\x03\n\rStreamService\x12X\n\x0bListStreams\x12#.proto.stream.v1.ListStreamsRequest\x1a$.proto.stream.v1.ListStreamsResponse\x12R\n\tAddStream\x12!.proto.stream.v1.AddStreamRequest\x1a".proto.stream.v1.AddStreamResponse\x12g\n\x10GetStreamOptions\x12(.proto.stream.v1.GetStreamOptionsRequest\x1a).proto.stream.v1.GetStreamOptionsResponse\x12g\n\x10SetStreamOptions\x12(.proto.stream.v1.SetStreamOptionsRequest\x1a).proto.stream.v1.SetStreamOptionsResponse\x12[\n\x0cRemoveStream\x12$.proto.stream.v1.RemoveStreamRequest\x1a%.proto.stream.v1.RemoveStreamResponseB.Z,github.com/edaniels/gostream/proto/stream/v1b\x06proto3')
10
10
  _globals = globals()
@@ -4,7 +4,7 @@ from google.protobuf import descriptor_pool as _descriptor_pool
4
4
  from google.protobuf import runtime_version as _runtime_version
5
5
  from google.protobuf import symbol_database as _symbol_database
6
6
  from google.protobuf.internal import builder as _builder
7
- _runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 2, '', 'tagger/v1/tagger.proto')
7
+ _runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 3, '', 'tagger/v1/tagger.proto')
8
8
  _sym_db = _symbol_database.Default()
9
9
  from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2
10
10
  DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16tagger/v1/tagger.proto\x12\ttagger.v1\x1a google/protobuf/descriptor.proto:3\n\x04tags\x12\x1d.google.protobuf.FieldOptions\x18\xc3\xe03 \x01(\tR\x04tags:>\n\noneof_tags\x12\x1d.google.protobuf.OneofOptions\x18\xc3\xe03 \x01(\tR\toneofTagsB4Z2github.com/srikrsna/protoc-gen-gotag/tagger;taggerb\x06proto3')
@@ -39,6 +39,10 @@ def pil_to_viam_image(image: Image.Image, mime_type: CameraMimeType) -> ViamImag
39
39
  Returns:
40
40
  ViamImage: The resulting ViamImage
41
41
  """
42
+ # Make sure at runtime the mime_type string is actually a CameraMimeType
43
+ if not isinstance(mime_type, CameraMimeType):
44
+ raise ValueError(f"Cannot encode to unsupported mimetype: {mime_type}")
45
+
42
46
  if mime_type.name in LIBRARY_SUPPORTED_FORMATS:
43
47
  buf = BytesIO()
44
48
  if image.mode == "RGBA" and mime_type == CameraMimeType.JPEG:
@@ -46,6 +50,6 @@ def pil_to_viam_image(image: Image.Image, mime_type: CameraMimeType) -> ViamImag
46
50
  image.save(buf, format=mime_type.name)
47
51
  data = buf.getvalue()
48
52
  else:
49
- raise ValueError(f"Cannot encode image to {mime_type}")
53
+ raise ValueError(f"Cannot encode to unsupported mimetype: {mime_type}")
50
54
 
51
55
  return ViamImage(data, mime_type)
viam/media/video.py CHANGED
@@ -1,8 +1,7 @@
1
1
  from array import array
2
- from enum import Enum
3
- from typing import List, Optional, Tuple
2
+ from typing import Any, List, Optional, Tuple
4
3
 
5
- from typing_extensions import Self
4
+ from typing_extensions import ClassVar, Self
6
5
 
7
6
  from viam.errors import NotSupportedError
8
7
  from viam.proto.component.camera import Format
@@ -10,12 +9,53 @@ from viam.proto.component.camera import Format
10
9
  from .viam_rgba import RGBA_HEADER_LENGTH, RGBA_MAGIC_NUMBER
11
10
 
12
11
 
13
- class CameraMimeType(str, Enum):
14
- VIAM_RGBA = "image/vnd.viam.rgba"
15
- VIAM_RAW_DEPTH = "image/vnd.viam.dep"
16
- JPEG = "image/jpeg"
17
- PNG = "image/png"
18
- PCD = "pointcloud/pcd"
12
+ class _FrozenClassAttributesMeta(type):
13
+ """
14
+ A metaclass that prevents the reassignment of existing class attributes.
15
+ """
16
+
17
+ def __setattr__(cls, name: str, value: Any):
18
+ # Check if the attribute `name` already exists on the class
19
+ if name in cls.__dict__:
20
+ # If it exists, raise an error to prevent overwriting
21
+ raise AttributeError(f"Cannot reassign constant '{name}'")
22
+ # If it's a new attribute, allow it to be set
23
+ super().__setattr__(name, value)
24
+
25
+
26
+ class CameraMimeType(str, metaclass=_FrozenClassAttributesMeta):
27
+ """
28
+ The compatible mime-types for cameras and vision services.
29
+
30
+ You can use the `CameraMimeType.CUSTOM(...)` method to use an unlisted mime-type.
31
+ """
32
+
33
+ VIAM_RGBA: ClassVar[Self]
34
+ VIAM_RAW_DEPTH: ClassVar[Self]
35
+ JPEG: ClassVar[Self]
36
+ PNG: ClassVar[Self]
37
+ PCD: ClassVar[Self]
38
+
39
+ @property
40
+ def name(self) -> str:
41
+ for key, value in self.__class__.__dict__.items():
42
+ if value == self:
43
+ return key
44
+ return "CUSTOM"
45
+
46
+ @property
47
+ def value(self) -> str:
48
+ return self
49
+
50
+ @classmethod
51
+ def CUSTOM(cls, mime_type: str) -> Self:
52
+ """
53
+ Create a custom mime type.
54
+
55
+ Args:
56
+ mime_type (str): The mimetype as a string
57
+ """
58
+ return cls.from_string(mime_type)
19
59
 
20
60
  @classmethod
21
61
  def from_string(cls, value: str) -> Self:
@@ -31,7 +71,7 @@ class CameraMimeType(str, Enum):
31
71
  return cls(value_mime)
32
72
 
33
73
  @classmethod
34
- def from_proto(cls, format: Format.ValueType) -> "CameraMimeType":
74
+ def from_proto(cls, format: Format.ValueType) -> Self:
35
75
  """Returns the mimetype from a proto enum.
36
76
 
37
77
  Args:
@@ -41,14 +81,15 @@ class CameraMimeType(str, Enum):
41
81
  Self: The mimetype.
42
82
  """
43
83
  mimetypes = {
44
- Format.FORMAT_RAW_RGBA: CameraMimeType.VIAM_RGBA,
45
- Format.FORMAT_RAW_DEPTH: CameraMimeType.VIAM_RAW_DEPTH,
46
- Format.FORMAT_JPEG: CameraMimeType.JPEG,
47
- Format.FORMAT_PNG: CameraMimeType.PNG,
84
+ Format.FORMAT_RAW_RGBA: cls.VIAM_RGBA,
85
+ Format.FORMAT_RAW_DEPTH: cls.VIAM_RAW_DEPTH,
86
+ Format.FORMAT_JPEG: cls.JPEG,
87
+ Format.FORMAT_PNG: cls.PNG,
48
88
  }
49
- return mimetypes.get(format, CameraMimeType.JPEG)
89
+ return cls(mimetypes.get(format, cls.JPEG))
50
90
 
51
- def to_proto(self) -> Format.ValueType:
91
+ @property
92
+ def proto(self) -> Format.ValueType:
52
93
  """Returns the mimetype in a proto enum.
53
94
 
54
95
  Returns:
@@ -62,6 +103,19 @@ class CameraMimeType(str, Enum):
62
103
  }
63
104
  return formats.get(self, Format.FORMAT_UNSPECIFIED)
64
105
 
106
+ def to_proto(self) -> Format.ValueType:
107
+ """
108
+ DEPRECATED: Use `CameraMimeType.proto`
109
+ """
110
+ return self.proto
111
+
112
+
113
+ CameraMimeType.VIAM_RGBA = CameraMimeType.from_string("image/vnd.viam.rgba")
114
+ CameraMimeType.VIAM_RAW_DEPTH = CameraMimeType.from_string("image/vnd.viam.dep")
115
+ CameraMimeType.JPEG = CameraMimeType.from_string("image/jpeg")
116
+ CameraMimeType.PNG = CameraMimeType.from_string("image/png")
117
+ CameraMimeType.PCD = CameraMimeType.from_string("pointcloud/pcd")
118
+
65
119
 
66
120
  class ViamImage:
67
121
  """A native implementation of an image.
@@ -22,6 +22,7 @@ from ...gen.common.v1.common_pb2 import (
22
22
  LogEntry,
23
23
  Mesh,
24
24
  Orientation,
25
+ PointCloud,
25
26
  PointCloudObject,
26
27
  Pose,
27
28
  PoseInFrame,
@@ -53,6 +54,7 @@ __all__ = [
53
54
  "LogEntry",
54
55
  "Mesh",
55
56
  "Orientation",
57
+ "PointCloud",
56
58
  "PointCloudObject",
57
59
  "Pose",
58
60
  "PoseInFrame",
@@ -0,0 +1,32 @@
1
+ """
2
+ @generated by Viam.
3
+ Do not edit manually!
4
+ """
5
+
6
+ from ....gen.service.worldstatestore.v1.world_state_store_grpc import (
7
+ UnimplementedWorldStateStoreServiceBase,
8
+ WorldStateStoreServiceBase,
9
+ WorldStateStoreServiceStub,
10
+ )
11
+ from ....gen.service.worldstatestore.v1.world_state_store_pb2 import (
12
+ GetTransformRequest,
13
+ GetTransformResponse,
14
+ ListUUIDsRequest,
15
+ ListUUIDsResponse,
16
+ StreamTransformChangesRequest,
17
+ StreamTransformChangesResponse,
18
+ TransformChangeType,
19
+ )
20
+
21
+ __all__ = [
22
+ "UnimplementedWorldStateStoreServiceBase",
23
+ "WorldStateStoreServiceBase",
24
+ "WorldStateStoreServiceStub",
25
+ "GetTransformRequest",
26
+ "GetTransformResponse",
27
+ "ListUUIDsRequest",
28
+ "ListUUIDsResponse",
29
+ "StreamTransformChangesRequest",
30
+ "StreamTransformChangesResponse",
31
+ "TransformChangeType",
32
+ ]
@@ -69,7 +69,11 @@ class VisionClient(Vision, ReconfigurableResourceRPCClientBase):
69
69
  result = CaptureAllResult()
70
70
  result.extra = struct_to_dict(response.extra)
71
71
  if return_image:
72
- mime_type = CameraMimeType.from_proto(response.image.format)
72
+ # TODO(RSDK-11728): remove this branching logic once we deleted the format field
73
+ if response.image.mime_type:
74
+ mime_type = CameraMimeType.from_string(response.image.mime_type)
75
+ else:
76
+ mime_type = CameraMimeType.from_proto(response.image.format)
73
77
  img = ViamImage(response.image.image, mime_type)
74
78
  result.image = img
75
79
  if return_classifications:
@@ -26,7 +26,7 @@ from viam.utils import dict_to_struct, struct_to_dict
26
26
  from .vision import Vision
27
27
 
28
28
 
29
- class VisionRPCService(UnimplementedVisionServiceBase, ResourceRPCServiceBase):
29
+ class VisionRPCService(UnimplementedVisionServiceBase, ResourceRPCServiceBase[Vision]):
30
30
  """
31
31
  gRPC service for a Vision service
32
32
  """
@@ -50,9 +50,11 @@ class VisionRPCService(UnimplementedVisionServiceBase, ResourceRPCServiceBase):
50
50
  )
51
51
  img = None
52
52
  if result.image is not None:
53
- fmt = result.image.mime_type.to_proto()
53
+ mime_type = CameraMimeType.from_string(result.image.mime_type)
54
+ # TODO(RSDK-11728): remove this fmt logic once we deleted the format field
55
+ fmt = mime_type.to_proto() # Will be Format.FORMAT_UNSPECIFIED if an unsupported/custom mime type is set
54
56
  img_bytes = result.image.data
55
- img = Image(source_name=request.camera_name, format=fmt, image=img_bytes)
57
+ img = Image(source_name=request.camera_name, mime_type=mime_type, format=fmt, image=img_bytes)
56
58
  response = CaptureAllFromCameraResponse(
57
59
  image=img,
58
60
  detections=result.detections,
@@ -79,8 +81,7 @@ class VisionRPCService(UnimplementedVisionServiceBase, ResourceRPCServiceBase):
79
81
  extra = struct_to_dict(request.extra)
80
82
  timeout = stream.deadline.time_remaining() if stream.deadline else None
81
83
 
82
- mime_type = CameraMimeType.from_string(request.mime_type)
83
- image = ViamImage(request.image, mime_type)
84
+ image = ViamImage(request.image, CameraMimeType.from_string(request.mime_type))
84
85
 
85
86
  result = await vision.get_detections(image, extra=extra, timeout=timeout)
86
87
  response = GetDetectionsResponse(detections=result)
@@ -105,8 +106,7 @@ class VisionRPCService(UnimplementedVisionServiceBase, ResourceRPCServiceBase):
105
106
  extra = struct_to_dict(request.extra)
106
107
  timeout = stream.deadline.time_remaining() if stream.deadline else None
107
108
 
108
- mime_type = CameraMimeType.from_string(request.mime_type)
109
- image = ViamImage(request.image, mime_type)
109
+ image = ViamImage(request.image, CameraMimeType.from_string(request.mime_type))
110
110
 
111
111
  result = await vision.get_classifications(image, request.n, extra=extra, timeout=timeout)
112
112
  response = GetClassificationsResponse(classifications=result)
@@ -119,7 +119,7 @@ class VisionRPCService(UnimplementedVisionServiceBase, ResourceRPCServiceBase):
119
119
  extra = struct_to_dict(request.extra)
120
120
  timeout = stream.deadline.time_remaining() if stream.deadline else None
121
121
  result = await vision.get_object_point_clouds(request.camera_name, extra=extra, timeout=timeout)
122
- response = GetObjectPointCloudsResponse(mime_type=CameraMimeType.PCD.value, objects=result)
122
+ response = GetObjectPointCloudsResponse(mime_type=CameraMimeType.PCD, objects=result)
123
123
  await stream.send_message(response)
124
124
 
125
125
  async def GetProperties(self, stream: Stream[GetPropertiesRequest, GetPropertiesResponse]) -> None:
@@ -0,0 +1,18 @@
1
+ from viam.proto.service.worldstatestore import StreamTransformChangesResponse, TransformChangeType
2
+ from viam.resource.registry import Registry, ResourceRegistration
3
+
4
+ from .client import WorldStateStoreClient
5
+ from .service import WorldStateStoreService
6
+ from .worldstatestore import WorldStateStore
7
+
8
+ __all__ = [
9
+ "WorldStateStore",
10
+ "WorldStateStoreClient",
11
+ "WorldStateStoreService",
12
+ "StreamTransformChangesResponse",
13
+ "TransformChangeType",
14
+ ]
15
+
16
+ Registry.register_api(
17
+ ResourceRegistration(WorldStateStore, WorldStateStoreService, lambda name, channel: WorldStateStoreClient(name, channel))
18
+ )
@@ -0,0 +1,94 @@
1
+ from typing import Any, AsyncGenerator, List, Mapping, Optional
2
+
3
+ from grpclib.client import Channel
4
+
5
+ from viam.proto.common import DoCommandRequest, DoCommandResponse, Transform
6
+ from viam.proto.service.worldstatestore import (
7
+ GetTransformRequest,
8
+ GetTransformResponse,
9
+ ListUUIDsRequest,
10
+ ListUUIDsResponse,
11
+ StreamTransformChangesRequest,
12
+ StreamTransformChangesResponse,
13
+ WorldStateStoreServiceStub,
14
+ )
15
+ from viam.resource.rpc_client_base import ReconfigurableResourceRPCClientBase
16
+ from viam.utils import ValueTypes, dict_to_struct, struct_to_dict
17
+
18
+ from .worldstatestore import WorldStateStore
19
+
20
+
21
+ class WorldStateStoreClient(WorldStateStore, ReconfigurableResourceRPCClientBase):
22
+ """
23
+ gRPC client for the WorldStateStore service.
24
+ """
25
+
26
+ client: WorldStateStoreServiceStub
27
+
28
+ def __init__(self, name: str, channel: Channel):
29
+ self.channel = channel
30
+ self.client = WorldStateStoreServiceStub(channel)
31
+ super().__init__(name)
32
+
33
+ async def list_uuids(
34
+ self,
35
+ *,
36
+ extra: Optional[Mapping[str, Any]] = None,
37
+ timeout: Optional[float] = None,
38
+ **kwargs,
39
+ ) -> List[bytes]:
40
+ md = kwargs.get("metadata", self.Metadata()).proto
41
+ request = ListUUIDsRequest(
42
+ name=self.name,
43
+ extra=dict_to_struct(extra),
44
+ )
45
+ response: ListUUIDsResponse = await self.client.ListUUIDs(request, timeout=timeout, metadata=md)
46
+ return list(response.uuids)
47
+
48
+ async def get_transform(
49
+ self,
50
+ uuid: bytes,
51
+ *,
52
+ extra: Optional[Mapping[str, Any]] = None,
53
+ timeout: Optional[float] = None,
54
+ **kwargs,
55
+ ) -> "Transform":
56
+ md = kwargs.get("metadata", self.Metadata()).proto
57
+ request = GetTransformRequest(
58
+ name=self.name,
59
+ uuid=uuid,
60
+ extra=dict_to_struct(extra),
61
+ )
62
+ response: GetTransformResponse = await self.client.GetTransform(request, timeout=timeout, metadata=md)
63
+ return response.transform
64
+
65
+ async def stream_transform_changes(
66
+ self,
67
+ *,
68
+ extra: Optional[Mapping[str, Any]] = None,
69
+ timeout: Optional[float] = None,
70
+ **kwargs,
71
+ ) -> AsyncGenerator[StreamTransformChangesResponse, None]:
72
+ md = kwargs.get("metadata", self.Metadata()).proto
73
+ request = StreamTransformChangesRequest(
74
+ name=self.name,
75
+ extra=dict_to_struct(extra),
76
+ )
77
+ responses = await self.client.StreamTransformChanges(request, timeout=timeout, metadata=md)
78
+ for response in responses:
79
+ yield response
80
+
81
+ async def do_command(
82
+ self,
83
+ command: Mapping[str, ValueTypes],
84
+ *,
85
+ timeout: Optional[float] = None,
86
+ **kwargs,
87
+ ) -> Mapping[str, ValueTypes]:
88
+ md = kwargs.get("metadata", self.Metadata()).proto
89
+ request = DoCommandRequest(
90
+ name=self.name,
91
+ command=dict_to_struct(command),
92
+ )
93
+ response: DoCommandResponse = await self.client.DoCommand(request, timeout=timeout, metadata=md)
94
+ return struct_to_dict(response.result)
@@ -0,0 +1,55 @@
1
+ from grpclib.server import Stream
2
+
3
+ from viam.proto.common import DoCommandRequest, DoCommandResponse
4
+ from viam.proto.service.worldstatestore import (
5
+ GetTransformRequest,
6
+ GetTransformResponse,
7
+ ListUUIDsRequest,
8
+ ListUUIDsResponse,
9
+ StreamTransformChangesRequest,
10
+ StreamTransformChangesResponse,
11
+ UnimplementedWorldStateStoreServiceBase,
12
+ )
13
+ from viam.resource.rpc_service_base import ResourceRPCServiceBase
14
+ from viam.utils import dict_to_struct, struct_to_dict
15
+
16
+ from .worldstatestore import WorldStateStore
17
+
18
+
19
+ class WorldStateStoreService(UnimplementedWorldStateStoreServiceBase, ResourceRPCServiceBase[WorldStateStore]):
20
+ RESOURCE_TYPE = WorldStateStore
21
+
22
+ async def ListUUIDs(self, stream: Stream[ListUUIDsRequest, ListUUIDsResponse]) -> None:
23
+ request = await stream.recv_message()
24
+ assert request is not None
25
+ service = self.get_resource(request.name)
26
+ timeout = stream.deadline.time_remaining() if stream.deadline else None
27
+ uuids = await service.list_uuids(extra=struct_to_dict(request.extra), timeout=timeout)
28
+ await stream.send_message(ListUUIDsResponse(uuids=uuids))
29
+
30
+ async def GetTransform(self, stream: Stream[GetTransformRequest, GetTransformResponse]) -> None:
31
+ request = await stream.recv_message()
32
+ assert request is not None
33
+ service = self.get_resource(request.name)
34
+ timeout = stream.deadline.time_remaining() if stream.deadline else None
35
+ transform = await service.get_transform(uuid=request.uuid, extra=struct_to_dict(request.extra), timeout=timeout)
36
+ await stream.send_message(GetTransformResponse(transform=transform))
37
+
38
+ async def StreamTransformChanges(
39
+ self,
40
+ stream: Stream[StreamTransformChangesRequest, StreamTransformChangesResponse],
41
+ ) -> None:
42
+ request = await stream.recv_message()
43
+ assert request is not None
44
+ service = self.get_resource(request.name)
45
+ timeout = stream.deadline.time_remaining() if stream.deadline else None
46
+ async for change in service.stream_transform_changes(extra=struct_to_dict(request.extra), timeout=timeout):
47
+ await stream.send_message(change)
48
+
49
+ async def DoCommand(self, stream: Stream[DoCommandRequest, DoCommandResponse]) -> None:
50
+ request = await stream.recv_message()
51
+ assert request is not None
52
+ worldstatestore = self.get_resource(request.name)
53
+ timeout = stream.deadline.time_remaining() if stream.deadline else None
54
+ result = await worldstatestore.do_command(struct_to_dict(request.command), timeout=timeout)
55
+ await stream.send_message(DoCommandResponse(result=dict_to_struct(result)))
@@ -0,0 +1,90 @@
1
+ import abc
2
+ from typing import Any, AsyncGenerator, Final, List, Mapping, Optional
3
+
4
+ from viam.proto.common import Transform
5
+ from viam.proto.service.worldstatestore import (
6
+ StreamTransformChangesResponse,
7
+ )
8
+ from viam.resource.types import API, RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_SERVICE
9
+
10
+ from ..service_base import ServiceBase
11
+
12
+
13
+ class WorldStateStore(ServiceBase):
14
+ """WorldStateStore is a Viam service that manages world state transforms.
15
+
16
+ The WorldStateStore service provides functionality to store, retrieve, and stream
17
+ changes to world state transforms, which represent the pose of objects in different
18
+ reference frames. This functionality can be used to create custom visualizations of the world state.
19
+
20
+ For more information, see `WorldStateStore service <https://docs.viam.com/dev/reference/apis/services/worldstatestore/>`_.
21
+ """
22
+
23
+ API: Final = API( # pyright: ignore [reportIncompatibleVariableOverride]
24
+ RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_SERVICE, "world_state_store"
25
+ )
26
+
27
+ @abc.abstractmethod
28
+ async def list_uuids(
29
+ self,
30
+ *,
31
+ extra: Optional[Mapping[str, Any]] = None,
32
+ timeout: Optional[float] = None,
33
+ ) -> List[bytes]:
34
+ """List all world state transform UUIDs.
35
+
36
+ ::
37
+
38
+ worldstatestore = WorldStateStoreClient.from_robot(robot=machine, name="builtin")
39
+
40
+ uuids = await worldstatestore.list_uuids()
41
+
42
+ Returns:
43
+ List[bytes]: A list of transform UUIDs
44
+ """
45
+ ...
46
+
47
+ @abc.abstractmethod
48
+ async def get_transform(
49
+ self,
50
+ uuid: bytes,
51
+ *,
52
+ extra: Optional[Mapping[str, Any]] = None,
53
+ timeout: Optional[float] = None,
54
+ ) -> Transform:
55
+ """Get a world state transform by UUID.
56
+
57
+ ::
58
+
59
+ worldstatestore = WorldStateStoreClient.from_robot(robot=machine, name="builtin")
60
+
61
+ transform = await worldstatestore.get_transform(uuid=b"some-uuid")
62
+
63
+ Args:
64
+ uuid (bytes): The UUID of the transform to retrieve
65
+
66
+ Returns:
67
+ Transform: The requested transform
68
+ """
69
+ ...
70
+
71
+ @abc.abstractmethod
72
+ async def stream_transform_changes(
73
+ self,
74
+ *,
75
+ extra: Optional[Mapping[str, Any]] = None,
76
+ timeout: Optional[float] = None,
77
+ ) -> AsyncGenerator[StreamTransformChangesResponse, None]:
78
+ """Stream changes to world state transforms.
79
+
80
+ ::
81
+
82
+ worldstatestore = WorldStateStoreClient.from_robot(robot=machine, name="builtin")
83
+
84
+ async for change in worldstatestore.stream_transform_changes():
85
+ print(f"Transform {change.transform.uuid} {change.change_type}")
86
+
87
+ Returns:
88
+ AsyncIterator[StreamTransformChangesResponse]: A stream of transform changes
89
+ """
90
+ ...
viam/version_metadata.py CHANGED
@@ -1,4 +1,4 @@
1
- __version__ = "0.54.2b0"
1
+ __version__ = "0.55.0"
2
2
 
3
- API_VERSION = "v0.1.474"
3
+ API_VERSION = "v0.1.475"
4
4
  SDK_VERSION = __version__
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: viam-sdk
3
- Version: 0.54.2b0
3
+ Version: 0.55.0
4
4
  Summary: Viam Robotics Python SDK
5
5
  Project-URL: Homepage, https://www.viam.com
6
6
  Project-URL: Documentation, https://python.viam.dev