🐡

Kria Robotics Stack(ROS2をFPGAで動かす)

2022/03/13に公開

はじめに

前回動かしてみたvadd_publisherについて、今回はもう少し詳しく見ていこうと思います。

colcon について

colconはソフトウェアパッケージのセットをビルドするためのコマンドラインツールになります。ROS2パッケージをビルドする際にもcolconが使われます。
Kria Robotics Stack(KRS)では、FPGAハードウェアアクセラレーションフローをROS2 CLIツールに統合し、それを管理するためにcolcon accelerationのビルドツール拡張がなされています。

select

selectはFPGAアクセラレーションのファームウエアを選択するコマンドになります。

colcon acceleration select kv260

選択されるファームウエアはcolcon build --merge-installで生成されたkrs_ws/acceleration/firmware/kv260ディレクトリ内にあります。

list

selectで選択されているファームウエアを確認するコマンドになります。
以下の例ではkv260のファームウエアが選択されていることを示しています。

colcon acceleration list
kv260*

ここではkv260の1種類しかファームウエアがありませんが、他のデバイスや異なるバージョンなど複数のファームウエアの管理・選択ができるようになります。

linux

ファームウェアによって生成されたSDカードのRAWイメージに、Linuxカーネル(イメージファイル、ブートスクリプト、デバイスツリーなど)を設定して、sd_card.imgファイルにまとめます。

colcon acceleration linux vanilla --install-dir install-kv260

doublevadd_publisher をCPUで動かす

前回vadd_publisherを試し、10Hzでループ動作することを確認しました。
次はdoublevadd_publisherで試してみます。
こちらのコードは以下に示す通り2重ループ構造を取り、vadd_publisherと比較して演算量が増えていることが確認できます。

#define DATA_SIZE 4096
// TRIPCOUNT identifier
const int c_size = DATA_SIZE;

extern "C" {
    void vadd(
            const unsigned int *in1,  // Read-Only Vector 1
            const unsigned int *in2,  // Read-Only Vector 2
            unsigned int *out,        // Output Result
            int size                  // Size in integer
            )
    {
        for (int j = 0; j < size; ++j) {  // stupidly iterate over
                                          // it to generate load
        #pragma HLS loop_tripcount min = c_size max = c_size
            for (int i = 0; i < size; ++i) {
            #pragma HLS loop_tripcount min = c_size max = c_size
              out[i] = in1[i] + in2[i];
            }
        }
    }
}

[補足] #pragma HLS loop_tripcountはFPGA高位合成のプラグマで、ループ反復回数が変数で不定だとコンパイラが最適化できないので、明示的に最大値を指定してあげる事で最適化度合を判断させるために必要。

こちらを前回と同じ手順でビルドしてKV260で動かしてみます。

# 設定
cd ~/krs_ws
source /tools/Xilinx/Vitis/2021.2/settings64.sh
source /opt/ros/rolling/setup.bash
source install/setup.bash
colcon build --merge-install
colcon acceleration select kv260

# ビルド
colcon build --build-base=build-kv260 --install-base=install-kv260 --merge-install --mixin kv260 --packages-select ament_vitis ament_acceleration doublevadd_publisher tracetools_acceleration adaptive_component vitis_common

# SDカードイメージ作成
colcon acceleration linux vanilla --install-dir install-kv260

Etcherを立ち上げて~/krs_ws/acceleration/firmware/kv260/sd_card.imgをSDカードに書き込みます。SDカードをKV260に差し込み、USB/UART/JTAG FTDIアダプターを介してKV260評価ボードとコンピューターを接続し、電源を入れます。
PetaLinuxにログインして、

PetaLinux 2021.2 xilinx-k26-som-2021_2 ttyPS1

xilinx-k26-som-2021_2 login: petalinux
You are required to change your password immediately (administrator enforced)
New password:
Retype new password:

doublevadd_publisherプログラムを起動します。

