ROS2 交叉编译
发布时间:2025-08-28 14:23:24.455 文章来源:AiSoftCloud 浏览次数:151 下载次数:1 

构建Ubuntu24.04 x86_64 docker镜像

Dockerfile_x86_ubuntu24

  1. FROM ubuntu:24.04
  2. ENV TZ=Asia/Shanghai
  3. RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
  4. RUN sed -i -e 's/^APT/# APT/' -e 's/^DPkg/# DPkg/' /etc/apt/apt.conf.d/docker-clean
  5. RUN apt-get update
  6. RUN apt-get install -y sudo vim wget build-essential cmake gcc g++ libnlopt-dev libnlopt-cxx-dev python3 python3-pip desktop-file-utils
  7. RUN echo 'root:123' | chpasswd
  8. #RUN useradd -ms /bin/bash ubuntu
  9. RUN echo 'ubuntu:123' | chpasswd
  10. RUN usermod -aG sudo ubuntu
  11. RUN apt update
  12. RUN apt install locales
  13. RUN locale-gen en_US en_US.UTF-8
  14. RUN update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
  15. ENV LANG=en_US.UTF-8
  16. RUN locale
  17. RUN apt install software-properties-common -y
  18. RUN add-apt-repository universe
  19. RUN apt update
  20. RUN apt install curl -y
  21. #ENV ROS_APT_SOURCE_VERSION=`curl -s https://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest | grep -F "tag_name" | awk -F\" '{print $4}'`
  22. #ENV ROS_APT_SOURCE_VERSION=1.1.0
  23. #RUN echo "ROS_APT_SOURCE_VERSION: ${ROS_APT_SOURCE_VERSION}"
  24. #RUN curl -L -o /home/ubuntu/ros2-apt-source.deb "https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(. /etc/os-release && echo ${UBUNTU_CODENAME:-${VERSION_CODENAME}})_all.deb"
  25. #RUN ls -rlt /home/ubuntu/ros2-apt-source.deb
  26. #RUN dpkg -i /home/ubuntu/ros2-apt-source.deb
  27. RUN curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
  28. RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu noble main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
  29. USER ubuntu
  30. RUN cat /etc/apt/sources.list.d/ros2.list
  31. RUN echo '123' | sudo -S apt update
  32. RUN echo '123' | sudo -S apt install ros-jazzy-desktop-full -y
  33. RUN echo '123' | sudo -S apt install ros-jazzy-ros-base -y
  34. RUN echo '123' | sudo -S apt install ros-dev-tools -y
  35. USER root
  36. RUN apt-get install -y cmake git wget python3-pip qemu-user-static g++-aarch64-linux-gnu g++-arm-linux-gnueabihf
  37. RUN apt-get install -y nlohmann-json3-dev libdw-dev
  38. RUN apt install -y libopenblas-dev liblapack-dev
  39. RUN apt install -y libgoogle-glog-dev libgflags-dev
  40. USER ubuntu
  41. WORKDIR /home/ubuntu

构建镜像(x86_ubuntu24_ros2_jazzy:v0.1)

  1. #!/bin/bash
  2. docker build -t x86_ubuntu24_ros2_jazzy:v0.1 -f Dockerfile_x86_ubuntu24 .

构建Ubuntu24.04 Arm64 docker镜像

