gobot.io/x/gobot/v2@v2.1.0/examples/ardrone_face_tracking.go (about)

     1  //go:build example
     2  // +build example
     3  
     4  //
     5  // Do not build by default.
     6  
     7  package main
     8  
     9  import (
    10  	"fmt"
    11  	"image"
    12  	"math"
    13  	"path"
    14  	"runtime"
    15  	"time"
    16  
    17  	"gobot.io/x/gobot/v2"
    18  	"gobot.io/x/gobot/v2/platforms/opencv"
    19  	"gobot.io/x/gobot/v2/platforms/parrot/ardrone"
    20  	"gocv.io/x/gocv"
    21  )
    22  
    23  func main() {
    24  	runtime.GOMAXPROCS(runtime.NumCPU())
    25  
    26  	_, currentfile, _, _ := runtime.Caller(0)
    27  	cascade := path.Join(path.Dir(currentfile), "haarcascade_frontalface_alt.xml")
    28  	window := opencv.NewWindowDriver()
    29  	camera := opencv.NewCameraDriver("tcp://192.168.1.1:5555")
    30  	ardroneAdaptor := ardrone.NewAdaptor()
    31  	drone := ardrone.NewDriver(ardroneAdaptor)
    32  
    33  	work := func() {
    34  		detect := false
    35  		drone.TakeOff()
    36  		var img gocv.Mat
    37  		camera.On(opencv.Frame, func(data interface{}) {
    38  			img = data.(gocv.Mat)
    39  			if !detect {
    40  				window.IMShow(img)
    41  				window.WaitKey(1)
    42  			}
    43  		})
    44  		drone.On(ardrone.Flying, func(data interface{}) {
    45  			gobot.After(1*time.Second, func() { drone.Up(0.2) })
    46  			gobot.After(2*time.Second, func() { drone.Hover() })
    47  			gobot.After(5*time.Second, func() {
    48  				detect = true
    49  				gobot.Every(300*time.Millisecond, func() {
    50  					drone.Hover()
    51  					i := img
    52  					faces := opencv.DetectObjects(cascade, i)
    53  					biggest := 0
    54  					var face image.Rectangle
    55  					for _, f := range faces {
    56  						if f.Width() > biggest {
    57  							biggest = f.Width()
    58  							face = f
    59  						}
    60  					}
    61  					if face != nil {
    62  						opencv.DrawRectangles(i, []img.Rectangle{face}, 0, 255, 0, 5)
    63  						centerX := float64(img.Size()).X * 0.5
    64  						turn := -(float64(face.Min.X - centerX)) / centerX
    65  						fmt.Println("turning:", turn)
    66  						if turn < 0 {
    67  							drone.Clockwise(math.Abs(turn * 0.4))
    68  						} else {
    69  							drone.CounterClockwise(math.Abs(turn * 0.4))
    70  						}
    71  					}
    72  					window.IMShow(i)
    73  					window.WaitKey(1)
    74  				})
    75  				gobot.After(20*time.Second, func() { drone.Land() })
    76  			})
    77  		})
    78  	}
    79  
    80  	robot := gobot.NewRobot("face",
    81  		[]gobot.Connection{ardroneAdaptor},
    82  		[]gobot.Device{window, camera, drone},
    83  		work,
    84  	)
    85  
    86  	robot.Start()
    87  }