ROS交流群
ROS Group 产品服务
Product Service 开源代码库
Github 官网
Official website 技术交流
Technological exchanges 激光雷达
LIDAR ROS教程
ROS Tourials 深度学习
Deep Learning 机器视觉
Computer Vision
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里面使用了。
-
博主,你好,我已经按照教程完成了ros android ndk 的安装和配置工作,现在向Android端移植自己的ros c++代码时遇到疑问,关于jni调用是否能给个例子呢?谢谢
-
@gongyue666 可以参照这个教程。
简单说就是利用java的工具生成c++的头文件,然后把自己的方法添加到对应的实现里面。
这是我自己移植程序的 jni wrapper -
非常感谢,我马上试一下~
-
博主,在编译工作空间是报错,ndk下找不到 armeabi-v7a
-
@gongyue666 是不是环境变量没有设置好。比如NDK_ROOT路径不对。 可以发一下完整的错误。
-
请问博主可以出一个rosjava-android的教程吗?
-
@gongyue666 可以参考这里
-
@weijiz 这个教程我跟着做了,不过好像是用java重新写ros的节点,现在想直接用c++的移植过去,然后在jni中添加自建消息的时候总是失败.