前回はロボットのソフトウェア構造における分散処理とそのフレームワークであるROS (Robot Operating System) に焦点を当てて解説をしました。
今回は、ROS に準拠した FPGA コンポーネントの具体的な作成方法を紹介します。更に、今後のロボットにおける FPGA 活用について考え、連載を締めくくりたいと思います。
ROS 準拠 FPGA コンポーネントの作成方法
前回に大まかな構造を示した ROS 準拠 FPGA コンポーネントの作成方法について、具体的に説明したいと思います。ただし、私の研究グループが開発・公開した ROS 準拠 FPGA コンポーネントは、2018年のもの (Ubuntu16.04 (Xenial), ROS バージョン Indigo/Jade) であり、その後 ROS のソフトウェアのバージョンは大幅に進んでいます。
そのため本記事では、現在の ROS バージョン (Ubuntu18.04 (Bionic), ROS バージョンMelodic/Noetic) を用いた場合に、どのように作成したらよいか説明します。
なお、2018年に開発した ROS 準拠 FPGA コンポーネントは、ROS 公式のパッケージ配布サイト *9にて配布していますので、参考にしてください。キーワード: FPGA で検索してみてください。openreroc_pwm *10という名前で、PWM 出力の FPGA 回路を ROS コンポーネントにしたものを配布しています (OpenReroc (Open source Reconfigurable robot component) というプロジェクト名)。また、openreroc_motion_sensor *11という名前で、加速度センサ・ジャイロセンサの値を相補フィルタでフュージョンした姿勢情報センサの ROS コンポーネントを配布しています。いずれも Zedboard で動作する bit ファイルを同梱しています。これらのコンポーネントは少し古くなってしまったので、新しいバージョンの ROS と FPGA ボード向けにアップデートする必要があります。こうしたバージョンアップを行う必要があることも、「課題」といえます。しかしながら、新旧の ROS コンポーネント間においても、メッセージレベルでは互換性があります。そのため、ROS コンポーネントにする事は、ただソースコードだけがあるという状況よりは、再利用可能性という点で有利であると考えられます。
手順1、Zynq (ARM) 上に ROS ソフトウェアをインストールする
Zynq の FPGA 部分 (PL) のハードウェア処理を ROS システム内で動作させるためには、まずは ARM プロセッサ上 (PS) で ROS のソフトウェアが動作する必要があります。
現在 ROS といえば、ROS のバージョン1 *1を示しますので、基本的には Ubuntu (Linux) 上で動かすことを想定します。ROS2 *2ではプラットフォーム OS になるべく依存しない方法で開発が進められているので、Ubuntu 以外で動作する可能性が高いです。一方、ROS のバージョン1は Ubuntu 上でのみ動作すると考えてください。
さて、Ubuntu を Zynq で動かす方法については、多くの人が記事を書いています *8ので、解説はそちらにお任せします。ARM プロセッサ上の Ubuntu ですので、必ずしも通常の PC における最新版ソフトウェアがそろっているわけではない事に注意してください。基本的にオープンソースのプロジェクトなので、多くの貢献者 (Contributor) による環境整備が行われています。
なお、PYNQ *3は、現在 Zynq 上で動作する Ubuntu ベースの Linux ディストリビューションとしては大変アクティブなので、WEB 上に多くの資料もあり、お勧めです。
2015-2018年に ROS 準拠 FPGA コンポーネントを開発した際には、Xillinux*4を用いました。Xillinux は Xillybus 社による、FPGA・ソフトウェア間の通信 IP を含む Linux ディストリビューションで、Xillinux-2.0 は、Ubuntu LTS 16.04 for ARM をベースとしています。ただし、2020年現在では既にメンテナンスを終了していますので、これから ROS 準拠 FPGA コンポーネントを開発する人は、別の選択肢 (PYNQ 等) をお勧めします。また当時、Verilog のユーザロジックを入力として ROS コンポーネント (ソフトウェア+ハードウェア) を生成する、cReComp *6 *12 (creator for Reconfigurable hw Component) というツールを、指導学生が開発してくれました。ただしこのツールは、上記の Xillinux を前提としているため、最新の環境で使うためには、改修する必要があります。
手順2、ROS のソフトウェアを動作させる
ROS のチュートリアル *5を行って、ROS の基本的な Publish/Subscribe 通信が可能であることを確認してください。どれを行うか、どこまで行うか迷うと思いますが、”Writing a Simple Publisher and Subscriber” (C++もしくはPythonどちらでも可) の“Talker”と“Listener”が動けば、まずは OK です。
このチュートリアルは、”Talker”ノードが”hello world <現在時刻>”という文字列メッセージ (std_msgs.msg.String) を、”chatter”トピックに Publish し続けます。なお、図に現れないものとして、roscore プロセスが必要です。これは、ROS システムに存在するノードとトピックを登録・参照するためのネームサーバとして働きます。詳しくは ROS のチュートリアルを行ってみてください。
これに対して、”Listener”ノードは”chatter”トピックに Subscribe し、文字列メッセージを受け取る、というものです。
これが動けば、とりあえずは ROS の基本的な動作をソフトウェアで確認したことになります。
手順3、ROS ソフトウェアから FPGA を駆動する
次に、ROS のソフトウェアから FPGA を駆動します。例えば下記のような”Filter”ノードを、先ほどの ROS システムに追加します。callback は、”chatter”トピックからメッセージを受け取ると呼ばれます。callback が呼ばれるたびに、FPGA 処理を用いて data から filtered_data を作ります。そして、作った filtered_data を”filtered_chatter”トピックに Publish します。Python で書くと非常に短く書けて手軽ですね。
import rospy
from std_msgs.msg import String
def callback(data):
rospy.loginfo('input: %s', data.data)
<<FPGA処理を用いてdataからfiltered_dataを作る>>
rospy.loginfo('output: %s', filtered_data)
pub.publish(String(filtered_data))
rospy.init_node('filter', anonymous=True)
pub = rospy.Publisher('filtered_chatter', String, queue_size=10)
rospy.Subscriber('chatter', String, callback)
rospy.spin()
ノードとトピックの接続関係は以下のようになります。
基本的には、ソフトウェアから FPGA 処理を使ってデータを処理出来れば、ROS システムに FPGA を導入することは問題なく出来るわけです。なお、必ずしも Subscribe と Publish の両方を行う必要があるわけではなく、Publish だけを行う ROS ノード「カメラで撮影した画像を FPGA 処理して Publish する」、もしくは Subscribe だけを行う ROS ノード「Subscribe して受け取ったデータを FPGA で認識処理する」も考えられます。
具体的なソフトウェアと FPGA 処理の間の接続については、本記事では詳細を省略しますが、C 言語からの高位合成ツール (Vivado HLS等) を使うと、ソフトウェアと FPGA 間でのデータのやり取りは、かなり簡単に実現できるようになりました。ここ数年で大きく状況は改善しているので、最新情報を入手して是非皆さん取り組んでみてください。
注意事項:Python と ROS のバージョンについて
現在、PYNQ 上で ROS 準拠 FPGA コンポーネントを作成すると、ROS のバージョンは Melodic となり Python2.7 で動作することとなります。一方、PYNQ は Python3 ベースですので、Python バージョンが相違する問題があります。そのため、PYNQ のフレームワークに頼らずに Python2.7 もしくは C 言語で FPGA 間の通信を実現する必要があります。もしくは、ROS の次バージョン Noetic の ARM 版が使用可能になれば Python3 ベースになりますので PYNQ フレームワークとも共存可能となり、問題は解決するかと思います。
上記のような問題もあり、FPGA だけでなく ROS ソフトウェアをしっかり動作させる知識を持っていないと、なかなか ROS 準拠 FPGA コンポーネントを開発することが困難というのは現在の課題です。
参考研究:完全ハードウェア版の ROS 準拠 FPGA コンポーネント
ARM プロセッサ上で、上記のように ROS ソフトウェアを動作させる場合、やはり問題となるのが通信性能です。ARM プロセッサの性能が向上しても、やはり画像等の大きなデータを送受信すると、大幅な遅延が発生します。
そのため著者らは、完全ハードウェア版の ROS 準拠 FPGA コンポーネントの研究開発も併せて行っています。これまでに、FPGA を用いた画像からの FAST 特徴点検出回路の処理遅延時間の評価を行い、PC (Intel Core i7) と同程度の処理遅延時間 (ハードウェアTCP/IP *13 による ROS の Publish/Subscribe 通信を含む) で、消費電力10分の1を達成しました。
この研究については幾つか学会発表をしていますので、興味のある人は是非論文*7 *8等をご参照ください。
ロボットにおける FPGA 活用の今後
本連載は5回にわたって、ロボットにおける FPGA 活用方法を考えてきました。
「制御」においては、電気信号レベルで処理遅延時間を最小化することに、FPGA は活躍します。また「計画」や「認識」の処理を FPGA で行い、それを ROS ノードの中で動作させることで、ロボットソフトウェアへの FPGA の導入が可能であることを示しました。
更に、作成した FPGA とソフトウェアは、ROS コンポーネントとして配布することで、自分のロボットシステムの処理加速のみならず、それを別の誰かのロボットシステムで使ってもらう、ということが可能になることが期待できます。
これは、ROS がロボットシステム開発者間で、お互いにソフトウェアのやり取りをすることに価値があるフレームワークだからです。配布されている ROS コンポーネントをダウンロードして、自分のロボットシステムを簡単にプロトタイピング (試作) 出来る、というメリットはもちろんありますが、その上で、自分が作った ROS コンポーネントを公開して誰かの役に立つという循環が、ロボット技術の進歩につながるのです。
一方、FPGA 処理を公開・配布するという枠組みはあまり整備されているとは言えないのですが、ここ数年で PYNQ 等のフレームワークが標準的に使われるようになって、状況は改善しつつあります。
例えば FPGA を導入した ROS ノードとして、カメラ画像から FPGA 処理で高速に画像認識を行い、結果だけを Publish する ROS ノード、があれば、ロボットを構築する際に非常に役に立つと思われます。そして、そのような FPGA 入りの ROS ノードが多く流通すれば、ロボット開発に FPGA を自由に活用する未来が実現できるのではないでしょうか。
この記事が、その一助になれば幸いです。
東海大学情報通信学部組込みソフトウェア工学科
大川猛
参考資料
*1 ROS http://wiki.ros.org/
*2 ROS2 https://index.ros.org/doc/ros2/
*3 PYNQ http://www.pynq.io/
*4 Xillinux http://xillybus.com/xillinux
*5 ROSチュートリアル http://wiki.ros.org/ROS/Tutorials*8 XilinxのWikiにおける”Ubuntu on Zynq” https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841732/Ubuntu+on+Zynq
*6 Takeshi Ohkawa, Kazushi Yamashina, Takuya Matsumoto, Kanemitsu Ootsu, Takashi Yokota, “Automatic Generation Tool of FPGA Components for Robots ,” IEICE Transactions on Information and Systems (Special Section on Reconfigurable Systems), Vol.E102-D No.5, pp.1012-1019, May. 2019.
*7 Yuhei Sugata, Takeshi Ohkawa, Kanemitsu Ootsu and Takashi Yokota, “Acceleration of publish/subscribe messaging in ROS-Compliant FPGA Component,” The 8th International Symposium on Highly Efficient Accelerators and Reconfigurable Technologies (HEART2017),Bochum, Germany, June 7-9, 2017
*8 Takeshi Ohkawa, Yuhei Sugata, Harumi Watanabe, Nobuhiko Ogura, Kanemitsu Ootsu, Takashi Yokota, “High Level Synthesis of ROS Protocol Interpretation and Communication Circuit for FPGA,” 2nd Workshop of Robot Software Engineering 2019 (RoSE2019) held with ICSE2019, 2019.
*9 ROSパッケージ検索 https://index.ros.org/search/?section=pkgs&term=FPGA
*10 openreroc_pwm https://index.ros.org/p/openreroc_pwm/github-Kumikomi-openreroc_pwm/
*11 openreroc_motion_sensor https://index.ros.org/p/openreroc_motion_sensor/github-Kumikomi-openreroc_motion_sensor/
*12 cReComp https://github.com/kazuyamashi/cReComp
*13 SiTCP https://www.bbtech.co.jp/en/sitcp/