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 }