zoukankan      html  css  js  c++  java
  • docker搭建ros-indigo-arm交叉编译环境

    ROS运行环境:ARM ubuntu14.04 + ROS indigo
    在arm环境下编译ros应用程序,速度极慢,无法忍受,尝试在x86机器上搭建docker+ros交叉编译环境。

    交叉编译环境的搭建主要参考:

    http://answers.ros.org/question/191070/compile-roscore-for-arm-board/

    1 ARM ubuntu环境上安装arm-indigo版本,后面需要将这个arm版本copy到交叉编译环境上
    2 x86环境上安装docker
    3 下载docker-ros镜像, 加载启动docker-ros镜像
    4 安装 sudo apt-get install g++-arm-linux-gnueabihf
    5 将docker环境中中x86版本的indigo替换成arm版本的indigo,
    替换之前需要备份x86版本indigo的lib,因为这些库文件在运行ros时是需要的。
    将x86版本indigo的lib保存到localpath目录下,设置export LD_LIBRARY_PATH=localpath,
    实现运行ros命令时使用x86的lib库。
    6 将arm环境下的库文件/头文件 copy到docker环境中,目录可以自己设定比如:/$ENV{HOME}/cross-compiling/ubuntu-rootfs
    7 配置rostoolchain.cmake文件

    #File rostoolchain.cmake
    
    set(CMAKE_SYSTEM_NAME Linux)
    set(CMAKE_C_COMPILER /usr/bin/arm-linux-gnueabihf-gcc)
    set(CMAKE_CXX_COMPILER /usr/bin/arm-linux-gnueabihf-g++)
    set(CMAKE_FIND_ROOT_PATH /opt/ros/indigo $ENV{HOME}/cross-compiling/ubuntu-rootfs)
    
    set(CMAKE_LIBRARY_PATH $ENV{HOME}/cross-compiling/ubuntu-rootfs/usr/lib/arm-linux-gnueabihf $ENV{HOME}/cross-compiling/ubuntu-rootfs/usr/lib $ENV{HOME}/cross-compiling/ubuntu-rootfs/lib $ENV{HOME}/cross-compiling/ubuntu-rootfs/usr/local/lib)
    
    set(CMAKE_INCLUDE_PATH $ENV{HOME}/cross-compiling/ubuntu-rootfs/usr/include $ENV{HOME}/cross-compiling/ubuntu-rootfs/usr/local/include)
    set(LD_LIBRARY_PATH $ENV{HOME}/cross-compiling/ubuntu-rootfs/usr/lib/arm-linux-gnueabihf $ENV{HOME}/cross-compiling/ubuntu-rootfs/usr/lib $ENV{HOME}/cross-compiling/ubuntu-rootfs/lib $ENV{HOME}/cross-compiling/ubuntu-rootfs/usr/local/lib)
    
    set(PYTHON_EXECUTABLE /usr/bin/python)
    set(PCL_ROOT $ENV{HOME}/cross-compiling/ubuntu-rootfs/usr)
    
    set(CMAKE_CROSSCOMPILING true)
    message("${CMAKE_CROSSCOMPILING}")
    
    # Have to set this one to BOTH, to allow CMake to find rospack
    
    
    set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
    set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
    set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
    set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
    View Code

    8 修改/opt/ros/indigo/share/catkin/cmake/tools/rt.cmake

    该文件的第34行

    if(NOT (APPLE OR WIN32 OR MINGW OR ANDROID))修改为if(NOT (APPLE OR WIN32 OR MINGW OR ANDROID OR UNIX))

    9 个人理解cmake交叉编译过程就是修改cmake搜索链接库文件位置的过程,正常编译会搜索x86库文件做在位置,
    交叉编译需要将搜索位置切换到目标架构需要的库文件存放位置,比如/$ENV{HOME}/cross-compiling/ubuntu-rootfs
    实现方法:
    修改catkin_INCLUDE_DIRS catkin_LIBRARY_DIRS,将这两个变量中指向x86系统的位置,修改为指向交叉编译依赖文件存放位置
    /opt/ros/indigo/share/catkin/cmake/catkinConfig.cmake
    这个文件末增加如下处理:

    list(APPEND catkin_INCLUDE_DIRS ${CMAKE_INCLUDE_PATH})
    list(APPEND catkin_LIBRARY_DIRS ${CMAKE_LIBRARY_PATH})
    
    set(catkin_LIBRARIES_tmp ${catkin_LIBRARIES})
    set(catkin_LIBRARIES "")
    foreach(catkinlib ${catkin_LIBRARIES_tmp})
        string(LENGTH ${catkinlib} lengths)    
        if (${lengths} GREATER 12)
            string(SUBSTRING ${catkinlib} "/" 12 result)
            string(COMPARE EQUAL ${result} "/usr/lib/lib" compareResult)
            if (${compareResult})
                string(REPLACE "/usr/lib/lib" "$ENV{HOME}/cross-compiling/ubuntu-rootfs/usr/lib/lib" result_tem ${catkinlib})
                list(APPEND catkin_LIBRARIES ${result_tem})
            else()
                list(APPEND catkin_LIBRARIES ${catkinlib})
            endif()
        else()
            list(APPEND catkin_LIBRARIES ${catkinlib})
        endif()
    endforeach()
    View Code

    10 编译命令

    catkin_make -DCMAKE_TOOLCHAIN_FILE=/$filepath/rostoolchain.cmake

  • 相关阅读:
    微信读书分享组队群
    骚操作!利用百度首页换肤的图片上传 API 做图床
    application/json和application/x-www-form-urlencoded使用选择
    通过类名或者jar名查询所在jar包
    sql中with as测试实例
    BeanUtils.copyProperties的简单示例
    jquery.validate.js的简单示例
    springboot restful接口服务异常处理
    怎样判断某个窗口是否打开
    怎样理解window.name
  • 原文地址:https://www.cnblogs.com/objectDetect/p/5223029.html
Copyright © 2011-2022 走看看