gobot.io/x/gobot@v1.16.0/examples/ardrone_face_tracking.go (about)

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