Пример #1
0
def main():

    # global exit_flag

    js_lock = threading.Lock()
    arm_lock = threading.Lock()

    js = Joystick(1, "Thread - Joystick", js_lock)
    arm = None

    screen = Screen()

    hotas = HOTAS_Arm(1, "Thread - HOTAS", js, arm, js_lock, arm_lock, screen)

    js.start()
    hotas.start()
    screen.start()

    screen.join()
    js.stop()
    print("Joystick asked to stop...")
    hotas.stop()
    print("Program asked to stop...")

    hotas.join()
    print("Main Ended")
    print("Please press a key on the joystick to end the program...")
    js.join()
    print("Program ended...")
Пример #2
0
    car = Car()
    camera = Camera()
    camera.start()

    try:
        while True:
            map = js.run()

            x = map.rx
            car.turn(x)

            # y = map.ly
            # car.turn(y)

            if map.menu == 1:
                if camera.running():
                    car.gogo(0)
                    camera.pause()
                    print('camera pause')
                else:
                    car.gogo(-2000)
                    camera.resume()
                    print('camera resume')

    except KeyboardInterrupt:
        js.stop()
        car.stop()
        camera.stop()
        time.sleep(1)
        print('Exit...')
Пример #3
0
class WheelChairController:

    def __init__(self):
        #channel numbers
        self.errorLightOut = 4
        self.errorLightLow = 18
        self.switchOut = 13
        self.switchDetect = 20

        #constants
        self.rs_stopped = 0
        self.rs_forward = 1
        self.rs_reverse = 2

        self.ss_nothing = 0 #nothing has happened yet
        self.ss_start = 1 #both eyes open complete
        self.ss_forward1 = 2 #one eye open complete
        self.ss_forward2 = 3 #both eyes closed complete
        self.ss_reverse1 = 4 #both eyes closed complete

        self.redFac = .75
        self.addFac = 1 - self.redFac

        self.maxSwitchTime = 7 #leave room for waiting and messing up
        self.maxReverseTime = 5

        self.defaultPrevX = 0
        self.defaultPrevY = -.5


        #vars
        self.runState = self.rs_stopped
        self.runTime = 0
        self.switchState = self.ss_nothing
        self.switchTime = 0
        self.prevX = self.defaultPrevX
        self.prevY = self.defaultPrevY

        self.joystick = Joystick()
        io.setmode(io.BCM)
        io.setup(self.errorLightOut, io.OUT, initial=io.LOW)
        io.setup(self.errorLightLow, io.OUT, initial=io.LOW)
        io.setup(self.switchOut, io.OUT, initial=io.HIGH)
        io.setup(self.switchDetect, io.IN, pull_up_down=io.PUD_DOWN)


        time.sleep(.2) #wait for io to definitely turn on before attempting to sense
        if self.should_shut_down():
            print("waiting for switch on")
            io.wait_for_edge(self.switchDetect, io.RISING) #wait for switch to turn on.
        self.set_led(io.HIGH) #indicate success
        time.sleep(.3) #wait so people know for sure that its working

    def sig_no_eye(self, now):
        #print("sig no eye")
        pass #probs just for debugging

    def sig_direction(self, x, y):
        #print("go ", x, ", ", y)
        self.prevX = self.prevX * self.redFac + x * self.addFac
        self.prevY = self.prevY * self.redFac + y * self.addFac
        if self.runState == self.rs_forward:
            self.joystick.forward(self.prevX, self.prevY)

    def sig_error_reset(self):
        #print("turn on error light")
        self.joystick.stop()
        self.set_led(io.HIGH)

    def sig_turn_off_error_light(self):
        self.set_led(io.LOW)

    def process_blink_commands(self, useGroups, now):
        temp = sorted(useGroups, key=lambda group: group.boxCenterX)
        eyes = len(useGroups)

        isLeft = True
        left = False
        right = False
        for group in temp:
            if group.lastOpen == now:
                if isLeft:
                    left = True
                    isLeft = False
                else:
                    right = True
        self.joystick.showEyes(left, right)

        counts1 = self.count_blinks(useGroups, 1, now) #be, bd, ne, nd

        if now - self.switchTime > self.maxSwitchTime and not (self.switchState == self.ss_start and counts1[3] == 2): # don't timeout if during start (because that would be confusing) if eyes are mostly open still
            if self.switchState != self.ss_nothing:
                print("canceled switch due to timeout")
            self.switchState = self.ss_nothing

        if (self.runState == self.rs_reverse and now - self.runTime > self.maxReverseTime) or eyes == 0:
            self.stop(now)
            print("no eye stop")
        elif eyes == 2: #other eyes == 1 case is just continue forward
            countsHalf = self.count_blinks(useGroups, .5, now)
            if self.runState == self.rs_forward:
                if counts1[3] < 2 or countsHalf[1] == 2: #not both ~open1 or both =closed.5
                    self.stop(now)
                    print("forward stop")
            elif self.runState == self.rs_reverse:
                if counts1[3] == 2 or countsHalf[1] == 2: #both ~open1 or both =closed.5
                    self.stop(now)
                    print("reverse stop")
            elif self.runState == self.rs_stopped:
                if self.switchState == self.ss_nothing:
                    if counts1[2] == 2: #both =open1
                        self.switchState = self.ss_start
                        print("ss_start")
                        self.switchTime = now
                    else:
                        print("still nothing")
                elif self.switchState == self.ss_start:
                    if counts1[0] == 2: #both =closed1
                        self.switchState = self.ss_reverse1
                        self.switchTime = now
                        print("ss_reverse1")
                    elif counts1[1] == 1 and counts1[3] == 1: #one ~open1, one ~closed1
                        self.switchState = self.ss_forward1
                        self.swtichTime = now
                        print("ss_forward1")
                    else:
                        print("still start")
                elif self.switchState == self.ss_reverse1:
                    if counts1[1] == 1 and counts1[3] == 1: #one ~open1, one ~closed1
                        self.start_reverse(now)
                    elif counts1[2] == 2: #both =open1
                        self.switchState = self.ss_start
                        self.switchTime = now
                        print("cancel")
                    else:
                        print("still reverse1")
                elif self.switchState == self.ss_forward1:
                    if counts1[0] == 2: #both =closed1
                        self.switchState = self.ss_forward2
                        self.switchTime = now
                        print("ss_forward2")
                    elif counts1[2] == 2: #both =open1
                        self.switchState = self.ss_start
                        self.switchTime = now
                        print("cancel")
                    else:
                        print("still forward1")
                elif self.switchState == self.ss_forward2:
                    if counts1[2] == 2: #both =open1
                        self.start_forward(now)
                    elif counts1[0] == 1 and counts1[2] == 1: #one =open1, one =closed1
                        self.switchState = self.ss_start
                        self.switchTime = now
                        print("cancel")
                    else:
                        print("still forward2")
                else:
                    #something went terribly wrong
                    print("aww nuts")
                    self.stop(now)
            else:
                #something went terribly wrong
                print("awww nutz")
                self.stop(now)

    def count_blinks(self, useGroups, timeReq, now):
        #return format: [blinking_exact, blinking_denoised, notBlinking_exact, notBlinking_denoised]
        be = sum((now - group.lastOpen) > timeReq for group in useGroups)
        bd = sum((now - group.lastDefOpen) > timeReq for group in useGroups)
        ne = sum((now - group.lastClosed) > timeReq for group in useGroups)
        nd = sum((now - group.lastDefClosed) > timeReq for group in useGroups)
        return [be, bd, ne, nd]

    def stop(self, now):
        self.runState = self.rs_stopped
        self.switchState = self.ss_nothing
        self.joystick.stop()
        self.runTime = now

    def start_forward(self, now):
        self.runState = self.rs_forward
        self.switchState = self.ss_nothing
        self.joystick.forward(self.prevX, self.prevY)
        self.runTime = now
        print("start forward")

    def start_reverse(self, now):
        self.runState = self.rs_reverse
        self.switchState = self.ss_nothing
        self.joystick.reverse()
        self.runTime = now
        print("start reverse")

    def should_shut_down(self):
        return io.input(self.switchDetect) == io.LOW

    def set_led(self, state):
        io.output(self.errorLightOut, state)

    def release_assets(self):
        print("releasing all assets")
        self.joystick.stop()
        self.joystick.shutdown()
        io.cleanup()
Пример #4
0
            x = copy.copy(self.joystick.axis_states['x'])
            y = copy.copy(self.joystick.axis_states['y'])

            self.rover.set_throttle(-y)
            self.rover.set_steering(-x)

            self.rover.send_cmd()
            time.sleep(0.002)

        self.rover.release_rc()
        print('stopped')

    def stop(self):
        self.stop_flag = True

if __name__ == '__main__':

    rover = MavrosRover()

    joystick = Joystick()
    joystick.start()

    control = Control(joystick, rover)

    g = lambda singal, frame: signal_handler(signal, frame, control.stop)
    signal.signal(signal.SIGINT, g)

    control.run()
    joystick.stop()