2

手头有一个小项目,我认为这将是学习 python 的一个很好的借口。使用我这里的游戏手柄(Logitech F310),操纵杆的 X 轴和 Y 轴的值在 0-255 之间变化,当它们在中心“空闲”时为 127 或 128。

使用此代码(来自http://www.lafavre.us/robotics/IoT_LogitechF310.pdf

from evdev import InputDevice, categorize, ecodes, KeyEvent 
    gamepad = InputDevice('/dev/input/event3') 
for event in gamepad.read_loop(): 
    if event.type == ecodes.EV_ABS: 
        absevent = categorize(event) 
        if ecodes.bytype[absevent.event.type][absevent.event.code] == 'ABS_RZ':
            if absevent.event.value > 128: 
                print 'reverse' 
                print absevent.event.value 
            elif absevent.event.value < 127: 
                print 'forward' 
                print absevent.event.value 
       if ecodes.bytype[absevent.event.type][absevent.event.code] == 'ABS_Z': 
            if absevent.event.value > 128 : 
                print 'right' 
                print absevent.event.value 
            elif absevent.event.value < 127: 
                print 'left' 
                print absevent.event.value

我能够获得上、下、右、左的位置;到目前为止我未能完成的是,当操纵杆位于 X 轴和 Y 轴之间时,如何检索 X 和 Y 的值,这是狭窄的间隔(准确地说是 4)。

4

2 回答 2

2

每个轴都单独报告,因此您需要在某些变量中保持当前状态。

from evdev import InputDevice, categorize, ecodes, KeyEvent 
    gamepad = InputDevice('/dev/input/event3') 
    last = {
        "ABS_RZ": 128,
        "ABS_Z": 128
    }
for event in gamepad.read_loop(): 
    if event.type == ecodes.EV_ABS: 
        absevent = categorize(event) 
        if ecodes.bytype[absevent.event.type][absevent.event.code] == 'ABS_RZ':
            last["ABS_RZ"] = absevent.event.value

       if ecodes.bytype[absevent.event.type][absevent.event.code] == 'ABS_Z': 
            last["ABS_Z"] = absevent.event.value

        if last["ABS_RZ"] > 128: 
            print 'reverse' 
            print last["ABS_RZ"] 
        elif last["ABS_RZ"] < 127: 
            print 'forward' 
            print last["ABS_RZ"] 

        if last["ABS_Z"] > 128 : 
            print 'right' 
            print last["ABS_Z"] 
        elif last["ABS_Z"] < 127: 
            print 'left' 
            print last["ABS_Z"]
于 2019-06-03T02:30:50.050 回答
0

通过阅读文档,我发现您可以absinfo用于从某个操纵杆中检索值:https ://python-evdev.readthedocs.io/en/latest/apidoc.html#evdev.device.AbsInfo

例如,要获取轴 0、1、2 和 5 的值(在 -1 和 1 之间转换),我使用以下代码:

device = evdev.InputDevice('/dev/input/event26')

def get_axis_value(i):
    return (device.absinfo(i).value - 128) / 128

def check_gamepad():
    [a, b, c, d] = map(get_axis_value, [0, 1, 2, 5])
于 2020-06-17T15:35:46.123 回答