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