gobot.io/x/gobot/v2@v2.1.0/examples/tello_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 a DJI Tello drone to run this example. 10 11 You run the Go program on your computer and communicate wirelessly via WiFi with the Tello. 12 13 How to run 14 15 go run examples/tello_ps3.go 16 */ 17 18 package main 19 20 import ( 21 "fmt" 22 "sync/atomic" 23 "time" 24 25 "gobot.io/x/gobot/v2" 26 "gobot.io/x/gobot/v2/platforms/dji/tello" 27 "gobot.io/x/gobot/v2/platforms/joystick" 28 ) 29 30 type pair struct { 31 x float64 32 y float64 33 } 34 35 var leftX, leftY, rightX, rightY atomic.Value 36 37 const offset = 32767.0 38 39 func main() { 40 joystickAdaptor := joystick.NewAdaptor() 41 stick := joystick.NewDriver(joystickAdaptor, "dualshock3") 42 43 drone := tello.NewDriver("8888") 44 45 work := func() { 46 leftX.Store(float64(0.0)) 47 leftY.Store(float64(0.0)) 48 rightX.Store(float64(0.0)) 49 rightY.Store(float64(0.0)) 50 51 stick.On(joystick.TrianglePress, func(data interface{}) { 52 drone.TakeOff() 53 }) 54 55 stick.On(joystick.XPress, func(data interface{}) { 56 drone.Land() 57 }) 58 59 stick.On(joystick.UpPress, func(data interface{}) { 60 fmt.Println("FrontFlip") 61 drone.FrontFlip() 62 }) 63 64 stick.On(joystick.DownPress, func(data interface{}) { 65 fmt.Println("BackFlip") 66 drone.BackFlip() 67 }) 68 69 stick.On(joystick.RightPress, func(data interface{}) { 70 fmt.Println("RightFlip") 71 drone.RightFlip() 72 }) 73 74 stick.On(joystick.LeftPress, func(data interface{}) { 75 fmt.Println("LeftFlip") 76 drone.LeftFlip() 77 }) 78 79 stick.On(joystick.LeftX, func(data interface{}) { 80 val := float64(data.(int16)) 81 leftX.Store(val) 82 }) 83 84 stick.On(joystick.LeftY, func(data interface{}) { 85 val := float64(data.(int16)) 86 leftY.Store(val) 87 }) 88 89 stick.On(joystick.RightX, func(data interface{}) { 90 val := float64(data.(int16)) 91 rightX.Store(val) 92 }) 93 94 stick.On(joystick.RightY, func(data interface{}) { 95 val := float64(data.(int16)) 96 rightY.Store(val) 97 }) 98 99 gobot.Every(50*time.Millisecond, func() { 100 rightStick := getRightStick() 101 102 switch { 103 case rightStick.y < -10: 104 drone.Forward(tello.ValidatePitch(rightStick.y, offset)) 105 case rightStick.y > 10: 106 drone.Backward(tello.ValidatePitch(rightStick.y, offset)) 107 default: 108 drone.Forward(0) 109 } 110 111 switch { 112 case rightStick.x > 10: 113 drone.Right(tello.ValidatePitch(rightStick.x, offset)) 114 case rightStick.x < -10: 115 drone.Left(tello.ValidatePitch(rightStick.x, offset)) 116 default: 117 drone.Right(0) 118 } 119 }) 120 121 gobot.Every(50*time.Millisecond, func() { 122 leftStick := getLeftStick() 123 switch { 124 case leftStick.y < -10: 125 drone.Up(tello.ValidatePitch(leftStick.y, offset)) 126 case leftStick.y > 10: 127 drone.Down(tello.ValidatePitch(leftStick.y, offset)) 128 default: 129 drone.Up(0) 130 } 131 132 switch { 133 case leftStick.x > 20: 134 drone.Clockwise(tello.ValidatePitch(leftStick.x, offset)) 135 case leftStick.x < -20: 136 drone.CounterClockwise(tello.ValidatePitch(leftStick.x, offset)) 137 default: 138 drone.Clockwise(0) 139 } 140 }) 141 } 142 143 robot := gobot.NewRobot("tello", 144 []gobot.Connection{joystickAdaptor}, 145 []gobot.Device{stick, drone}, 146 work, 147 ) 148 149 robot.Start() 150 } 151 152 func getLeftStick() pair { 153 s := pair{x: 0, y: 0} 154 s.x = leftX.Load().(float64) 155 s.y = leftY.Load().(float64) 156 return s 157 } 158 159 func getRightStick() pair { 160 s := pair{x: 0, y: 0} 161 s.x = rightX.Load().(float64) 162 s.y = rightY.Load().(float64) 163 return s 164 }