[JAVA] Développement d'applications ROS sur Android

Contenu de cet article

Je vais vous expliquer l'application tutoriel pour la communication Pub-Sub de ROS (Robot Operating System) sur Android. L'application Android ROS est développée avec rosjava, mais j'ai créé un article car la quantité d'informations en japonais est inférieure ou antérieure à roscpp et rospy.

En gros, je me réfère au tutoriel ROS.org http://wiki.ros.org/android.

Connaissances préalables

--Connaissance générale du développement d'applications Android --Connaissance générale du développement ROS

Contenu du tutoriel

Ici, en supposant que ROS Master fonctionne sur le PC ROS, vérifiez l'opération d'abonnement du message publié sur le smartphone sur le PC ROS (+ le smartphone lui-même).

system_android.png

Environnement de vérification de fonctionnement

Préparation

La procédure détaillée pour chaque élément est omise car elle est introduite sur d'autres sites.

Procédure de développement d'applications

build.gradle


// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

buildscript {
    apply from: "https://github.com/rosjava/android_core/raw/kinetic/buildscript.gradle"
}

subprojects {
    apply plugin: 'ros-android'

    afterEvaluate { project ->
        android {
            // Exclude a few files that are duplicated across our dependencies and
            // prevent packaging Android applications.
            packagingOptions {
                exclude "META-INF/LICENSE.txt"
                exclude "META-INF/NOTICE.txt"
            }
        }
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

Ici, dans le tutoriel d'origine

Edit the top-level build.gradle file and replace this part:

with this:

Il y a une déclaration (j'ai ajouté l'accent sur remplacer), mais dans mon environnement, j'ai eu une erreur lorsque j'ai supprimé le premier buildscript, donc je l'ai laissé tel quel.

build.gradle


apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "goodclues.example.myrosapplication"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'org.ros.android_core:android_15:[0.3,0.4)'
}

La dernière «implémentation» est «compiler» à la maison, mais elle semble désormais obsolète. ~~ Aussi, changeons le nombre de 15 "android_15" en fonction du niveau d'API. ~~ (← Veuillez noter dans les commentaires, il semble que le numéro et le niveau d'API ne soient pas liés. De plus, il semble que la méthode de description ait changé maintenant, veuillez donc consulter le tutoriel pour les dernières informations.)

<uses-permission android:name="android.permission.INTERNET" />

Autorisation d'utiliser le réseau.

<activity android:name="org.ros.android.MasterChooser" />

Master Chooser est une activité pour spécifier l'URI du maître ROS. Si vous décrivez cela, l'écran de réglage s'affichera automatiquement au démarrage de l'application. Vous pouvez également coder en dur l'URI maître, mais consultez le didacticiel d'origine pour savoir comment procéder.

<application xmlns:tools="http://schemas.android.com/tools"
        tools:replace="android:icon"
        ...(Suite ci-dessous)

Je ne sais pas pourquoi, mais sans cela, j'obtiens une erreur. Le fichier manifeste final ressemble à ceci:

AndroidManifest.xml


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="goodclues.example.myrosapplication">

    <uses-permission android:name="android.permission.INTERNET" />

    <application xmlns:tools="http://schemas.android.com/tools"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:replace="android:icon">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <activity android:name="org.ros.android.MasterChooser" />
    </application>

activity_main.xml


<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <org.ros.android.view.RosTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:id="@+id/text"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

Pour utiliser ROS, créez une activité qui étend RosActivity. L'exemple ci-dessous a une classe appelée Talker qui publie un message / chatter et une vue qui s'abonne à un sujet de discussion appelé RosTextView.

La classe Talker publie en interne un nombre qui est incrémenté chaque seconde.

MainActivity.java


/*
 * Copyright (C) 2011 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package goodclues.example.myrosapplication;

import android.os.Bundle;
import org.ros.android.MessageCallable;
import org.ros.android.RosActivity;
import org.ros.android.view.RosTextView;
import org.ros.node.NodeConfiguration;
import org.ros.node.NodeMainExecutor;

/**
 * @author [email protected] (Damon Kohler)
 */
public class MainActivity extends RosActivity {

    private RosTextView<std_msgs.String> rosTextView;
    private Talker talker;

    public MainActivity() {
        // The RosActivity constructor configures the notification title and ticker
        // messages.
        super("Pubsub Tutorial", "Pubsub Tutorial");
    }

    @SuppressWarnings("unchecked")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        rosTextView = (RosTextView<std_msgs.String>) findViewById(R.id.text);
        rosTextView.setTopicName("chatter");
        rosTextView.setMessageType(std_msgs.String._TYPE);
        rosTextView.setMessageToStringCallable(new MessageCallable<String, std_msgs.String>() {
            @Override
            public String call(std_msgs.String message) {
                return message.getData();
            }
        });
    }

    @Override
    protected void init(NodeMainExecutor nodeMainExecutor) {
        talker = new Talker();

        // At this point, the user has already been prompted to either enter the URI
        // of a master to use or to start a master locally.

        // The user can easily use the selected ROS Hostname in the master chooser
        // activity.
        NodeConfiguration nodeConfiguration = NodeConfiguration.newPublic(getRosHostname());
        nodeConfiguration.setMasterUri(getMasterUri());
        nodeMainExecutor.execute(talker, nodeConfiguration);
        // The RosTextView is also a NodeMain that must be executed in order to
        // start displaying incoming messages.
        nodeMainExecutor.execute(rosTextView, nodeConfiguration);
    }
}

