Custom Meta Tags
2503 Hero Banner

AMD製品に関連する技術ブログ

Long Copy

ROS2 Multi-Node Communications via TSNを動かしてみた!

2023-04-03

Static HTML

皆さん、こんにちは。「ノリさん」です!
今回はKria KR260によるTSNのアプリケーションを動作させていきます。

 

Step0:ハードウェア要件

 

ハードウェア要件(KR260の付属品以外は全て別売り)

 

 

Step1:ボードのセットアップ・アプリケーションのインストール

 

Ubuntuイメージを次のURLからダウンロードし、SDカードに書き込みます。
https://ubuntu.com/download/amd-xilinx

 

図 1. KR260のイメージ

 

図1のJ11にSDカードを差し込みます。

データ転送をサポートする USB-A - micro-B ケーブル をJ4 及びPCに接続し、PuttyやTeraTermなどを立ち上げてシリアル通信ができるようにしておきます。
OSごとに細かな設定方法が異なるので、下記もご参照ください。
https://www.xilinx.com/products/som/kria/kr260-robotics-starter-kit/kr260-getting-started/booting-your-starter-kit.html target=

イーサネット ケーブルをJ10に差し込み、ルータと接続してインターネットに接続できるようにします。

電源をJ12に接続し、Ubuntuを起動させます。

ユーザー名と初期パスワードは共にubuntuです。

sudo 実行時にパスワードの変更を求められるので、変更します。

システムのタイムゾーンとロケールを設定します。

$ sudo timedatectl set-ntp true
$ sudo timedatectl set-timezone Asia/Tokyo
$ timedatectl
$ sudo locale-gen en_US en_US.UTF-8
$ sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
$ export LANG=en_US.UTF-8
$ locale

デモアプリケーションのアーカイブを追加します。

$ sudo add-apt-repository ppa:xilinx-apps
$ sudo add-apt-repository ppa:ubuntu-xilinx/sdk
$ sudo apt update
$ sudo apt upgrade

再起動します。

$ sudo reboot

最新の xrt zocl ドライバーをインストールします。

$ sudo apt install xrt-dkms

ファームウェア バイナリをインストールし、dfx-mgr を再起動します。

新しいパッケージまたは更新されたパッケージをインストールするように求められたら、y を入力します。

$ sudo apt install xlnx-firmware-kr260-tsn-rs485pmod
$ sudo systemctl restart dfx-mgr.service

依存関係とアプリケーションをインストールします。

$ sudo apt install xlnx-app-kr260-pmod-rs485-test
$ sudo apt install xlnx-app-kr260-tsn-examples

環境変数に次のパスを追加します。
(このコマンドを~/.bashrc に書きこめば、毎回実行する手間を省けます。)

$ export PATH=${PATH}:/opt/xilinx/pmod-rs485-test/bin/
$ export PATH=${PATH}:/opt/xilinx/tsn-examples/bin/

ROS2 humble とROS2 アプリケーションをインストールします。(KR260 2台での通信を行う場合のみ)

$ sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
$ echo "deb [arch=arm64 signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2-testing/ubuntu jammy main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install ros-humble-ros-base
$ mkdir -p ~/Downloads
$ wget https://github.com/Xilinx/ros-tsn-pubsub/releases/download/v0.1/ros-humble-xlnx-pubsub_0.1.0-0jammy_arm64.deb -P ~/Downloads/
$ sudo apt install ~/Downloads/ros-humble-xlnx-pubsub_0.1.0-0jammy_arm64.deb

アプリケーション パッケージを読み込みます。 (*1)

$ sudo xmutil unloadapp
$ sudo xmutil loadapp kr260-tsn-rs485pmod

 

 

Step2: ボックス アプリケーションの実行1(KR260とワークステーションとの通信)

 

ワークステーションとボードの構成

 

ワークステーション上のコマンドは青字で表記します。

ワークステーションの電源を入れ、ログインします。

インターフェース名を確認し、結果をテキストファイルに書き込みます。(*2)

$ ifconfig

ワークステーションをシャットダウンします。

ワークステーションにネットワークアダプタを差し込み、図2のようにワークステーションとKR260を接続します。

 

図 2. ワークステーションとKR260の接続図

 

ワークステーションの電源を入れ、ログインします。

