皆さん、こんにちは。「ノリさん」です!
今回はKria KR260によるTSNのアプリケーションを動作させていきます。
Step0:ハードウェア要件
ハードウェア要件(KR260の付属品以外は全て別売り)
- 共通(KR260を2台用いた通信を行う場合は、それぞれ2点必要)
- KR260 Robotics Starter Kit
- KR260用電源(KR260 Robotics Starter Kit に付属)
- CAT5eイーサネットケーブル(KR260 Robotics Starter Kit に付属)
- USB-A to micro-B ケーブル(KR260 Robotics Starter Kit に付属)
- 16GBマイクロSDカード(KR260 Robotics Starter Kit に付属)
- TSNネットワークのサンプルアプリケーション
- Digilent Pmod TPH2
https://digilent.com/shop/pmod-tph2-12-pin-test-point-header/ - I210-T1 ネットワークアダプタ及び、それを接続したUbuntuワークステーション
https://www.amazon.com/gp/product/B00ESFF2JC/ - オシロスコープ又はDegilent Analog Discovery 2
https://digilent.com/reference/test-and-measurement/analog-discovery-2/start
- Digilent Pmod TPH2
- 温度センサーのサンプルアプリケーション
- RS485 温度センサー
https://www.amazon.com/Temperature-Humidity-Sensor-Display-Modbus/dp/B078NRYBVZ - Digilent Pmod RS485
https://digilent.com/shop/pmod-rs485-high-speed-isolated-communication/ - 12V電源(KR260又はKV260のもので代用可)
https://digilent.com/shop/12v-3a-power-supply/ - 電源に接続可能な18 AWGケーブル
https://www.amazon.co.jp/Kabenjee-5-5mmx2-1mm-DC/dp/B07PW87KZC
- RS485 温度センサー
Step1:ボードのセットアップ・アプリケーションのインストール
Ubuntuイメージを次のURLからダウンロードし、SDカードに書き込みます。
https://ubuntu.com/download/amd-xilinx

図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を接続します。

ワークステーションの電源を入れ、ログインします。
ワークステーションに必要なツールをインストールします。
$ 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 桁の値まで下がっていくことが見てとれます。

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を接続しておきます。


Linux ホスト マシンで Wireshark を起動し、*4 で確認したインターフェースを選択してトラフィックデータを表示します。
$ wireshark &
KR260ボードからパケット送信開始、30秒間トーカーが実行されます。
オシロスコープで波形を観測すると、図6のような結果が得られます。

Wiresharkのキャプチャ内に 2 つのパケット セットがあることを確認します。
1つのセットはパケット長 = 900 で、もう 1 つのセットはパケット長 = 800 となります。

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

Wireshark トレースは、70% のScheduled Trafficと 30% のBest Effort Trafficのトラフィック分布を表しています。
RS485による通信と温度センサーでのデモ
図9、図10のように、Pmod RS485 と電源、及び KR260 を接続します。


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

アプリケーションを実行します。
$ pmod-rs485-test
図12のように表示されます。温度と湿度の値はセンサーと概ね一致している必要があります。

センサー自体のエラーによって、誤った値が出力されることがあるので (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 に接続

Analog Discovery 2 の場合は図14のようになります。
オレンジのケーブルを Board1 の P1、青のケーブルを Board2 の P1 に接続し、それぞれのGNDを黒のケーブルと接続します。

このデモでは、Board1 がそのクロックをマスター、Board2 がスレーブとして設定します。
Board2 クロックは、短い同期期間の後、Board1 クロックと同期します。
マスター モードで Board1 の ptp を開始します。
$ source /usr/bin/start_ptp.sh -m
スレーブ モードで Board2 で ptp を開始します。
マスターが実行されていないと、同期に失敗するので、必ずマスターを先に実行します。
$ source /usr/bin/start_ptp.sh -s
出力結果を見ると、rms 値は最初は高いが、クロックが同期していることを示す 1 桁の値まで下がっていくことが見てとれます。

オシロスコープまたは Analog Discovery 2 で結果を観察します。
オシロスコープの場合、図16のようになります(左が同期前、右が同期後)。

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

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のようになります。


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での観測結果を示します。


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

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

Kria
Kria SOMはアダプティブSoCデバイスを搭載しており、スマートカメラやエンベデッドビジョンなどに最適です。
AMD製品に関連する技術ブログ
- エンジニアブログの再開およびテクニカルウェビナーのご案内
- 初心者のためのPython & Numpy入門
- KR260でIntel RealSenseを動かしてみた!
- Vitis HLSで足し算IPを作ってみた!(プログラミング編)
- KD240でモータ制御してみた!
- KR260でデジタル信号処理してみた! (3)
- KR260でデジタル信号処理してみた! (2)
- KR260でデジタル信号処理してみた! (1)
- KR260でロボットアームを動かしてみた! (2)
- KR260でロボットアームを動かしてみた! (1)
- KR260でROS2を使ってキャリブレーション&マーカー検出してみた!
- KR260とPynqでAIカメラを動かしてみた!
- KR260でROS2 Perception Stack Applicationを動かしてみた!【2】
- KR260でROS2 Perception Stack Applicationを動かしてみた!
- Kria SOMでTPM2.0を動かしてみた!
- VivadoでKR260のハードウェアデザインを作って動かしてみた!
- ROS2 Multi-Node Communications via TSNを動かしてみた!
- AIBOX-ReIDを動かしてみた!