docker搭建ros-indigo-arm交叉编译环境

本文详细介绍在ARM环境下编译ROS应用程序的极慢问题,并提供了一种解决方案:通过在x86机器上搭建Docker+ROS交叉编译环境来加速编译过程。文章包括了从ARMubuntu环境安装、Docker配置到rostoolchain.cmake文件调整的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《转》

https://www.cnblogs.com/objectDetect/p/5223029.html

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)

复制代码

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()

复制代码

10 编译命令

catkin_make -DCMAKE_TOOLCHAIN_FILE=/$filepath/rostoolchain.cmake

终于搞定了,分享我遇到的主要两个问题(其它还有就是我本地连接问题临了)
1.set(CMAKE_FIND_ROOT_PATH “/opt/ros/indigo /opt/ros_arm/rootfs”)==我多用了引号,正确应该为
set(CMAKE_FIND_ROOT_PATH /opt/ros/indigo /opt/ros_arm/rootfs)
2.
/opt/ros/indigo/share/catkin/cmake/catkinConfig.cmake
替换路径的脚本,由于我的路径时/usr/lib 需要对应修改(注意里面对应的字符串长度是8了,我没注意到,跌坑里了)
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 7)
string(SUBSTRING ${catkinlib} "/" 8 result)

string(COMPARE EQUAL ${result} "/usr/lib" compareResult)
if (${compareResult})
string(REPLACE "/usr/lib" "/opt/ros_arm/rootfs/usr/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()

<think>好的,我现在需要帮助用户在基于ARM架构的Docker容器中安装PCL-ROS,但遇到了失败的问题。首先,我需要理解用户的环境和需求。用户提到他们使用的是ARM架构的Docker环境,可能是在x86机器上通过Docker进行交叉编译,或者在ARM机器上直接运行Docker。根据引用[4],如果Docker镜像是基于arm64的,比如FROM arm64v8/ubuntu,那么可能不需要交叉编译,但安装过程中可能遇到依赖问题。 用户的问题集中在安装PCL-ROS失败,需要处理依赖项和兼容性。首先,PCL(Point Cloud Library)本身依赖很多第三方库,安装时可能会遇到缺少依赖或版本冲突的问题。引用[3]提到安装libpcl-dev可以通过apt-get,但这是在Ubuntu系统下的方法,但如果在Docker环境中,特别是ARM架构,可能需要特定的仓库或源。 接下来,ROS中的PCL-ROS包可能对PCL的版本有特定要求,需要确保两者兼容。用户可能使用的ROS版本是Indigo,但需要确认。根据引用[1]和[2],用户之前在ARM Ubuntu14.04 + ROS Indigo环境下编译ROS应用速度慢,转而使用Docker交叉编译环境。现在的问题是在这个Docker环境中安装PCL-ROS失败。 可能的解决步骤包括: 1. 确保Docker镜像的基础是正确的ARM架构,比如使用arm64v8/ubuntu或其他官方ARM镜像。 2. 配置正确的软件源,确保ARM架构的软件包可用。可能需要检查/etc/apt/sources.list中的仓库是否支持ARM。 3. 安装PCL的依赖库,可能需要手动安装某些在ARM上不可用的包,或者从源码编译。 4. 处理ROS的依赖,特别是PCL-ROS包可能需要特定版本的PCL,需要检查版本兼容性。 5. 使用rosdep安装依赖,但可能需要手动修复某些无法自动安装的包。 6. 如果标准仓库中的PCL版本不兼容,考虑从源码编译PCL和PCL-ROS,调整编译选项以适应ARM架构。 此外,用户可能在安装过程中遇到编译错误,比如缺少头文件、链接错误或架构不匹配。需要查看具体的错误信息,例如是否提示某些库未找到,或者编译选项不正确。例如,在ARM架构下,某些优化指令可能需要调整,或者依赖库需要重新编译为ARM版本。 另外,Docker构建时的缓存问题也可能导致依赖安装不完整,可能需要清除缓存或分阶段构建。使用多阶段构建或者合理利用Docker层缓存可以提升效率,但需要确保每一步的依赖正确安装。 最后,可能需要参考社区或ROS官方文档中关于在ARM架构下安装PCL-ROS的指南,或者寻找其他开发者在类似环境中的经验分享,比如调整CMakeLists.txt中的链接库路径,或者使用特定的编译标志。</think>### 分步解决方案 #### 1. 确认基础镜像架构 在Dockerfile中使用正确的ARM架构基础镜像。例如: ```dockerfile FROM arm64v8/ubuntu:20.04 # 根据ROS版本选择对应Ubuntu版本 ``` 验证镜像架构: ```bash docker run --rm your-image uname -m # 应输出aarch64 ``` #### 2. 配置ARM架构软件源 在Ubuntu系统中,确保`/etc/apt/sources.list`包含ARM架构的仓库: ```dockerfile RUN sed -i 's/ports.ubuntu.com/mirrors.ustc.edu.cn\/ubuntu-ports/' /etc/apt/sources.list # 使用国内镜像加速 ``` #### 3. 安装PCL依赖项 分阶段安装依赖库以避免缓存问题: ```dockerfile RUN apt-get update && apt-get install -y \ libpcl-dev \ ros-noetic-pcl-ros # 替换为对应ROS版本 ``` 若遇到依赖缺失,手动添加: ```bash RUN apt-get install -y libboost-system-dev libvtk7-dev libflann-dev ``` #### 4. 源码编译PCL(备用方案) 当APT源中的版本不兼容时,从源码编译: ```dockerfile RUN git clone https://github.com/PointCloudLibrary/pcl.git && \ cd pcl && mkdir build && cd build && \ cmake -DCMAKE_BUILD_TYPE=Release .. && \ make -j$(nproc) && make install ``` #### 5. 处理ROS依赖 在ROS工作空间中配置: ```bash RUN source /opt/ros/noetic/setup.bash && \ mkdir -p catkin_ws/src && cd catkin_ws && \ catkin_make -DPCL_DIR=/usr/local/share/pcl-1.12 # 指向自定义PCL路径 ``` #### 6.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值