ワークステーションに必要なツールをインストールします。

$ sudo apt install ethtool
$ sudo apt install linuxptp

インターフェース名を確認し、結果をテキストファイルに書き込みます。 (*3)

$ ifconfig

*2 と *3 とで差分を取り、ネットワークアダプタがどのインターフェースに対応しているか確認します。

enp1s0といったように表示されているものが該当します 。(*4)

下記のコマンドで、PTP通信可能であるかを確認します。

$ ethtool -T <*4 で確認したインターフェース>

PTP Hardware Clock: 0 が出力されていれば成功です。

KR260を起動してUbuntuを立ち上げ、ログインします。

*1 を参考に、アプリケーションパッケージを読み込みます。

KR260ボードインターフェイスのセットアップを行います。

$ source /usr/bin/net_setup.sh -b2

この時、ボード上で ifconfig をするとep.20 が確認できるので、IPアドレスなどの値をテキストファイルに書き込みます。今回の例であれば、inet 111.222.0.20 netmask 255.255.255.0 broadcast 111.222.0.255 のようになっている部分を書き込みます。

$ ifconfig

KR260とワークステーションのIPアドレスを合わせます。

$ ifconfig <*4 で確認したインターフェース> 111.222.0.100 netmask 255.255.255.0 broadcast 111.222.0.255

今回の例では、KR260のアドレスが、inet 111.222.0.20 netmask 255.255.255.0 broadcast 111.222.0.255だったため、ワークステーション側はずらして111.222.0.100 としてあります。

 

ネットワーク時刻同期 (PTP デモ)

 

このデモでは、KR260 をスレーブ、 ワークステーションをマスターとして、KR260 クロックをワークステーションのクロックと同期させます。

ワークステーションとボードの構成をまだ行っていない場合は、行います。

ワークステーション上で ptp4l を起動します。

$ sudo ptp4l -P -2 -H -i <*4 で確認したインターフェース> -m -f ptp4l_master.conf & ptplog &

使用可能な ptp デバイスが複数ある場合は、次の使用例に示すように、-p 引数で使用するデバイスを指定します。

$ sudo ptp4l -P -2 -H -i <*4 で確認したインターフェース> -p /dev/ptp1 -m -f ptp4l_master.conf >& ptplog &

スレーブクロックモードで KR260 で ptp を開始します。
ワークステーションでptp4lを起動していないと失敗するので、起動していない場合はします。

$ source /usr/bin/start_ptp.sh -s

出力結果を見ると、rms 値がクロックが同期していることを示す 1 桁の値まで下がっていくことが見てとれます。

 

図 3. ワークステーションとのクロック同期結果

 

 

Network Time Shaper 機能 (802.1Qbv デモ)

 

このデモでは、Scheduled Traffic (ST) および Best Effort Traffic(BE) にタイム スロットを割り当て、オシロスコープで可視化します。1ミリ秒のサイクル時間で、ST トラフィックは 700us 送信、BE トラフィックは 300us 送信されます。

基本的な設定はネットワーク時刻同期のデモと同じ なので、先にそちらを動かしておく。

ワークステーションにwiresharkをインストールします。

$ sudo apt install wireshark

デフォルトでは一般ユーザーに権限が付与されておらず、wiresharkをそのまま立ち上げることはできないので、一般ユーザーでもwiresharkが扱えるように権限を付与します。

$ sudo dpkg-reconfigure wireshark-common 
$ sudo usermod -a -G wireshark <ユーザー名>

 

Analog Discovery 2を用いる場合は、ワークステーションに Digilent Adept 及び Digilent Waveformsをインストールする必要があります。

https://store.digilentinc.com/digilent-adept-2-download-only/ のページ右側のRuntime- Latest Downloads から、adeptのdeb パッケージを選択してダウンロードします。

ダウンロード先のディレクトリでターミナルを開き、下記を実行する

$ sudo dpkg -i <ダウンロードしたadeptのdebファイル>

同様に、 https://digilent.com/reference/software/waveforms/waveforms-3/start の右側からwaveformsのdebパッケージをダウンロードし、インストールします。

$ sudo dpkg -i <ダウンロードしたwaveformsのdebファイル>

