ROS交流群
ROS Group
产品服务
Product Service
开源代码库
Github
官网
Official website
技术交流
Technological exchanges
激光雷达
LIDAR
ROS教程
ROS Tourials
深度学习
Deep Learning
机器视觉
Computer Vision

如何移植ROS程序到Android



  • 在Android上运行ROS程序一般使用rosjava-android。但是也可以直接利用NDK编译成so文件移植到Android上。当然移植过程也并不简单。 下面是一个简单的例子。

    安装cmake(>3.14)

    新版本的cmake增加了对Android cross compile的支持,所以我们要安装新版本的cmake。

    wget -q https://github.com/Kitware/CMake/releases/download/v3.14.0-rc4/cmake-3.14.0-rc4.tar.gz
    tar -xzf cmake-3.14.0-rc4.tar.gz
    cd cmake-3.14.0-rc4/
    env CC=$(which clang) CXX=$(which clang++) ./bootstrap --prefix=/usr --parallel=4
    make
    sudo make install
    cd ..
    

    安装clang

    新版本的NDK默认使用clang进行编译。所以我们需要安装clang。clang的安装方式可以参照这里

    安装NDK

    wget -q https://dl.google.com/android/repository/android-ndk-r18b-linux-x86_64.zip
    unzip -qq android-ndk-r18b-linux-x86_64.zip
    export NDK_ROOT=$(pwd)/android-ndk-r18b
    

    设置cmake toolchain

    git clone https://github.com/BluewhaleRobot/rostoolchain
    export TOOLCHAIN_ROOT=$(pwd)/rostoolchain
    

    安装Boost-android

    git clone https://github.com/moritz-wundke/Boost-for-Android
    mkdir boost_libs
    cd Boost-for-Android
    ./build-android.sh --boost=1.68.0 --prefix=$(pwd)/../boost_libs $NDK_ROOT
    cd ..
    #set up boost
    export INSTALL_PREFIX=/opt/ros/arm
    sudo mkdir -p $INSTALL_PREFIX/include
    sudo mkdir -p $INSTALL_PREFIX/lib
    sudo cp -rf boost_libs/armeabi-v7a/include/boost-1_68/boost $INSTALL_PREFIX/include/
    sudo cp boost_libs/armeabi-v7a/lib/*.a $INSTALL_PREFIX/lib/
    

    设置ROS workspace

    mkdir -p arm/src
    cd arm/src
    git clone https://github.com/ros/catkin --depth=1
    git clone https://github.com/ros/common_msgs --depth=1
    git clone https://github.com/ros/gencpp --depth=1
    git clone https://github.com/jsk-ros-pkg/geneus --depth=1
    git clone https://github.com/ros/genlisp --depth=1
    git clone https://github.com/ros/genmsg --depth=1
    git clone https://github.com/RethinkRobotics-opensource/gennodejs --depth=1
    git clone https://github.com/ros/genpy --depth=1
    git clone https://github.com/ros/message_generation --depth=1
    git clone https://github.com/ros/message_runtime --depth=1
    git clone https://github.com/BluewhaleRobot/ros_comm --depth=1
    git clone https://github.com/ros/ros_comm_msgs --depth=1
    git clone https://github.com/BluewhaleRobot/rosconsole --depth=1
    git clone https://github.com/BluewhaleRobot/roscpp_core --depth=1
    git clone https://github.com/ros/std_msgs --depth=1
    

    编译工作空间

    cd ..
    ./src/catkin/bin/catkin_make -DCMAKE_TOOLCHAIN_FILE=$TOOLCHAIN_ROOT/toolchain-arm.cmake -DCATKIN_WHITELIST_PACKAGES="" -DBUILD_SHARED_LIBS=OFF
    sudo cp -rf devel/lib/*.a $INSTALL_PREFIX/lib/
    sudo cp -rf devel/lib/pkgconfig $INSTALL_PREFIX/lib/
    export PKG_CONFIG_PATH=$INSTALL_PREFIX/lib/pkgconfig
    

    编译你自己的代码

    现在把你的代码放置到此工作空间内,然后像之前编译工作空间一样。

    ./src/catkin/bin/catkin_make -DCMAKE_TOOLCHAIN_FILE=$TOOLCHAIN_ROOT/toolchain-arm.cmake -DCATKIN_WHITELIST_PACKAGES="" -DBUILD_SHARED_LIBS=OFF
    

    编译出so文件或.a文件之后,利用JNI写一个包装程序,然后通过java调用。这样就可以在Android app里面使用了。