[英]How to access the joysticks of a gamepad using 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)
任何建議表示贊賞! 謝謝!
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 )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.