Waveformsの使い方については、公式ページをご参照ください。
https://digilent.com/reference/software/waveforms/waveforms-3/getting-started-guide

 

図2を参照して、Pmod TPH2が差さっていることを確認します。

KR260 の Test Pmod の GNDをオシロスコープのGND又はAnalog Discovery 2の黒いコードに接続します。

KR260 の Test Pmod の VCCをオシロスコープのGND又はAnalog Discovery 2の黒いコードに接続します。

KR260 の Test Pmod の P7 をオシロスコープの Channel1又はAnalog Discovery 2のオレンジのコードに接続します。

KR260 の Test Pmod の P9 をオシロスコープの Channel2又はAnalog Discovery 2の青いコードに接続します。

Analog Discovery 2を用いる場合は、ワークステーションのUSBポートとAnalog Discovery 2を接続しておきます。

 

図 4. Pmodとオシロスコープの接続イメージ

 

 

図 5. 実際にPmodとAnalog Discovery 2を接続した様子

 

Linux ホスト マシンで Wireshark を起動し、*4 で確認したインターフェースを選択してトラフィックデータを表示します。

$ wireshark &

KR260ボードからパケット送信開始、30秒間トーカーが実行されます。

オシロスコープで波形を観測すると、図6のような結果が得られます。

 

図 6. オシロスコープでの観測波形 1

 

Wiresharkのキャプチャ内に 2 つのパケット セットがあることを確認します。

1つのセットはパケット長 = 900 で、もう 1 つのセットはパケット長 = 800 となります。

 

図 7. Wiresharkでの観測結果1

 

長さ = 800 バイトのパケットをクリックし、vlan ID = 20、優先順位 (PCP/PRI = 1) を観察します。
ここで、PCP = 1 のパケットはBest Effort Trafficであることを示します。

 

図 8. Wiresharkでの観測結果 2

 

Wireshark トレースは、70% のScheduled Trafficと 30% のBest Effort Trafficのトラフィック分布を表しています。

 

 

RS485による通信と温度センサーでのデモ

 

図9、図10のように、Pmod RS485 と電源、及び KR260 を接続します。

 

図 9. Pmod RS485 とKR260との接続イメージ

 

 

図 10. 実際にPmod RS485 とKR260を接続した様子

 

電源を繋いだ際、温度センサーのLEDが表示されていることを確認します。
下の図の左側の部分にある、スイッチを押すと、温度と湿度の表示の切り替えができます。

 

図 11. センサーの表示結果

 

アプリケーションを実行します。

$ pmod-rs485-test

図12のように表示されます。温度と湿度の値はセンサーと概ね一致している必要があります。

 

図 12. Pmod-RS485-testアプリケーションの表示結果


 
センサー自体のエラーによって、誤った値が出力されることがあるので (3276.8 など)、そのような値が表示された場合は再実行します。

 

 

 

ボックス アプリケーションの実行2(KR260 2台での通信)

 

ボード 2台の構成

 

以降は、ボードのセットアップを行ったことを前提としているので、行っていない場合は行います。

Board1 の PL ETH1 (J10 上) から Board2 の PL ETH1 (J10 上) にイーサネット ケーブルを接続します。

両方のボードの JTAG/UART ポートを PC に接続します。

両方のボードの電源を入れ、Ubuntuを起動して、ログインします。

 

 

ボックス アプリケーションから TSN-ROS を実行する

 

*1 を参考に、アプリケーションパッケージを読み込みます。

シリアル ターミナルで次のコマンドを実行して、イーサネット ポートをセットアップします。

これにより、TSN スイッチ IP の EP および ETH ポートに MAC/IP/VLAN が設定されます。

KR260 Board1 インターフェースのセットアップ

    $ source /usr/bin/net_setup.sh -b1

KR260 Board2 インターフェースのセットアップ

    $ source /usr/bin/net_setup.sh -b2

Board1 とBoard2 の両方で ros env をセットアップ

    $ source /opt/ros/humble/setup.sh

 

 

ネットワーク時刻同期 (PTP デモ)

 

ボード2台とオシロスコープを次の図のように接続します。

Board1 の TestPt Pmod (TPH2) の P1 をオシロスコープの Channel1 に接続

Board2 の TestPt Pmod (TPH2) の P1 をオシロスコープの Channel2 に接続

 

