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  }