天天看點

Python調用xbox搖桿馬達震動

最近搞強化學習高斯過程模拟,用到了搖桿修正運動軌迹方式。

看的大佬:來自江南的你的文章Pygame詳解(十七):joystick 子產品

在python 環境下安裝pygame後 全文複制就可以調用,然後xbox 搖桿支援馬達,就想着在使用搖桿扳機的時候控制搖桿震動。找了半天沒找到合适的文章,最後在stackoverflow上找到一個issue的解決辦法1

他用的是python 調用C語言的dll檔案實作的,代碼如下:

import ctypes

# Define necessary structures
class XINPUT_VIBRATION(ctypes.Structure):
    _fields_ = [("wLeftMotorSpeed", ctypes.c_ushort),
                ("wRightMotorSpeed", ctypes.c_ushort)]

xinput = ctypes.windll.xinput1_1  # Load Xinput.dll

# Set up function argument types and return type
XInputSetState = xinput.XInputSetState
XInputSetState.argtypes = [ctypes.c_uint, ctypes.POINTER(XINPUT_VIBRATION)]
XInputSetState.restype = ctypes.c_uint

# Now we're ready to call it.  Set left motor to 100%, right motor to 50%
# for controller 0
vibration = XINPUT_VIBRATION(65535, 32768)
XInputSetState(0, ctypes.byref(vibration)) # 直接調用


# 調用封裝的函數
def set_vibration(controller, left_motor, right_motor):
    vibration = XINPUT_VIBRATION(int(left_motor * 65535), int(right_motor * 65535))
    XInputSetState(controller, ctypes.byref(vibration))

set_vibration(0, 1.0, 0.5)   #參數分别為: 控制器編号(預設為0)  左馬達震動系數   右馬達震動系數
           

注意: 調用這個函數搖桿隻震動一次,手感比較微弱,如果需要持續震動,需要自己寫一個循環重複調用。至于馬達的非線性手感…以後有機會再研究吧…