2021年5月5日水曜日

ultra96v2でVitis 2020.2を使用してcv::fastをxf::cv::fastに置き換えて見た話

xf::cv::fastはコーナ部分をMatで固定値255として出力してくる。ORB_SLAM2ではコーナスコアを使用して特徴点の数を間引くので、そのままだと不都合がある。

そこでcv::fastで出力している特徴点リストと、明確さ(CornerScore)をxf::cv::fastから出力するように変更する。直接変更座標を出力するようにしたほうがリソースと速度の面から有利かもしれないので、後の改善項目として検討する。

この後は間引き処理もカーネルに取り込み、全体の並列動作を調整していく。

環境

  • ubuntu:20.04
  • vitis:2020.2
  • yocto:zeus(https://github.com/akira-nishiyama/petalinux-ros2-manifests feature-v2020.2ブランチ)
  • board:ultra96v2(https://github.com/akira-nishiyama/ultra96v2_4z.git feature-v2020.2ブランチ)

変更点

デフォルトではコーナースコアが出力されないので、以下のように変更する。

diff --git a/hw/hw_kernel/vision/include/features/xf_fast.hpp b/hw/hw_kernel/vision/include/features/xf_fast.hpp
index a7aa1b1..935c0a2 100644
--- a/hw/hw_kernel/vision/include/features/xf_fast.hpp
+++ b/hw/hw_kernel/vision/include/features/xf_fast.hpp
@@ -201,7 +201,8 @@ void xFfastProc(XF_PTNAME(DEPTH) OutputValues[XF_NPIXPERCYCLE(NPC)],
         // NMS Score Computation
         if (iscorner) {
             xFCoreScore(flag_d[i], _threshold, &core);
-            pack_corners.range(ix + 7, ix) = 255;
+            //pack_corners.range(ix + 7, ix) = 255;
+            pack_corners.range(ix + 7, ix) = core;
         } else
             pack_corners.range(ix + 7, ix) = 0;
         ix += 8;
@@ -570,7 +571,8 @@ void xFnmsProc(XF_PTNAME(DEPTH) OutputValues[XF_NPIXPERCYCLE(NPC)],
         if ((src_buf[1][1] > src_buf[1][0]) && (src_buf[1][1] > src_buf[1][2]) && (src_buf[1][1] > src_buf[0][0]) &&
             (src_buf[1][1] > src_buf[0][1]) && (src_buf[1][1] > src_buf[0][2]) && (src_buf[1][1] > src_buf[2][0]) &&
             (src_buf[1][1] > src_buf[2][1]) && (src_buf[1][1] > src_buf[2][2])) {
-            pix = 255;
+            //pix = 255;
+            pix = src_buf[1][1];
         } else {
             pix = 0;
         }

sw_emu

build

OpenCVの結果と比較するテストプログラムで確認する。 hashは85f0af60868b7a0ba831647bcfd453f4b6b19c6c

git clone https://github.com/akira-nishiyama/orb_slam_2_ros.git -b feature-fpga
cd orb_slam_2_ros
mkdir build
cd build
source <vitis-installation-path>/settings64.sh
source <sdk-installation-path>/environment-setup-aarch64-xilinx-linux
export AMENT_PREFIX_PATH=$OECORE_NATIVE_SYSROOT/usr:$OECORE_TARGET_SYSROOT/usr
export PYTHONPATH=$OECORE_NATIVE_SYSROOT/usr/lib/python3.7/site-packages:$OECORE_TARGET_SYSROOT/usr/lib/python3.7/site-packages
cmake .. -DCMAKE_INSTALL_SO_NO_EXE=0 -DBUILD_TESTING=OFF -DCMAKE_NO_SYSTEM_FROM_IMPORTED=1 -GNinja -DCMAKE_INSTALL_PREFIX=/media/akira/usr -DPLATFORM_COMPONENTS_PATH=/home/akira/work/ultra96v2 -DBUILD_TEST_TARGETS=OFF -DBUILD_TARGET=sw_emu -DCMAKE_BUILD_TYPE=Debug -DENABLE_KRNL_CHECK=OFF -DBUILD_FAST_TEST=OFF -DBUILD_FAST_AND_DIST_TEST=ON -DDISABLE_RESIZE_KRNL=ON -DDISABLE_FAST_KRNL=OFF
ninja -j4

run

cd hw/hw_link/package_sw_emu/
source <vitis-installation-path>/settings64.sh
./launch_sw_emu.sh -pid-file emulation.pid -no-reboot -forward-port 2222 22

ターミナルで以下の通り実行する。

cd /mnt/sd-mmcblk0p1
export LD_LIBRARY_PATH=/mnt/sd-mmcblk0p1:/tmp:$LD_LIBRARY_PATH
export XCL_EMULATION_MODE=sw_emu
export XILINX_XRT=/usr
export XILINX_VITIS=/mnt/sd-mmcblk0p1
./xf_fast_and_dist_tb 128x128_1.png

result

============ xf_fast_and_dist test starts ============
INFO: Running OpenCL section.
Found Platform
Platform Name: Xilinx
INFO: Device found - avnet_com_av_ULTRA96V2_1_0
XCLBIN File Name: krnl_fast
INFO: Importing xclbin/krnl_fast.xclbin
Loading: 'xclbin/krnl_fast.xclbin'
ocv_result:511
hls_result:511
Test Passed
The maximum depth reached by any of the 2 hls::stream() instances in the design is 16384

2021年5月1日土曜日

orb_slam2のcv::fastをxf::cv::fastで置き換えてみた話

orb_slam2のcv::fastをxf::cv::fastで置き換えてみた話。
単純な置き換えで並列化もしてないために更に遅くなった。
間引き処理まで含めて一度最適化してみようかとは思う。

xf::cv::fastは8の倍数の列数をカーネルに指定しないと応答が帰ってこなくなる模様。
XF_NPPC1をNPSに指定していれば大丈夫と考えていたが、実際に動作させてみるとenqueueReadBufferか、 enqueueTaskのイベントが完了しなくなる事象を確認した。
8の倍数を指定すると正常にイベントが完了するのか、処理が先に進む。 面倒なので原因は追って無いが、enqueueTasの完了条件満たせなくなるのだろうと思っている。
なので、オリジナルの実装から少し変更し、固定サイズセルに分割するように変更した。 この辺はACRiの記事と同じかな。

また、orb_slam2ではcv::fast処理を行って得られたkeypointのresponse値を使用して特徴点の間引きを行っているが、 xf::cv::fastはkeypointが得られず、response値も得られない実装となっている。 とりあえずは動作速度の確認のために検出したコーナをkeypoint化し、response値は埋めないように実装して試した。

keypointの差はどうやって埋めようかなぁ。

環境

  • ubuntu:20.04
  • vitis:2020.2
  • yocto:zeus(https://github.com/akira-nishiyama/petalinux-ros2-manifests feature-v2020.2ブランチ)
  • board:ultra96v2(https://github.com/akira-nishiyama/ultra96v2_4z.git feature-v2020.2ブランチ)

環境

省略。

sw_emu

インターフェースのデバッグにはvitis -debugが有効だった。
setArgは変更毎に実行しないとカーネルに設定されないことはこれで見つけた。
以下に実行した方法を示しておく。

build

hashは50ac9c83379795185fd49166ca9d1c074b37dc23。
hashはb35f2dde90e18fd94b08c4ce903f16866f9797dd。

git clone https://github.com/akira-nishiyama/orb_slam_2_ros.git -b feature-fpga
cd orb_slam_2_ros
mkdir build
cd build
source <vitis-installation-path>/settings64.sh
source <sdk-installation-path>/environment-setup-aarch64-xilinx-linux
export AMENT_PREFIX_PATH=$OECORE_NATIVE_SYSROOT/usr:$OECORE_TARGET_SYSROOT/usr
export PYTHONPATH=$OECORE_NATIVE_SYSROOT/usr/lib/python3.7/site-packages:$OECORE_TARGET_SYSROOT/usr/lib/python3.7/site-packages
cmake .. -DCMAKE_INSTALL_SO_NO_EXE=0 -DBUILD_TESTING=OFF -DCMAKE_NO_SYSTEM_FROM_IMPORTED=1 -GNinja -DCMAKE_INSTALL_PREFIX=/media/akira/usr -DPLATFORM_COMPONENTS_PATH=/home/akira/work/ultra96v2 -DBUILD_TEST_TARGETS=OFF -DBUILD_TARGET=sw_emu -DCMAKE_BUILD_TYPE=Debug -DENABLE_KRNL_CHECK=ON -DBUILD_FAST_TEST=ON -DDISABLE_RESIZE_KRNL=ON -DDISABLE_FAST_KRNL=OFF
ninja -j4

run

-forward-portオプションは1つのポートしか指定できない模様(v2020.2では)。 なので、sshのポートにビルドPC側の2222番ポートでアクセスできるようにしておく。

cd hw/hw_link/package_sw_emu/
source <vitis-installation-path>/settings64.sh
./launch_sw_emu.sh -pid-file emulation.pid -no-reboot -forward-port 2222 22

エミュレータ起動したらtcfが1534番のポートで待ち受けているので、 ビルドPC側の1440番ポートで接続できるようにsshでtargetに接続する。

ssh -L 1440:localhost:1534 localhost -p 2222 -l root

テスト対象を転送する。(リポジトリのルートからの実行) orb_slam2_ros_mono_tum_testは転送しなくてもvitisがやってくれるかも。

ssh -p 2222 root@localhost "mkdir -p /usr/bin/xclbin"
scp -P 2222 build/orb_slam2_ros_mono_tum_test root@localhost:/home/root/
scp -P 2222 orb_slam2/lib/liborb_slam2_ros_core.so root@localhost:/usr/lib/liborb_slam2_ros_core.accel.so
scp -P 2222 build/hw/hw_link/orbslam2_accel_sw_emu.xclbin root@localhost:/usr/bin/xclbin/resize_krnl.xclbin

エミュレータ実行フォルダから次の通り実行する。

vitis -debug -flow embedded_accel -host-exe-file ../../../orb_slam2_ros_mono_tum_test -target sw_emu -kernel-names fast_accel -program-args "/usr/share/orb_slam2_ros/orb_slam2/Vocabulary/ORBvoc.txt /home/root/tum-dataset" -host 127.0.0.1 -port 1440

result

デバッグ画面表示されるのと、ブレークポイント設定することでカーネル呼び出し時の引数の状態などを確認できる。
ライブラリの中までデバッグしようとした場合にはどうすればよいかはよく分からない。
hostプログラムだけならgdbserverとdebugfsを用意すればできる。

hw

resize_krnlとfast_krnlを両方活かしてみてどうなるかを確認する。

build

ビルドディレクトリで以下の通り実行。

source <vitis-installation-path>/settings64.sh
source <sdk-installation-path>/environment-setup-aarch64-xilinx-linux
export AMENT_PREFIX_PATH=$OECORE_NATIVE_SYSROOT/usr:$OECORE_TARGET_SYSROOT/usr
export PYTHONPATH=$OECORE_NATIVE_SYSROOT/usr/lib/python3.7/site-packages:$OECORE_TARGET_SYSROOT/usr/lib/python3.7/site-packages
cmake .. -DCMAKE_INSTALL_SO_NO_EXE=0 -DBUILD_TESTING=OFF -DCMAKE_NO_SYSTEM_FROM_IMPORTED=1 -GNinja -DCMAKE_INSTALL_PREFIX=/media/akira/usr -DPLATFORM_COMPONENTS_PATH=/home/akira/work/ultra96v2 -DBUILD_TEST_TARGETS=OFF -DBUILD_TARGET=hw -DCMAKE_BUILD_TYPE=Debug -DENABLE_KRNL_CHECK=OFF -DBUILD_FAST_TEST=ON -DDISABLE_RESIZE_KRNL=OFF -DDISABLE_FAST_KRNL=OFF
ninja -j4

run

テスト対象を転送する。

ssh root@192.168.2.1 "mkdir -p /usr/bin/xclbin"
scp build/orb_slam2_ros_mono_tum_test root@192.168.2.1:/home/root/
scp orb_slam2/lib/liborb_slam2_ros_core.so root@192.168.2.1:/usr/lib/liborb_slam2_ros_core.accel.so
scp build/hw/hw_link/orbslam2_accel_hw.xclbin root@192.168.2.1:/usr/bin/xclbin/resize_krnl.xclbin
root@ultra96v2-zynqmp:~# export LD_LIBRARY_PATH=/mnt/sd-mmcblk0p1:/tmp:$LD_LIBRARY_PATH
root@ultra96v2-zynqmp:~# export XILINX_XRT=/usr
root@ultra96v2-zynqmp:~# export XILINX_VITIS=/mnt/sd-mmcblk0p1
root@ultra96v2-zynqmp:~# mv /usr/lib/liborb_slam2_ros_core.so /usr/lib/liborb_slam2_ros_core.soft.so
root@ultra96v2-zynqmp:~# ln -s -f /usr/lib/liborb_slam2_ros_core.accel.so /usr/lib/liborb_slam2_ros_core.so
root@ultra96v2-zynqmp:~# time ./orb_slam2_ros_mono_tum_test /usr/share/orb_slam2_ros/orb_slam2/Vocabulary/ORBvoc.txt ./tum-dataset

result

liborb_slam2_ros_core.soft.soを使用する場合はmedian tracking=0.12、トータル約2分なので、倍くらいの時間がかかるようになった。
置き換えただけじゃ当然そうなるよね。

root@ultra96v2-zynqmp:~# time ./orb_slam2_ros_mono_tum_test /usr/share/orb_slam2_ros/orb_slam2/Vocabulary/ORBvoc.txt ./tum-dataset

ORB-SLAM2 Copyright (C) 2014-2016 Raul Mur-Artal, University of Zaragoza.
This program comes with ABSOLUTELY NO WARRANTY;
This is free software, and you are welcome to redistribute it
under certain conditions. See LICENSE.txt.

OpenCV version : 3.4.3
Major version : 3
Minor version : 4
Subminor version : 3
Input sensor was set to: Monocular

Loading ORB Vocabulary.
Vocabulary loaded!


Camera Parameters: 
- fx: 517.306
- fy: 516.469
- cx: 318.643
- cy: 255.314
- k1: 0.262383
- k2: -0.953104
- k3: 0.002628
- p1: 1.16331
- p2: -0.005358
- fps: 30
- bf: 0
- color order: RGB (ignored if grayscale)
Found Platform
Platform Name: Xilinx
INFO: Device found - edge
Loading: '/usr/bin/xclbin/resize_krnl.xclbin'
Found Platform
Platform Name: Xilinx
INFO: Device found - edge
Loading: '/usr/bin/xclbin/resize_krnl.xclbin'

ORB Extractor Parameters: 
- Number of Features: 1000
- Scale Levels: 8
- Scale Factor: 1.2
- Initial Fast Threshold: 20
- Minimum Fast Threshold: 7

-------
Start processing sequence ...
Images in the sequence: 798

-------

median tracking time: 0.259621
mean tracking time: 0.258882

Saving keyframe trajectory to KeyFrameTrajectory.txt ...

trajectory saved!

real    3m53.420s
user    3m24.638s
sys 0m45.453s
root@ultra96v2-zynqmp:~# 

2021年4月25日日曜日

ultra96v2上でcv::fastをaccelerationするテストを実行した話

cv::fastをaccelerationするテストを実行した話。
nonmaxSupressionは有効とし、Resource Optimizaitonも有効とする。
基本的にはVitis_Librariesのfastをそのまま持ってきて動かしただけ。
他のライブラリも同じようにして導入できそうなことが分かってきた。

準備

前回と同じ

src

vision/L2/examples/fast配下から次のファイルを配置する。

  • xf_fast_accel.cpp
  • xf_fast_config.h
  • xf_fast_tb.cpp
  • xf_config_params.h

extやdataフォルダの中身はresizeと共通して使用できる。
他のものも同じようにして導入できそう。

sw_emu

build(sw_emu)

hashは3eec9b91c8ceba52e219e4b8d0be5e64c1ec1f30
git clone https://github.com/akira-nishiyama/orb_slam_2_ros.git -b feature-fpga
cd hw
mkdir build
cd build
source <vitis-installation-path>/settings64.sh
source <sdk-installation-path>/environment-setup-aarch64-xilinx-linux
cmake .. -GNinja -DPLATFORM_COMPONENTS_PATH=<path-to-platform-components> -DBUILD_TARGET=sw_emu -DBUILD_FAST_TEST=ON

run(sw_emu)

エミュレータを起動する。次はビルドディレクトリからのコマンド例である。

cd hw/hw_link/package_sw_emu/
source <vitis-installation-path>/settings64.sh
./launch_sw_emu.sh -pid-file emulation.pid -no-reboot -forward-port 1440 1534 -forward-port 2222 22

ターミナルで次の通り実行する。 必要なファイルは/mnt/sd-mmcblk0p1にある。

root@ultra96v2-zynqmp:~# cd /mnt/sd-mmcblk0p1/
root@ultra96v2-zynqmp:/mnt/sd-mmcblk0p1# export LD_LIBRARY_PATH=/mnt/sd-mmcblk0p1:/tmp:$LD_LIBRARY_PATH
root@ultra96v2-zynqmp:/mnt/sd-mmcblk0p1# export XCL_EMULATION_MODE=sw_emu
root@ultra96v2-zynqmp:/mnt/sd-mmcblk0p1# export XILINX_XRT=/usr
root@ultra96v2-zynqmp:/mnt/sd-mmcblk0p1# export XILINX_VITIS=/mnt/sd-mmcblk0p1
root@ultra96v2-zynqmp:/mnt/sd-mmcblk0p1# mkdir xclbin
root@ultra96v2-zynqmp:/mnt/sd-mmcblk0p1# cp binary_container_1_sw_emu.xclbin xclbin/krnl_fast.xclbin
root@ultra96v2-zynqmp:/mnt/sd-mmcblk0p1# ./xf_fast_tb 128x128_1.png

result(sw_emu)

INFO: Running OpenCL section.
Found Platform
Platform Name: Xilinx
INFO: Device found - avnet_com_av_ULTRA96V2_1_0
XCLBIN File Name: krnl_fast
INFO: Importing xclbin/krnl_fast.xclbin
Loading: 'xclbin/krnl_fast.xclbin'
ocvpoints:511=
INFO: Verification results:
    Common = 511
    Success = 100
    Loss = 0
    Gain = 0
Test Passed
The maximum depth reached by any of the 4 hls::stream() instances in the design is 2048

hw

build(hw)

ビルドディレクトリからのコマンドを示す。

source <vitis-installation-path>/settings64.sh
source <sdk-installation-path>/environment-setup-aarch64-xilinx-linux
cmake .. -GNinja -DPLATFORM_COMPONENTS_PATH=<path-to-platform-components> -DBUILD_TARGET=hw -DBUILD_FAST_TEST=ON

run(hw)

sdカードはビルドディレクトリから以下の通り作成可能。 sd-deviceはdmesg等で調べたsdカードのデバイスファイルを指定する。

sudo dd if=hw/hw_link/package_hw/sd_card.img of=<sd-device>

ultra96のwifiに接続し、以下の通りsshアクセスを行う。

ssh -l root 192.168.2.1

ターミナルでは次のようにコマンドを実行する。

root@ultra96v2-zynqmp:~# cd /mnt/sd-mmcblk0p1/
root@ultra96v2-zynqmp:/mnt/sd-mmcblk0p1# export LD_LIBRARY_PATH=/mnt/sd-mmcblk0p1:/tmp:$LD_LIBRARY_PATH
root@ultra96v2-zynqmp:/mnt/sd-mmcblk0p1# export XILINX_XRT=/usr
root@ultra96v2-zynqmp:/mnt/sd-mmcblk0p1# export XILINX_VITIS=/mnt/sd-mmcblk0p1
root@ultra96v2-zynqmp:/mnt/sd-mmcblk0p1# mkdir xclbin
root@ultra96v2-zynqmp:/mnt/sd-mmcblk0p1# cp binary_container_1_hw.xclbin xclbin/krnl_fast.xclbin
root@ultra96v2-zynqmp:/mnt/sd-mmcblk0p1# ./xf_fast_tb 128x128_1.png 

result(hw)

INFO: Running OpenCL section.
Found Platform
Platform Name: Xilinx
INFO: Device found - edge
XCLBIN File Name: krnl_fast
INFO: Importing xclbin/krnl_fast.xclbin
Loading: 'xclbin/krnl_fast.xclbin'
ocvpoints:511=
INFO: Verification results:
    Common = 511
    Success = 100
    Loss = 0
    Gain = 0
Test Passed

2021年4月23日金曜日

ultra96v2+orb_slam2のaccelerationでcv::resizeを置き換えてみた話

ultra96v2+orb_slam2のaccelerationでcv::resizeをハードウェアカーネルに置き換えてみた話。 単純に置き換えるだけじゃやっぱりだめだよねっていう結果が得られた。

環境

  • ubuntu:20.04
  • vitis:2020.2
  • yocto:zeus(https://github.com/akira-nishiyama/petalinux-ros2-manifests feature-v2020.2ブランチ)
  • board:ultra96v2(https://github.com/akira-nishiyama/ultra96v2_4z.git feature-v2020.2ブランチ)

準備

前回と同じ

変更内容

とりあえずの対象はACRiの記事で示されているExtractORBとする。
記事に記載の内容を実装してみることとするが、ultra96v2向けにはリソース使用量から考えて記事に記載の回路そのままは入らないと考えられるため並列処理数は減らしていく方向で検討する。
とりあえずはcv::resizeを回路に置き換えてみて様子を見る。
このためにORBExtractor.ccとORBExtractor.hを変更した。
主にOpen CLのランタイム環境設定と、cv::resizeに対してカーネル呼び出しコードの追加を行った。
(参考:https://japan.xilinx.com/html_docs/xilinx2020_2/vitis_doc/devhostapp.html#ariaid-title2)

sw_emu

build

sw_emuでは簡単に動作を見ていく。 そのためにENABLE_KRNL_CHECKオプションを有効にする。 ENABLE_KRNL_CHECKオプションはKRNL_CHECKをdefineして必要な処理をORBExtractorに追加している。

hashは9fd1ad11b8982927366b687b527595651a82d8a9。将来変更となると思うので。

git clone https://github.com/akira-nishiyama/orb_slam_2_ros.git -b feature-fpga
cd orb_slam_2_ros
mkdir build
cd build
source <vitis-installation-path>/settings64.sh
source <sdk-installation-path>/environment-setup-aarch64-xilinx-linux
export AMENT_PREFIX_PATH=$OECORE_NATIVE_SYSROOT/usr:$OECORE_TARGET_SYSROOT/usr
export PYTHONPATH=$OECORE_NATIVE_SYSROOT/usr/lib/python3.7/site-packages:$OECORE_TARGET_SYSROOT/usr/lib/python3.7/site-packages
cmake .. -DCMAKE_INSTALL_SO_NO_EXE=0 -DBUILD_TESTING=OFF -DCMAKE_NO_SYSTEM_FROM_IMPORTED=1 -GNinja -DCMAKE_INSTALL_PREFIX=<path-to-sdcard>/usr -DPLATFORM_COMPONENTS_PATH=<path-to-platform-components> -DBUILD_TEST_TARGETS=ON -DBUILD_TARGET=sw_emu -DCMAKE_BUILD_TYPE=Debug -DENABLE_KRNL_CHECK=ON
ninja -j4

run

エミュレータを起動する。次はビルドディレクトリからのコマンド例である。

cd hw/hw_link/package_sw_emu/
source <vitis-installation-path>/settings64.sh
./launch_sw_emu.sh -pid-file emulation.pid -no-reboot -forward-port 1440 1534 -forward-port 2222 22

エミュレータが起動したら必要なファイルを転送する。
リポジトリのトップからの転送コマンドを示す。

ssh -p 2222 root@localhost "mkdir -p /usr/bin/xclbin"
scp -P 2222 build/orb_slam2_ros_mono_tum_test root@localhost:/home/root/
scp -P 2222 orb_slam2/lib/liborb_slam2_ros_core.so root@localhost:/usr/lib/liborb_slam2_ros_core.accel.so
scp -P 2222 build/hw/hw_link/orbslam2_accel_sw_emu.xclbin root@localhost:/usr/bin/xclbin/resize_krnl.xclbin

エミュレータ上でプログラムを実行する。(参考:https://japan.xilinx.com/html_docs/xilinx2020_2/vitis_doc/runemulation1.html#ariaid-title6)
オリジナルのliborb_slam2_ros_core.soはsoft実行用に保存し、新たにacceleration向けのものをリンクしておきこれを実行する。

export LD_LIBRARY_PATH=/mnt/sd-mmcblk0p1:/tmp:$LD_LIBRARY_PATH
export XCL_EMULATION_MODE=sw_emu
export XILINX_XRT=/usr
export XILINX_VITIS=/mnt/sd-mmcblk0p1
mv /usr/lib/liborb_slam2_ros_core.so /usr/lib/liborb_slam2_ros_core.soft.so
ln -s -f /usr/lib/liborb_slam2_ros_core.accel.so /usr/lib/liborb_slam2_ros_core.so
cp /mnt/sd-mmcblk0p1/emconfig.json .
./orb_slam2_ros_mono_tum_test /usr/share/orb_slam2_ros/orb_slam2/Vocabulary/ORBvoc.txt ./tum-dataset

result

一生かかっても終わる気配が無かったので途中で中断している。 opencvと同じ結果が得られているようなのでとりあえずよしとする。 (意図的にfailさせてないのでテストプログラムが正しいかは少し心配)

root@ultra96v2-zynqmp:~# ./orb_slam2_ros_mono_tum_test /usr/share/orb_slam2_ros/orb_slam2/Vocabulary/ORBvoc.txt ./tum-dataset

ORB-SLAM2 Copyright (C) 2014-2016 Raul Mur-Artal, University of Zaragoza.
This program comes with ABSOLUTELY NO WARRANTY;
This is free software, and you are welcome to redistribute it
under certain conditions. See LICENSE.txt.

OpenCV version : 3.4.3
Major version : 3
Minor version : 4
Subminor version : 3
Input sensor was set to: Monocular

Loading ORB Vocabulary.
Vocabulary loaded!


Camera Parameters: 
- fx: 517.306
- fy: 516.469
- cx: 318.643
- cy: 255.314
- k1: 0.262383
- k2: -0.953104
- k3: 0.002628
- p1: 1.16331
- p2: -0.005358
- fps: 30
- bf: 0
- color order: RGB (ignored if grayscale)
Found Platform
Platform Name: Xilinx
INFO: Device found - avnet_com_av_ULTRA96V2_1_0
Loading: '/usr/bin/xclbin/resize_krnl.xclbin'
Found Platform
Platform Name: Xilinx
INFO: Device found - avnet_com_av_ULTRA96V2_1_0
Loading: '/usr/bin/xclbin/resize_krnl.xclbin'

ORB Extractor Parameters: 
- Number of Features: 1000
- Scale Levels: 8
- Scale Factor: 1.2
- Initial Fast Threshold: 20
- Minimum Fast Threshold: 7

-------
Start processing sequence ...
Images in the sequence: 798

here! level=1
in_height:480,in_width:640
out_height:400,out_width:533
    Minimum error in intensity = 0
    Maximum error in intensity = 0
    Percentage of pixels above error threshold = 0
Check Passed 
here! level=2
in_height:400,in_width:533
out_height:333,out_width:444
    Minimum error in intensity = 0
    Maximum error in intensity = 0
    Percentage of pixels above error threshold = 0
Check Passed 
here! level=3
in_height:333,in_width:444
out_height:278,out_width:370
    Minimum error in intensity = 0
    Maximum error in intensity = 0
    Percentage of pixels above error threshold = 0
Check Passed 
here! level=4
in_height:278,in_width:370
out_height:231,out_width:309
    Minimum error in intensity = 0
    Maximum error in intensity = 0
    Percentage of pixels above error threshold = 0
Check Passed 
here! level=5
in_height:231,in_width:309
out_height:193,out_width:257
    Minimum error in intensity = 0
    Maximum error in intensity = 0
    Percentage of pixels above error threshold = 0
Check Passed 
here! level=6
in_height:193,in_width:257
out_height:161,out_width:214
    Minimum error in intensity = 0
    Maximum error in intensity = 0
    Percentage of pixels above error threshold = 0
Check Passed 
here! level=7
in_height:161,in_width:214
out_height:134,out_width:179
    Minimum error in intensity = 0
    Maximum error in intensity = 0
    Percentage of pixels above error threshold = 0
Check Passed 
here! level=1
in_height:480,in_width:640
out_height:400,out_width:533
    Minimum error in intensity = 0
    Maximum error in intensity = 0
    Percentage of pixels above error threshold = 0
Check Passed 
here! level=2
in_height:400,in_width:533
out_height:333,out_width:444
    Minimum error in intensity = 0
    Maximum error in intensity = 0
    Percentage of pixels above error threshold = 0
Check Passed 
here! level=3
in_height:333,in_width:444
out_height:278,out_width:370
^C
root@ultra96v2-zynqmp:~# 

hw

build

buildディレクトリで以下のように実行。 環境変数設定済の場合はcmake以降を実行すれば良い。

source <vitis-installation-path>/settings64.sh
source <sdk-installation-path>/environment-setup-aarch64-xilinx-linux
export AMENT_PREFIX_PATH=$OECORE_NATIVE_SYSROOT/usr:$OECORE_TARGET_SYSROOT/usr
export PYTHONPATH=$OECORE_NATIVE_SYSROOT/usr/lib/python3.7/site-packages:$OECORE_TARGET_SYSROOT/usr/lib/python3.7/site-packages
cmake .. -DCMAKE_INSTALL_SO_NO_EXE=0 -DBUILD_TESTING=OFF -DCMAKE_NO_SYSTEM_FROM_IMPORTED=1 -GNinja -DCMAKE_INSTALL_PREFIX=<path-to-sdcard>/usr -DPLATFORM_COMPONENTS_PATH=<path-to-platform-components> -DBUILD_TEST_TARGETS=ON -DBUILD_TARGET=hw -DCMAKE_BUILD_TYPE=Debug -DENABLE_KRNL_CHECK=OFF
ninja -j4

run

ビルドディレクトリから以下の通り実行してsdカードを作成する。

sudo dd if=hw/hw_link/package_hw/sd_card.img of=<path-to-sd-device>

sdをultra96v2に挿して起動させれば良い。 wifiは有効なはずなので、これに接続すれば、次のコマンドでターミナルにアクセスできる。

ssh 192.168.2.1 -l root

sdに直接書いてもいいが、何度かビルドと変更を繰り返すことになると思うので ホストで次のコマンドを実行して必要なファイルを転送する。 実行はリポジトリのトップから行っている。

ssh root@192.168.2.1 "mkdir -p /usr/bin/xclbin"
scp build/orb_slam2_ros_mono_tum_test root@192.168.2.1:/home/root/
scp orb_slam2/lib/liborb_slam2_ros_core.so root@192.168.2.1:/usr/lib/liborb_slam2_ros_core.accel.so
scp build/hw/hw_link/orbslam2_accel_sw_emu.xclbin root@192.168.2.1:/usr/bin/xclbin/resize_krnl.xclbin

ultra96v2のターミナルで以下のコマンドを入力してオリジナルの状態を確認する。

root@ultra96v2-zynqmp:~# export LD_LIBRARY_PATH=/mnt/sd-mmcblk0p1:/tmp:$LD_LIBRARY_PATH
root@ultra96v2-zynqmp:~# export XILINX_XRT=/usr
root@ultra96v2-zynqmp:~# export XILINX_VITIS=/mnt/sd-mmcblk0p1
root@ultra96v2-zynqmp:~# mv /usr/lib/liborb_slam2_ros_core.so /usr/lib/liborb_slam2_ros_core.soft.so
root@ultra96v2-zynqmp:~# ln -s -f /usr/lib/liborb_slam2_ros_core.soft.so /usr/lib/liborb_slam2_ros_core.so
root@ultra96v2-zynqmp:~# time ./orb_slam2_ros_mono_tum_test /usr/share/orb_slam2_ros/orb_slam2/Vocabulary/ORBvoc.txt ./tum-dataset

result

liborb_slam2_ros_core.soft.soを実行した場合の結果は次の通りだった。

ORBvoc.txt ./tum-dataset

ORB-SLAM2 Copyright (C) 2014-2016 Raul Mur-Artal, University of Zaragoza.
This program comes with ABSOLUTELY NO WARRANTY;
This is free software, and you are welcome to redistribute it
under certain conditions. See LICENSE.txt.

OpenCV version : 3.4.3
Major version : 3
Minor version : 4
Subminor version : 3
Input sensor was set to: Monocular

Loading ORB Vocabulary.
Vocabulary loaded!


Camera Parameters: 
- fx: 517.306
- fy: 516.469
- cx: 318.643
- cy: 255.314
- k1: 0.262383
- k2: -0.953104
- k3: 0.002628
- p1: 1.16331
- p2: -0.005358
- fps: 30
- bf: 0
- color order: RGB (ignored if grayscale)

ORB Extractor Parameters: 
- Number of Features: 1000
- Scale Levels: 8
- Scale Factor: 1.2
- Initial Fast Threshold: 20
- Minimum Fast Threshold: 7

-------
Start processing sequence ...
Images in the sequence: 798

-------

median tracking time: 0.129078
mean tracking time: 0.129074

Saving keyframe trajectory to KeyFrameTrajectory.txt ...

trajectory saved!

real    2m9.262s
user    2m19.686s
sys 0m5.226s
root@ultra96v2-zynqmp:~# cat KeyFrameTrajectory.txt 
root@ultra96v2-zynqmp:~# 

accelerationを使用した場合の結果は次の通りであった。

root@ultra96v2-zynqmp:~# ln -s -f /usr/lib/liborb_slam2_ros_core.accel.so /usr/lib/liborb_slam2_ros_core.so
root@ultra96v2-zynqmp:~# time ./orb_slam2_ros_mono_tum_test /usr/share/orb_slam2_ros/orb_slam2/Vocabulary/ORBvoc.txt ./tum-dataset

ORB-SLAM2 Copyright (C) 2014-2016 Raul Mur-Artal, University of Zaragoza.
This program comes with ABSOLUTELY NO WARRANTY;
This is free software, and you are welcome to redistribute it
under certain conditions. See LICENSE.txt.

OpenCV version : 3.4.3
Major version : 3
Minor version : 4
Subminor version : 3
Input sensor was set to: Monocular

Loading ORB Vocabulary.
Vocabulary loaded!


Camera Parameters: 
- fx: 517.306
- fy: 516.469
- cx: 318.643
- cy: 255.314
- k1: 0.262383
- k2: -0.953104
- k3: 0.002628
- p1: 1.16331
- p2: -0.005358
- fps: 30
- bf: 0
- color order: RGB (ignored if grayscale)
Found Platform
Platform Name: Xilinx
INFO: Device found - edge
Loading: '/usr/bin/xclbin/resize_krnl.xclbin'
Found Platform
Platform Name: Xilinx
INFO: Device found - edge
Loading: '/usr/bin/xclbin/resize_krnl.xclbin'

ORB Extractor Parameters: 
- Number of Features: 1000
- Scale Levels: 8
- Scale Factor: 1.2
- Initial Fast Threshold: 20
- Minimum Fast Threshold: 7

-------
Start processing sequence ...
Images in the sequence: 798

-------

median tracking time: 0.148386
mean tracking time: 0.148938

Saving keyframe trajectory to KeyFrameTrajectory.txt ...

trajectory saved!

real    2m25.290s
user    2m20.827s
sys 0m5.976s
root@ultra96v2-zynqmp:~# cat KeyFrameTrajectory.txt 
root@ultra96v2-zynqmp:~# 

2021年4月14日水曜日

ultra96v2上でorb_slam2をtum datasetで動作させてみた話

ultra96v2上でorb_slam2のaccelerationを行う前に、 評価のためのtum datasetを準備して使ってみた話。

環境

  • ubuntu:20.04
  • vitis:2020.2
  • yocto:zeus(https://github.com/akira-nishiyama/petalinux-ros2-manifests feature-v2020.2ブランチ)
  • board:ultra96v2(https://github.com/akira-nishiyama/ultra96v2_4z.git feature-v2020.2ブランチ)

準備

vivadoプロジェクト(これまでから変更なし)

source <vivado_installation_path>/setup.sh
source ~/vivado_cmake_helper/setup.sh
https://github.com/akira-nishiyama/ultra96v2_4z.git -b feature-v2020.2
cd ultra96v2_4z
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=~/<xsa-path> -GNinja
cmake --build .
ninja install

petalinux(tum datasetを/home/rootに追加。emulationの簡素化のため)

cd <petalinux-project-path>
repo init -u http://github.com/akira-nishiyama/petalinux-ros2-manifests -b feature-rel-v2020.2
repo sync

local.confを変更してxsaを指定する

HDF_EXT_ultra96v2-zynqmp = "xsa"
HDF_BASE_ultra96v2-zynqmp = "file://"
HDF_PATH_ultra96v2-zynqmp = "<xsa-file-path>/<yourdesign.xsa>"
QB_TAP_OPT_forcevariable = "-netdev tap,id=net0,ifname=tap0"
cd <petalinux-project-path>
source setupsdk
MACHINE=ultra96v2-zynqmp bitbake petalinux-image-minimal-ultra96v2ros2
MACHINE=ultra96v2-zynqmp bitbake petalinux-image-minimal-ultra96v2ros2 -c do_populate_sdk
tmp/deploy/sdk/petalinux-glibc-x86_64-petalinux-image-minimal-ultra96v2ros2-aarch64-ultra96v2-zynqmp-toolchain-2020.2.sh -d <sdk-installation-path>

<sdk-installation-path>/sysroots/x86_64-petalinux-linux/usr/share/cmake/OEToolchainConfig.cmakeを次の通り編集する

set( CMAKE_FIND_ROOT_PATH "\$ENV{OECORE_TARGET_SYSROOT};\$ENV{OECORE_NATIVE_SYSROOT}" )

<sdk-installation-path>sysroots/aarch64-xilinx-linux/usr/share/fastrtps/cmake/fastrtps-targets.cmakeを修正する。

set_target_properties(fastrtps PROPERTIES
  INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include"
  INTERFACE_LINK_LIBRARIES "fastcdr;foonathan_memory;-lpthread;dl;$ENV{OECORE_TARGET_SYSROOT}/usr/lib/libtinyxml2.so;\$<\$<BOOL:1>:OpenSSL::SSL\$<SEMICOLON>OpenSSL::Crypto>;\$<\$<BOOL:>:iphlpapi\$<SEMICOLON>Shlwapi>"
)

sw_emu

build

git clone https://github.com/akira-nishiyama/orb_slam_2_ros.git -b feature-fpga
source <vitis-installation-path>/settings64.sh
source <sdk-installation-path>/environment-setup-aarch64-xilinx-linux
export AMENT_PREFIX_PATH=$OECORE_NATIVE_SYSROOT/usr:$OECORE_TARGET_SYSROOT/usr
export PYTHONPATH=$OECORE_NATIVE_SYSROOT/usr/lib/python3.7/site-packages:$OECORE_TARGET_SYSROOT/usr/lib/python3.7/site-packages
cmake .. -DCMAKE_INSTALL_SO_NO_EXE=0 -DBUILD_TESTING=OFF -DCMAKE_NO_SYSTEM_FROM_IMPORTED=1 -GNinja -DCMAKE_INSTALL_PREFIX=<path-to-sd-card-root>/usr -DPLATFORM_COMPONENTS_PATH=<path-to-platform-components> -DBUILD_TEST_TARGETS=ON -DBUILD_TARGET=sw_emu
ninja -j4

run

エミュレータを起動する

cd hw/hw_link/package_sw_emu/
source /opt/Xilinx/Vitis/2020.2/settings64.sh
./launch_sw_emu.sh -pid-file emulation.pid -no-reboot -forward-port 1440 1534 -forward-port 2222 22

テストプログラムを/home/rootに転送する

scp -P 2222 ./orb_slam2_ros_mono_tum_test root@localhost:/home/root

ultra96上でテストプログラムを実行する

./orb_slam2_ros_mono_tum_test /usr/share/orb_slam2_ros/orb_slam2/Vocabulary/ORBvoc.txt ./tum-dataset/

result

ログは以下の通り。遅いせいかKeyFrameが全然認識できていない。 実機の評価は別の機会にしてopencl化して改善できるかはこれから試す。

ORB-SLAM2 Copyright (C) 2014-2016 Raul Mur-Artal, University of Zaragoza.
This program comes with ABSOLUTELY NO WARRANTY;
This is free software, and you are welcome to redistribute it
under certain conditions. See LICENSE.txt.

OpenCV version : 3.4.3
Major version : 3
Minor version : 4
Subminor version : 3
Input sensor was set to: Monocular

Loading ORB Vocabulary.
Vocabulary loaded!


Camera Parameters: 
- fx: 517.306
- fy: 516.469
- cx: 318.643
- cy: 255.314
- k1: 0.262383
- k2: -0.953104
- k3: 0.002628
- p1: 1.16331
- p2: -0.005358
- fps: 30
- bf: 0
- color order: RGB (ignored if grayscale)

ORB Extractor Parameters: 
- Number of Features: 1000
- Scale Levels: 8
- Scale Factor: 1.2
- Initial Fast Threshold: 20
- Minimum Fast Threshold: 7

-------
Start processing sequence ...
Images in the sequence: 798

-------

median tracking time: 1.5039
mean tracking time: 1.74812

Saving keyframe trajectory to KeyFrameTrajectory.txt ...

trajectory saved!

2021年4月7日水曜日

Vitis 2020.2でVitis LIbraryのresize_accelを試してみた話

resize_accelのテストをしたときのメモ。

環境

  • ubuntu:20.04
  • vitis:2020.2
  • yocto:zeus(https://github.com/akira-nishiyama/petalinux-ros2-manifests feature-v2020.2ブランチ)
  • board:ultra96v2(https://github.com/akira-nishiyama/ultra96v2_4z.git feature-v2020.2ブランチ)

sw_emu

ビルド

以下のコマンドで必要なデータ生成される。 cmakeの-DBUILD_TARGETをhw_emuにするとハードウェアエミュレーション、hwにすると実機用のデータが生成される。 はacceleration platformを作成するのに必要なファイルを保存しているパス。 必要に応じて置き換えること。 cmakeを実行するとどのように期待しているかのメッセージが表示されるので参考にすること。

git clone https://github.com/akira-nishiyama/orb_slam_2_ros.git -b feature-resize-accel
source <path-to-sdk>/environment_setup
source /opt/Xilinx/Vitis/2020.2/settings64.sh
cd orb_slam_2_ros/orb_slam2
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_SO_NO_EXE=0 -DBUILD_TARGET=sw_emu -DPLATFORM_COMPONENTS_PATH=<path-to-components-required-files> -DBUILD_TEST_TARGETS=ON -GNinja
make -j4

実行

cd hw_link/package_sw_emu/
source /opt/Xilinx/Vitis/2020.2/settings64.sh
./launch_sw_emu.sh -pid-file emulation.pid -no-reboot -forward-port 1440 1534 -forward-port 2222 22

ターミナル起動後は次のコマンドを実行する。 デバッグが必要な場合はvitis -debugでxf_resize_tbを起動する。

root@ultra96v2-zynqmp:~# cd /mnt/sd-mmcblk0p1/
root@ultra96v2-zynqmp:/mnt/sd-mmcblk0p1# export XCL_EMULATION_MODE=sw_emu
root@ultra96v2-zynqmp:/mnt/sd-mmcblk0p1# mkdir xclbin
root@ultra96v2-zynqmp:/mnt/sd-mmcblk0p1# cp binary_container_2_sw_emu.xclbin xclbin/krnl_resize.sw_emu.avnet_com_av_ULTRA96V2_1_0.xclbin

profile結果が得られるようにxrt.iniを作成する。

root@ultra96v2-zynqmp:/mnt/sd-mmcblk0p1# vi xrt.ini
[Debug] 
profile=true
timeline_trace=true
trace_buffer_size=1M

結果

root@ultra96v2-zynqmp:/media/sd-mmcblk0p1# ./xf_resize_tb 128x128_1.png 64 64
INFO: Running OpenCL section.
Found Platform
Platform Name: Xilinx
INFO: Device found - avnet_com_av_ULTRA96V2_1_0
XCLBIN File Name: krnl_resize
INFO: Importing xclbin/krnl_resize.sw_emu.avnet_com_av_ULTRA96V2_1_0.xclbin
Loading: 'xclbin/krnl_resize.sw_emu.avnet_com_av_ULTRA96V2_1_0.xclbin'
36905.7ms
    Minimum error in intensity = 0
    Maximum error in intensity = 1
    Percentage of pixels above error threshold = 0
Test Passed 
The maximum depth reached by any of the 4 hls::stream() instances in the design is 16384
root@ultra96v2-zynqmp:/mnt/sd-mmcblk0p1# 

プロファイルの結果は次のようにして取得可能。 vitis -debugで実行した場合は自動的に取得される。

mkdir report_sw_emu
scp -P 2222 root@localhost:/mnt/sd-mmcblk0p1/xclbin.run_summary ./report_sw_emu
scp -P 2222 root@localhost:/mnt/sd-mmcblk0p1/profile_summary.csv ./report_sw_emu
scp -P 2222 root@localhost:/mnt/sd-mmcblk0p1/timeline_trace.csv ./report_sw_emu
vitis_analyzer report_sw_emu


hw_emu

ビルド

sw_emu実行後にリポジトリのtopから開始する。

cd orb_slam_2_ros/orb_slam2/build
cmake .. -DCMAKE_INSTALL_SO_NO_EXE=0 -DBUILD_TARGET=hw_emu -DPLATFORM_COMPONENTS_PATH=<path-to-components-required-files> -DBUILD_TEST_TARGETS=ON
make -j4

実行

cd hw_link/package_hw_emu/
./launch_hw_emu.sh -pid-file emulation.pid -no-reboot -forward-port 1440 1534 -forward-port 2222 22

ターミナル起動後は次のコマンドを実行する。 デバッグが必要な場合はvitis -debugでxf_resize_tbを起動する。

root@ultra96v2-zynqmp:~# cd /mnt/sd-mmcblk0p1/
root@ultra96v2-zynqmp:/mnt/sd-mmcblk0p1# export XCL_EMULATION_MODE=hw_emu
root@ultra96v2-zynqmp:/mnt/sd-mmcblk0p1# mkdir xclbin
root@ultra96v2-zynqmp:/mnt/sd-mmcblk0p1# cp binary_container_2_hw_emu.xclbin xclbin/krnl_resize.hw_emu.edge.xclbin

profile結果が得られるようにxrt.iniを作成する。

root@ultra96v2-zynqmp:/mnt/sd-mmcblk0p1# vi xrt.ini
[Debug] 
profile=true
timeline_trace=true
trace_buffer_size=1M

結果

root@ultra96v2-zynqmp:/mnt/sd-mmcblk0p1# ./xf_resize_tb 128x128_1.png 64 64
INFO: Running OpenCL section.
Found Platform
Platform Name: Xilinx
[  257.173751] [drm] Pid 1124 opened device
INFO: Device found - edge
XCLBIN File Name: krnl_resize
INFO: Importing xclbin/krnl_resize.hw_emu.edge.xclbin
Loading: 'xclbin/krnl_resize.hw_emu.edge.xclbin'
[  258.218452] [drm] get section DEBUG_IP_LAYOUT err: -22 
[  258.224260] [drm] get section AIE_METADATA err: -22 
[  258.230851] [drm] zocl_xclbin_read_axlf ad3f6288-9ebf-40e2-b7d2-da7e0ef9d155 ret: 0
[  258.329375] [drm] bitstream ad3f6288-9ebf-40e2-b7d2-da7e0ef9d155 locked, ref=1
[  258.339355] [drm] No ERT scheduler on MPSoC, using KDS
[  258.454364] [drm] scheduler config ert(0)
[  258.456924] [drm]   cus(1)
[  258.468834] [drm]   slots(16)
[  258.469260] [drm]   num_cu_masks(1)
[  258.469485] [drm]   cu_shift(16)
[  258.473936] [drm]   cu_base(0x80010000)
[  258.474516] [drm]   polling(0)
[  258.480007] [drm] bitstream ad3f6288-9ebf-40e2-b7d2-da7e0ef9d155 unlocked, ref=0
21509.8ms
    Minimum error in intensity = 0
    Maximum error in intensity = 1
    Percentage of pixels above error threshold = 0
Test Passed 
[  258.647570] [drm] bitstream ad3f6288-9ebf-40e2-b7d2-da7e0ef9d155 locked, ref=1
[  280.899806] [drm] bitstream ad3f6288-9ebf-40e2-b7d2-da7e0ef9d155 unlocked, ref=0
[  281.437319] [drm] Pid 1124 closed device
root@ultra96v2-zynqmp:/mnt/sd-mmcblk0p1#

プロファイルの結果は次のようにして取得可能。 vitis -debugの場合は自動的に取得される。

mkdir report_hw_emu
scp -P 2222 root@localhost:/mnt/sd-mmcblk0p1/binary_container_1_hw_emu.xclbin.run_summary ./report_hw_emu
scp -P 2222 root@localhost:/mnt/sd-mmcblk0p1/profile_summary.csv ./report_hw_emu
scp -P 2222 root@localhost:/mnt/sd-mmcblk0p1/timeline_trace.csv ./report_hw_emu
vitis_analyzer report_hw_emu


hw

ビルド

sw_emu実行後にリポジトリのtopから開始する。

cd orb_slam_2_ros/orb_slam2/build
cmake .. -DCMAKE_INSTALL_SO_NO_EXE=0 -DBUILD_TARGET=hw -DPLATFORM_COMPONENTS_PATH=<path-to-components-required-files> -DBUILD_TEST_TARGETS=ON -GNinja
make -j4

実行

引っ越しのために実機は梱包しているので未実施。

2021年1月30日土曜日

Vitis 2020.2でvector additionサンプルをコマンドラインからライブラリとしてビルドできるようにしてデバッグ方法を確認した

vector additionサンプルをコマンドラインからライブラリとしてビルドできるようにしてデバッグ方法を確認した話。

環境

  • ubuntu:20.04
  • vitis:2020.2
  • yocto:zeus(https://github.com/akira-nishiyama/petalinux-ros2-manifests feature-v2020.2ブランチ)
  • board:ultra96v2(https://github.com/akira-nishiyama/ultra96v2_4z.git feature-v2020.2ブランチ)

ビルド方法

githubにvadd_lib_sampleリポジトリを用意するので、 xsaとboot componentを用意してsdカードのパスを確認して以下の通り実行すればok。なお、サンプルはVitis-Tutorialsを参考にさせてもらっている。

git clone https://github.com/akira-nishiyama/vitis_library_compilation_sample.git
cd vitis_library_compilation_sample

platform設定は用意したxsaとboot componentに合わせて修正が必要。 guiでプラットフォーム作るときと同じようにパスを指定すれば良い。

  • platform/platform.tcl
platform create -name {ultra96v2_platform}\
-hw {/home/akira/work/ultra96v2/xsa_dir/ultra96v2_4z/ultra96v2_4z.xsa}\
-proc {psu_cortexa53} -os {linux} -arch {64-bit} -no-boot-bsp -fsbl-target {psu_cortexa53_0} -out {.}

platform write
platform active {ultra96v2_platform}
domain config -bif {/home/akira/work/ultra96v2/vitis_args/linux.bif}
platform write
domain config -boot {/home/akira/work/ultra96v2/boot}
platform write
domain config -image {/home/akira/work/ultra96v2/boot}
platform write
domain config -rootfs {/home/akira/work/ultra96v2/petalinux/build/tmp/deploy/images/ultra96v2-zynqmp/petalinux-image-minimal-ultra96v2ros2-ultra96v2-zynqmp.ext4}
platform write
domain config -sysroot {/home/akira/work/ultra96v2/sdk/sysroots/aarch64-xilinx-linux}
platform write
domain config -qemu-data {/home/akira/work/ultra96v2/vitis_args}
platform write
domain config -qemu-data {/home/akira/work/ultra96v2/boot}
platform write
domain config -qemu-args {/home/akira/work/ultra96v2/vitis_args/qemu_args.txt}
platform write
domain config -pmuqemu-args {/opt/Xilinx/Vitis/2020.2/data/emulation/platforms/zynqmp/sw/a53_linux/qemu/pmu_args.txt}
platform write
domain config -pmuqemu-args {/home/akira/work/ultra96v2/vitis_args/pmu_args.txt}
platform write
domain config -qemu-data {/home/akira/work/ultra96v2/petalinux/build/tmp/deploy/images/ultra96v2-zynqmp}
platform write
platform generate

<sd-device>,<sd-device-root>は環境に合わせて指定すること。

source <vitis-installation-path>/settings.sh
source <sdk-installation-path>/environment-setup-aarch64-xilinx-linux
export PATH_TO_SD=<path-to-sd>
mkdir build
cd build
cmake .. -DBUILD_TARGET=hw
sudo dd if=hw_link/package_hw/sd_card.img of=<sd-device>
mkdir rootfs
sudo mount <sd-device-root> rootfs
sudo cp host/test_vecadd rootfs/home/root
sudo cp hw_link/binary_container_2_hw.xclbin rootfs/home/root
sudo cp host/libvecadd.so rootfs/usr/lib

sdをultra96v2に挿して起動後、次のコマンドを実行するとTEST PASSEDの文字が確認できる。

# ./vecadd_test binary_container_2_hw.xclbin 
Loading: 'binary_container_2_hw.xclbin'
TEST PASSED

また、BUILD_TARGETをsw_emu,hw_emuとするとbuild配下のhw_link/package_sw_emuやhw_link/package_hw_emuにエミュレーション用のファイル出来上がるので、それぞれのフォルダでterminalを2つ用意し、次の通り実行するとデバッグ可能。(https://japan.xilinx.com/html_docs/xilinx2020_1/vitis_doc/debugappproj.html#rme1587072841352)

なお、実行に際してはxrt.iniを自分で用意する必要がある。(https://www.xilinx.com/html_docs/xilinx2020_2/vitis_doc/obl1532064985142.html)

[Debug] 
profile=true
timeline_trace=true
trace_buffer_size=1M

ライブラリのパスをどうやって解決しているのかはよくわからない。

sw_emu

build/package_sw_emuに移動して次のコマンドを実行する。

  • terminal1
./launch_sw_emu.sh -pid-file emulation.pid -no-reboot -forward-port 1440 1534

ログインプロンプトが表示されたら次のコマンドを実行する。 デバッグしないなら/mnt/sd-mmcblk0p1においてあるテストプログラムを実行すれば結果が得られる。 ただし、export XCL_EMULATION_MODE=sw_emuの実行(xrt.iniに書いても可かも)と、libvecadd.soを/usr/libにコピーする必要がある。

  • terminal2
vitis -debug -flow embedded_accel -target sw_emu -exe ../../host/vecadd_test -program-args binary_container_2_sw_emu.xclbin -kernels vadd

実行後、vitisが立ち上がるので、vaddにブレークポイントを設定する。


 

メニューからFile->Open fileしてline break pointを指定しても良い。


 

実行するとbreak pointにひっかかる。


 

無事に終了。


 

profileデータなどはbuild/package_sw_emu/reportに保存されるのでvitis_analyzerで開けば確認できる。

vitis_analyzer reports



hw_emu

build/package_hw_emuに移動して次のコマンドを実行する。 -sim-guiは波形でバッグしない場合は不要。

  • terminal1
./launch_hw_emu.sh -pid-file emulation.pid -sim-gui -no-reboot -forward-port 1440 1534

ログインプロンプトが表示されたら次のコマンドを実行する。 デバッグしないなら/mnt/sd-mmcblk0p1においてあるテストプログラムを実行すれば結果が得られる。

  • terminal2
vitis -debug -flow embedded_accel -target hw_emu -exe ../../host/vecadd_test -program-args binary_container_2_hw_emu.xclbin -kernels vadd

メニューからFile->Open fileしてline break pointを指定できる。 HWカーネルはCソースレベルではブレークできないようだが、 vivado_simと同じ使い方でブレークさせることは可能そう。


 

構成

まず、vitisのembedded accelerationはplatform部と、host部と、hw_kernel部と、hw_link部に分けることができる。

platformは必要なファイルを集めて固定のshell部分を作っている。

host部はクロスコンパイラを使用してxilinxopencl,pthread,rt,stdc++,gmp,xrt_coreとリンクすれば良い。インクルードディレクトリはsdkの環境セットアップすれば解決される。通常のC++などと同じに扱えるのでライブラリはそれで作成可能。 (https://japan.xilinx.com/html_docs/xilinx2020_1/vitis_doc/debugappproj.html#rme1587072841352)

hw_kernel部はv++ -cを動作させて.xoを作成している。

hw_link部ではv++ -lで.xoを必要な個数接続している。また、パッケージ化もついでに行っている。