PetaLinuxにROS2 Humbleを追加する(2023.1)

Kria KV260上でROS2を動かしたい。 ただし2023年7月時点で acceleration_firmware_kv260 のv1.1.0以降のバージョンではPetaLinuxではなくUbuntuがターゲット …

npz35 Sun 26 November 2023

Kria KV260上でROS2を動かしたい。 ただし2023年7月時点で acceleration_firmware_kv260 のv1.1.0以降のバージョンではPetaLinuxではなくUbuntuがターゲットとなっている。 また、確認した限りではROS2も含まれていない。 そこで、 PetaLinuxをビルドする(2023.1) でビルドしたPetaLinuxに、ROS2 Humbleを追加する。

動作環境

  • OS : Ubuntu 20.04.3 LTS(64 bit)
  • Vivado : 2023.1
  • ROS2 : Humble

ファイルの配置

PetaLinuxをビルドする(2023.1) で作成したDockerコンテナの中で、 ROS 2 Humble in AMD KV260 with Yocto を参考に、 petalinux-image-minimal.bbappend を追加する。 ただし後述エラーの回避のために以下のパッケージは除外した。

  • python3-nose
  • examples-rclpy-executors
  • examples-rclpy-minimal-action-client
cd ${HOME}/xilinx-kv260-starterkit-2023.1/
mkdir -p project-spec/meta-user/recipes-images/images
cat << 'EOF' > project-spec/meta-user/recipes-images/images/petalinux-image-minimal.bbappend
require ${COREBASE}/../meta-petalinux/recipes-core/images/petalinux-image-minimal.bb

SUMMARY = "A image including a bare-minimum installation of ROS 2 and including some basic pub/sub examples. It includes two DDS middleware implementations, FastDDS and Cyclone DDS"
DESCRIPTION = "${SUMMARY}"

inherit ros_distro_${ROS_DISTRO}
inherit ${ROS_DISTRO_TYPE}_image

ROS_SYSROOT_BUILD_DEPENDENCIES = " \
    ament-lint-auto \
    ament-cmake-auto \
    ament-cmake-core \
    ament-cmake-cppcheck \
    ament-cmake-cpplint \
    ament-cmake-export-definitions \
    ament-cmake-export-dependencies \
    ament-cmake-export-include-directories \
    ament-cmake-export-interfaces \
    ament-cmake-export-libraries \
    ament-cmake-export-link-flags \
    ament-cmake-export-targets \
    ament-cmake-gmock \
    ament-cmake-gtest \
    ament-cmake-include-directories \
    ament-cmake-libraries \
    ament-cmake \
    ament-cmake-pytest \
    ament-cmake-python \
    ament-cmake-ros \
    ament-cmake-target-dependencies \
    ament-cmake-test \
    ament-cmake-version \
    ament-cmake-uncrustify \
    ament-cmake-flake8 \
    ament-cmake-pep257 \
    ament-copyright \
    ament-cpplint \
    ament-flake8 \
    ament-index-python \
    ament-lint-cmake \
    ament-mypy \
    ament-package \
    ament-pclint \
    ament-pep257 \
    ament-pycodestyle \
    ament-pyflakes \
    ament-uncrustify \
    ament-xmllint \
    cmake \
    eigen3-cmake-module \
    fastcdr \
    fastrtps-cmake-module \
    fastrtps \
    git \
    gmock-vendor \
    gtest-vendor \
    pkgconfig \
    python-cmake-module \
    python3-catkin-pkg \
    python3-empy \
    python3 \
    python3-pytest \
    rcutils \
    rmw-implementation-cmake \
    rosidl-cmake \
    rosidl-default-generators \
    rosidl-generator-c \
    rosidl-generator-cpp \
    rosidl-generator-dds-idl \
    rosidl-generator-py \
    rosidl-parser \
    rosidl-runtime-c \
    rosidl-runtime-cpp \
    rosidl-typesupport-c \
    rosidl-typesupport-cpp \
    rosidl-typesupport-fastrtps-cpp \
    rosidl-typesupport-interface \
    rosidl-typesupport-introspection-c \
    rosidl-typesupport-introspection-cpp \
    foonathan-memory-vendor \
    libyaml-vendor \
"

