Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion src/viam/components/camera/camera.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,9 @@ async def get_image(
...

@abc.abstractmethod
async def get_images(self, *, timeout: Optional[float] = None, **kwargs) -> Tuple[List[NamedImage], ResponseMetadata]:
async def get_images(
self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs
) -> Tuple[List[NamedImage], ResponseMetadata]:
"""Get simultaneous images from different imagers, along with associated metadata.
This should not be used for getting a time series of images from the same imager.

Expand All @@ -75,6 +77,9 @@ async def get_images(self, *, timeout: Optional[float] = None, **kwargs) -> Tupl
first_image = images[0]
timestamp = metadata.captured_at

Args:
extra (Optional[Dict[str, Any]]): Additional arguments to the method.

Returns:
Tuple[List[NamedImage], ResponseMetadata]: A tuple containing two values; the first [0] a list of images
returned from the camera system, and the second [1] the metadata associated with this response.
Expand Down
3 changes: 2 additions & 1 deletion src/viam/components/camera/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,12 @@ async def get_image(
async def get_images(
self,
*,
extra: Optional[Dict[str, Any]] = None,
timeout: Optional[float] = None,
**kwargs,
) -> Tuple[List[NamedImage], ResponseMetadata]:
md = kwargs.get("metadata", self.Metadata()).proto
request = GetImagesRequest(name=self.name)
request = GetImagesRequest(name=self.name, extra=dict_to_struct(extra))
response: GetImagesResponse = await self.client.GetImages(request, timeout=timeout, metadata=md)
imgs = []
for img_data in response.images:
Expand Down
4 changes: 3 additions & 1 deletion src/viam/components/camera/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,9 @@ async def GetImages(self, stream: Stream[GetImagesRequest, GetImagesResponse]) -
camera = self.get_resource(name)

timeout = stream.deadline.time_remaining() if stream.deadline else None
images, metadata = await camera.get_images(timeout=timeout, metadata=stream.metadata)
images, metadata = await camera.get_images(
extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata
)
img_bytes_lst = []
for img in images:
fmt = img.mime_type.to_proto()
Expand Down
5 changes: 4 additions & 1 deletion tests/mocks/components.py
Original file line number Diff line number Diff line change
Expand Up @@ -377,8 +377,11 @@ async def get_image(
self.timeout = timeout
return self.image

async def get_images(self, timeout: Optional[float] = None, **kwargs) -> Tuple[List[NamedImage], ResponseMetadata]:
async def get_images(
self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs
) -> Tuple[List[NamedImage], ResponseMetadata]:
self.timeout = timeout
self.extra = extra # Add this line to store the extra parameter
return [NamedImage(self.name, self.image.data, self.image.mime_type)], self.metadata

async def get_point_cloud(
Expand Down
13 changes: 13 additions & 0 deletions tests/test_camera.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,10 @@ async def test_get_images(self, camera: Camera, image: ViamImage, metadata: Resp
assert imgs[0].data == image.data
assert md == metadata

# Add this block to test the 'extra' parameter
await camera.get_images(extra={"1": 1})
assert camera.extra == {"1": 1}

async def test_get_point_cloud(self, camera: MockCamera, point_cloud: bytes):
pc, _ = await camera.get_point_cloud()
assert pc == point_cloud
Expand Down Expand Up @@ -163,6 +167,11 @@ async def test_get_images(self, camera: MockCamera, service: CameraRPCService, m
assert response.response_metadata == metadata
assert camera.timeout == loose_approx(18.1)

# Add this block to test the 'extra' parameter
request_with_extra = GetImagesRequest(name="camera", extra=dict_to_struct({"2": 2}))
await client.GetImages(request_with_extra)
assert camera.extra == {"2": 2}

async def test_render_frame(self, camera: MockCamera, service: CameraRPCService, image: ViamImage):
assert camera.timeout is None
async with ChannelFor([service]) as channel:
Expand Down Expand Up @@ -233,6 +242,10 @@ async def test_get_images(self, camera: MockCamera, service: CameraRPCService, i
assert md == metadata
assert camera.timeout == loose_approx(1.82)

# Add this block to test the 'extra' parameter
await client.get_images(extra={"3": 3})
assert camera.extra == {"3": 3}

async def test_get_point_cloud(self, camera: MockCamera, service: CameraRPCService, point_cloud: bytes):
assert camera.timeout is None
async with ChannelFor([service]) as channel:
Expand Down
Loading