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

     1  //go:build example
     2  // +build example
     3  
     4  //
     5  // Do not build by default.
     6  
     7  /*
     8   How to setup
     9   You must be using a PS3 or compatible controller, along with
    10   any of the Parrot Minidrone drones to run this example.
    11  
    12   You run the Go program on your computer and communicate
    13   wirelessly with the Parrot Minidrone.
    14  
    15   How to run
    16   Pass the Bluetooth name or address as first param:
    17  
    18  	go run examples/minidrone_ps3.go "Travis_1234"
    19  
    20   NOTE: sudo is required to use BLE in Linux
    21  */
    22  
    23  package main
    24  
    25  import (
    26  	"os"
    27  	"sync/atomic"
    28  	"time"
    29  
    30  	"gobot.io/x/gobot/v2"
    31  	"gobot.io/x/gobot/v2/platforms/ble"
    32  	"gobot.io/x/gobot/v2/platforms/joystick"
    33  	"gobot.io/x/gobot/v2/platforms/parrot/minidrone"
    34  )
    35  
    36  type pair struct {
    37  	x float64
    38  	y float64
    39  }
    40  
    41  var leftX, leftY, rightX, rightY atomic.Value
    42  
    43  const offset = 32767.0
    44  
    45  func main() {
    46  	joystickAdaptor := joystick.NewAdaptor()
    47  	stick := joystick.NewDriver(joystickAdaptor, "dualshock3")
    48  
    49  	droneAdaptor := ble.NewClientAdaptor(os.Args[1])
    50  	drone := minidrone.NewDriver(droneAdaptor)
    51  
    52  	work := func() {
    53  		leftX.Store(float64(0.0))
    54  		leftY.Store(float64(0.0))
    55  		rightX.Store(float64(0.0))
    56  		rightY.Store(float64(0.0))
    57  
    58  		recording := false
    59  
    60  		stick.On(joystick.CirclePress, func(data interface{}) {
    61  			if recording {
    62  				drone.StopRecording()
    63  			} else {
    64  				drone.StartRecording()
    65  			}
    66  			recording = !recording
    67  		})
    68  
    69  		stick.On(joystick.SquarePress, func(data interface{}) {
    70  			drone.Stop()
    71  		})
    72  
    73  		stick.On(joystick.TrianglePress, func(data interface{}) {
    74  			drone.HullProtection(true)
    75  			drone.TakeOff()
    76  		})
    77  
    78  		stick.On(joystick.XPress, func(data interface{}) {
    79  			drone.Land()
    80  		})
    81  
    82  		stick.On(joystick.LeftX, func(data interface{}) {
    83  			val := float64(data.(int16))
    84  			leftX.Store(val)
    85  		})
    86  
    87  		stick.On(joystick.LeftY, func(data interface{}) {
    88  			val := float64(data.(int16))
    89  			leftY.Store(val)
    90  		})
    91  
    92  		stick.On(joystick.RightX, func(data interface{}) {
    93  			val := float64(data.(int16))
    94  			rightX.Store(val)
    95  		})
    96  
    97  		stick.On(joystick.RightY, func(data interface{}) {
    98  			val := float64(data.(int16))
    99  			rightY.Store(val)
   100  		})
   101  
   102  		gobot.Every(10*time.Millisecond, func() {
   103  			rightStick := getRightStick()
   104  
   105  			switch {
   106  			case rightStick.y < -10:
   107  				drone.Forward(minidrone.ValidatePitch(rightStick.y, offset))
   108  			case rightStick.y > 10:
   109  				drone.Backward(minidrone.ValidatePitch(rightStick.y, offset))
   110  			default:
   111  				drone.Forward(0)
   112  			}
   113  
   114  			switch {
   115  			case rightStick.x > 10:
   116  				drone.Right(minidrone.ValidatePitch(rightStick.x, offset))
   117  			case rightStick.x < -10:
   118  				drone.Left(minidrone.ValidatePitch(rightStick.x, offset))
   119  			default:
   120  				drone.Right(0)
   121  			}
   122  		})
   123  
   124  		gobot.Every(10*time.Millisecond, func() {
   125  			leftStick := getLeftStick()
   126  			switch {
   127  			case leftStick.y < -10:
   128  				drone.Up(minidrone.ValidatePitch(leftStick.y, offset))
   129  			case leftStick.y > 10:
   130  				drone.Down(minidrone.ValidatePitch(leftStick.y, offset))
   131  			default:
   132  				drone.Up(0)
   133  			}
   134  
   135  			switch {
   136  			case leftStick.x > 20:
   137  				drone.Clockwise(minidrone.ValidatePitch(leftStick.x, offset))
   138  			case leftStick.x < -20:
   139  				drone.CounterClockwise(minidrone.ValidatePitch(leftStick.x, offset))
   140  			default:
   141  				drone.Clockwise(0)
   142  			}
   143  		})
   144  	}
   145  
   146  	robot := gobot.NewRobot("minidrone",
   147  		[]gobot.Connection{joystickAdaptor, droneAdaptor},
   148  		[]gobot.Device{stick, drone},
   149  		work,
   150  	)
   151  
   152  	robot.Start()
   153  }
   154  
   155  func getLeftStick() pair {
   156  	s := pair{x: 0, y: 0}
   157  	s.x = leftX.Load().(float64)
   158  	s.y = leftY.Load().(float64)
   159  	return s
   160  }
   161  
   162  func getRightStick() pair {
   163  	s := pair{x: 0, y: 0}
   164  	s.x = rightX.Load().(float64)
   165  	s.y = rightY.Load().(float64)
   166  	return s
   167  }