【问题标题】:PS3 controller driver -> uinput-> python? somehow?PS3 控制器驱动程序-> uinput-> python?不知何故?
【发布时间】:2012-05-27 03:37:04
【问题描述】:

我正在尝试从 Ubuntu 上的 Python 中的 PS3 控制器读取数据,但运气不佳。我从 Willow Garage (http://www.ros.org/wiki/ps3joy) 的 ps3joy 驱动程序开始,据说它会将 PS3 控制器的所有重要部分发布到我从未听说过的“uinput”中。显然,这是一个允许用户空间驱动程序提供系统事件的 linux 功能。 ...为什么 WG 驱动程序需要 root 访问权限,因为它应该是一个用户空间驱动程序,这超出了我的范围,但这不是我的问题。

无论如何,我试图让它工作的当前状态是我已经让驱动程序工作,并且我已经验证它响应控制器上的按钮按下,但我不知道如何拉任何这些数据,以便我可以使用它。

我的第一个猜测是使用 pygame(希望)从 /dev/uinput 读取(我很确定驱动程序发送数据的位置):

from pygame import joystick
if not joystick.get_init():
  joystick.init()
js = joystick.Joystick(0)  # there is only one joystick... even if the driver isn't running(!)
js.init()
print js.get_numbuttons()  # perhaps coincidentally correctly prints 17 which is the number of buttons on a PS3 controller
for i in range(js.get_numaxes()):
  print js.get_axis(i)   # always prints 0, no matter what I'm doing with the controller

但它没有用。这个问题最能说明问题的部分是,如果我根本没有运行 WG 驱动程序,它会做同样的事情。

我确信这很容易,我只是没有阅读正确的信息,但谷歌搜索并没有帮助我找到正确的信息,我感到疲倦和绝望。

【问题讨论】:

    标签: python ps3


    【解决方案1】:

    您不需要驱动程序。假设控制器将自身暴露为 HID,您可以使用 event subsystem 直接从设备读取控制器事件。

    【讨论】:

    • 如何确定控制器是否将自身暴露为 HID?
    • 查看系统日志。当您插入它时,您应该会看到“HID”经过。
    • 我不确定它是否那么简单。控制器是蓝牙的,但它的行为很奇怪。当我运行蓝牙向导时,它反复闪烁在设备列表中和我无法连接到它。当我打开控制器电源时,在我运行向导时,在我使用 WG 驱动程序成功连接时,dmesg 中都没有出现。
    • 编辑:检查一下,确实出现了一件事,但我没有注意到。每次我使用 WG 驱动程序时,我都会得到一个新的输入:[11270.347066] 输入:Sony Playstation SixAxis/DS3 as /devices/virtual/input/input19 这只是弄清楚如何读取该文件的问题。
    • Edit2:该文件不存在...我真的很困惑。
    【解决方案2】:

    我知道为时已晚,但如果有人需要该代码或正在为此苦苦挣扎,您可以使用我的。我在 python 中编写了一个脚本,它从 USB 获取 ps3 数据并通过 PC 的蓝牙将其发送到特定的 MAC 地址(您只能将 ps3controller.py 用于数据)。 这是为我的四轴飞行器项目制作的。

    https://github.com/urbanzrim/ps3controller

    【讨论】:

    • 请阅读这篇关于提供您自己的 OSS 解决方案的帖子:How to offer personal open-source libraries?。如果您包含一个应该如何使用您的库和/或它如何解决所述问题的示例,将会很有帮助。
    【解决方案3】:

    试试

    pygame.event.pump()

    在您阅读操纵杆之前。我需要它来使用 360 控制器

    【讨论】:

      【解决方案4】:

      我相信你至少需要以下几点:

      from pygame import joystick, event, display
      display.init()
      joystick.init()
      js=joystick.Joystick(0)
      js.init()
      ...
      for foo in bar:
          event.pump()
          ...
      
      if foo:
          event.pump()
          ...
      
      while bar:
          event.pump()
          ...
      

      我相信 display.init() 必须存在,因为它是事件处理所必需的......

      另外,你可以跳过很多

      import pygame
      pygame.init()
      js=pygame.joystick.Joystick(0)
      js.init()
      ...
      for foo in bar:
          pygame.event.pump()
          ...
      if foo:
          pygame.event.pump()
          ...
      
      while bar:
          pygame.event.pump()
          ....
      

      我可能是错的,但我认为您的问题是: A) if/while/for 子句中没有 event.pump B) 没有 display.init()

      来源: http://webcache.googleusercontent.com/search?q=cache:I56GyE7I4CkJ:iamtherockstar.com/archive/making-hid-devices-easier-using-pygame-joysticks/+&cd=1&hl=en&ct=clnk&gl=us 和 http://www.pygame.org/docs/ref/event.html

      “输入队列严重依赖于pygame显示模块。”

      【讨论】:

        【解决方案5】:

        现在正在解决类似的问题:在 GNU/Linux 中使用 python 从 PS3 蓝牙远程通信/接收数据。

        我发现有帮助:

        1. 调试PS3控制器http://www.pabr.org/sixlinux/sixlinux.en.html
        2. 看起来像工作项目,PS3 Remote http://kitlaan.twinaxis.com/projects/bluez-ps3remote/(它需要修补 bluez 1st)尚未测试。
        3. pybluez BT 包装器http://code.google.com/p/pybluez/(立即检查)

        【讨论】:

        • 您可能会尝试的一件事是打开 ps3joy 驱动程序并添加打印行以将发送到 uinput 的值列表转储,然后您可以按下按钮并查看值更改。暂时这就是我所做的;我刚刚将驱动程序合并到我的程序中,这样我就可以完全绕过 uinput。这是一个可怕的 hack,但至少它有效。
        猜你喜欢
        • 1970-01-01
        • 2012-09-20
        • 2011-11-02
        • 2010-09-25
        • 1970-01-01
        • 1970-01-01
        • 2019-03-17
        • 2017-12-05
        • 1970-01-01
        相关资源
        最近更新 更多