Kria Robotics StackのLinuxイメージをビルドする(2023.1)

PetaLinuxにROS2 Humbleを追加する(2023.1) でビルドしたPetaLinuxにKRSを追加して、Kria KV260用のmicroSDカードに書き込むファイルをビルドした。 動作 …

npz35 Tue 28 November 2023

PetaLinuxにROS2 Humbleを追加する(2023.1) でビルドしたPetaLinuxにKRSを追加して、Kria KV260用のmicroSDカードに書き込むファイルをビルドした。 動作確認はこの記事とは別で行う。

動作環境

  • OS : Ubuntu 20.04.3 LTS(64 bit)
  • Vivado : 2023.1
  • Vitis : 2023.1
  • Vitis_HLS : 2023.1
  • ROS2 : Humble
  • ボード : Kria KV260

PetaLinuxへのパッケージの追加

PetaLinuxにROS2 Humbleを追加する(2023.1) でビルドしたPetaLinuxに、パッケージを追加する。 ${HOME}/xilinx-kv260-starterkit-2023.1/project-spec/meta-user/conf/user-rootfsconfig に追加するパッケージの設定項目を追記する。

cd ${HOME}/xilinx-kv260-starterkit-2023.1

echo 'CONFIG_swig' >> project-spec/meta-user/conf/user-rootfsconfig
echo 'CONFIG_swig-dev' >> project-spec/meta-user/conf/user-rootfsconfig
echo 'CONFIG_packagegroup-core-buildessential' >> project-spec/meta-user/conf/user-rootfsconfig
echo 'CONFIG_packagegroup-core-buildessential-dev' >> project-spec/meta-user/conf/user-rootfsconfig
echo 'CONFIG_python3-pip' >> project-spec/meta-user/conf/user-rootfsconfig

また、 petalinux-config --component rootfs を実行して上記で追加したパッケージを有効化する。

次に、 ${HOME}/xilinx-kv260-starterkit-2023.1/project-spec/meta-user/recipes-images/images/petalinux-image-minimal.bbappendROS_SYSROOT_BUILD_DEPENDENCIES に必要なパッケージを追加する。

     libyaml-vendor \
+    foonathan-memory \
+    lttng-ust \
+    babeltrace2 \
+    opencv-dev \
+    opencv-staticdev \
+    ament-cmake-gen-version-h \
+    ament-cmake-lint-cmake \
+    ament-cmake-mypy \
+    ament-cmake-xmllint \
+    ament-lint-common \
+    camera-calibration-parsers \
+    camera-info-manager \
+    cv-bridge \
+    image-geometry \
+    image-transport \
+    ltt-control \
+    ltt-control-dev \
"

meta-kria-robotics-stack リポジトリをクローンする。

cd ${HOME}/xilinx-kv260-starterkit-2023.1

git clone https://github.com/npz35/meta-kria-robotics-stack.git components/yocto/layers/meta-kria-robotics-stack -b 0.5.0

${HOME}/xilinx-kv260-starterkit-2023.1/build/conf/bblayers.confmeta-kria-robotics-stack を追加する。

   ${SDKBASEMETAPATH}/layers/meta-ros/meta-ros2-humble \
+  ${SDKBASEMETAPATH}/layers/meta-kria-robotics-stack \
   ${SDKBASEMETAPATH}/layers/meta-jupyter \

ビルド並列度を下げるために ${HOME}/xilinx-kv260-starterkit-2023.1/build/conf/local.conf に以下の記述を追記する。

BB_NUMBER_THREADS = '4'
PARALLEL_MAKE = '-j 4'

cpio 形式のファイルのサイズの上限は2GBとなっている。 ここで、rootfsのサイズが大きくなったことでcpio形式でrootfsを固めることができなくなる。 そのため、このままビルドを実行しようとすると以下のようなエラーが出る。