J'emprunte l'échantillon presque tel quel. Cependant, à la tête de la famille

import org.ros.rosjava_tutorial_pubsub.Talker;

Cependant, dans mon environnement, j'ai eu une erreur, j'ai donc copié la source suivante et créé une classe Talker dans mon projet. http://docs.ros.org/hydro/api/rosjava_core/html/Talker_8java_source.html

Contrôle de fonctionnement

Démarrez roscore sur le PC ROS.

$ roscore

Ensuite, lorsque vous démarrez l'application, l'écran de configuration de la connexion ROS Master suivant s'affiche. (Si vous cochez Afficher les options avancées, vous verrez un bouton pour définir les paramètres réseau détaillés et le smartphone lui-même un ROS Master, mais je l'omettrai ici car ce n'est pas nécessaire) ros_master_setting.png

Entrez l'URI maître ROS dans "URI maître". Ce n'est pas grave si vous changez l'endroit où il est "localhost" en "192.168.0.15" défini ci-dessus. Ensuite, appuyez sur CONNEXION et si la connexion réussit, elle passera à l'activité principale.

main_activity.png

Le numéro affiché à droite de Hello world! Est le message auquel vous vous abonnez (publié par vous-même).

Maintenant, vérifions si vous pouvez vous abonner sur ROS PC. Au terminal

$ rostopic echo /chatter

Puis

data: "Hello world! X"

Si le message est émis à intervalles réguliers comme celui-ci, il réussit. (X est un nombre)

en conclusion

J'ai expliqué la procédure de développement d'applications Android qui réalise une communication Pub-Sub simple avec le tutoriel de ROS.org. Cela facilitera la liaison du robot avec une caméra de smartphone, etc., alors essayez-le.

Recommended Posts

Développement d'applications ROS sur Android
Lancement du développement personnel de l'application Android
Remarques sur l'appel du programme d'installation sur l'application Android
Application météo Android
Développement Android app_preparation
J'ai créé une application de calculatrice sur Android
Permet la lecture automatique de Youtube même avec l'application Android de Cordova
Développement (paramètres) Riot (application de chat) dans Android Studio
Résumé du lien de développement Android
[Android] Notes sur xml
Analyseur de spectre d'application Android
Préparation au développement d'applications Android 7/15
À propos des composants de l'application Android
Site de référence de développement Android
Points clés du développement d'applications Android où les programmeurs à l'ancienne ont trébuché
[Version de préservation 2018] Application Android d'ingénierie inverse (.apk) sur Mac
Un débutant en développement d'applications a essayé de créer une application de calculatrice Android
Personnaliser la vue de liste sur Android
Bibliothèque de transmission en plusieurs parties sur Android
L'ingénieur iOS démarre le développement Android
Développement d'applications iOS: application Timer (2. affichage de la minuterie)
Utiliser la communication série sur Android
Introduction au développement d'applications Android
Développement Android ~ transition d'écran (intention) ~
Décompilation de l'application Android ⇒ correction ⇒ recompilation
Développement d'applications iOS: application Timer (résumé)
Créez une application Android. (Jour 5)
Utiliser le code natif sur Android
Développement ATDD sur iOS (édition de base)
Ce que les débutants du développement Android ont fait avant de publier l'application dans 2 semaines
Introduction au développement d'applications Android 1 Installation de JDK et d'Android Studio pour mac
Importer des images d'appareils avec l'application Android
À propos des bases du développement Android
Gestion des événements avec RxBus sur Android
Commentaire ReactNative Android Bridge
[Android] Obtenez la date du lundi
[Unity] Procédure de construction de l'environnement de développement Android
Obtenez la couverture du code JUnit sur Android.
Premier développement Android pour les gens occupés
Une collection de bibliothèques utiles dans le développement Android
Journal complet de développement d'applications IOS pour l'auto-apprentissage
Créez une application Android. (Premier jour)
Notes pour les débutants en développement d'applications Android
Watson Assistant (anciennement Conversation) sur Android
Une série de problèmes dans le développement de studios Android
Enregistrer ArrayList à l'aide de GSON sur Android
Feuille de route des compétences de développement d'applications iOS (introduction)
Remarques sur le traitement des threads Android (java)
[Android] Recevoir une intention avec le récepteur de diffusion
Développement d'applications iOS: application Timer (4. Implémentation du compte à rebours)
Développement d'applications iOS: application Timer (1. réglage de l'heure de la minuterie)
Créer un environnement de développement Unity sur docker
J'ai créé une application correspondante (application Android)
Développement d'applications iOS: application Timer (10. Créer une animation)
Implémenter la représentation ondulatoire dans les images sur Android
[Android] J'ai créé une application de podomètre.
Accélérez l'acquisition d'informations de localisation sur Android