Contrôle du robot avec une manette PS3

Une petite démo de ce que je suis parvenu à faire : contrôler le robot avec une manette PS3 en JAVA :

Cela faisait déjà un moment que je souhaitais pouvoir contrôler facilement le robot autrement que de façon programmatique, notamment pour les mouvements. Il y a quelques mois, j’avais déjà ajouté cette possibilité au travers d’une interface Web (par l’intermédiaire de Websockets et d’événements), mais pas très pratique de gérer les mouvements de manière naturelle à la souris ! Et quoi de mieux qu’une manette pour faire ça ? Grâce à ses multiples boutons et à ses joysticks analogiques, le contrôle est à portée de main.

Comme j’avais une manette PS3 qui traînait dans un coin, j’ai alors fait quelques tests de branchement sous Ubuntu. Résultat : elle est reconnue en USB et même en Bluetooth !!! Il ne restait donc plus qu’à l’intégrer à mon projet via une librairie Java. Pour cela, j’ai utilisé la librairie JInput (qui est capable de gérer les périphériques) et j’ai créé une surcouche de cette librairie pour faciliter son utilisation à l’aide du pattern Observable/Observer (et donc à base de listener) que je vous partage dans ce post.

Voici les différentes procédures à faire pour utiliser une manette PS3 dans un projet JAVA avec Maven sous Ubuntu (reprises en partie du site de JInput) :

  • Dans le pom, ajouter le plugin permettant de « générer / extraire » les librairies natives nécessaires à la librairie JInput, qui permettent de faire le lien entre JAVA et les librairies USB de votre système d’exploitation.
        ...
        <build>
            <plugins>
                ...
                <plugin>
                    <groupId>com.googlecode.mavennatives</groupId>
                    <artifactId>maven-nativedependencies-plugin</artifactId>
                    <version>0.0.7</version>
                    <executions>
                        <execution>
                            <id>unpacknatives</id>
                            <goals>
                                <goal>copy</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
                ...
            </plugins>
        </build>
        ...
    
  • Toujours dans le pom, ajouter les dépendances JInput suivantes :
        ...
        <dependencies>
            ...
            <dependency>
                <groupId>net.java.jinput</groupId>
                <artifactId>jinput</artifactId>
                <version>2.0.9</version>
            </dependency>
            <dependency>
                <groupId>net.java.jinput</groupId>
                <artifactId>jinput</artifactId>
                <version>2.0.9</version>
                <classifier>natives-all</classifier>
            </dependency>
            ...
        </dependencies>
        ...
    
  • Extraire les librairies natives dans le dossier target/natives de votre projet en lançant le goal install.
  • Récupérer sur GitHub les classes JAVA de la librairie de surcouche JInput que j’ai développée et intégrer-les à votre projet. Pour l’instant, je n’ai pas créé de dépendance Maven (peut-être un jour, …).
  • Créer une classe de test (qui est présente dans le lien précédent) :
    public class GamepadTest implements PS3Listener {
    
        public static void main(String[] args) {
            // Création du manager de manettes en indiquant la liste des manettes qui seront gérées (seulement PS3 pour l'instant)
            GamepadManager gamepadManager = new GamepadManager(Ps3Controller.class);
            // Création du listener de la manette (ici, la classe de test)
            GamepadTest listener = new GamepadTest();
            // Ajout de l'écouteur au manager
            gamepadManager.addListener(listener);
            // Lancement du Thread d'écoute des manettes
            gamepadManager.start();
        }
    
        /** Méthode permettant d'écouter les évènements envoyées par les manettes. */
        @Override
        public void onEvent(Ps3ControllerEvent event) {
            System.out.println("EVENT = " + event.toString());
        }
    }
    
  • Assurez-vous que la manette est bien connectée (en USB ou Bluetooth) avant de lancer le test. Une des leds de la manette PS3 doit être allumée et fixe.
  • Lancer le programme en indiquant dans les options de la VM (en ligne de commande ou via votre IDE) le chemin vers le dossier où se trouvent les librairies natives de JInput : -Djava.library.path=/path/of/your/project/target/natives
  • En manipulant votre manette, les évènements interceptés devraient s’afficher : boutons appuyés ou relâchés, niveau des joysticks, …
  • Pour aller un peu plus loin dans l’interception des événements de la manette, vous pouvez vous inspirer du contrôleur de manette que j’ai fait pour le robot (et qui est démontré dans la vidéo).
    En vous inspirant des classes développées pour la manette de la PS3, vous pouvez également gérer une manette XBox (je n’ai pas fait le test). Il suffira juste de faire le bon mapping entre les boutons.

    Amusez-vous bien !!!

Nicolas

About Nicolas

Développeur JAVA, je suis passionné de robotique depuis quelques années, notamment tout ce qui concerne la partie programmation (vision artificielle, synthèse et reconnaissance vocale, intelligence artificielle, ...).

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces tags et attributs HTML :

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>