Управление джойстиком с Qt

Иногда встает необходимость управлять роботом или другими устройствами удаленно. Я хочу обсудить дистанционное управлении с помощью джойстика, когда обработчик команд висит на компьютере и команды передаются на робота через канал передачи данных или команды обрабатываются непосредственно на самом устройстве, если он PC совместимо. Очевидные плюсы - дешевая цена джойстика от 300 руб. Удобно - джойстик зарекомендовал себя в играх.

Я написал небольшой класс VJoystickAdapter на С++ для Qt. Он взаимодействует с SDL дает пользователю удобный интерфейс работы с устройством и генерирует Qt сигналы при изменения состояния кнопок, аналоговых осей или других элементов джойстика. Связка SDL Qt делает код переносимым между разными OS. Рассмотрим UML диаграмму нашего  класса.
UML VJoystickAdapter C++ class

Для подсоединения к джойстику используется метод open(int id) принимающий в качестве параметра id — идентификатор джойстика. В классе есть два вспомогательных статических метода getNumAvaliableJoystick() возвращающий число доступных в системе джойстиков и getAvaliableJoystickName() возвращающий список строк имен доступных в системе джойстиков. Для закрытия джойстика используется метод close() при вызове деструктора происходит проверка на закрытие джойстика и если вы забыли это сделаеть — это будет выполнено автоматически. Как можно заметить что внутри основного класса VJoystickAdapter описан класс VJoystickThread в котором запускается отдельный поток, класс VJoystickThread принимает указатель на базовый класс VJoystickAdapter и генерирует сигналы из метода run(). Генерируются следущие сигналы:

signals:
    void sigButtonChanged(int id, bool state);
    void sigAxisChanged(int id, int state);
    void sigHatCanged(int id, int state);
    void sigBallChanged(int id, int stateX, int stateY);

Названия сигналов говорят сами за себя: сигнал изменения состояния кнопки(Button), аналоговой оси(Axis), перекрестья(hat), и шарика(ball). Все сигналы передают два(три) параметра: id и состояние. Также в классе VJoystickAdapter есть методы для определения числа кнопок, аналоговых осей и других частей джойстика, метод возвращающий id и имя текущего джойстика. Значения возвращаемых параметров аналогичны тем что используются в SDL. Для аналоговых осей возвращаемая величина изменяется от -32768 до +32768. Значение кнокок — нажат, ненажат. Значения с перекрестья могут принимать значения из перечисления HatPosition:

enum HatPosition    
{        
JOYSTICK_HAT_CENTERED = SDL_HAT_DOWN,        
JOYSTICK_HAT_UP = SDL_HAT_UP,      
JOYSTICK_HAT_UP_RIGHT = SDL_HAT_RIGHT,        
JOYSTICK_HAT_RIGHT = SDL_HAT_RIGHT,        
JOYSTICK_HAT_RIGHT_DOWN = SDL_HAT_RIGHTDOWN,        
JOYSTICK_HAT_DOWN = SDL_HAT_DOWN,        
JOYSTICK_HAT_DOWN_LEFT = SDL_HAT_LEFTDOWN,        
JOYSTICK_HAT_LEFT = SDL_HAT_LEFT,        
JOYSTICK_HAT_LEFT_UP = SDL_HAT_LEFTUP    
};

Для Ball сказать ничего не могу — ибо у меня на джойстике нет такой штуки и в документации к SDL об этом ничего не сказано. Наверное по классу все.

В качестве примера использования класса и демонстрации возможностей я написал небольшую GUI программу, которая позволяет сканировать доступные джойстики в системе и отображает состояние элементов джойстика с которым вы соединились, попутно выводиться вся информация о джойстике.


Вот такое применение.Хочется отметить что за основу класс использует библиотеку SDL в текущей стабильной версии на момент написания статьи 1.2.14 отсутствует поддержка вибрации и обратной связи. Что немного печалит игроманов, но в целом на управлении не сказывается. Так как SDL портирована на множество операционных систем, то класс можно использовать везде где есть Qt и SDL. Точно могу сказать, что в Linux, Windows, MacOS этот код будет работать, все что нужно для работы его в других ОС это наличие SDL и Qt.
В прилагаемом архиве класс тестировался в Linux. Все что вам будет необходимо если вы используете не linux это подредактировать makefile.

Скачать Класс, GUI и UML.

В скором веремени планируется создать обработчик команд для управления роботом TurboT. Следите за темой !!!

На моей страничке в github http://github.com/proydakov/vJoyQt я написал gui и обновленный класс по этой статье. Самую свежую версию можно скачать именно оттуда.

Leave a Reply

You must be logged in to post a comment.