図 13. KR260 2台とオシロスコープの接続イメージ

 

Analog Discovery 2 の場合は図14のようになります。

オレンジのケーブルを Board1 の P1、青のケーブルを Board2 の P1 に接続し、それぞれのGNDを黒のケーブルと接続します。

 

図 14. 実際にKR260 2台とAnalog Discovery 2を接続した様子

 

このデモでは、Board1 がそのクロックをマスター、Board2 がスレーブとして設定します。

Board2 クロックは、短い同期期間の後、Board1 クロックと同期します。

マスター モードで Board1 の ptp を開始します。

    $ source /usr/bin/start_ptp.sh -m

スレーブ モードで Board2 で ptp を開始します。

 

マスターが実行されていないと、同期に失敗するので、必ずマスターを先に実行します。

 

    $ source /usr/bin/start_ptp.sh -s

出力結果を見ると、rms 値は最初は高いが、クロックが同期していることを示す 1 桁の値まで下がっていくことが見てとれます。

 

図 15. KR260 2台でのクロック同期結果

 

オシロスコープまたは Analog Discovery 2 で結果を観察します。

オシロスコープの場合、図16のようになります(左が同期前、右が同期後)。

 

図 16. オシロスコープでの観測波形 2

 

Analog Discovery 2 の場合は図17のようになります(上が同期前、下が同期後)。

 

図 17. Analog Discovery 2での観測波形 1

 

 

ROS パブリッシャーとサブスクライバーのデモ

 

最初に Board2 でサブスクライバー (リスナー) を開始し、パブリッシャーがメッセージの送信を開始したらすぐにメッセージを受信できるようにします。

    $ source /opt/xilinx/ros-tsn-example/bin/start_ros_test.sh -l

次に Board1 で Publisher (talker) を開始して、トピックにサブスクライブされているボードへのメッセージの送信を開始します。

    $ source /opt/xilinx/ros-tsn-example/bin/start_ros_test.sh -t

xlnx-pubsub トーカーは、スケジュール トラフィック タイプのパケットを毎秒生成します。

xlnx-pubsub リスナーは、パケットを受信するとメッセージを出力します。

トーカー、リスナーの実行結果はそれぞれ図18、図19のようになります。

 

図 18. トーカーの実行結果

 

 

図 19. リスナーの実行結果

 

 

Network Time Shaper 機能 (802.1Qbv デモ)

 

Board2 の Test PMOD の P8 をオシロスコープの Channel1 または Analog Discovery 2 のオレンジのケーブルに接続します。

Board2 の Test PMOD の P10 をオシロスコープの Channel2 または Analog Discovery 2 の青のケーブルに接続します。

Analog Discovery 2 の場合は、黒のケーブルをBoard2 のGNDに接続します。

Channel1と Channel2 にOR条件でトリガーを設定し、タイム スケール間隔を 1 ミリ秒に設定します。

Board2で受信を開始します。

    $ source /opt/xilinx/tsn-examples/bin/start_qbv_test.sh -rx

Board1で送信を開始します。

    $ source /opt/xilinx/tsn-examples/bin/start_qbv_test.sh -tx

オシロスコープまたは Analog Discovery 2 で結果を観測します。

図20にオシロスコープ、図21にAnalog Discovery 2での観測結果を示します。

 

図 20. オシロスコープでの観測波形 3

 

 

図 21. Analog Discovery 2での観測波形 2

 

 

感想

前回と比較すると、作業量が多かったので、苦労しましたが、上手くいったときの達成感は前回よりも得られたと感じています。ROS2は別のデモでも使用したことがあるのですが、通信の機能に強みを感じられるので、将来ロボット同士で意思疎通を図る際、通信の機能を用いて、遠くにいてもテレパシーのように会話ができる...ということもあり得るかもしれませんね。それでは、また次の記事でお会いしましょう!

 

 

 

2503 Grid Box Light - Blog

ブログ

AMDによる設計およびデバッグ手法のブログ、およびアヴネット社員によるAMD製品を用いた開発チャレンジのブログです。

2503 Grid Box Light - Kria

Kria

Kria SOMはアダプティブSoCデバイスを搭載しており、スマートカメラやエンベデッドビジョンなどに最適です。