Как получить доступ к джойстикам геймпада с помощью python evdev?

Я очень плохо знаком с evdev и сейчас пытаюсь использовать контроллер xbox для управления маленьким роботом. Я успешно справляюсь с каждой из кнопок, но не могу понять, как получить достоверные показания с помощью джойстиков.

Этот код работает только для ответа кнопки.

редактировать: всякий раз, когда нажимается кнопка ABXY, также происходят события EV_ABS. Я не уверен, как отличить эти значения от фактических значений джойстика. Кроме того, коды событий от движений джойстика несовместимы. Вот код, который я сейчас использую:

from evdev import InputDevice, categorize, ecodes
dev = InputDevice('/dev/input/event1')

print(dev)

for event in dev.read_loop():
    if event.type == ecodes.EV_KEY:
        print("button is pressed")
    elif event.type == ecodes.EV_ABS:
        print(event)

Любой совет приветствуется! Спасибо!

0 ответов

Python не мой любимый язык, и, возможно, есть лучший метод калибровки, но я собрал все вместе. Надеюсь, это поможет.

Все сопоставления и максимумы были измерены на моем контроллере Xbox One Wireless, поэтому вам, возможно, придется поэкспериментировать / настроить константы для вашего собственного контроллера.

from evdev import list_devices, InputDevice, categorize, ecodes

CENTER_TOLERANCE = 350
STICK_MAX = 65536

dev = InputDevice( list_devices()[0] )
axis = {
    ecodes.ABS_X: 'ls_x', # 0 - 65,536   the middle is 32768
    ecodes.ABS_Y: 'ls_y',
    ecodes.ABS_Z: 'rs_x',
    ecodes.ABS_RZ: 'rs_y',
    ecodes.ABS_BRAKE: 'lt', # 0 - 1023
    ecodes.ABS_GAS: 'rt',

    ecodes.ABS_HAT0X: 'dpad_x', # -1 - 1
    ecodes.ABS_HAT0Y: 'dpad_y'
}

center = {
    'ls_x': STICK_MAX/2,
    'ls_y': STICK_MAX/2,
    'rs_x': STICK_MAX/2,
    'rs_y': STICK_MAX/2
}

last = {
    'ls_x': STICK_MAX/2,
    'ls_y': STICK_MAX/2,
    'rs_x': STICK_MAX/2,
    'rs_y': STICK_MAX/2
}

for event in dev.read_loop():

    # calibrate zero on Y button
    if event.type == ecodes.EV_KEY:
        if categorize(event).keycode[0] == "BTN_WEST":
            center['ls_x'] = last['ls_x']
            center['ls_y'] = last['ls_y']
            center['rs_x'] = last['rs_x']
            center['rs_y'] = last['rs_y']
            print( 'calibrated' )

    #read stick axis movement
    elif event.type == ecodes.EV_ABS:
        if axis[ event.code ] in [ 'ls_x', 'ls_y', 'rs_x', 'rs_y' ]:
            last[ axis[ event.code ] ] = event.value

            value = event.value - center[ axis[ event.code ] ]

            if abs( value ) <= CENTER_TOLERANCE:
                value = 0

            if axis[ event.code ] == 'rs_x':
                if value < 0:
                    print('left')
                else:
                    print('right')
                print( value )

            elif axis[ event.code ] == 'ls_y':
                if value < 0:
                    print('foreward')
                else:
                    print('backward')
                print( value )
Другие вопросы по тегам