IMAGE_INSTALL:append = " \
    ros-base \
    examples-rclcpp-minimal-action-client \
    examples-rclcpp-minimal-action-server \
    examples-rclcpp-minimal-client \
    examples-rclcpp-minimal-composition \
    examples-rclcpp-minimal-publisher \
    examples-rclcpp-minimal-service \
    examples-rclcpp-minimal-subscriber \
    examples-rclcpp-minimal-timer \
    examples-rclcpp-multithreaded-executor \
    examples-rclpy-minimal-action-server \
    examples-rclpy-minimal-client \
    examples-rclpy-minimal-publisher \
    examples-rclpy-minimal-service \
    examples-rclpy-minimal-subscriber \
    demo-nodes-cpp \
    demo-nodes-cpp-rosnative \
    demo-nodes-py \
    cyclonedds \
    rmw-cyclonedds-cpp \
    tmux \
    byobu \
    python3-argcomplete \
    glibc-utils \
    localedef \
    rt-tests \
    stress \
    xrt-dev \
    xrt \
    zocl \
    opencl-headers-dev \
    opencl-clhpp-dev \
    ${ROS_SYSROOT_BUILD_DEPENDENCIES} \
"

IMAGE_LINGUAS = "en-us"
GLIBC_GENERATE_LOCALES = "en_US.UTF-8"

EOF

PetaLinuxをビルドする(2023.1)petalinux-config --component rootfs の手順から再度実行していく。 SDKのビルドまで完了した後に、SDKを展開するとROS2 Humbleが含まれていることが確認できる。

$ cd ${HOME}/krs_workdir_2023_1
$ mkdir -p sdk
$ ./images/linux/sdk.sh -d sdk
$ ls sdk/sysroots/cortexa72-cortexa53-xilinx-linux/usr/bin/ros*
sdk/sysroots/cortexa72-cortexa53-xilinx-linux/usr/bin/ros2
sdk/sysroots/cortexa72-cortexa53-xilinx-linux/usr/bin/ros-discovery
sdk/sysroots/cortexa72-cortexa53-xilinx-linux/usr/bin/rosdistro_build_cache
sdk/sysroots/cortexa72-cortexa53-xilinx-linux/usr/bin/rosdistro_freeze_source
sdk/sysroots/cortexa72-cortexa53-xilinx-linux/usr/bin/rosdistro_migrate_to_rep_141
sdk/sysroots/cortexa72-cortexa53-xilinx-linux/usr/bin/rosdistro_migrate_to_rep_143
sdk/sysroots/cortexa72-cortexa53-xilinx-linux/usr/bin/rosdistro_reformat
sdk/sysroots/cortexa72-cortexa53-xilinx-linux/usr/bin/rosidl
sdk/sysroots/cortexa72-cortexa53-xilinx-linux/usr/bin/ros_local_setup.bash
sdk/sysroots/cortexa72-cortexa53-xilinx-linux/usr/bin/ros_local_setup.sh
sdk/sysroots/cortexa72-cortexa53-xilinx-linux/usr/bin/ros_local_setup.zsh
sdk/sysroots/cortexa72-cortexa53-xilinx-linux/usr/bin/ros_setup.bash
sdk/sysroots/cortexa72-cortexa53-xilinx-linux/usr/bin/ros_setup.sh
sdk/sysroots/cortexa72-cortexa53-xilinx-linux/usr/bin/ros_setup.zsh

除外したパッケージについて

python3-nose をLinuxイメージに含めるように設定していると、以下のエラーが出る。

ERROR: Nothing RPROVIDES 'python3-nose' (but /home/np/xilinx-kv260-starterkit-2023.1/components/yocto/layers/meta-petalinux/recipes-core/images/petalinux-image-minimal.bb RDEPENDS on or otherwise requires it)
NOTE: Runtime target 'python3-nose' is unbuildable, removing...
Missing or unbuildable dependency chain was: ['python3-nose']
ERROR: Required build target 'petalinux-image-minimal' has no buildable providers.
Missing or unbuildable dependency chain was: ['petalinux-image-minimal', 'python3-nose']

また、 examples-rclpy-executorsexamples-rclpy-minimal-action-client をLinuxイメージに含めるように設定していると、以下のエラーが出る。

Running transaction test
Error: Transaction test error:
  file /usr/bin/listener conflicts between attempted installs of examples-rclpy-executors-0.15.0+2-r0.0.cortexa72_cortexa53 and demo-nodes-py-0.20.1+2-r0.0.cortexa72_cortexa53
  file /usr/bin/talker conflicts between attempted installs of examples-rclpy-executors-0.15.0+2-r0.0.cortexa72_cortexa53 and demo-nodes-py-0.20.1+2-r0.0.cortexa72_cortexa53
  file /usr/bin/client conflicts between attempted installs of examples-rclpy-minimal-client-0.15.0+2-r0.0.cortexa72_cortexa53 and examples-rclpy-minimal-action-client-0.15.0+2-r0.0.cortexa72_cortexa53

本記事では上記のエラーを回避するために、上記のパッケージは除外した。