Dockerfile_arm64_ubuntu24

  1. ARG ARM_ARCH=arm64v8
  2. FROM ${ARM_ARCH}/ubuntu:noble
  3. ENV TZ=Asia/Shanghai
  4. RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
  5. RUN sed -i -e 's/^APT/# APT/' -e 's/^DPkg/# DPkg/' /etc/apt/apt.conf.d/docker-clean
  6. RUN apt-get update
  7. RUN apt-get install -y sudo vim wget build-essential cmake gcc g++ libnlopt-dev libnlopt-cxx-dev python3 python3-pip desktop-file-utils
  8. RUN echo 'root:123' | chpasswd
  9. #RUN useradd -ms /bin/bash ubuntu
  10. RUN echo 'ubuntu:123' | chpasswd
  11. RUN usermod -aG sudo ubuntu
  12. RUN apt update
  13. RUN apt install locales
  14. RUN locale-gen en_US en_US.UTF-8
  15. RUN update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
  16. ENV LANG=en_US.UTF-8
  17. RUN locale
  18. RUN apt install software-properties-common -y
  19. RUN add-apt-repository universe
  20. RUN apt update
  21. RUN apt install curl -y
  22. #ENV ROS_APT_SOURCE_VERSION=`curl -s https://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest | grep -F "tag_name" | awk -F\" '{print $4}'`
  23. #ENV ROS_APT_SOURCE_VERSION=1.1.0
  24. #RUN echo "ROS_APT_SOURCE_VERSION: ${ROS_APT_SOURCE_VERSION}"
  25. #RUN curl -L -o /home/ubuntu/ros2-apt-source.deb "https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(. /etc/os-release && echo ${UBUNTU_CODENAME:-${VERSION_CODENAME}})_all.deb"
  26. #RUN ls -rlt /home/ubuntu/ros2-apt-source.deb
  27. #RUN dpkg -i /home/ubuntu/ros2-apt-source.deb
  28. RUN curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
  29. RUN echo "deb [arch=arm64 signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu noble main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
  30. USER ubuntu
  31. RUN cat /etc/apt/sources.list.d/ros2.list
  32. RUN echo '123' | sudo -S apt update
  33. RUN echo '123' | sudo -S apt install ros-jazzy-desktop-full -y
  34. RUN echo '123' | sudo -S apt install ros-jazzy-ros-base -y
  35. RUN echo '123' | sudo -S apt install ros-dev-tools -y
  36. USER root
  37. RUN apt install nlohmann-json3-dev libdw-dev
  38. RUN apt install -y libopenblas-dev liblapack-dev
  39. RUN apt install -y libgoogle-glog-dev libgflags-dev
  40. USER ubuntu
  41. WORKDIR /home/ubuntu

构建镜像(aarch64_ubuntu24_ros2_jazzy:v0.1)

  1. #!/bin/bash
  2. docker build --platform linux/arm64 -t aarch64_ubuntu24_ros2_jazzy:v0.1 -f Dockerfile_arm64_ubuntu24 .

准备Arm交叉编译sysroot

首先运行上述构建出的镜像(aarch64_ubuntu24_ros2_jazzy:v0.1)

  1. #!/bin/bash
  2. docker run -it \
  3. --name arm_sysroot_ubuntu24 \
  4. aarch64_ubuntu24_ros2_jazzy:v0.1 \
  5. /bin/bash

然后导出sysroot:

  1. docker container export -o sysroot_docker.tar arm_sysroot_ubuntu24
  2. mkdir sysroot_docker
  3. tar -C sysroot_docker -xf sysroot_docker.tar lib usr opt etc

导出后可以看到sysroot_docker目录下有lib、usr、opt、etc几个目录,这几个就是交叉编译环境。

构建交叉编译镜像

准备交叉编译环境文件

data/toolchain_aarch64.cmake:

  1. set(CMAKE_SYSTEM_NAME Linux)
  2. set(CMAKE_SYSTEM_VERSION 1)
  3. set(CMAKE_SYSTEM_PROCESSOR aarch64)
  4. # Specify the cross compiler
  5. set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc)
  6. set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++)
  7. set(CMAKE_SYSROOT /opt/sysroot)
  8. set(CMAKE_FIND_ROOT_PATH /opt/sysroot/opt/ros/jazzy $ENV{ROS2_WORKSPACE_PATH}/install)
  9. set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
  10. set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
  11. set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
  12. set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
  13. # Specify the python SOABI
  14. set(PYTHON_SOABI cpython-36m-aarch64-linux-gnu)
  15. set(spdlog_DIR ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/cmake/spdlog CACHE PATH "" FORCE)
  16. set(fmt_DIR ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/cmake/fmt CACHE PATH "" FORCE)
  17. set(yaml-cpp_DIR ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/cmake/yaml-cpp CACHE PATH "" FORCE)
  18. set(console_bridge_DIR ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/console_bridge/cmake CACHE PATH "" FORCE)
  19. #set(dl_LIBRARY "${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/libdl.so.2" CACHE FILEPATH "Path to libdl")
  20. if(NOT TARGET Qt5::moc)
  21. set(QT_MOC_EXECUTABLE /usr/bin/moc)
  22. add_executable(Qt5::moc IMPORTED)
  23. set_property(TARGET Qt5::moc PROPERTY IMPORTED_LOCATION ${QT_MOC_EXECUTABLE})
  24. endif()
  25. # This assumes that pthread will be available on the target system
  26. # (this emulates that the return of the TRY_RUN is a return code "0")
  27. set(THREADS_PTHREAD_ARG "0"
  28. CACHE STRING "Result from TRY_RUN" FORCE)