ERROR: linux-xlnx-6.1.5-xilinx-v2023.1+gitAUTOINC+716921b6d7-r0 do_assemble_fitimage_initramfs: Could not find a valid initramfs type for petalinux-initramfs-image-xilinx-k26-kv, the supported types are: cpio.lz4 cpio.lzo cpio.lzma cpio.xz cpio.zst cpio.gz ext2.gz cpio
ERROR: linux-xlnx-6.1.5-xilinx-v2023.1+gitAUTOINC+716921b6d7-r0 do_assemble_fitimage_initramfs: ExecutionError('/home/np/xilinx-kv260-starterkit-2023.1/build/tmp/work/xilinx_k26_kv-xilinx-linux/linux-xlnx/6.1.5-xilinx-v2023.1+gitAUTOINC+716921b6d7-r0/temp/run.do_assemble_fitimage_initramfs.374249', 1, None, None)
ERROR: Logfile of failure stored in: /home/np/xilinx-kv260-starterkit-2023.1/build/tmp/work/xilinx_k26_kv-xilinx-linux/linux-xlnx/6.1.5-xilinx-v2023.1+gitAUTOINC+716921b6d7-r0/temp/log.do_assemble_fitimage_initramfs.374249
ERROR: Task (/home/np/xilinx-kv260-starterkit-2023.1/components/yocto/layers/meta-xilinx/meta-xilinx-core/recipes-kernel/linux/linux-xlnx_2023.1.bb:do_assemble_fitimage_initramfs) failed with exit code '1'
| DEBUG: Python function extend_recipe_sysroot finished
| DEBUG: Executing python function set_image_size
| DEBUG: 3296919.600000 = 2536092 * 1.300000
| DEBUG: 3399319.600000 = max(3296919.600000, 65536)[3296919.600000] + 102400
| DEBUG: 3399320.000000 = int(3399319.600000)
| DEBUG: 3399320 = aligned(3399320)
| DEBUG: returning 3399320
| DEBUG: Python function set_image_size finished
| DEBUG: Executing shell function do_image_cpio
| 4652677 blocks
| cpio: cannot seek on output: Invalid argument
| WARNING: exit code 2 from a shell command.
ERROR: Task (/home/np/xilinx-kv260-starterkit-2023.1/components/yocto/layers/meta-petalinux/recipes-core/images/petalinux-image-minimal.bb:do_image_cpio) failed with exit code '1'

上記のエラーを回避するために petalinux-config を実行し Image Packaging ConfigurationRoot filesystem type から INITRDEXT4 へ変更する。

また project-spec/meta-user/conf/petalinuxbsp.conf に以下の設定を追記してcpio形式でファイルが生成されないようにする。

 IMAGE_BOOT_FILES:zynqmp = "ramdisk.cpio.gz.u-boot,boot.scr,Image,system.dtb,system-zynqmp-sck-kv-g-revB.dtb"
+
+IMAGE_FSTYPES:remove = "cpio cpio.gz cpio.bz2 cpio.xz cpio.lzma cpio.lz4 cpio.gz.u-boot"
+IMAGE_FSTYPES_DEBUGFS:remove = "cpio cpio.gz cpio.bz2 cpio.xz cpio.lzma cpio.lz4 cpio.gz.u-boot"
+

ビルドをやり直す。

petalinux-build --component kernel
petalinux-build --component u-boot
petalinux-build --component rootfs
petalinux-build
petalinux-build --sdk

生成された images をホスト側にコピーする。

cp -r images ${HOME}/krs_workdir_2023_1/

SDKのインストール

SDKをインストールする。

cd ${HOME}/krs_workdir_2023_1
./images/linux/sdk.sh -d sdk

KRSのDockerイメージのビルド

kria-robotics-stack-docker リポジトリをcloneする。

cd ${HOME}
git clone https://github.com/npz35/kria-robotics-stack-docker.git -b 0.5.0

ビルドしたPetaLinuxの images ディレクトリを kria-robotics-stack-docker にコピーする。

cd ${HOME}/kria-robotics-stack-docker
cp -r ${HOME}/krs_workdir_2023_1/images .

KRSのDockerイメージをビルドする。

cd ${HOME}/kria-robotics-stack-docker
./scripts/docker_build.sh

KRSのDockerコンテナの起動

古いDockerコンテナが残っている場合には、必要に応じてrenameで退避する。

docker rename krs krs.backup

KRSのDockerコンテナを起動する。

cd ${HOME}/kria-robotics-stack-docker
./scripts/docker_run.sh

ROS2ワークスペースの設定・変更

KRSのDockerコンテナの中で、ファームウェアを選択する。

cd ${HOME}/krs_ws/
source install/setup.bash
colcon acceleration select kv260

ビルド時に発生する参照周りのエラーを回避するために、変更を加える。

cd ${HOME}/krs_ws
SYSROOT=${HOME}/krs_ws/acceleration/firmware/kv260/sysroots/cortexa72-cortexa53-xilinx-linux

