ロボットでも注目される FPGA ⼊⾨ (4)

前回までに、ロボットの制御・計画とそれに必要な画像認識について FPGA の活用方法を紹介しました。

今回は、どのようにして制御・計画・画像認識を統合するか、そのプラットフォームである ROS (Robot Operating System) について説明し、FPGA を導入する方法について考えたいと思います。

ROS (Robot Operating System)とは

知的なロボットシステムの機能実現において、ソフトウェアの占める重要性は非常に大きく、如何に短期間で所望のソフトウェアを構築するかが課題です。

ロボットのソフトウェアは制御や計画から構成されることを、前回までに説明しました。通常のソフトウェアの入力データが、例えばハードディスク上のファイルのような固定的で再現可能なものであるのに対して、ロボットのソフトウェアの入力データは主にセンサを通じて取得される実世界の状態です。また、出力データはモータ等を通じて実世界の状態に反映されます。実世界の物理的な状態は一期一会で再現不可能なことが多いのです。

ロボットソフトウェアは、センサから入力して計算処理をして、ロボットの動きのための出力をする、というループを回し続けるソフトウェア、という構成になることが一般的です。

この際、1つの While ループの中で、上記の入力・処理・出力を行うプログラムとして実装してしまうと、センサの数や処理の分岐が増えてきたときに、数多くの条件分岐を含む巨大な While ループになってしまいます。そして、例えばセンサを新しい高性能なものに交換したい、といった場合に、プログラムの修正は困難を極めるでしょう。

巨大な処理を含むWhileループの分散化

図は、巨大な処理を分割して、センサやモータのプログラムを分割し、その間を通信で繋いだ例です。自分の作るロボットにおいては、このように独自にプログラムの分割・通信方法を編み出して、センサのプログラムを交換しやすくするといった方法が考えられます。しかし、通信の内容が独自規格になるので、他の人がつくるロボットソフトウェアとの互換性という面では難しいものがあります。

ROS (Robot Operating System) を始めとした分散処理フレームワーク (分散ミドルウェア等とも呼ばれます) は、上記の悩みを解決するものです。基本的な考え方は、入力と処理と出力を、別々のプログラムとして実現します。そして、それらのプログラムの間で共通のデータ形式で通信することで、入力、処理、出力からなるロボットシステムの全体を動作させる、というものです。このような構成にすると複数のプログラムが「分散」して処理されることになりますよね?ですので、分散処理フレームワークと呼ばれます。

このように分散して作ることの利点は、プログラムが部品として独立になるので交換や再利用が容易になることです。例えばセンサのプログラムが独立しているので、新しいセンサに交換することは容易です。センサ入力のプログラムが通信して、次の処理のプログラムに渡す値の形式が同じであれば、プログラムを取り換えることが容易なのです。また、少し違うバージョンのロボットを構築する際にも再利用がしやすいのです。この、交換容易性・再利用可能性の高いソフトウェア部品の使用による開発生産性の向上が ROS を始めとする分散処理フレームワークの重要な利点です。 (このような、あるフレームワークの利用者が多いほど、そのフレームワークの価値が上がることを「ネットワーク外部性」と呼びます。)

小さなROSシステムの例

上の図に簡単な ROS システムの例を示します。センサ入力からいくつかの処理を経てモータ駆動するシステムであることが分かると思います。ROS においては、プログラムの単位を Node (ノード) と呼びます。また、Node の間は Message (メッセージ) を用いて通信が行われます。システムの中で行き交う多くのメッセージを区別するためにメッセージの箱を作り、名前を付けます。これを Topic (トピック) と呼びます。この図の例では、まず「センサ入力」の Node から「センサ値」の Topic にメッセージが送られます。

メッセージを送ることを Publish (パブリッシュ) するといいます。Topic にはメッセージが蓄積されますが、受け取り手がいればそこに配信されます。ただし、受け取り手は事前に登録しておく必要があります。この事前登録の事を Subscribe (サブスクライブ) といいます。雑誌の定期購読や Youtube のチャンネルに登録することを Subscribe というのと同じです。その Topic (話題) のデータを定期購読するという事です。この場合、「フィルタ処理」の Node が「センサ値」の Topic を Subscribe している、という状態を図に表しています。このようなケースでは、「センサ入力」Node は、例えば 100ms に1回といった頻度で Publish します。そのため、「フィルタ処理」Node は、100ms に1回メッセージを受け取ることになります。この図では「センサ値」Topic に Subscribe している Node (Subscriberといいます) は1つだけですが、Subscriber は複数存在可能です。その場合、メッセージはすべての Subscriber に配信されます。そしてすべての Subscriber に配信され終わるとメッセージは消えます。消えないと無限にメモリを消費しますので。

