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 }