@@ -21,11 +21,13 @@ import (
2121 "github.com/golang/geo/r3"
2222
2323 "go.viam.com/rdk/app"
24+ "go.viam.com/rdk/components/camera"
2425 "go.viam.com/rdk/components/switch"
2526 "go.viam.com/rdk/logging"
2627 "go.viam.com/rdk/pointcloud"
2728 "go.viam.com/rdk/referenceframe"
2829 "go.viam.com/rdk/resource"
30+ "go.viam.com/rdk/rimage"
2931 "go.viam.com/rdk/robot"
3032 "go.viam.com/rdk/services/generic"
3133 "go.viam.com/rdk/services/motion"
@@ -379,6 +381,14 @@ func (vc *VinoCart) checkPickQuality(ctx context.Context) error {
379381 return fmt .Errorf ("bad pick %v" , cs [0 ])
380382}
381383
384+ func saveImageToDatasetFromCamera (ctx context.Context , cam camera.Camera , dataClient * app.DataClient , dataSetId string ) error {
385+ imgs , _ , err := cam .Images (ctx )
386+ if err != nil {
387+ return err
388+ }
389+ return saveImageToDataset (ctx , cam .Name (), imgs [0 ].Image , dataClient , dataSetId )
390+ }
391+
382392func saveImageToDataset (ctx context.Context , component resource.Name , img image.Image , dataClient * app.DataClient , dataSetId string ) error {
383393 pid := os .Getenv ("VIAM_MACHINE_PART_ID" )
384394 if pid == "" {
@@ -767,24 +777,58 @@ func (vc *VinoCart) goTo(ctx context.Context, poss ...toggleswitch.Switch) error
767777 return multierr .Combine (errors ... )
768778}
769779
770- func (vc * VinoCart ) DebugGetGlassPourCamImage (ctx context.Context , loopNumber int ) (image.Image , string , error ) {
771- nimgs , _ , err := vc .c .GlassPourCam . Images (ctx )
780+ func (vc * VinoCart ) PourGlassFindCroppedRect (ctx context.Context ) (* image.Rectangle , error ) {
781+ detections , err := vc .c .PourGlassFindService . DetectionsFromCamera (ctx , "" , nil )
772782 if err != nil {
773- return nil , "" , err
783+ return nil , err
784+ }
785+
786+ if len (detections ) == 0 {
787+ return nil , fmt .Errorf ("did not find glass to monitor pour" )
788+ }
789+
790+ return detections [0 ].BoundingBox (), nil
791+ }
792+
793+ func (vc * VinoCart ) PourGlassFindCroppedImage (ctx context.Context , r * image.Rectangle ) (image.Image , error ) {
794+
795+ imgs , _ , err := vc .c .GlassPourCam .Images (ctx )
796+ if err != nil {
797+ return nil , err
798+ }
799+
800+ img := imgs [0 ].Image
801+
802+ lazy , ok := img .(* rimage.LazyEncodedImage )
803+ if ok {
804+ img , err = lazy .DecodedImage ()
805+ if err != nil {
806+ return nil , err
807+ }
774808 }
775- if len (nimgs ) == 0 {
776- return nil , "" , fmt .Errorf ("GlassPourCam returned no images" )
809+
810+ return img .(subImager ).SubImage (* r ), nil
811+ }
812+
813+ type subImager interface {
814+ SubImage (r image.Rectangle ) image.Image
815+ }
816+
817+ func (vc * VinoCart ) DebugGetGlassPourCamImage (ctx context.Context , box * image.Rectangle , loopNumber int ) (image.Image , string , error ) {
818+ img , err := vc .PourGlassFindCroppedImage (ctx , box )
819+ if err != nil {
820+ return nil , "" , err
777821 }
778822
779823 fn := ""
780824 if loopNumber >= 0 {
781- fn , err = saveImage (nimgs [ 0 ]. Image , loopNumber )
825+ fn , err = saveImage (img , loopNumber )
782826 if err != nil {
783827 return nil , "" , err
784828 }
785829 }
786830
787- return nimgs [ 0 ]. Image , fn , nil
831+ return img , fn , nil
788832}
789833
790834func (vc * VinoCart ) Pour (ctx context.Context ) error {
@@ -817,6 +861,23 @@ func (vc *VinoCart) Pour(ctx context.Context) error {
817861 wg := sync.WaitGroup {}
818862 wg .Add (1 )
819863
864+ if vc .dataClient != nil && vc .c .GlassPourCam != nil {
865+ vc .logger .Infof ("uploading image to dataset for cup finding" )
866+ wg .Add (1 )
867+ go func () {
868+ defer wg .Done ()
869+ err := saveImageToDatasetFromCamera (context .Background (), vc .c .GlassPourCam , vc .dataClient , "683d1210c83b3f3823ec70ff" )
870+ if err != nil {
871+ vc .logger .Errorf ("error saving cup cam to data set: %v" , err )
872+ }
873+ }()
874+ }
875+
876+ box , err := vc .PourGlassFindCroppedRect (ctx )
877+ if err != nil {
878+ return err
879+ }
880+
820881 go func () {
821882 defer wg .Done ()
822883 err := vc .doPourMotion (ctx , pourContext )
@@ -840,7 +901,7 @@ func (vc *VinoCart) Pour(ctx context.Context) error {
840901 for time .Since (start ) < totalTime {
841902 loopStart := time .Now ()
842903
843- img , fn , err := vc .DebugGetGlassPourCamImage (ctx /* loopNumber */ , - 1 )
904+ img , fn , err := vc .DebugGetGlassPourCamImage (ctx /* loopNumber */ , box , - 1 )
844905 if err != nil {
845906 return err
846907 }
0 commit comments