Skip to content

Commit d038ca2

Browse files
committed
Update GetImages method and use local proto replacement
1 parent 072e5bb commit d038ca2

File tree

18 files changed

+196
-56
lines changed

18 files changed

+196
-56
lines changed

components/camera/camera.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,11 @@ func (ni *NamedImage) Bytes(ctx context.Context) ([]byte, error) {
133133
return ni.data, nil
134134
}
135135

136+
// MimeType returns the mime type of the NamedImage.
137+
func (ni *NamedImage) MimeType() string {
138+
return ni.mimeType
139+
}
140+
136141
// ImageMetadata contains useful information about returned image bytes such as its mimetype.
137142
type ImageMetadata struct {
138143
MimeType string
@@ -193,7 +198,7 @@ type Camera interface {
193198

194199
// Images is used for getting simultaneous images from different imagers,
195200
// along with associated metadata (just timestamp for now). It's not for getting a time series of images from the same imager.
196-
Images(ctx context.Context) ([]NamedImage, resource.ResponseMetadata, error)
201+
Images(ctx context.Context, filterSourceNames []string, extra map[string]interface{}) ([]NamedImage, resource.ResponseMetadata, error)
197202

198203
// NextPointCloud returns the next immediately available point cloud, not necessarily one
199204
// a part of a sequence. In the future, there could be streaming of point clouds.
@@ -230,7 +235,7 @@ func DecodeImageFromCamera(ctx context.Context, mimeType string, extra map[strin
230235
// It uses the mimeType arg to specify how to encode the bytes returned from GetImages.
231236
func GetImageFromGetImages(ctx context.Context, sourceName *string, mimeType string, cam Camera) ([]byte, ImageMetadata, error) {
232237
// TODO(RSDK-10991): pass through extra field when implemented
233-
images, _, err := cam.Images(ctx)
238+
images, _, err := cam.Images(ctx, nil, nil)
234239
if err != nil {
235240
return nil, ImageMetadata{}, fmt.Errorf("could not get images from camera: %w", err)
236241
}
@@ -247,14 +252,14 @@ func GetImageFromGetImages(ctx context.Context, sourceName *string, mimeType str
247252
if sourceName == nil {
248253
img, err = images[0].Image(ctx)
249254
if err != nil {
250-
return nil, ImageMetadata{}, fmt.Errorf("could not get image from camera: %w", err)
255+
return nil, ImageMetadata{}, fmt.Errorf("could not get image from named image: %w", err)
251256
}
252257
} else {
253258
for _, i := range images {
254259
if i.SourceName == *sourceName {
255260
img, err = i.Image(ctx)
256261
if err != nil {
257-
return nil, ImageMetadata{}, fmt.Errorf("could not get image from camera: %w", err)
262+
return nil, ImageMetadata{}, fmt.Errorf("could not get image from named image: %w", err)
258263
}
259264
break
260265
}
@@ -328,7 +333,7 @@ type PointCloudSource interface {
328333

329334
// A ImagesSource is a source that can return a list of images with timestamp.
330335
type ImagesSource interface {
331-
Images(ctx context.Context) ([]NamedImage, resource.ResponseMetadata, error)
336+
Images(ctx context.Context, filterSourceNames []string, extra map[string]interface{}) ([]NamedImage, resource.ResponseMetadata, error)
332337
}
333338

334339
// NewPropertiesError returns an error specific to a failure in Properties.

components/camera/camera_test.go

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ func TestCameraWithProjector(t *testing.T) {
243243
test.That(t, img.Bounds().Dx(), test.ShouldEqual, 1280)
244244
test.That(t, img.Bounds().Dy(), test.ShouldEqual, 720)
245245
// cam2 should implement a default GetImages, that just returns the one image
246-
images, _, err := videoSrc2.Images(context.Background())
246+
images, _, err := videoSrc2.Images(context.Background(), nil, nil)
247247
test.That(t, err, test.ShouldBeNil)
248248
test.That(t, len(images), test.ShouldEqual, 1)
249249
imgFromImages, err := images[0].Image(context.Background())
@@ -288,7 +288,11 @@ func TestGetImageFromGetImages(t *testing.T) {
288288
testImg2 := image.NewRGBA(image.Rect(0, 0, 200, 200))
289289

290290
rgbaCam := inject.NewCamera("rgba_cam")
291-
rgbaCam.ImagesFunc = func(ctx context.Context) ([]camera.NamedImage, resource.ResponseMetadata, error) {
291+
rgbaCam.ImagesFunc = func(
292+
ctx context.Context,
293+
filterSourceNames []string,
294+
extra map[string]interface{},
295+
) ([]camera.NamedImage, resource.ResponseMetadata, error) {
292296
namedImg1, err := camera.NamedImageFromImage(testImg1, source1Name, rutils.MimeTypeRawRGBA)
293297
if err != nil {
294298
return nil, resource.ResponseMetadata{}, err
@@ -305,7 +309,11 @@ func TestGetImageFromGetImages(t *testing.T) {
305309

306310
dm := rimage.NewEmptyDepthMap(100, 100)
307311
depthCam := inject.NewCamera("depth_cam")
308-
depthCam.ImagesFunc = func(ctx context.Context) ([]camera.NamedImage, resource.ResponseMetadata, error) {
312+
depthCam.ImagesFunc = func(
313+
ctx context.Context,
314+
filterSourceNames []string,
315+
extra map[string]interface{},
316+
) ([]camera.NamedImage, resource.ResponseMetadata, error) {
309317
namedImg, err := camera.NamedImageFromImage(dm, source1Name, rutils.MimeTypeRawDepth)
310318
if err != nil {
311319
return nil, resource.ResponseMetadata{}, err
@@ -357,7 +365,11 @@ func TestGetImageFromGetImages(t *testing.T) {
357365

358366
t.Run("error case", func(t *testing.T) {
359367
errorCam := inject.NewCamera("error_cam")
360-
errorCam.ImagesFunc = func(ctx context.Context) ([]camera.NamedImage, resource.ResponseMetadata, error) {
368+
errorCam.ImagesFunc = func(
369+
ctx context.Context,
370+
filterSourceNames []string,
371+
extra map[string]interface{},
372+
) ([]camera.NamedImage, resource.ResponseMetadata, error) {
361373
return nil, resource.ResponseMetadata{}, errors.New("test error")
362374
}
363375
_, _, err := camera.GetImageFromGetImages(context.Background(), nil, rutils.MimeTypePNG, errorCam)
@@ -366,7 +378,11 @@ func TestGetImageFromGetImages(t *testing.T) {
366378

367379
t.Run("empty images case", func(t *testing.T) {
368380
emptyCam := inject.NewCamera("empty_cam")
369-
emptyCam.ImagesFunc = func(ctx context.Context) ([]camera.NamedImage, resource.ResponseMetadata, error) {
381+
emptyCam.ImagesFunc = func(
382+
ctx context.Context,
383+
filterSourceNames []string,
384+
extra map[string]interface{},
385+
) ([]camera.NamedImage, resource.ResponseMetadata, error) {
370386
return []camera.NamedImage{}, resource.ResponseMetadata{CapturedAt: time.Now()}, nil
371387
}
372388
_, _, err := camera.GetImageFromGetImages(context.Background(), nil, rutils.MimeTypePNG, emptyCam)
@@ -375,7 +391,11 @@ func TestGetImageFromGetImages(t *testing.T) {
375391

376392
t.Run("nil image case", func(t *testing.T) {
377393
nilImageCam := inject.NewCamera("nil_image_cam")
378-
nilImageCam.ImagesFunc = func(ctx context.Context) ([]camera.NamedImage, resource.ResponseMetadata, error) {
394+
nilImageCam.ImagesFunc = func(
395+
ctx context.Context,
396+
filterSourceNames []string,
397+
extra map[string]interface{},
398+
) ([]camera.NamedImage, resource.ResponseMetadata, error) {
379399
namedImg, err := camera.NamedImageFromImage(nil, source1Name, rutils.MimeTypeRawRGBA)
380400
if err != nil {
381401
return nil, resource.ResponseMetadata{}, err

components/camera/client.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,12 +208,22 @@ func (c *client) Image(ctx context.Context, mimeType string, extra map[string]in
208208
return resp.Image, ImageMetadata{MimeType: resp.MimeType}, nil
209209
}
210210

211-
func (c *client) Images(ctx context.Context) ([]NamedImage, resource.ResponseMetadata, error) {
211+
func (c *client) Images(
212+
ctx context.Context,
213+
filterSourceNames []string,
214+
extra map[string]interface{},
215+
) ([]NamedImage, resource.ResponseMetadata, error) {
212216
ctx, span := trace.StartSpan(ctx, "camera::client::Images")
213217
defer span.End()
214218

219+
convertedExtra, err := goprotoutils.StructToStructPb(extra)
220+
if err != nil {
221+
return nil, resource.ResponseMetadata{}, err
222+
}
215223
resp, err := c.client.GetImages(ctx, &pb.GetImagesRequest{
216-
Name: c.name,
224+
Name: c.name,
225+
FilterSourceNames: filterSourceNames,
226+
Extra: convertedExtra,
217227
})
218228
if err != nil {
219229
return nil, resource.ResponseMetadata{}, fmt.Errorf("camera client: could not gets images from the camera %w", err)

components/camera/client_test.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,11 @@ func TestClient(t *testing.T) {
8888
injectCamera.ProjectorFunc = func(ctx context.Context) (transform.Projector, error) {
8989
return projA, nil
9090
}
91-
injectCamera.ImagesFunc = func(ctx context.Context) ([]camera.NamedImage, resource.ResponseMetadata, error) {
91+
injectCamera.ImagesFunc = func(
92+
ctx context.Context,
93+
filterSourceNames []string,
94+
extra map[string]interface{},
95+
) ([]camera.NamedImage, resource.ResponseMetadata, error) {
9296
images := []camera.NamedImage{}
9397
// one color image
9498
color := rimage.NewImage(40, 50)
@@ -212,7 +216,7 @@ func TestClient(t *testing.T) {
212216
test.That(t, propsB.SupportsPCD, test.ShouldBeTrue)
213217
test.That(t, propsB.IntrinsicParams, test.ShouldResemble, intrinsics)
214218

215-
images, meta, err := camera1Client.Images(context.Background())
219+
images, meta, err := camera1Client.Images(context.Background(), nil, nil)
216220
test.That(t, err, test.ShouldBeNil)
217221
test.That(t, meta.CapturedAt, test.ShouldEqual, time.UnixMilli(12345))
218222
test.That(t, len(images), test.ShouldEqual, 2)
@@ -735,7 +739,7 @@ func TestMultiplexOverRemoteConnection(t *testing.T) {
735739
cameraClient, err := camera.FromRobot(mainRobot, "remote:rtpPassthroughCamera")
736740
test.That(t, err, test.ShouldBeNil)
737741

738-
image, _, err := cameraClient.Images(mainCtx)
742+
image, _, err := cameraClient.Images(mainCtx, nil, nil)
739743
test.That(t, err, test.ShouldBeNil)
740744
test.That(t, image, test.ShouldNotBeNil)
741745
logger.Info("got images")
@@ -808,7 +812,7 @@ func TestMultiplexOverMultiHopRemoteConnection(t *testing.T) {
808812
cameraClient, err := camera.FromRobot(mainRobot, "remote-1:remote-2:rtpPassthroughCamera")
809813
test.That(t, err, test.ShouldBeNil)
810814

811-
image, _, err := cameraClient.Images(mainCtx)
815+
image, _, err := cameraClient.Images(mainCtx, nil, nil)
812816
test.That(t, err, test.ShouldBeNil)
813817
test.That(t, image, test.ShouldNotBeNil)
814818
logger.Info("got images")
@@ -892,7 +896,7 @@ func TestWhyMustTimeoutOnReadRTP(t *testing.T) {
892896
cameraClient, err := camera.FromRobot(mainRobot, "remote-1:remote-2:rtpPassthroughCamera")
893897
test.That(t, err, test.ShouldBeNil)
894898

895-
image, _, err := cameraClient.Images(mainCtx)
899+
image, _, err := cameraClient.Images(mainCtx, nil, nil)
896900
test.That(t, err, test.ShouldBeNil)
897901
test.That(t, image, test.ShouldNotBeNil)
898902
logger.Info("got images")
@@ -1028,7 +1032,7 @@ func TestGrandRemoteRebooting(t *testing.T) {
10281032
mainCameraClient, err := camera.FromRobot(mainRobot, "remote-1:remote-2:rtpPassthroughCamera")
10291033
test.That(t, err, test.ShouldBeNil)
10301034

1031-
image, _, err := mainCameraClient.Images(mainCtx)
1035+
image, _, err := mainCameraClient.Images(mainCtx, nil, nil)
10321036
test.That(t, err, test.ShouldBeNil)
10331037
test.That(t, image, test.ShouldNotBeNil)
10341038
logger.Info("got images")

components/camera/collectors.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ func newGetImagesCollector(resource interface{}, params data.CollectorParams) (d
148148
defer span.End()
149149
ctx = context.WithValue(ctx, data.FromDMContextKey{}, true)
150150

151-
resImgs, resMetadata, err := camera.Images(ctx)
151+
resImgs, resMetadata, err := camera.Images(ctx, nil, nil)
152152
if err != nil {
153153
if errors.Is(err, data.ErrNoCaptureToStore) {
154154
return res, err

components/camera/collectors_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,11 @@ func newCamera(
197197
return pcd, nil
198198
}
199199

200-
v.ImagesFunc = func(ctx context.Context) ([]camera.NamedImage, resource.ResponseMetadata, error) {
200+
v.ImagesFunc = func(
201+
ctx context.Context,
202+
filterSourceNames []string,
203+
extra map[string]interface{},
204+
) ([]camera.NamedImage, resource.ResponseMetadata, error) {
201205
leftImg, err := camera.NamedImageFromImage(left, "left", utils.MimeTypeJPEG)
202206
if err != nil {
203207
return nil, resource.ResponseMetadata{}, err

components/camera/fake/image_file_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ func TestPreloadedImages(t *testing.T) {
134134
test.That(t, bounds.Dx() > 0, test.ShouldBeTrue)
135135
test.That(t, bounds.Dy() > 0, test.ShouldBeTrue)
136136

137-
namedImages, metadata, err := cam.Images(ctx)
137+
namedImages, metadata, err := cam.Images(ctx, nil, nil)
138138
test.That(t, err, test.ShouldBeNil)
139139
test.That(t, len(namedImages), test.ShouldEqual, 1)
140140
test.That(t, namedImages[0].SourceName, test.ShouldEqual, "preloaded")
@@ -159,7 +159,7 @@ func TestPreloadedImages(t *testing.T) {
159159
test.That(t, err, test.ShouldBeNil)
160160

161161
// Should return both images
162-
namedImages, _, err := cam.Images(ctx)
162+
namedImages, _, err := cam.Images(ctx, nil, nil)
163163
test.That(t, err, test.ShouldBeNil)
164164
test.That(t, len(namedImages), test.ShouldEqual, 2)
165165
test.That(t, namedImages[0].SourceName, test.ShouldEqual, "preloaded")

components/camera/replaypcd/replaypcd.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,11 @@ func addGRPCMetadata(ctx context.Context, timeRequested, timeReceived *timestamp
329329
}
330330

331331
// Images is a part of the camera interface but is not implemented for replay.
332-
func (replay *pcdCamera) Images(ctx context.Context) ([]camera.NamedImage, resource.ResponseMetadata, error) {
332+
func (replay *pcdCamera) Images(
333+
ctx context.Context,
334+
filterSourceNames []string,
335+
extra map[string]interface{},
336+
) ([]camera.NamedImage, resource.ResponseMetadata, error) {
333337
return nil, resource.ResponseMetadata{}, errors.New("Images is unimplemented")
334338
}
335339

components/camera/server.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ func (s *serviceServer) GetImages(
108108
}
109109
// request the images, and then check to see what the underlying type is to determine
110110
// what to encode as. If it's color, just encode as JPEG.
111-
imgs, metadata, err := cam.Images(ctx)
111+
imgs, metadata, err := cam.Images(ctx, req.FilterSourceNames, req.Extra.AsMap())
112112
if err != nil {
113113
return nil, errors.Wrap(err, "camera server GetImages could not call Images on the camera")
114114
}

components/camera/server_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,11 @@ func TestServer(t *testing.T) {
9393
FrameRate: float32(10.0),
9494
}, nil
9595
}
96-
injectCamera.ImagesFunc = func(ctx context.Context) ([]camera.NamedImage, resource.ResponseMetadata, error) {
96+
injectCamera.ImagesFunc = func(
97+
ctx context.Context,
98+
filterSourceNames []string,
99+
extra map[string]interface{},
100+
) ([]camera.NamedImage, resource.ResponseMetadata, error) {
97101
images := []camera.NamedImage{}
98102
// one color image
99103
color := rimage.NewImage(40, 50)

0 commit comments

Comments
 (0)