grep -rn -l FIXMESTAGINGDIRHOST ${SYSROOT}/usr/share | \
  xargs sed -i 's/INTERFACE_INCLUDE_DIRECTORIES "FIXMESTAGINGDIRHOST\/usr\/lib\/python3.10\/site-packages\/numpy\/core\/include"//g'
grep -rn -l '\/scratch\/jenkins-BUILDS-eSDK-2023.1_stable-pipeline-build-136_VersalFullPrime\/build\/tmp\/work\/cortexa72-cortexa53-xilinx-linux\/[^;]\+;' ${SYSROOT}/usr/share/ | \
  xargs sed -i 's/\/scratch\/jenkins-BUILDS-eSDK-2023.1_stable-pipeline-build-136_VersalFullPrime\/build\/tmp\/work\/cortexa72-cortexa53-xilinx-linux\/[^;]\+;//g'
grep -rn -l '\/scratch\/jenkins-BUILDS-eSDK-2023.1_stable-pipeline-build-136_VersalFullPrime\/build\/tmp\/work\/cortexa72-cortexa53-xilinx-linux\/[^;"]\+"' ${SYSROOT}/usr/share/ | \
  xargs sed -i 's/\/scratch\/jenkins-BUILDS-eSDK-2023.1_stable-pipeline-build-136_VersalFullPrime\/build\/tmp\/work\/cortexa72-cortexa53-xilinx-linux\/[^;"]\+"/"/g'

grep -rn -I -l 'xilinx-kv260-starterkit-2023.1\/build\/tmp\/work\/cortexa72-cortexa53-xilinx-linux\/[^/]\+\/[^/]\+\/recipe-sysroot' ${SYSROOT}/usr/share/ | \
  xargs sed -i 's/xilinx-kv260-starterkit-2023.1\/build\/tmp\/work\/cortexa72-cortexa53-xilinx-linux\/.*\/recipe-sysroot/krs_ws\/acceleration\/firmware\/kv260\/sysroots\/cortexa72-cortexa53-xilinx-linux/g'
grep -rn -I -l 'xilinx-kv260-starterkit-2023.1\/build\/tmp\/work\/cortexa72-cortexa53-xilinx-linux\/[^/]\+\/[^/]\+\/recipe-sysroot' ${SYSROOT}/usr/lib/ | \
  xargs sed -i 's/xilinx-kv260-starterkit-2023.1\/build\/tmp\/work\/cortexa72-cortexa53-xilinx-linux\/.*\/recipe-sysroot/krs_ws\/acceleration\/firmware\/kv260\/sysroots\/cortexa72-cortexa53-xilinx-linux/g'

KRSのビルド時に BOOT.BIN を生成しないように変更する。

find src/ -name CMakeLists.txt | xargs sed -i 's/PACKAGE/# PACKAGE/g'

colconビルド

KRSのDockerコンテナの中で、Kria KV260向けのROS2パッケージを順にビルドする。

trace関連のROS2パッケージをビルドする。

cd ${HOME}/krs_ws
colcon build \
  --build-base=build-kv260 \
  --install-base=install-kv260 \
  --merge-install \
  --mixin kv260 \
  --cmake-args -DTRACETOOLS_LTTNG_ENABLED=true \
  --packages-up-to \
    ros2trace \
    tracetools \
    tracetools_launch \
    tracetools_read \
    tracetools_test \
    tracetools_trace

汎用のROS2パッケージをビルドする。

colcon build \
  --build-base=build-kv260 \
  --install-base=install-kv260 \
  --merge-install \
  --mixin kv260 \
  --cmake-args \
    -DNOKERNELS=false \
    -DTRACETOOLS_LTTNG_ENABLED=true \
  --packages-select \
    ament_acceleration \
    ament_vitis \
    vitis_common \
    ros2acceleration

KRSのサンプルパッケージをビルドする。

colcon build \
  --build-base=build-kv260 \
  --install-base=install-kv260 \
  --merge-install \
  --mixin kv260 \
  --cmake-args \
    -DNOKERNELS=false \
    -DTRACETOOLS_LTTNG_ENABLED=true \
  --packages-select \
    vadd_publisher \
    offloaded_doublevadd_publisher

simple_adder をビルドする。

colcon build \
  --build-base=build-kv260 \
  --install-base=install-kv260 \
  --merge-install \
  --mixin kv260 \
  --cmake-args \
    -DNOKERNELS=false \
    -DTRACETOOLS_LTTNG_ENABLED=true \
  --packages-select simple_adder