このようにして ROS システムは動作します。なお勘の良い方はお気づきかと思いますが、Node と Node の間に通信が必要であることから、そこに時間遅れが生じます。これは本質的な分散処理の欠点であり、ROS も例外ではありません。「交換しやすいソフトウェア部品」には必ず通信時間遅れのオーバーヘッドが伴います。これは避けられないのですが、FPGA を用いたハードウェア通信でオーバーヘッドを最小化する試みも行っており、これについては後程、紹介します。また、ROS は Ubuntu Linux 等の大きめの OS が前提となっているという欠点もあります。これについては非常に小規模なマイコンで動く ROS も提案されています*1。

さて、以上を理解すれば ROS の概要は把握したといえるでしょう。いくつかの欠点は残りますが、知的ロボットのような複雑なシステムを作るためには、ROS が有益であることは理解いただけたかと思います。また、オープンソースソフトウェアであり、多くのロボット用のソフトウェア (入力・出力を含む) が、パッケージとして公開されていることも非常に大きな利点です。その他の「ROS の利点」そのものについては、ロボット技術者・ロボットソフトウェア開発者といった分野の多くの方が解説*2していますので、参考にしてみてください。

本記事ではこれ以降、ROS のソフトウェアの中に FPGA を入れるためにはどのような方法があるかについて説明します。

ROS への FPGA 導入方法

ソフトウェア中心の ROS システムに FPGA を入れて、ロボットソフトウェアに必要な処理を加速するにはどうしたら良いでしょうか?

現状の ROS においては、上記で述べた通信のオーバーヘッド (もしくはリアルタイム性の問題) のために、「制御」のための入力・処理・出力を複数 Node に分割することは余り勧められません (時間遅れ、もしくは時間遅れの揺らぎが大きい)。そのため、ROS システムの中の「計画」の処理や、それに必要な「認識」の処理を FPGA に行わせる、というのが FPGA 活用のポイントであると考えられます。

では、具体的に FPGA を含む ROS ノードの3種類の実現方法を紹介します。見ていきましょう。

方法1:PC (ROS) + (ARM + FPGA) での実現

PC 上に、通常の ROS をインストールして ROS node を動作させる方法です。高速化したい処理は FPGA 上で実現します。この際、ARM プロセッサ +FPGA が1チップになったプログラマブル SoC (例えば Zynq (Xilinx社) や SoC FPGA (Intel社)) の使用を想定します。FPGA 処理に対してはデータを入力して処理結果を出力する必要があるので、ARM プロセッサが橋渡しをします。図にすると次のようになります。

登場する要素が多いので、一見すると複雑に見えるかもしれませんが、以下の利点があります。

1、PC 上での ROS 動作は通常のソフトウェアなので問題が少なく高速
2、ARM プロセッサは通信のみを行うので負担が少ない

一方、PC と ARM プロセッサ間の通信は、何らかのプロトコルを設計する必要があります。

この方法で開発されたロボットの例として、九州工業大学の田向権先生の研究グループで開発されたサービスロボット Exi@ *3 があります。Exi@ はロボットの競技会である RoboCup のホームサービス部門 (RoboCup@Home) において、Hibikino-Musashi@Home というチーム名で出場して優勝・上位入賞*4しています。そこで使われている画像認識の一部に FPGA を用いており、ROS で他のソフトウェアと通信することでロボットシステムの開発生産性を大幅に向上しているとのことです。そのための通信フレームワーク (ホスト PC・ARM・FPGA 間) として COMTA*5 を開発し用いているとのことです。興味がある方は是非調べてみてください。

方法2:ARM (ROS) + FPGA での実現

プログラマブル SoC の ARM プロセッサに、Ubuntu + ROS をインストールして、ROS node を動かす方法です。高速化したい処理は、方法1と同様に FPGA 上で実現します。

図に示すように、PC が無くても ROS の Topic との間の通信を行うことが出来るので、独立した ROS node として動作することが利点であるといえます。