Dockerfile_ubuntu24_x86_cross_arm64

  1. FROM x86_ubuntu24_ros2_jazzy:v0.1
  2. USER root
  3. RUN rm -rf /opt/sysroot
  4. COPY sysroot_docker/ /opt/sysroot
  5. COPY data/toolchain_aarch64.cmake /opt/sysroot/toolchain_aarch64.cmake
  6. RUN ls /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/pkgconfig/lapack-openblas.pc
  7. RUN ls /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/libblas.a
  8. RUN ls /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/libblas.so.3
  9. RUN ls /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/liblapack.so.3
  10. RUN ls /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/libopenblas.so.0
  11. RUN ls /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/libblas.so
  12. RUN ls /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/libblas.a
  13. RUN ls /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/liblapack.so
  14. RUN ls /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/liblapack.a
  15. RUN ls /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/libopenblas.so
  16. RUN ls /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/libopenblas.a
  17. RUN rm -rf /etc/alternatives/lapack.pc-aarch64-linux-gnu && ln -s /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/pkgconfig/lapack-openblas.pc /etc/alternatives/lapack.pc-aarch64-linux-gnu
  18. RUN rm -rf /etc/alternatives/libblas.a-aarch64-linux-gnu && ln -s /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/libblas.a /etc/alternatives/libblas.a-aarch64-linux-gnu
  19. RUN rm -rf /etc/alternatives/libblas.so.3-aarch64-linux-gnu && ln -s /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/libblas.so.3 /etc/alternatives/libblas.so.3-aarch64-linux-gnu
  20. RUN rm -rf /etc/alternatives/liblapack.so.3-aarch64-linux-gnu && ln -s /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/liblapack.so.3 /etc/alternatives/liblapack.so.3-aarch64-linux-gnu
  21. RUN rm -rf /etc/alternatives/libopenblas.so.0-aarch64-linux-gnu && ln -s /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/libopenblas.so.0 /etc/alternatives/libopenblas.so.0-aarch64-linux-gnu
  22. RUN rm -rf /etc/alternatives/libblas.so-aarch64-linux-gnu && ln -s /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/libblas.so /etc/alternatives/libblas.so-aarch64-linux-gnu
  23. RUN rm -rf /etc/alternatives/liblapack.so-aarch64-linux-gnu && ln -s /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/liblapack.so /etc/alternatives/liblapack.so-aarch64-linux-gnu
  24. RUN rm -rf /etc/alternatives/liblapack.a-aarch64-linux-gnu && ln -s /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/liblapack.a /etc/alternatives/liblapack.a-aarch64-linux-gnu
  25. RUN rm -rf /etc/alternatives/libopenblas.so-aarch64-linux-gnu && ln -s /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/libopenblas.so /etc/alternatives/libopenblas.so-aarch64-linux-gnu
  26. RUN rm -rf /etc/alternatives/libopenblas.a-aarch64-linux-gnu && ln -s /opt/sysroot/usr/lib/aarch64-linux-gnu/openblas-pthread/libopenblas.a /etc/alternatives/libopenblas.a-aarch64-linux-gnu
  27. USER ubuntu
  28. WORKDIR /home/ubuntu

构建镜像

  1. #!/bin/bash
  2. docker build -t x86_ubuntu24_cross:v0.1 -f Dockerfile_ubuntu24_x86_cross_arm64 .

测试

  1. #!/bin/bash
  2. docker run -it x86_ubuntu24_cross:v0.1 /bin/bash
  3. source /opt/sysroot/opt/ros/jazzy/setup.bash
  4. # 使用如下命令编译
  5. # colcon build

参考文章

ROS2 Humble交叉编译
Cross-compilation

更多文章可关注公众号
aisoftcloud