ros2交叉编译 x86到arm

本文详细描述了如何在x86_ubuntu系统上进行ROS2到arm_ubuntu的交叉编译过程,包括安装工具、克隆仓库、创建Docker镜像、交叉编译设置及问题解决策略。作者强调了使用预编译ROS镜像的方法,以避免网络访问问题。
摘要由CSDN通过智能技术生成


前言

内容概括:

本篇文章记录了ros2 交叉编译(从x86_ubuntu到arm_ubuntu)过程,以及问题解决。
ros2官方文档 中给出了 三种交叉编译 编译的实现方法: ①提前在本地下载ros2源码然后创建docker ②直接自动下载ros2源码然后创建docker③不用ros2源码,在docker中安装预编译ros
因为交叉编译ros2是要先创建带有ros2的arm架构的ubuntu镜像,然后将系统文件从docker镜像拉取到本机完成编译,①②两种方法在用dockerfile创建docker镜像时要访问外国地址会报错且问题不好解决,所以建议使用方法③。


以下是是使用方法③实现ros2交叉编译的过程

一、安装开发所需工具库

sudo apt update && sudo apt install -y \
    cmake \
    git \
    wget \
    python3-pip \
    qemu-user-static \
    g++-aarch64-linux-gnu \
    g++-arm-linux-gnueabihf \
    pkg-config-aarch64-linux-gnu

python3 -m pip install -U \
    vcstool \
    colcon-common-extensions

二、将ros2 示例功能包和交叉编译工具克隆到本地

mkdir -p ~/cc_ws/ros2_ws/src
cd ~/cc_ws/ros2_ws/src
git clone https://github.com/ros2/examples.git
git clone https://github.com/ros-tooling/cross_compile.git -b 0.0.1
cd ..

三、创建docker镜像、准备系统路径

1、qeum

使用Docker和qemu构建一个带有所有ROS 2依赖的arm Ubuntu镜像:将qemu-static二进制文件复制到工作空间。它将用于使用docker在目标文件系统上安装ROS 2依赖项。

mkdir qemu-user-static
cp /usr/bin/qemu-*-static qemu-user-static
2、使用dockerfile创建docker镜像

官方提供的Dockerfile_ubuntu_arm64_prebuilt中系统是arm_ubuntu18.04 ros2版本是crystal,但是尝试过后发现缺少一些文件无法编译,所以需要修改为arm_ubuntu20.04 ros2 foxy版本(其他ros2 版本也可以:Iron Humble Galactic Foxy Eloquent Dashing Crystal )

FROM arm64v8/ubuntu:bionic
修改为
FROM arm64v8/ubuntu:focal

ENV ROS_DISTRO crystal
修改为
ENV ROS_DISTRO foxy

创建docker镜像指令:

docker build -t arm_ros2:latest -f /src/ros2/cross_compile/sysroot/Dockerfile_ubuntu_arm64_prebuilt .

创建docker镜像时如果遇到以下报错则需要更换系统源或者使用科学上网工具:
在这里插入图片描述
在这里插入图片描述
创建 ros2 foxy的镜像时可能会卡在设置键盘布局,终端会没有反应,可以在dockerfile中添加终端无交互:

FROM arm64v8/ubuntu:focal