画像処理のサンプルパッケージをビルドする。

colcon build \
  --build-base=build-kv260 \
  --install-base=install-kv260 \
  --merge-install \
  --mixin kv260 \
  --cmake-args \
    -DNOKERNELS=true \
    -DTRACETOOLS_LTTNG_ENABLED=true \
  --packages-up-to \
    perception_2nodes \
    image_pipeline_examples

image_proc をビルドする。

colcon build \
  --build-base=build-kv260 \
  --install-base=install-kv260 \
  --merge-install \
  --mixin kv260 \
  --cmake-args \
    -DNOKERNELS=false \
    -DTRACETOOLS_LTTNG_ENABLED=true \
  --packages-select \
    image_proc

生成物のコピー

KRSのDockerコンテナの中から、ホスト側へ必要なデータをコピーする。

sudo rm -rf ${HOME}/krs_workdir_2023_1/krs_ws/acceleration
mkdir -p ${HOME}/krs_workdir_2023_1/krs_ws/acceleration/firmware
sudo cp -r -d acceleration/firmware/kv260 ${HOME}/krs_workdir_2023_1/krs_ws/acceleration/firmware/kv260
cp -r -d src           ${HOME}/krs_workdir_2023_1/krs_ws/ 2> /dev/null
cp -r -d build-kv260   ${HOME}/krs_workdir_2023_1/krs_ws/
cp -r -d install-kv260 ${HOME}/krs_workdir_2023_1/krs_ws/

ホスト側で、オーナーを変更する。

cd ${HOME}/krs_workdir_2023_1/krs_ws/
sudo chown -R $USER:$USER acceleration

ホスト側で、 colcon-hardware-acceleration をビルドする。

cd ${HOME}/krs_workdir_2023_1/krs_ws/
source /opt/ros/foxy/setup.bash
colcon build --merge-install \
  --packages-select \
    colcon-hardware-acceleration \
    ros2acceleration

perception_2nodes もビルドする。

colcon build --merge-install \
  --packages-up-to \
    perception_2nodes

ホスト側で、ワークスペースの設定を行う。

cd ${HOME}/krs_workdir_2023_1/krs_ws/
source install/setup.bash
colcon acceleration select kv260

microSDカードにイメージを焼く

以下のコマンドを実行し、microSDカードをフォーマットする。 フォーマットすると、microSDカード上のデータは全て消去される。 ここでは、microSDカードのデバイスパスは /dev/sdx とする。

sudo XAUTHORITY=~/.Xauthority gparted

右上のプルダウンから /dev/sdx を選択し、以下の設定でフォーマットする。

  • 第一パーティション:FAT32、2GB
  • 第二パーティション:ext4、残り全て

完了したらウィンドウを閉じる。

ホスト側で、microSDカードのブート領域をマウントする。 SD_PATH にはmicroSDカードのデバイスパスを設定する。

sudo mkdir -p /media/sd/BOOT
sudo mkdir -p /media/sd/rootfs
sudo mount ${SD_PATH}1 /media/sd/BOOT
sudo mount ${SD_PATH}2 /media/sd/rootfs

PetaLinuxのファイルを書き込む。

sudo cp \
  ${HOME}/krs_workdir_2023_1/images/linux/ramdisk.cpio.gz.u-boot \
  ${HOME}/krs_workdir_2023_1/images/linux/boot.scr \
  ${HOME}/krs_workdir_2023_1/images/linux/Image \
  ${HOME}/krs_workdir_2023_1/images/linux/system-zynqmp-sck-kv-g-revB.dtb \
  ${HOME}/krs_workdir_2023_1/images/linux/system.dtb \
  /media/sd/BOOT/

sudo tar xzvf ${HOME}/krs_workdir_2023_1/images/linux/rootfs.tar.gz -C /media/sd/rootfs/

KRSのファイルも書き込む。

sudo mkdir -p /media/sd/rootfs/home/petalinux/krs_ws/install-kv260
sudo cp -r ${HOME}/krs_workdir_2023_1/krs_ws/install-kv260/* /media/sd/rootfs/home/petalinux/krs_ws/install-kv260/

sync で書き込む。

sync

書き込みが完了した後に、ホスト側で、microSDカードをアンマウントする。

sudo umount /media/sd/BOOT
sudo umount /media/sd/rootfs
sudo eject ${SD_PATH}