source /usr/bin/ros_setup.bash
. /krs_ws/local_setup.bash
ros2 topic hz /vector --window 10 &
ros2 run doublevadd_publisher doublevadd_publisher

結果は以下の通りとなります。
vadd_publisherはaverage_rate=10Hzで処理できていたのに対し、doublevadd_publisherは演算量が増えているためもちろんaverage_rate=2.2Hzと遅くなっていることが分かります。

doublevadd_publisher をFPGAで動かす

doublevadd_publisherをFPGAで動かしていきます。
サンプルコードは~/krs_ws/src/acceleration/acceleration_examples/nodes/offloaded_doublevadd_publisherにあります。CMakeLists.txtの以下のスクリプトのTYPEの項目をhwに設定することでFPGAアクセサレーションでビルドしてくれるみたいです。

  # vadd kernel
  vitis_acceleration_kernel(
    NAME vadd_offloaded
    FILE src/vadd.cpp
    CONFIG src/kv260.cfg
    INCLUDE
      include
    TYPE
      # sw_emu
      # hw_emu
      hw
    LINK
    PACKAGE
  )

今回ビルド時にバックグラウンドでHLSを動かしますが、IP生成時に問題が発生するために以下のページを参考にパッチを事前にあてておきます。
https://support.xilinx.com/s/article/76960?language=ja

パッチをあてたらビルドしてみます。

# 設定
source /tools/Xilinx/Vitis/2021.2/settings64.sh
source /opt/ros/rolling/setup.bash
export PATH="/usr/bin":$PATH
colcon build --merge-install
source install/setup.bash
colcon acceleration select kv260

# ビルド
colcon build --build-base=build-kv260 --install-base=install-kv260 --merge-install --mixin kv260 --packages-select ament_acceleration ament_vitis vitis_common ros2acceleration offloaded_doublevadd_publisher

そうするとHLS合成でエラーが出ます。エラー内容を確認します。

more ~/krs_ws/build-kv260/offloaded_doublevadd_publisher/v++_vadd_offloaded.log
・・・
****** vpl v2021.2 (64-bit)
  **** SW Build 3363252 on 2021-10-14-04:41:01
    ** Copyright 1986-2020 Xilinx, Inc. All Rights Reserved.

INFO: [VPL 60-839] Read in kernel information from file '/home/kino/krs_ws/build-kv260/offloaded_doublevadd_publisher/_x/link/int/kernel_
info.dat'.
INFO: [VPL 60-423]   Target device: kv260_custom_platform
INFO: [VPL 60-1032] Extracting hardware platform to /home/kino/krs_ws/build-kv260/offloaded_doublevadd_publisher/_x/link/vivado/vpl/.loca
l/hw_platform
[01:01:30] Run vpl: Step create_project: Started
Creating Vivado project.
[01:01:33] Run vpl: Step create_project: Failed
[01:01:33] Run vpl: FINISHED. Run Status: create_project ERROR
ERROR: [VPL 60-773] In '/home/kino/krs_ws/build-kv260/offloaded_doublevadd_publisher/_x/link/vivado/vpl/vivado.log', caught Tcl error:  E
RROR: [Board 49-71] The board_part definition was not found for xilinx.com:k26c:part0:1.1. The project's board_part property was not set,
 but the project's part property was set to xck26-sfvc784-2LV-c. Valid board_part values can be retrieved with the 'get_board_parts' Tcl 
command. Check if board.repoPaths parameter is set and the board_part is installed from the tcl app store.
ERROR: [VPL 60-704] Integration error, Failed to rebuild a project required for hardware synthesis. The project is 'prj'. The rebuild scr
ipt is '.local/hw_platform/prj/rebuild.tcl'. The rebuild script was delivered as part of the hardware platform. Consult with the hardware
 platform provider to investigate the rebuild script contents. An error stack with function names and arguments may be available in the '
