前言
内容概括:
本篇文章记录了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
文章来源:https://www.toymoban.com/news/detail-853960.html
总结
总体来说ros2交叉编译没有太大的意义,没有太高的适用性,但是也是ros2编译的一种必不可少的方式,希望大家遇到问题可以多找、多搜索、多尝试,多试几次就成功了,有没有见过的报错和问题可以交流交流。文章来源地址https://www.toymoban.com/news/detail-853960.html
到了这里,关于ros2交叉编译 x86到arm的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!