web-dev-qa-db-ja.com

pygameを使用してPS4コントローラーで押されているボタンを識別する方法

Raspberry Pi3を使用してロボット車両を制御しています。 ds4drvを使用してPS4コントローラーをRPiに正常にリンクしました。 pygameを使用してPS4コントローラーでボタンが押された/離されたときに「ボタンが押された」/「ボタンが解放された」を出力する次のコードがあります。どのボタンが正確に押されているかを特定する方法を知りたいです。

ps4_controller.py

import pygame

pygame.init()

j = pygame.joystick.Joystick(0)
j.init()

try:
    while True:
        events = pygame.event.get()
        for event in events:
            if event.type == pygame.JOYBUTTONDOWN:
                print("Button Pressed")
            Elif event.type == pygame.JOYBUTTONUP:
                print("Button Released")

except KeyboardInterrupt:
    print("EXITING NOW")
    j.quit()
6
Ctpelnar1988

ハックを見つけた:

PS4ボタンには次のように番号が付けられています。

_0 = SQUARE_

_1 = X_

_2 = CIRCLE_

_3 = TRIANGLE_

_4 = L1_

_5 = R1_

_6 = L2_

_7 = R2_

_8 = SHARE_

_9 = OPTIONS_

_10 = LEFT ANALOG PRESS_

_11 = RIGHT ANALOG PRESS_

_12 = PS4 ON BUTTON_

_13 = TOUCHPAD PRESS_

どのボタンが押されているかを把握するために、j.get_button(int)を使用して、一致するボタンの整数を渡しました。

例:

_import pygame

pygame.init()

j = pygame.joystick.Joystick(0)
j.init()

try:
    while True:
        events = pygame.event.get()
        for event in events:
            if event.type == pygame.JOYBUTTONDOWN:
                print("Button Pressed")
                if j.get_button(6):
                    # Control Left Motor using L2
                Elif j.get_button(7):
                    # Control Right Motor using R2
            Elif event.type == pygame.JOYBUTTONUP:
                print("Button Released")

except KeyboardInterrupt:
    print("EXITING NOW")
    j.quit()
_
8
Ctpelnar1988

あなたは本当に近いです!いくつかの調整を加えると、コードは代わりに次のようになります。

import pygame

pygame.init()
j = pygame.joystick.Joystick(0)
j.init()

try:
    while True:
        events = pygame.event.get()
        for event in events:
            if event.type == pygame.JOYAXISMOTION:
                print(event.dict, event.joy, event.axis, event.value)
            Elif event.type == pygame.JOYBALLMOTION:
                print(event.dict, event.joy, event.ball, event.rel)
            Elif event.type == pygame.JOYBUTTONDOWN:
                print(event.dict, event.joy, event.button, 'pressed')
            Elif event.type == pygame.JOYBUTTONUP:
                print(event.dict, event.joy, event.button, 'released')
            Elif event.type == pygame.JOYHATMOTION:
                print(event.dict, event.joy, event.hat, event.value)

except KeyboardInterrupt:
    print("EXITING NOW")
    j.quit()

私がアップを書くのに役立つと思ったいくつかのリソースには、 pygameのイベントドキュメント 、Pythonのdir関数を使用して、pythonオブジェクトが持つプロパティを確認する、および pygameの親Cライブラリ、SDLのドキュメント プロパティが実際に何を意味するのかをより深く説明したい場合は、辞書アクセスバージョン(event.dictを使用)とプロパティアクセスバージョン(event.whatever_the_property_name_isのみを使用)。event.buttonは番号のみを提供することに注意してください。各ボタン番号がコントローラー上で意味するもののマッピングを手動で作成するのは、あなた次第です。これがクリアされることを願っています。それまで!

5
CodeSurgeon

少し遅れましたが、それでも解決策を探している人がいる場合は、モジュールを作成しました:pyPS4Controllerは、コントローラー上のすべてのボタンイベントが既にマップされており、次のように上書きできます。

from pyPS4Controller.controller import Controller


class MyController(Controller):

    def __init__(self, **kwargs):
        Controller.__init__(self, **kwargs)

    def on_x_press(self):
       print("Hello world")

    def on_x_release(self):
       print("Goodbye world")

controller = MyController(interface="/dev/input/js0", connecting_using_ds4drv=False)
# you can start listening before controller is paired, as long as you pair it within the timeout window
controller.listen(timeout=60)

これは1つのイベントの単なる例です。次のように、上書きできるイベントが他にもあります。

on_x_press
on_x_release
on_triangle_press
on_triangle_release
on_circle_press
on_circle_release
on_square_press
on_square_release
on_L1_press
on_L1_release
on_L2_press
on_L2_release
on_R1_press
on_R1_release
on_R2_press
on_R2_release
on_up_arrow_press
on_up_down_arrow_release
on_down_arrow_press
on_left_arrow_press
on_left_right_arrow_release
on_right_arrow_press
on_L3_up
on_L3_down
on_L3_left
on_L3_right
on_L3_at_rest  # L3 joystick is at rest after the joystick was moved and let go off
on_L3_press  # L3 joystick is clicked. This event is only detected when connecting without ds4drv
on_L3_release  # L3 joystick is released after the click. This event is only detected when connecting without ds4drv
on_R3_up
on_R3_down
on_R3_left
on_R3_right
on_R3_at_rest  # R3 joystick is at rest after the joystick was moved and let go off
on_R3_press  # R3 joystick is clicked. This event is only detected when connecting without ds4drv
on_R3_release  # R3 joystick is released after the click. This event is only detected when connecting without ds4drv
on_options_press
on_options_release
on_share_press  # this event is only detected when connecting without ds4drv
on_share_release  # this event is only detected when connecting without ds4drv
on_PlayStation_button_press  # this event is only detected when connecting without ds4drv
on_PlayStation_button_release  # this event is only detected when connecting without ds4drv

完全なドキュメントは@ https://github.com/ArturSpirin/pyPS4Controller で入手できます。

0
Artur Spirin