Pygame Joystick.get_axis() всегда возвращает ноль

Купил Logitech Gamepad F310 для удаленного управления робототехникой. Я использую Pygame (версия 1.9.1, версия Python 2.7.11+) в Linux Mint (выпуск 18, Сара).

В качестве простого теста для проверки функциональности джойстика я написал этот короткий скрипт, который выводит значения для разных осей:

import pygame

pygame.display.init()
pygame.joystick.init()
pygame.joystick.Joystick(0).init()

# Get the name of the joystick and print it
JoyName = pygame.joystick.Joystick(0).get_name()
print "Name of the joystick:"
print JoyName

# Get the number of axes
JoyAx = pygame.joystick.Joystick(0).get_numaxes()
print "Number of axis:"
print JoyAx

# Print the values for the axes
pygame.event.pump()
print pygame.joystick.Joystick(0).get_axis(0)
print pygame.joystick.Joystick(0).get_axis(1)
print pygame.joystick.Joystick(0).get_axis(2)
print pygame.joystick.Joystick(0).get_axis(3)

Независимо от положения осей, когда я запускаю скрипт, я всегда получаю следующий вывод:

Name of the joystick:
Logitech Gamepad F310
Number of axis:
6
SDL_JoystickGetAxis value:0:
0.0
SDL_JoystickGetAxis value:0:
0.0
SDL_JoystickGetAxis value:0:
0.0
SDL_JoystickGetAxis value:0:
0.0

Насколько я понимаю, вывод "SDL_joystick.Joystick(0).getAxis value" связан с тем, что разработчики сохранили флаг отладки при компиляции исходного кода. Но я не понимаю, почему скрипт возвращает 0 для всех значений оси, если они не находятся в позиции 0.

Я протестировал джойстик с пакетом jstest-gtk. Используя этот пакет, он работает без сбоев. Есть ли ошибка в моем коде?

Я запускал код в Windows, там все работает без сбоев. Есть идеи, почему это не работает в дистрибутиве Linux?


person SGolt    schedule 02.10.2016    source источник
comment
Два диагностических комментария: количество осей равно 6, но вы запрашиваете только значение для 4. Кроме того, может быть некоторое обнуление начальной позиции при запуске скрипта, и поскольку это не игра, а просто скрипт который запускается мгновенно, вы можете запросить и распечатать значения в цикле и посмотреть, получаете ли вы по-прежнему 0 в реальном времени.   -  person Blake O'Hare    schedule 02.10.2016
comment
Блейк, спасибо, ты прав. Я начал корректировать исходный код Pygame и компилировать его, чтобы избавиться от лишнего вывода SDL_joystick.Joystick, который печатался при каждом вызове. Затем я начал выяснять, что я сделал неправильно в своем начальном цикле while (который я не опубликовал в приведенном выше коде). Проблема заключалась в том, что я поместил функцию pygame.event.pump() в неправильное положение (вне цикла while). Урок усвоен, читайте инструкцию :)   -  person SGolt    schedule 02.10.2016
comment
Стоило бы перенести обновление + решение в отдельный ответ. Совершенно нормально отвечать на ваши вопросы, а затем за ответ можно проголосовать и отметить его как решение.   -  person Petr    schedule 25.11.2017


Ответы (1)


Извлечено из редактирования вопроса.

В исходном коде (не размещенном выше) у меня был цикл while, но я сделал ошибку новичка, поместив строку pygame.event.pump() вне цикла while. Код, который у меня есть сейчас, чтобы научиться работать с этим модулем, работает отлично.

import pygame

pygame.display.init()
pygame.joystick.init()
pygame.joystick.Joystick(0).init()

# Prints the joystick's name
JoyName = pygame.joystick.Joystick(0).get_name()
print "Name of the joystick:"
print JoyName
# Gets the number of axes
JoyAx = pygame.joystick.Joystick(0).get_numaxes()
print "Number of axis:"
print JoyAx

# Prints the values for axis0
while True:
        pygame.event.pump()
        print pygame.joystick.Joystick(0).get_axis(0)

Мне пришлось потратить некоторое время на корректировку и перекомпиляцию исходного кода joystick.c, чтобы избавиться от распечаток «SDL_joystick.Joystick(0).getAxis value:0:». По-видимому, проблема известна уже несколько лет, но не исправлена ​​​​для Ubuntu / Mint.

person Community    schedule 31.10.2019