一方、ARM プロセッサ上で Ubuntu および ROS を動かすために、処理能力、特に TCP/IP の通信処理に負荷がかかり、大きなデータ (画像など) を送受信すると遅延が大きくなることが分かっています。すなわち、1チップで ROS node として動作することは非常に魅力的ですが、性能面で問題となる場合があるのが欠点です。

方法2での ROS node が、筆者らが提案している「ROS 準拠 FPGA コンポーネント」*6です。方法2では、ARM プロセッサと FPGA を密結合してパッケージ化できるので、ソフトウェアとハードウェアからなる ROS node の自動生成がやりやすいという利点があります。プログラマブル SoC を活用して1チップで ROS node として動作し、ロボットシステムの処理を加速するためのプラットフォームとなることを目指しています。

方法3:FPGA のみでの実現

FPGA が、高速化したい処理に加えて、ROS の Topic との間の通信処理をハードウェア (回路) で行う方法です。図にすると次の様に単純になります。

ROS においては通常 TCP/IP 通信を用いてメッセージをやり取りします。詳細は次回に説明しますが、ROS (バージョン1) で FPGA を ROS node として働かせるためには、TCPROS という独自プロトコルで通信を行う必要があります。

方式3の ROS node についても、著者らは試作・実装*9しました。TCPROS は2段階に分かれていて、(1) Topic の所在を問い合わせる通信を行うための roscore プロセス (ROSを使用する際にシステム内に立ち上げる Topic や node に関するネームサービス) との XMLRPC (テキストベース) でのやり取りと、(2) Topic の所在 (IP アドレス・ポート) との間の独自バイナリ形式でのデータ通信、です。

著者らの試作・実装では、(2) のデータ通信部分の通信性能のみを FPGA で加速することとし、(1) は別の PC が代理で行うという方式を選択しました。これにより FPGA のハードウェア開発量および使用量を減らすことが出来ます。性能評価の結果、画像データ等の ROS node 間での topic を介した Publish/Subscribe 通信時間を短縮することが示されています。

一方、ROS システムで用いられる多種多様なメッセージの種類の全てに対応した FPGA 通信ハードウェアの設計は困難であり、使用するハードウェア量も多くなります。ソフトウェアで簡単に出来る事も、FPGA にやらそうとすると効率が悪くなる場合もありますので、どこまでをハードウェア化・高速化するかの判断が必要です。

まとめ

今回は、ROS に代表される分散処理プラットフォーム導入の利点を考えるところから始めて、ROS システムへの FPGA 導入方法を3通り紹介しました。

次回、著者が開発した ROS 準拠 FPGA コンポーネントの内部構成や開発環境を紹介し、課題と今後の展望について考えたいと思います。次回が本連載の最終回です。お楽しみに!

東海大学情報通信学部組込みソフトウェア工学科
大川猛

参考資料

*1 mROS: https://github.com/tlk-emb/mROS
(Quitaに記事もあります)
*2 例えば、「自律ロボット開発にROSを使うべきいくつかの理由」
http://forestofazumino.web.fc2.com/ros/ros_pros_cons.html
*3 田向権「Robot OS(ROS)とFPGAを融合したロボットや自動車のための新しい計算機システム」

(JST新技術説明会)
https://www.youtube.com/watch?v=HTWsZ-tkrQI
https://shingi.jst.go.jp/var/rev0/0000/4541/2016_kyutech_4.pdf

*4 RoboCup@Home https://athome.robocup.org/awards/
*5 COMTA https://roscon.ros.org/jp/2018/presentations/ROSCon_JP_2018_presentation_15.pdf
*6
Kazushi Yamashina, Takeshi Ohkawa, Kanemitsu Ootsu and Takashi Yokota, “”Proposal of ROS-comliant FPGA Component for Low-Power Robotic Systems” -case study on image processing application- 2nd International Workshop on FPGAs for Software Programmers (FSP 2015), London, United Kingdom, September 1, 2015
https://arxiv.org/abs/1508.07123
*7 Takeshi Ohkawa, Yutaro Ishida, Yuhei Sugata, Hakaru Tamukoh
https://roscon.ros.org/2017/presentations/ROSCon%202017%20ROS%20Compliant%20FPGA.pdf
*8 大川猛「ロボットへのFPGA導入を容易化するコンポーネント技術」
(JST新技術説明会)
https://www.youtube.com/watch?v=NjZGxD6dnWM
https://shingi.jst.go.jp/var/rev0/0000/6134/2018_4u
1_5.pdf
*9 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

タイトルとURLをコピーしました