Outils pour utilisateurs

Outils du site


ros_android

Android

ROS Android

Il existe plusieurs méthodes pour utiliser ROS sur un système Android.

  1. Portage Java de ROS avec le package Android http://wiki.ros.org/android
  2. Avec le NDK d'Android et cross-compilation des libs ROS. http://wiki.ros.org/android_ndk/Tutorials

La deuxième méthode permet d'assurer la compatibilité avec l'ensemble des codes C++ existants et une meilleur performance.

Tutoriel: ROS only

Construction d'un projet de test avec Android Studio et ROS. Ce tuto permet de lancer un noeud ROS sans avoir besoin d'une Android Activity.

Tout d'abord, récupérer (ou cross-compiler) ROS pour les systèmes Android.

(Déziper et) Placer le dossier roscpp_android_ndk à l'endroit voulu (Dans le dossier AndroidStudioProjects par exemple).

Ensuite, récupérer le projet de test sur le Redmine du LAAS. Ce projet peut servir de base à un projet plus conséquent.

https://redmine.laas.fr/projects/lumus/repository cloner le dépot Lumus. Le projet de base est contenu dans le dossier simpleROS.

Le projet test permet de lancer une node ROS sur un dispositif Android. Cette node écoute le topic /chatter et publie sur le topic /a_chatter.

Ouvrir le projet avec Android studio

Dans l'arborescence projet, ouvrir app/cpp/sample_app/src/test.cpp qui contient le code C++ ROS

Modifier les valeurs des adresses ip pour les faire correspondre à votre configuration réseau.

// Set master workstation ip : __master
// Set android device ip : __ip
char *argv[] = {"nothing_important" , "__master:=http://192.168.150.1:11311", "__ip:=192.168.150.10"};

Dans l'arborescence projet, ouvrir External Build Files/Android.mk qui permet de configurer le build des modules NDK du projet (dans notre cas ROS)

Modifier la valeur NDK_MODULES_PATH par celle du dossier qui contient le dossier roscpp_android_ndk. Cette variable référence le dossier contenant les modules NDK de l'application.

Ne pas oublier d'activer l'accès réseu pour le dispositif android. Dans AndroidManifest.xml

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

Ensuite compiler l'application avec Android Studio (CTRL+F9).

Il faut maintenant lancer ROS sur la machine principale.

:!: Ne pas oublier de modifier les variables ROS_MASTER_URI et ROS_IP avec l'adresse IP de votre machine sur le réseau. ROS_MASTER_URI doit être identique à celle que vous avez modifier dans le code précédemment.

:!: La machine principale et l'appareil Android doivent être sur le même réseau. L'application https://play.google.com/store/apps/details?id=ua.com.streamsoft.pingtools&hl=fr permet de tester la connectivité réseau sur Android.

Dans 3 terminaux différents, lancer :

 roscore 

Connecter (USB) votre appareil et lancer l'application depuis Android Studio (SHIFT+F10).

 rostopic pub /chatter std_msgs/String 'Hello!' -r 1 
 rostopic echo /a_chatter 

Si tout fonctionne, la sortie console retourne

data: hello world from android ndk 1
data: hello world from android ndk 2
data: hello world from android ndk 3

Il est possible de surveiller le déroulement de l'application Android sur l'appareil avec Android Monitor sur Android Studio.

Tutoriel: ROS avec une Android Activity

Avant toute chose, il faut s'assurer que la lib ROS/Android est correctement mise en place dans le pprojet. Se réféerer au tuto précédent pour les détails. Exemple de fichier NDK build Android.mk :

LOCAL_PATH := $(call my-dir)
NDK_MODULES_PATH:= $(call my-dir)/../../../../../..

include $(CLEAR_VARS)

LOCAL_MODULE    := ros_main

LOCAL_C_INCLUDES := $(LOCAL_PATH)/src/ros/jniCalls
LOCAL_C_INCLUDES += $(LOCAL_PATH)/src/ros/nativeCode

FILE_LIST := $(wildcard $(LOCAL_PATH)/src/ros/jniCalls/*.cpp)
FILE_LIST += $(wildcard $(LOCAL_PATH)/src/ros/nativeCode/*.cpp)
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)

LOCAL_LDLIBS := -landroid -llog
LOCAL_STATIC_LIBRARIES := roscpp_android_ndk

include $(BUILD_SHARED_LIBRARY)

#import ros ndk with custom directory location
$(call import-add-path, $(NDK_MODULES_PATH) )
$(call import-module,roscpp_android_ndk)

Afin de ne pas bloquer l'execution de l'UI Android il est important de lancer les nodes ROS sur des threads différents. Un exemple de class pour réponder à cette contrainte :

public class ROSThread implements Runnable {
    private Thread m_thread;

    public ROSThread() {
        this.m_thread = new Thread(this);
    }

    public void rosrun(){
        m_thread.start();
    }

    @Override
    public void run() {
        startROSNode();
    }

    //load C/C++ shared library
    static
    {
        System.loadLibrary("ros_main");
    }
    private native void startROSNode();
}

L'implémentation de private native void startROSNode(); est une fonction C++ JNI qui lance le noeud ROS. Exemple :

JNIEXPORT void JNICALL Java_com_laas_simpleAR_ROSThread_startROSNode(JNIEnv* env, jobject obj)
{
    android_main();
    return;
}

On retrouve dans android_main() un noeud ROS habituel :

void android_main() {

    ros::init(...);
    ros::NodeHandle n;
    ros::WallRate loop_rate(100);
    while(ros::ok()){
        ros::spinOnce();
        loop_rate.sleep();
    }
}

Ne pas oublier d'activer l'accès réseu pour le dispositif android. Dans AndroidManifest.xml

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

Liens intéressants

ROS Android et snapdragon (used in Lumus DK50)

Performance

GPGPU OpenCL on Adreno GPU (used in Lumus DK50): https://developer.qualcomm.com/software/adreno-gpu-sdk/tools

Computer vision library

Programmation sur les lunettes Lumus

Attention à la version NDK utilisé. Version NDK 10e à utiliser tant que native_app_glue est utilisé.

ros_android.txt · Dernière modification: 2017/09/04 14:11 par tristan