我手上有一个小项目,我认为这是学习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个)。
答案 0 :(得分:0)
每个轴都是单独报告的,因此您需要在某些变量中保持当前状态。
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"]
答案 1 :(得分: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])