vivado.log'.
ERROR: [VPL 60-1328] Vpl run 'vpl' failed
・・・

見るとboard_part definition was not found for xilinx.com:k26c:part0:1.1. とあり、ボードファイルが無い事が原因のようです。
Githubからボードファイルをダウンロードしてきます。ただし今回必要なのはk26c/1.1のボードファイルであり、リビジョン2021.1にしか無いので、こちらからダウンロードしてみます。
https://github.com/Xilinx/XilinxBoardStore/blob/master/boards/Xilinx/k26c/1.1/part0_pins.xml

ダウンロード完了したら、k26csom240のボードファイルをVivadoのボードファイルディレクトリにコピーします。

unzip XilinxBoardStore-2021.1.zip
sudo cp -r ./XilinxBoardStore-2021.1/boards/Xilinx/k26c/1.1 /tools/Xilinx/Vivado/2021.2/data/xhub/boards/XilinxBoardStore/boards/Xilinx/k26c/
sudo cp -r ./XilinxBoardStore-2021.1/boards/Xilinx/som240 /tools/Xilinx/Vivado/2021.2/data/xhub/boards/XilinxBoardStore/boards/Xilinx/

この状態でもう一度ビルドをしてみます。そうするとビルドが成功します。

colcon build --build-base=build-kv260 --install-base=install-kv260 --merge-install --mixin kv260 --packages-select ament_acceleration ament_vitis vitis_common ros2acceleration offloaded_doublevadd_publisher

・・・・
[Processing: offloaded_doublevadd_publisher]                                   
[Processing: offloaded_doublevadd_publisher]                                   
[Processing: offloaded_doublevadd_publisher]                                   
[Processing: offloaded_doublevadd_publisher]                                   
[Processing: offloaded_doublevadd_publisher]                                   
[Processing: offloaded_doublevadd_publisher]                                   
[Processing: offloaded_doublevadd_publisher]                                   
[Processing: offloaded_doublevadd_publisher]                                     
[Processing: offloaded_doublevadd_publisher]                                     
[Processing: offloaded_doublevadd_publisher]                                     
Finished <<< offloaded_doublevadd_publisher [11min 50s]
Summary: 5 packages finished [11min 52s]

BOOT.BINを生成し、SDカードイメージを作成します。
生成されたsd_card.imgをEtcherでSDカードに書き込みます。

cd ~/krs_ws/build-kv260/offloaded_doublevadd_publisher
bootgen -arch zynqmp -image vadd_offloaded.bif -o ./package/BOOT.BIN
cd ~/krs_ws
colcon acceleration linux vanilla --install-dir install-kv260

KV260にSDカードを挿して起動します。ターミナルソフトからdoublevadd_publisherを実行します。offloaded_doublevadd_publisherのMAIN関数で読み込むXCLBINファイル名がvadd.xclbinに指定されていますが、実際にはvadd_offloaded.xclbinという名前で生成されているので、vadd.xclbinという名前でファイルのコピーを作っておきます。

sudo su
source /usr/bin/ros_setup.bash
. /krs_ws/local_setup.bash
ros2 acceleration stop; ros2 acceleration start
ros2 acceleration list
ros2 acceleration select offloaded_doublevadd_publisher

cd /krs_ws/lib/offloaded_doublevadd_publisher
cp vadd_offloaded.xclbin vadd.xclbin
ros2 topic hz /vector_acceleration --window 10 &
ros2 run offloaded_doublevadd_publisher offloaded_doublevadd_publisher

実行結果は以下の通りとなります。

今回はdoublevadd_publisherをFPGAにオフロードして実行しました。
CPU処理するdoublevadd_publisherのaverage_rate=2.2Hzに対し、doublevadd_publisherではのaverage_rate=2.115Hzと処理速度が低下する結果となります。
性能を出すためにはFPGA動作周波数アップや並列化の最適化が必要になってくるようです。
次回、そちらについて見ていきたいと思います。

Discussion