【问题标题】:python-evdev : reading axes X and Y of a gamepad simultaneouslypython-evdev:同时读取游戏手柄的 X 轴和 Y 轴
【发布时间】:2018-09-01 00:50:53
【问题描述】:

手头有一个小项目,我认为这将是学习 python 的一个很好的借口。使用我这里的游戏手柄(罗技 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)。

【问题讨论】:

    标签: python evdev


    【解决方案1】:

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

    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"]
    

    【讨论】:

      【解决方案2】:

      通过阅读文档,我发现您可以使用 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])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 2017-12-09
        • 2022-01-16
        • 1970-01-01
        • 2014-07-12
        • 2012-09-06
        • 1970-01-01
        相关资源
        最近更新 更多