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.
- viam/app/app_client.py +13 -5
- viam/components/camera/camera.py +14 -3
- viam/components/camera/client.py +13 -5
- viam/components/camera/service.py +13 -5
- viam/components/component_base.py +2 -2
- viam/gen/app/agent/v1/agent_pb2.py +1 -1
- viam/gen/app/cloudslam/v1/cloud_slam_pb2.py +1 -1
- viam/gen/app/data/v1/data_pb2.py +1 -1
- viam/gen/app/datapipelines/v1/data_pipelines_pb2.py +1 -1
- viam/gen/app/dataset/v1/dataset_pb2.py +1 -1
- viam/gen/app/datasync/v1/data_sync_pb2.py +1 -1
- viam/gen/app/mlinference/v1/ml_inference_pb2.py +1 -1
- viam/gen/app/mltraining/v1/ml_training_pb2.py +1 -1
- viam/gen/app/packages/v1/packages_pb2.py +1 -1
- viam/gen/app/v1/app_pb2.py +1 -1
- viam/gen/app/v1/billing_pb2.py +1 -1
- viam/gen/app/v1/end_user_pb2.py +1 -1
- viam/gen/app/v1/robot_pb2.py +1 -1
- viam/gen/common/v1/common_pb2.py +44 -42
- viam/gen/common/v1/common_pb2.pyi +38 -7
- viam/gen/component/arm/v1/arm_pb2.py +1 -1
- viam/gen/component/audioinput/v1/audioinput_pb2.py +1 -1
- viam/gen/component/base/v1/base_pb2.py +1 -1
- viam/gen/component/board/v1/board_pb2.py +1 -1
- viam/gen/component/button/v1/button_pb2.py +1 -1
- viam/gen/component/camera/v1/camera_pb2.py +1 -1
- viam/gen/component/encoder/v1/encoder_pb2.py +1 -1
- viam/gen/component/gantry/v1/gantry_pb2.py +1 -1
- viam/gen/component/generic/v1/generic_pb2.py +1 -1
- viam/gen/component/gripper/v1/gripper_pb2.py +1 -1
- viam/gen/component/inputcontroller/v1/input_controller_pb2.py +1 -1
- viam/gen/component/motor/v1/motor_pb2.py +1 -1
- viam/gen/component/movementsensor/v1/movementsensor_pb2.py +1 -1
- viam/gen/component/posetracker/v1/pose_tracker_pb2.py +1 -1
- viam/gen/component/powersensor/v1/powersensor_pb2.py +1 -1
- viam/gen/component/sensor/v1/sensor_pb2.py +1 -1
- viam/gen/component/servo/v1/servo_pb2.py +1 -1
- viam/gen/component/switch/v1/switch_pb2.py +1 -1
- viam/gen/component/testecho/v1/testecho_pb2.py +1 -1
- viam/gen/module/v1/module_pb2.py +1 -1
- viam/gen/proto/rpc/examples/echo/v1/echo_pb2.py +1 -1
- viam/gen/proto/rpc/examples/echoresource/v1/echoresource_pb2.py +1 -1
- viam/gen/proto/rpc/v1/auth_pb2.py +1 -1
- viam/gen/proto/rpc/webrtc/v1/grpc_pb2.py +1 -1
- viam/gen/proto/rpc/webrtc/v1/signaling_pb2.py +1 -1
- viam/gen/provisioning/v1/provisioning_pb2.py +1 -1
- viam/gen/robot/v1/robot_pb2.py +1 -1
- viam/gen/service/datamanager/v1/data_manager_pb2.py +1 -1
- viam/gen/service/discovery/v1/discovery_pb2.py +1 -1
- viam/gen/service/generic/v1/generic_pb2.py +1 -1
- viam/gen/service/mlmodel/v1/mlmodel_pb2.py +1 -1
- viam/gen/service/motion/v1/motion_pb2.py +1 -1
- viam/gen/service/navigation/v1/navigation_pb2.py +1 -1
- viam/gen/service/sensors/v1/sensors_pb2.py +1 -1
- viam/gen/service/shell/v1/shell_pb2.py +1 -1
- viam/gen/service/slam/v1/slam_pb2.py +1 -1
- viam/gen/service/vision/v1/vision_pb2.py +1 -1
- viam/gen/service/worldstatestore/__init__.py +0 -0
- viam/gen/service/worldstatestore/v1/__init__.py +0 -0
- viam/gen/service/worldstatestore/v1/world_state_store_grpc.py +55 -0
- viam/gen/service/worldstatestore/v1/world_state_store_pb2.py +39 -0
- viam/gen/service/worldstatestore/v1/world_state_store_pb2.pyi +171 -0
- viam/gen/stream/v1/stream_pb2.py +1 -1
- viam/gen/tagger/v1/tagger_pb2.py +1 -1
- viam/media/utils/pil/__init__.py +5 -1
- viam/media/video.py +70 -16
- viam/proto/common/__init__.py +2 -0
- viam/proto/service/worldstatestore/__init__.py +32 -0
- viam/rpc/libviam_rust_utils.so +0 -0
- viam/services/vision/client.py +5 -1
- viam/services/vision/service.py +8 -8
- viam/services/worldstatestore/__init__.py +18 -0
- viam/services/worldstatestore/client.py +94 -0
- viam/services/worldstatestore/service.py +55 -0
- viam/services/worldstatestore/worldstatestore.py +90 -0
- viam/version_metadata.py +2 -2
- {viam_sdk-0.54.2b0.dist-info → viam_sdk-0.55.1.dist-info}/METADATA +1 -1
- {viam_sdk-0.54.2b0.dist-info → viam_sdk-0.55.1.dist-info}/RECORD +80 -70
- {viam_sdk-0.54.2b0.dist-info → viam_sdk-0.55.1.dist-info}/WHEEL +0 -0
- {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
|
viam/gen/stream/v1/stream_pb2.py
CHANGED
|
@@ -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,
|
|
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()
|
viam/gen/tagger/v1/tagger_pb2.py
CHANGED
|
@@ -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,
|
|
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')
|
viam/media/utils/pil/__init__.py
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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) ->
|
|
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:
|
|
45
|
-
Format.FORMAT_RAW_DEPTH:
|
|
46
|
-
Format.FORMAT_JPEG:
|
|
47
|
-
Format.FORMAT_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,
|
|
89
|
+
return cls(mimetypes.get(format, cls.JPEG))
|
|
50
90
|
|
|
51
|
-
|
|
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.
|
viam/proto/common/__init__.py
CHANGED
|
@@ -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
|
+
]
|
viam/rpc/libviam_rust_utils.so
CHANGED
|
Binary file
|
viam/services/vision/client.py
CHANGED
|
@@ -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
|
-
|
|
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:
|
viam/services/vision/service.py
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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)))
|