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

     1  // +build example
     2  //
     3  // Do not build by default.
     4  
     5  package main
     6  
     7  import (
     8  	"sync/atomic"
     9  	"time"
    10  
    11  	"gobot.io/x/gobot"
    12  	"gobot.io/x/gobot/platforms/joystick"
    13  	"gobot.io/x/gobot/platforms/parrot/bebop"
    14  )
    15  
    16  type pair struct {
    17  	x float64
    18  	y float64
    19  }
    20  
    21  var leftX, leftY, rightX, rightY atomic.Value
    22  
    23  const offset = 32767.0
    24  
    25  func main() {
    26  	joystickAdaptor := joystick.NewAdaptor()
    27  	stick := joystick.NewDriver(joystickAdaptor, "dualshock3")
    28  
    29  	bebopAdaptor := bebop.NewAdaptor()
    30  	drone := bebop.NewDriver(bebopAdaptor)
    31  
    32  	work := func() {
    33  		leftX.Store(float64(0.0))
    34  		leftY.Store(float64(0.0))
    35  		rightX.Store(float64(0.0))
    36  		rightY.Store(float64(0.0))
    37  
    38  		recording := false
    39  
    40  		stick.On(joystick.CirclePress, func(data interface{}) {
    41  			if recording {
    42  				drone.StopRecording()
    43  			} else {
    44  				drone.StartRecording()
    45  			}
    46  			recording = !recording
    47  		})
    48  
    49  		stick.On(joystick.SquarePress, func(data interface{}) {
    50  			drone.HullProtection(true)
    51  			drone.TakeOff()
    52  		})
    53  
    54  		stick.On(joystick.TrianglePress, func(data interface{}) {
    55  			drone.Stop()
    56  		})
    57  
    58  		stick.On(joystick.XPress, func(data interface{}) {
    59  			drone.Land()
    60  		})
    61  
    62  		stick.On(joystick.LeftX, func(data interface{}) {
    63  			val := float64(data.(int16))
    64  			leftX.Store(val)
    65  		})
    66  
    67  		stick.On(joystick.LeftY, func(data interface{}) {
    68  			val := float64(data.(int16))
    69  			leftY.Store(val)
    70  		})
    71  
    72  		stick.On(joystick.RightX, func(data interface{}) {
    73  			val := float64(data.(int16))
    74  			rightX.Store(val)
    75  		})
    76  
    77  		stick.On(joystick.RightY, func(data interface{}) {
    78  			val := float64(data.(int16))
    79  			rightY.Store(val)
    80  		})
    81  
    82  		gobot.Every(10*time.Millisecond, func() {
    83  			leftStick := getLeftStick()
    84  
    85  			switch {
    86  			case leftStick.y < -10:
    87  				drone.Forward(bebop.ValidatePitch(leftStick.y, offset))
    88  			case leftStick.y > 10:
    89  				drone.Backward(bebop.ValidatePitch(leftStick.y, offset))
    90  			default:
    91  				drone.Forward(0)
    92  			}
    93  
    94  			switch {
    95  			case leftStick.x > 10:
    96  				drone.Right(bebop.ValidatePitch(leftStick.x, offset))
    97  			case leftStick.x < -10:
    98  				drone.Left(bebop.ValidatePitch(leftStick.x, offset))
    99  			default:
   100  				drone.Right(0)
   101  			}
   102  		})
   103  
   104  		gobot.Every(10*time.Millisecond, func() {
   105  			rightStick := getRightStick()
   106  			switch {
   107  			case rightStick.y < -10:
   108  				drone.Up(bebop.ValidatePitch(rightStick.y, offset))
   109  			case rightStick.y > 10:
   110  				drone.Down(bebop.ValidatePitch(rightStick.y, offset))
   111  			default:
   112  				drone.Up(0)
   113  			}
   114  
   115  			switch {
   116  			case rightStick.x > 20:
   117  				drone.Clockwise(bebop.ValidatePitch(rightStick.x, offset))
   118  			case rightStick.x < -20:
   119  				drone.CounterClockwise(bebop.ValidatePitch(rightStick.x, offset))
   120  			default:
   121  				drone.Clockwise(0)
   122  			}
   123  		})
   124  	}
   125  
   126  	robot := gobot.NewRobot("bebop",
   127  		[]gobot.Connection{joystickAdaptor, bebopAdaptor},
   128  		[]gobot.Device{stick, drone},
   129  		work,
   130  	)
   131  
   132  	robot.Start()
   133  }
   134  
   135  func getLeftStick() pair {
   136  	s := pair{x: 0, y: 0}
   137  	s.x = leftX.Load().(float64)
   138  	s.y = leftY.Load().(float64)
   139  	return s
   140  }
   141  
   142  func getRightStick() pair {
   143  	s := pair{x: 0, y: 0}
   144  	s.x = rightX.Load().(float64)
   145  	s.y = rightY.Load().(float64)
   146  	return s
   147  }