viam-sdk 0.54.2b0__py3-none-linux_armv6l.whl → 0.55.1__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 (80) hide show
  1. viam/app/app_client.py +13 -5
  2. viam/components/camera/camera.py +14 -3
  3. viam/components/camera/client.py +13 -5
  4. viam/components/camera/service.py +13 -5
  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/rpc/libviam_rust_utils.so +0 -0
  70. viam/services/vision/client.py +5 -1
  71. viam/services/vision/service.py +8 -8
  72. viam/services/worldstatestore/__init__.py +18 -0
  73. viam/services/worldstatestore/client.py +94 -0
  74. viam/services/worldstatestore/service.py +55 -0
  75. viam/services/worldstatestore/worldstatestore.py +90 -0
  76. viam/version_metadata.py +2 -2
  77. {viam_sdk-0.54.2b0.dist-info → viam_sdk-0.55.1.dist-info}/METADATA +1 -1
  78. {viam_sdk-0.54.2b0.dist-info → viam_sdk-0.55.1.dist-info}/RECORD +80 -70
  79. {viam_sdk-0.54.2b0.dist-info → viam_sdk-0.55.1.dist-info}/WHEEL +0 -0
  80. {viam_sdk-0.54.2b0.dist-info → viam_sdk-0.55.1.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,171 @@
1
+ """
2
+ @generated by mypy-protobuf. Do not edit manually!
3
+ isort:skip_file
4
+ """
5
+ import builtins
6
+ import collections.abc
7
+ from .... import common
8
+ import google.protobuf.descriptor
9
+ import google.protobuf.field_mask_pb2
10
+ import google.protobuf.internal.containers
11
+ import google.protobuf.internal.enum_type_wrapper
12
+ import google.protobuf.message
13
+ import google.protobuf.struct_pb2
14
+ import sys
15
+ import typing
16
+ if sys.version_info >= (3, 10):
17
+ import typing as typing_extensions
18
+ else:
19
+ import typing_extensions
20
+ DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
21
+
22
+ class _TransformChangeType:
23
+ ValueType = typing.NewType('ValueType', builtins.int)
24
+ V: typing_extensions.TypeAlias = ValueType
25
+
26
+ class _TransformChangeTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_TransformChangeType.ValueType], builtins.type):
27
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
28
+ TRANSFORM_CHANGE_TYPE_UNSPECIFIED: _TransformChangeType.ValueType
29
+ TRANSFORM_CHANGE_TYPE_ADDED: _TransformChangeType.ValueType
30
+ TRANSFORM_CHANGE_TYPE_REMOVED: _TransformChangeType.ValueType
31
+ TRANSFORM_CHANGE_TYPE_UPDATED: _TransformChangeType.ValueType
32
+
33
+ class TransformChangeType(_TransformChangeType, metaclass=_TransformChangeTypeEnumTypeWrapper):
34
+ ...
35
+ TRANSFORM_CHANGE_TYPE_UNSPECIFIED: TransformChangeType.ValueType
36
+ TRANSFORM_CHANGE_TYPE_ADDED: TransformChangeType.ValueType
37
+ TRANSFORM_CHANGE_TYPE_REMOVED: TransformChangeType.ValueType
38
+ TRANSFORM_CHANGE_TYPE_UPDATED: TransformChangeType.ValueType
39
+ global___TransformChangeType = TransformChangeType
40
+
41
+ @typing.final
42
+ class ListUUIDsRequest(google.protobuf.message.Message):
43
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
44
+ NAME_FIELD_NUMBER: builtins.int
45
+ EXTRA_FIELD_NUMBER: builtins.int
46
+ name: builtins.str
47
+ 'Name of the world object store service'
48
+
49
+ @property
50
+ def extra(self) -> google.protobuf.struct_pb2.Struct:
51
+ """Additional arguments to the method"""
52
+
53
+ def __init__(self, *, name: builtins.str=..., extra: google.protobuf.struct_pb2.Struct | None=...) -> None:
54
+ ...
55
+
56
+ def HasField(self, field_name: typing.Literal['extra', b'extra']) -> builtins.bool:
57
+ ...
58
+
59
+ def ClearField(self, field_name: typing.Literal['extra', b'extra', 'name', b'name']) -> None:
60
+ ...
61
+ global___ListUUIDsRequest = ListUUIDsRequest
62
+
63
+ @typing.final
64
+ class ListUUIDsResponse(google.protobuf.message.Message):
65
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
66
+ UUIDS_FIELD_NUMBER: builtins.int
67
+
68
+ @property
69
+ def uuids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.bytes]:
70
+ ...
71
+
72
+ def __init__(self, *, uuids: collections.abc.Iterable[builtins.bytes] | None=...) -> None:
73
+ ...
74
+
75
+ def ClearField(self, field_name: typing.Literal['uuids', b'uuids']) -> None:
76
+ ...
77
+ global___ListUUIDsResponse = ListUUIDsResponse
78
+
79
+ @typing.final
80
+ class GetTransformRequest(google.protobuf.message.Message):
81
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
82
+ NAME_FIELD_NUMBER: builtins.int
83
+ UUID_FIELD_NUMBER: builtins.int
84
+ EXTRA_FIELD_NUMBER: builtins.int
85
+ name: builtins.str
86
+ 'Name of the world object store service'
87
+ uuid: builtins.bytes
88
+
89
+ @property
90
+ def extra(self) -> google.protobuf.struct_pb2.Struct:
91
+ """Additional arguments to the method"""
92
+
93
+ def __init__(self, *, name: builtins.str=..., uuid: builtins.bytes=..., extra: google.protobuf.struct_pb2.Struct | None=...) -> None:
94
+ ...
95
+
96
+ def HasField(self, field_name: typing.Literal['extra', b'extra']) -> builtins.bool:
97
+ ...
98
+
99
+ def ClearField(self, field_name: typing.Literal['extra', b'extra', 'name', b'name', 'uuid', b'uuid']) -> None:
100
+ ...
101
+ global___GetTransformRequest = GetTransformRequest
102
+
103
+ @typing.final
104
+ class GetTransformResponse(google.protobuf.message.Message):
105
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
106
+ TRANSFORM_FIELD_NUMBER: builtins.int
107
+
108
+ @property
109
+ def transform(self) -> common.v1.common_pb2.Transform:
110
+ ...
111
+
112
+ def __init__(self, *, transform: common.v1.common_pb2.Transform | None=...) -> None:
113
+ ...
114
+
115
+ def HasField(self, field_name: typing.Literal['transform', b'transform']) -> builtins.bool:
116
+ ...
117
+
118
+ def ClearField(self, field_name: typing.Literal['transform', b'transform']) -> None:
119
+ ...
120
+ global___GetTransformResponse = GetTransformResponse
121
+
122
+ @typing.final
123
+ class StreamTransformChangesRequest(google.protobuf.message.Message):
124
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
125
+ NAME_FIELD_NUMBER: builtins.int
126
+ EXTRA_FIELD_NUMBER: builtins.int
127
+ name: builtins.str
128
+ 'Name of the world object store service'
129
+
130
+ @property
131
+ def extra(self) -> google.protobuf.struct_pb2.Struct:
132
+ """Additional arguments to the method"""
133
+
134
+ def __init__(self, *, name: builtins.str=..., extra: google.protobuf.struct_pb2.Struct | None=...) -> None:
135
+ ...
136
+
137
+ def HasField(self, field_name: typing.Literal['extra', b'extra']) -> builtins.bool:
138
+ ...
139
+
140
+ def ClearField(self, field_name: typing.Literal['extra', b'extra', 'name', b'name']) -> None:
141
+ ...
142
+ global___StreamTransformChangesRequest = StreamTransformChangesRequest
143
+
144
+ @typing.final
145
+ class StreamTransformChangesResponse(google.protobuf.message.Message):
146
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
147
+ CHANGE_TYPE_FIELD_NUMBER: builtins.int
148
+ TRANSFORM_FIELD_NUMBER: builtins.int
149
+ UPDATED_FIELDS_FIELD_NUMBER: builtins.int
150
+ change_type: global___TransformChangeType.ValueType
151
+
152
+ @property
153
+ def transform(self) -> common.v1.common_pb2.Transform:
154
+ ...
155
+
156
+ @property
157
+ def updated_fields(self) -> google.protobuf.field_mask_pb2.FieldMask:
158
+ """The field mask of the transform that has changed, if any. For added transforms, this will be empty. For updated
159
+ transforms, this will be the fields that have changed. For removed transforms, this will be the transform's UUID
160
+ path.
161
+ """
162
+
163
+ def __init__(self, *, change_type: global___TransformChangeType.ValueType=..., transform: common.v1.common_pb2.Transform | None=..., updated_fields: google.protobuf.field_mask_pb2.FieldMask | None=...) -> None:
164
+ ...
165
+
166
+ def HasField(self, field_name: typing.Literal['transform', b'transform', 'updated_fields', b'updated_fields']) -> builtins.bool:
167
+ ...
168
+
169
+ def ClearField(self, field_name: typing.Literal['change_type', b'change_type', 'transform', b'transform', 'updated_fields', b'updated_fields']) -> None:
170
+ ...
171
+ global___StreamTransformChangesResponse = StreamTransformChangesResponse
@@ -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
+ ]
Binary file
@@ -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)))