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 }