COPY ./qemu-user-static/* /usr/bin/

# Set timezone
RUN echo 'Etc/UTC' > /etc/timezone && \
    ln -s /usr/share/zoneinfo/Etc/UTC /etc/localtime && \
    apt-get update && apt-get install -q -y tzdata && \
    rm -rf /var/lib/apt/lists/*

RUN apt update && apt install -y \
    pkg-config \
    lsb-release \
    curl \
    bash-completion \
    gnupg2

ENV LANG en_US.UTF-8
ENV LC_ALL C.UTF-8

# 终端无交互指令
RUN echo "setxkbmap us" > /etc/profile.d/keyboard_layout.sh
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get install -y keyboard-configuration
RUN dpkg-reconfigure --frontend=noninteractive keyboard-configuration

RUN curl http://repo.ros2.org/repos.key | apt-key add -
RUN sh -c 'echo "deb [arch=amd64,arm64] http://repo.ros2.org/ubuntu/main \
    `lsb_release -cs` main" > /etc/apt/sources.list.d/ros2-latest.list'

ENV ROS_DISTRO foxy
RUN apt-get update && apt-get install -y \
    ros-$ROS_DISTRO-desktop && \
    rm -rf /var/lib/apt/lists/*

docker镜像创建完成如图:
在这里插入图片描述

3、使用容器启动创建的镜像
cd ~/cc_ws/
sudo docker run --name arm_sysroot arm_ros2:latest

这一步会报错:因为系统架构不同不能启动,但是没影响,可以执行后面的操作

4、将arm_ubuntu镜像系统文件拉取到本地
cd ~/cc_ws/
sudo docker container export -o sysroot_docker.tar arm_sysroot   # 拉取
mkdir sysroot_docker
tar -C sysroot_docker -xf sysroot_docker.tar lib usr opt etc  # 将压缩包中lib usr opt etc解压出来放到sysroot_docker目录下
sudo docker rm arm_sysroot  # 删除临时容器

四、交叉编译

1、设置交叉编译工具链文件变量

generic_linux.cmake(在/src/cross_compile/cmake-toolchains/目录下)交叉编译工具文件手动修改:
注释掉第5行 "$ENV{CROSS_COMPILE}" STREQUAL "" OR
第17、18行gcc g++设置绝对路径(第一步安装开发工具库时自动下载到usr/bin目录下)
在这里插入图片描述
终端设置其他变量:

cd ~/cc_ws/ros2_ws
export TARGET_ARCH=aarch64
export SYSROOT=~/cc_ws/sysroot_docker
export PYTHON_SOABI=cpython-36m-aarch64-linux-gnu
export ROS2_INSTALL_PATH=~/cc_ws/sysroot_docker/opt/ros/foxy
source $ROS2_INSTALL_PATH/setup.bash

在终端输入:ros2 ,测试是否设置成功,如果提示找不到ros2指令则说明没有成功,需重新设置

2、交叉编译

交叉编译指令:

cd ~/cc_ws/ros2_ws

colcon build \
    --merge-install \
    --cmake-force-configure \
    --cmake-args \
        -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \
        -DCMAKE_TOOLCHAIN_FILE="$(pwd)/src/cross_compile/cmake-toolchains/generic_linux.cmake"

编译会报错:官方给的示例代码有错误,不想改错的话可以将编译失败的包删除
在这里插入图片描述
编译成功如下:
在这里插入图片描述

五、测试交叉编译结果

1、将编译好的文件目录挂载到docker上:
cd ~/cc_ws/ros2_ws

sudo docker run -it --rm -v /home/自己的虚拟机名称/cc_ws/ros2_ws:/data --name arm_ros 镜像id

# 例如:
sudo docker run -it --rm -v /home/sun/cc_ws/ros2_ws:/data --name arm_ros d2a61652daa1

镜像id 通过sudo docker images查看

2、挂载后source编译好的环境:
cd /data
source /install/local_setup.bash
3、测试c++/python demo:
ros2 run demo_nodes_cpp listener &
ros2 run demo_nodes_py talker

在这里插入图片描述

总结

总体来说ros2交叉编译没有太大的意义,没有太高的适用性,但是也是ros2编译的一种必不可少的方式,希望大家遇到问题可以多找、多搜索、多尝试,多试几次就成功了,有没有见过的报错和问题可以交流交流。

  • 33
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
Kinetic ROS 是一种基于机器人操作系统(ROS)的版本,主要用于开发和控制机器人。交叉编译是在一个计算机系统上为另一个不同架构的目标系统生成可执行代码的过程。 在进行 Kinetic ROS 交叉编译之前,需要确保目标系统和开发系统具有相同的 ROS 版本和软件库。此外,还需了解目标系统的架构和操作系统。 首先,在开发系统上安装必要的交叉编译工具链和相关软件包。这些工具链包括交叉编译器、连接器和库文件等。可以通过命令行或者包管理器来安装这些工具。 接下来,需要为目标系统交叉编译 ROS 的源代码。首先,从源代码库中获取 ROS 的源代码,并解压到开发系统的工作空间中。然后,通过运行特定的交叉编译命令,将源代码编译成目标系统可以执行的可执行文件。 在编译过程中,可能会遇到一些依赖项缺失的问题。这时,需要在开发系统上安装这些缺失的依赖项,并且确保它们也符合目标系统的要求。 完成编译后,将生成的可执行文件和相关的库文件复制到目标系统中。然后,将所有必要的配置文件和启动脚本等也复制到目标系统上。 最后,将目标系统与开发系统连接起来,并确保两者之间的通信正常。这可能需要对网络设置或者串口通信进行相应的配置。 通过以上步骤,可以成功地将 Kinetic ROS 交叉编译到目标系统中,从而实现在目标系统上进行机器人控制和开发的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值