导航

    蓝鲸ROS机器人论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 热门
    ROS交流群
    ROS Group
    产品服务
    Product Service
    开源代码库
    Github
    官网
    Official website
    技术交流
    Technological exchanges
    激光雷达
    LIDAR
    ROS教程
    ROS Tourials
    深度学习
    Deep Learning
    机器视觉
    Computer Vision

    如何移植ROS程序到Android

    技术交流
    2
    9
    5277
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • weijiz
      weijiz 最后由 编辑

      在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里面使用了。

      1 条回复 最后回复 回复 引用 0
      • gongyue666
        gongyue666 最后由 编辑

        博主,你好,我已经按照教程完成了ros android ndk 的安装和配置工作,现在向Android端移植自己的ros c++代码时遇到疑问,关于jni调用是否能给个例子呢?谢谢

        weijiz 1 条回复 最后回复 回复 引用 0
        • weijiz
          weijiz @gongyue666 最后由 编辑

          @gongyue666 可以参照这个教程。
          简单说就是利用java的工具生成c++的头文件,然后把自己的方法添加到对应的实现里面。
          这是我自己移植程序的 jni wrapper

          1 条回复 最后回复 回复 引用 0
          • gongyue666
            gongyue666 最后由 编辑

            非常感谢,我马上试一下~

            1 条回复 最后回复 回复 引用 0
            • gongyue666
              gongyue666 最后由 编辑

              博主,在编译工作空间是报错,ndk下找不到 armeabi-v7a

              weijiz 1 条回复 最后回复 回复 引用 0
              • weijiz
                weijiz @gongyue666 最后由 编辑

                @gongyue666 是不是环境变量没有设置好。比如NDK_ROOT路径不对。 可以发一下完整的错误。

                1 条回复 最后回复 回复 引用 0
                • gongyue666
                  gongyue666 最后由 编辑

                  请问博主可以出一个rosjava-android的教程吗?

                  weijiz 1 条回复 最后回复 回复 引用 0
                  • weijiz
                    weijiz @gongyue666 最后由 编辑

                    @gongyue666 可以参考这里

                    gongyue666 1 条回复 最后回复 回复 引用 0
                    • gongyue666
                      gongyue666 @weijiz 最后由 编辑

                      @weijiz 这个教程我跟着做了,不过好像是用java重新写ros的节点,现在想直接用c++的移植过去,然后在jni中添加自建消息的时候总是失败.

                      1 条回复 最后回复 回复 引用 0
                      • 1 / 1
                      • First post
                        Last post
                      Copyright © 2015-2023 BlueWhale community