使用Python模拟XBox控制器输入

17

我希望我的Python程序可以模拟XBox手柄的输入,包括模拟两个摇杆和按键。

我在这里找到了关于如何使用ctypes在Python中模拟键盘输入的主题,例如在这里:Python模拟按键按下

是否可以类似于正常键盘或鼠标上的“keydown”来模拟它?

2个回答

18

如果有人遇到同样的问题,可以参考这个帖子:

我使用了vJoy、pyVJoy和x360ce解决了这个问题。

vJoy提供了一个SDK和驱动程序来模拟输入设备。您可以使用游戏手柄等控制器。 PyvJoy允许您访问这些驱动程序并在Python中模拟输入。 https://github.com/tidzo/pyvjoy pyvJoy将“模拟”摇杆的值设置在0和32767之间。 例如,要获得Xbox控制器的左拇指杆处于中性位置的输入,可以将XAxis和YAxis设置为32767的1/2。

因此,对于我而言,如果输入值在0和1之间,则需要将它们乘以这些值。 在我的代码中,看起来像这样:

MAX_VJOY = 32767
self.j = pyvjoy.VJoyDevice(1)

def play_function(self,X,Y,Z,XRot):
    self.j.data.wAxisX = int(X * self.MAX_VJOY)
    self.j.data.wAxisY = int(Y * self.MAX_VJOY)
    self.j.data.wAxisZ = int(Z * self.MAX_VJOY)
    self.j.data.wAxisXRot = int(XRot * self.MAX_VJOY)
    j.update()

您还可以通过这种方式更新“二进制”/“数字”按钮。pyvjoy Github 页面上有更多示例。 尝试使用此摇杆应用程序进行校准:http://www.planetpointy.co.uk/joystick-test-application/

最后一部分是使用 X360CE,它将 vJoy “DigitalInput” 设备转换为 XInput 设备。因此,PC/游戏认为它是实际的 Xbox 360 或 Xbox One 控制器。这最后一部分仅适用于某些只允许官方 Xbox 控制器(如 GTA 5)的游戏。 您可以从这里获取 X360CE:http://www.x360ce.com/

所有这些组合使我能够通过 Python 玩那些游戏。我发现使用 WASD 训练神经网络效果不佳,因为它总是表现得极端,因为它仅允许 1 或 0 的按钮按下。使用这些控件,您可以获得更平滑的游戏控件。


1
听起来你正在做一个类似于我正在做的项目。你能分享一下你是如何记录Xbox控制器输入的吗?你有GitHub页面或者代码可以展示吗?我正在尝试使用inputs包,但是我遇到了一些同步问题。我在这里发布了我的问题,但是还没有得到回复。https://stackoverflow.com/questions/53803729/how-to-record-state-of-xbox-gamepad-controller-in-python - Allen
1
嗨@Allen,我从TensorKart项目utils.file中获取了记录Xbox控制器部分的内容:https://github.com/kevinhughes27/TensorKart/blob/master/utils.py - Herka
可以请您展示如何使用j.data方法与多个按钮吗?@Herka - Samm Flynn

0
vgamepad比接受的答案要简单得多。根据我的测试,它不需要任何设置。
PyPi: https://pypi.org/project/vgamepad/ 示例:
import vgamepad as vg
import time

gamepad = vg.VX360Gamepad()

while True:
    print("press")
    gamepad.press_button(vg.XUSB_BUTTON.XUSB_GAMEPAD_A)
    gamepad.update()
    time.sleep(0.5)
    print("release")
    gamepad.release_button(button=vg.XUSB_BUTTON.XUSB_GAMEPAD_A)
    gamepad.update()
    time.sleep(0.5)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接