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.bbappend の ROS_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.conf に meta-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 Configuration の Root filesystem type から INITRD を EXT4 へ変更する。
また 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}