ros2交叉编译 x86到arm

这篇具有很好参考价值的文章主要介绍了ros2交叉编译 x86到arm。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

内容概括:

本篇文章记录了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 交叉编译 arm x86,arm开发,linux,ubuntu
ros2 交叉编译 arm x86,arm开发,linux,ubuntu
创建 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镜像创建完成如图:
ros2 交叉编译 arm x86,arm开发,linux,ubuntu

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目录下)
ros2 交叉编译 arm x86,arm开发,linux,ubuntu
终端设置其他变量:

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"

编译会报错:官方给的示例代码有错误,不想改错的话可以将编译失败的包删除
ros2 交叉编译 arm x86,arm开发,linux,ubuntu
编译成功如下:
ros2 交叉编译 arm x86,arm开发,linux,ubuntu

五、测试交叉编译结果

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 交叉编译 arm x86,arm开发,linux,ubuntu

总结

总体来说ros2交叉编译没有太大的意义,没有太高的适用性,但是也是ros2编译的一种必不可少的方式,希望大家遇到问题可以多找、多搜索、多尝试,多试几次就成功了,有没有见过的报错和问题可以交流交流。文章来源地址https://www.toymoban.com/news/detail-853960.html

到了这里,关于ros2交叉编译 x86到arm的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • x86架构ubuntu 搭建arm64交叉编译环境及QT编译arm64架构工程

    背景:由于最近项目需要做国产系统适配,很多软件需要重新编译以适配不同架构CPU。 环境: 1、主机win10 64bit   vmware虚拟主机ubuntu1804 64bit 2、vmware虚拟主机已经安装了qt5.14.2及qt_create4.11.1 一、C/C++程序交叉编译 1、交叉编译环境搭建 ①选定编译工具aarch64-linux-gnu ②安装交叉

    2024年02月09日
    浏览(65)
  • cmake与交叉编译(x86 to arm)过程和问题全记录

    公司维护一批c++动态库,由于生产需要,每次更新都要在windows、linux_x86、kylin_arm等多个环境中编译一遍,操作比较麻烦,所以想通过交叉编译的方式在一台机器上边编译多个环境的动态库,减少工作量。考虑到工作难度以及本人水平,决定从官方发布的成品交叉编译工具链中

    2024年04月28日
    浏览(46)
  • 交叉编译----宿主机x86 ubuntu 64位-目标机ARMv8 aarch64

    1.交叉编译是什么,为什么要交叉编译 编译:在一个平台上生成在该平台上的可执行代码 交叉编译:在一个平台上生成在另一个平台上的可执行代码 交叉编译的例子:如51单片机的可执行代码(hex文件)是在集成环境keil上面编译完成的,我们只需要将编译好的可执行代码下

    2024年02月15日
    浏览(46)
  • 带wiringPi库的交叉编译 ---宿主机x86Ubuntu,目标机ARMv8 aarch64(香橙派)

    带wiringPi库的交叉编译如何进行 先交叉编译wiringPi库,编译出的库适合香橙派,这时候交叉编译可执行程序的平台和链接库的格式也是正确的 ,然后通过-I和-L来指定链接的wiringPi库的头文件和库的位置,但是现在还没有学习过,后面学了补上 此时如果把wiringPi库拿到Ubuntu上进

    2024年02月15日
    浏览(47)
  • 【保姆级教程】Docker服务在双架构(X86和ARM)编译统一实践

    在现代计算机系统中,X86和ARM64是两种常见的处理器架构。为了满足不同架构的需求,Docker镜像也需要支持双架构编包形式。本文将介绍Docker镜像双架构编包统一的实践     在Docker镜像中,通常使用多阶段构建来实现。在第一阶段,构建出对应架构服务的二进制文件;在第二

    2024年02月07日
    浏览(52)
  • ubuntu上安装boost库为SOMEIP的X86和ARM下编译做准备(编译两种版本)

    Boost库是C++拓展库,是SOMEIP源码编译所必需的库。编译 Boost 库时,需要根据不同的架构,选择不同的工具链和参数 首先,Boost源码下载,Boost官网:https://www.boost.org 基于此处我编译的SOMEIP源码版本,需要安装1.74版本的Boost库,下载链接:https://boostorg.jfrog.io/artifactory/main/relea

    2024年02月10日
    浏览(44)
  • Linux conan+cmake管理的项目如何进行多架构编译(x86_64及交叉编译arm64)

    Conan 和 CMake 是两个非常流行的跨平台开发工具,它们可以让开发者轻松管理依赖和构建项目,支持多种操作系统和架构。下面是一些关于 conan 和 cmake 的介绍: Conan Conan 是一个用于管理 C++ 依赖项的开源工具。它可以从公共或私有存储库中自动下载和安装依赖项。Conan 可以轻

    2024年02月09日
    浏览(48)
  • Qt教程3-Ubuntu(x86_64)上配置arm64(aarch64)交叉编译环境及QT编译arm64架构工程

    苦辣酸甜时光八载,春夏秋冬志此一生 Qt简介: Qt(官方发音 [kju:t],音同 cute)是一个跨平台的 C++ 开发库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序,当然也可以开发不带界面的命令行(Command User Interface,CUI)程序。 Qt 支持的操作系统有很多,例如通用

    2024年01月23日
    浏览(51)
  • ARM_Linux的交叉开发以及交叉编译器

    目录 为什么要使用交叉开发 为什么要使用交叉编译 交叉编译器的安装 交叉编译器的使用 交叉开发是指在通用的电脑上吧程序编写,编译,调试好,再下载到嵌入式产品中去运行,对于一些简单的程序的话,直接在电脑上编译调试好即可,但是对于一些需要操作硬件的开发

    2024年01月23日
    浏览(56)
  • X86和arm的区别

    硬件上的区别 x86 系统中的硬件组件(如声卡、显卡、内存、存储器和 CPU)都是相互独立的。大多数组件都有单独的芯片,称为控制器。我们可以对这些组件进行更改或扩展,而不会影响连接性或整个硬件平台。 ARM 处理器没有单独的 CPU。相反,处理单元与其他硬件控制器位

    2024年02月03日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包