2012-05-27 6 views
5

Estoy tratando de leer desde un controlador de PS3 en python en Ubuntu y no estoy teniendo mucha suerte. Empecé con el controlador ps3joy de Willow Garage (http://www.ros.org/wiki/ps3joy) que supuestamente publica todos los elementos importantes del controlador de PS3 en algo que nunca había escuchado llamar "uinput". Aparentemente es una característica de Linux que permite a los controladores de espacio de usuario proporcionar eventos del sistema. ... Por qué el controlador WG requiere acceso raíz dado que supuestamente es un controlador de espacio de usuario me supera, pero esa no es mi pregunta.Controlador de controlador PS3 -> uinput-> python? ¿de algun modo?

De todos modos, el estado actual de mí tratando de hacer que funcione es que tengo el controlador funcionando, y he verificado que responde a las pulsaciones del botón en el controlador, pero no sé cómo sacar cualquiera de esos datos para poder usarlos.

Mi primera suposición era utilizar a pygame (con suerte) leído desde/dev/uinput (que estoy bastante seguro de que es donde el conductor envía los datos):

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 

pero no funcionó . La parte más reveladora del problema es que hace lo mismo si no tengo el controlador WG ejecutándose.

Estoy seguro de que esto es algo fácil, que simplemente no estoy leyendo la información correcta, pero buscar en Google no me ha ayudado a encontrar la información correcta y me estoy cansando y desesperado.

Respuesta

3

No necesita el controlador. Suponiendo que el controlador se expone a sí mismo como un HID, puede usar el event subsystem para leer los eventos del controlador directamente desde el dispositivo.

+0

¿Cómo puedo determinar si el controlador se expone como una HID? – teryret

+0

Mire el registro del sistema. Debería ver "HID" cuando lo conecte. –

+0

No estoy seguro de que sea así de simple. El controlador es bluetooth pero se comporta de manera extraña. Cuando ejecuto bluetooth-wizard, se enciende y apaga repetidamente la lista de dispositivos y no puedo conectarme a ella. No apareció nada en dmesg cuando encendí el controlador, ni cuando ejecuté el asistente, ni cuando usé el controlador WG para conectarme con éxito. – teryret

0

Resolviendo un problema similar en este momento: comunicar/recibir datos de PS3 bluetooth remote con python en GNU/Linux.

lo que he encontrado útil:

  1. controlador de PS3 Depuración http://www.pabr.org/sixlinux/sixlinux.en.html
  2. Parece proyecto de trabajo, para PS3 a distancia http://kitlaan.twinaxis.com/projects/bluez-ps3remote/ (que requiere parchear primera bluez) no probado, sin embargo.
  3. envoltorio pybluez BT http://code.google.com/p/pybluez/ (comprobación de que en este momento)
+0

Una cosa que podría intentar es abrir el controlador ps3joy y agregar una línea de impresión para volcar la lista de valores que se envían a la entrada, luego puede presionar un botón y ver el cambio de valor. Por el momento eso es lo que hice; Acabo de incorporar el controlador en mi programa para poder omitir la entrada por completo. Es un truco terrible, pero al menos funciona. – teryret

1

Trate

pygame.event.pump()

antes de leer el joystick. Lo necesitaba para trabajar con el controlador 360

0

Creo que se necesita lo siguiente como mínimo:

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() 
    ... 

creo que display.init() tiene que estar ahí, ya que es necesario para el manejo de eventos ...

Además, puede saltar mucho de eso con

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() 
    .... 

podría estar equivocado, pero creo que sus problemas son: a) No event.pump en su i f/while/for clauses B) Sin visualización.init()

Fuentes: 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 y http://www.pygame.org/docs/ref/event.html

"La cola de entrada depende en gran medida el módulo de visualización pygame."

1

Sé que es demasiado tarde, pero si alguien alguna vez necesita el código o está luchando con él, puede usar el mío. He escrito un script en python que obtiene datos de ps3 del USB y los envía a una dirección MAC específica a través del bluetooth de la PC (puede usar ps3controller.py solo para datos). Esto fue hecho para mi proyecto de quadcopter.

https://github.com/urbanzrim/ps3controller

+0

Lea esta publicación sobre cómo ofrecer sus propias soluciones OSS: [¿Cómo ofrecer bibliotecas personales de código abierto?] (Https://meta.stackexchange.com/q/229085). Sería útil incluir un ejemplo de cómo debería usarse su biblioteca y/o cómo resolvió el problema planteado. –

Cuestiones relacionadas