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

前回の記事では、ロボットにおけるソフトウェア処理を高速化する (マクロ) 視点での FPGA 活用と、ロボットを構成する電気信号レベルでの入出力や制御に関する (ミクロ) 視点での FPGA 活用について、大枠を考えました。今回は、ロボットの目的や定義を考えた上で、小さいロボットシステムの事例を通じて FPGA が活用できる場面がどこにあるかを見ていきます。

ロボットの定義

さて、そもそも「ロボットとは何」でしょう?

時代によってロボットの定義は変化しており[1]、「ロボットについて完全に一般性をもった定義というのは実は存在しない[1]」ともいわれ、ロボットの定義は難しい問題です。また、時代とともに変化するものですから、そもそも固定する必要も無いようです。2020年の現時点では「ロボットとは,“人の役にたつ,作業をする機械”の総称[2]」「センサー、知能・制御系、駆動系の3つの要素技術を有する、知能化した機械システム[1]」といった定義がしっくりくるように思いますが、一方、将来的には「知能・制御系のみによって、社会の多様な場面で、多様なロボット機能が提供できるようになる可能性もある。」[3][4]とすら考えられます。

また、「ロボットというと、人それぞれ異なったものをイメージする傾向にある。このことが、ロボットについての議論がスムーズに進まない大きな原因である。[2]」ということも言われています。そのため、まずこのブログでは、ロボットに対するイメージや、ロボットの目的を共有するところから始めたいと思います。

ロボットの目的と FPGA 活用

「ロボットを使いたい・作りたい」と考えるとき、何らかの目的があるはずです。

ロボットを使う立場からは、「部屋の床をくまなく掃除してほしい」「車を運転して目的地まで行ってほしい」「倉庫で荷物を指定の場所に運んでほしい」「工場における製造ラインの目視検査で不良品を除去してほしい」「金属板を図面通りに加工してほしい」といった、さまざまな目的があげられます。

一方、メカ・エレキ・ソフトといった技術によってロボットを作る立場では、上記の目的をどのように実現するか、が興味の対象となります。

例えば「部屋の床をくまなく掃除してほしい」という目的であれば、ルンバのようなお掃除ロボットを想像すると思います。コンパクトな大きさで、動き回って掃除することを前提とすると、移動するための機構・ごみを除去するための機構・どのように移動するかを決めるための機構、などなどが必要になるでしょう。つまり、作る立場・実現する立場に立ってみると、目的を小さな目的に分解する必要があることが分かります。

制御

ロボットの目的を複数の小さな目的に分解すると、たどり着くのが「制御」という単位です。「制御」を大雑把に言うと、
(1)現在の状況を測定し
(2)目標値に対して近づくためにどうしたらよいか考えて
(3)何かしらのアクションをする
ということです。

例として、下の図のようにロボットアームの関節を動かすのであれば、(1)の測定を行うのはセンサであり、ロボットアームの関節の角度(制御量)を測定します。(2)では関節の角度の目標値と現在の測定値 (制御量) を比較して、(コントローラが) 関節をどちらにどのくらいの力で動かしたらよいか (操作量) を計算します。(3)では前述の計算結果 (操作量) をもとにして関節を動かすアクチュエータ (モータ等) への出力を行います。

この例で、どのように FPGA を活用したらよいでしょうか?「制御」を頑張ればロボットアームの性能が上がるのでしょうか?FPGA が(2)の計算を頑張って速く出来れば、何か良いことがあるのでしょうか?もしかしたら、(1)のセンサの情報がたくさんあって、(2)の計算がすごく複雑な場合には、ソフトウェアでは時間がかかる計算を FPGA で速くすることが、早く目標値に安定 (収束) させたり、安全に制御を行うための役に立つかもしれません。

機械や電気を専門として学ぶ人たちが、最初に制御理論を学ぶのは、上記のような一般的な問題を数学的に考えるための道具を得るためです。

計画

もう一つの FPGA 活用の可能性は、制御の目標値を決める部分である「計画」です。

先ほどの制御の図で、目標値は外部から与えられていました。しかし、目標値を決めることも簡単ではありません。ロボットの目的を達成するためには、時々刻々と変化する状態に応じて、目標値を決定していく必要があります。

制御の目標値を決めることは、一般には「計画」と呼ばれます。お掃除ロボットの例でいえば、お部屋をすみずみまで移動して掃除するという目的のために、計画を行って、どのように移動したらよいか目標値を決める必要があります。また、ロボットアームの例でいえば、ロボットアームの関節の角度が目標値であり、それに近づくための制御を行ってモータを動かすための操作量を決めるのが制御です。ここで、ロボットアームの関節の角度をどのようにするか (目標値)は、目的に応じて計画して決める、という関係にあるわけです。

計画は、一般的には制御よりも高次元の判断が要求されます。これは、目標値よりも目的の方が抽象的だからです。そのため、この高次元の判断のための計算に FPGA の処理能力が活用できる可能性は大いにあるといえます。

階層的なロボットシステムへ

さて、「計画」は目的と状態に応じて目標値を決めることですが、ロボットの目的を達成するための計画は、必ずしも図のように1つの箱で書けるほど単純でないことが想像できると思います。そのため、トップレベルでの計画の目標値を達成するための「部分計画」を用意する、階層的な構造を持つ必要があるでしょう。また、モータのような駆動系を持たないセンサ部品も、システムには必要でしょう。更に、ロボットシステムを各種センサ (カメラ、加速度センサ、LiDAR など) から状態を得る (推定する) ための「認識」も必要となってくるでしょう。

これらの「計画」「部分計画」「制御」「認識」は現代においてはコンピュータシステム・ソフトウェアを用いて実現することが一般的です。そして、その間をつなぐのは通信ネットワークであり、インターネットです。クラウド上にこれらのソフトウェア部品が配置されることも珍しくありません。こうなってくると、これはもはや単にロボットとは言えず、ロボットシステムと呼ぶべきです。

これらのロボットの構成要素のうち、どこに FPGA を活用できるでしょうか?おそらく、ロボットシステムを構成する要素のどこにでも、活用できるポイントはあると思います。

FPGA による制御システムの事例

ロボットシステムへの FPGA 活用の夢は広がりますが、ここで一度原点に立ち返って、「制御」への FPGA 活用について、小さなロボットシステムの設計事例を紹介したいと思います。

ここで取り上げるのは「倒立振子」です。

マイコンを使わず FPGA で制御処理を行う倒立振子

ここでは、私 (と共同研究者) が2012年から2013年に開発した「マイコンを使わず FPGA で制御処理を行う倒立振子ロボット」を紹介します。なお、文献[5-8]では、ここで紹介した FPGA 制御に関する詳しい研究内容を記載しています。

倒立振子 (とうりつしんし) そのものは、高専や大学の制御入門の実験で非常によく用いられる題材です。振子 (振り子) というのは、おもりに紐をつけてブラブラする、あれです。倒立の振り子 (倒立振子) というのは、それが上下逆になったものです。子供のころ、傘を手のひらの上に立てて、倒れないようにする遊びをしたことがあるかと思いますが、それを機械が制御するものだと思ってください。かなり頑張って制御しないと傘は倒れてしまいます。

下記の図は、マイコン制御による倒立振子の概念図を示しています。倒立振子の本体角度を0にするように、各種センサの値をもとにしてモータを駆動し車輪を適切に回転制御すると、倒れずに直立させることが出来ます。また、移動距離の変化が無くなるように制御すれば停止させることが可能になります。倒立振子そのものについては、こちらの記事が参考になります。

同記事でも用いていますが、マイコンを用いた C 言語プログラムで制御する教育用の倒立振子キットは、数多く販売されています。ここで紹介する倒立振子は、ヴィストン株式会社の Beauto Balancer をベースとして使用しました。(現在は廃番となっており、後継製品が出ているようです。)

まず、販売されている教育用キットそのままのマイコン制御のシステムについて解説します。(開発元にてサンプルのソースコードも公開されていますので、興味のある方は是非のぞいてみてください。)

上部の乾電池がおもりになっていて、下部の車輪をモータで駆動して倒立振子の制御を行います。センサ基板とマイコン基板は分離されており、センサ基板にはジャイロセンサとエンコーダが搭載されています。角速度を計測するジャイロセンサの出力はアナログ電圧 (0-3.3V) ですので、A/D コンバータでディジタル値に変換し、H8 マイコン (H8/36064G@14.5674MHz) でPID 制御の計算に用います。またロータリーエンコーダは車輪の回転を検出するもので、0/3.3Vのディジタル電圧でマイコンに入力します。PID 制御の計算結果は PWM の DUTY 比に変換し、モータドライバ経由でモータを駆動し、車輪に回転力を発生し制御します。

ロータリーエンコーダでの車輪の回転は、円盤に放射状に開けられたスリットを光が通過するかどうか、で検出します。すこし離れた位置に置かれた光検出器でA相・B相の2本の0/1の電気信号に変換します。マイコンでロータリーエンコーダの回転検出を行うため、A相・B相でそれぞれ信号の変化時に割り込みが発生するように H8 マイコンの機能で設定しています。実際に回転すると、割り込みが発生して対応するプログラムが動き、現在の回転位置カウンタを増加・減少させます。通常フローの制御プログラムは、その回転位置カウンタの値を読んで、制御の計算に用いる、という構成です。

制御のプログラム (C言語) を分析した結果を示します。左側が全体の制御フロー、右側が制御のための演算処理の中身です。制御周期が8.3msに設定されているのに対し、制御処理時間を測定したところ6.9ms(最悪値)で、あまり余裕がないことが分かりました。制御周期を短くすると制御は安定しますが、このままでは制御周期を短くすることはできません。

また、ソースコードとコンパイル結果の機械語を分析して、処理にかかる時間を分析したところ、各センサ値の計算 (ジャイロセンサ平均化を含む) とエンコーダ (のカウンタ値の) 平均化に、それぞれ46%と21%の処理時間がかかっていることが分かりました。なおここでの平均化は、過去10回の値を平均したものを用いる、という処理です。

FPGA でセンサからデータを取得,リアルタイム制御,モータ駆動

どうやらマイコン処理では制御のための計算処理に時間がかかっており、これ以上に制御周期を短くするのは難しそうです。そこで、このマイコンから FPGA への載せ替えを行ってみます。使用した FPGA 基板は、eTrees 社製の exStick で搭載 FPGA は Xilinx 社の Spartan6 XC6SLX16 (クロック周波数は50MHz) です。

センサ基板はそのままのものを使い、マイコン基板を取り外して、FPGA 基板を搭載しました。また、A/D コンバータ (MCP3208) とモータドライバ IC はユニバーサル基板を用いて接続しました。この構成で、FPGA を用いて、マイコンと同じ制御処理を実現します。

FPGA を用いることの利点は、各処理を並列に (つまり同時に) 行うことが出来るという事です。マイコンの C 言語でのプログラムでは、ジャイロセンサの平均化、エンコーダカウンタ値の平均化、制御のための演算、と順番に行う必要がありました。一方、FPGA を用いると、それらの処理を並列に行うことが出来ます。

評価結果

さて、FPGA を用いた制御の結果ですが、無事マイコン同様の倒立振子制御を行うことが出来ました。この際、制御周期はマイコンと同じ120Hz (8.3ms) で行いました。(動画は、こちらのサイトで見ることが出来ます。あまりきれいではないですが。)

更に、今後の FPGA 活用の可能性を探るために、制御周期をどこまで短くできるのかを調べることとしました。

このシーケンス図は FPGA の各モジュールの処理時間を示しています。上から下に時間が経過します。

Encoder (エンコーダからの入力と平均化)、Gyro (ジャイロセンサのA/Dコンバータからの入力と平均化)、Calc (制御のための演算)、PWM (モータドライバへの出力)、Timer (同期信号発生のためのタイマ) の各モジュールが活動する時間が青く色づけされています。PWM と Timer は常に動いていますが、それ以外は同期信号 (Sync) に合わせて動作を開始します。

Encoder は、ロータリーエンコーダの出力信号 (A相・B相) を抵抗分圧による電圧変換 (3.3V→2.5V) のみ行って、直接 FPGA に入力しています。マイコンでは割り込みを発生してソフトウェアでカウンタを増減させましたが、FPGA ではカウントする回路によって実現するので、取りこぼしを全く発生させず、割り込みによる遅延時間も発生せずに安定した動作が可能になりました。Encoder の1周期当たりの処理時間は、1μs程度でした。

また、Gyro は A/D コンバータから電圧値を SPI インターフェイスで読み出すのですが、これは A/D コンバータ (MCP3208) のチップの使用上、8回に分けてレジスタ値の読み出しを行う必要があり、2.3ms程度の時間がかかっていました。

そして、Calc は、制御のための演算モジュールですが、C 言語プログラムと同等の演算を行い、処理時間は8μs程度でした。ただし、浮動小数点演算を固定小数点化しています。また、ハードウェアの実装は JavaRock という高位合成ツールを用いました。(現在は Synthesijer に引き継がれています。)

以上をまとめると、FPGA を用いた制御の処理時間は、上記3つのモジュール (Encoder, Gyro, Calc) の最大値を取って2.3msになりました。

マイコンと FPGA の処理時間比較と考察

マイコンの処理時間が6.9msであったのに対し、FPGA の処理時間が2.3msなので、制御周期の短縮には貢献できるといえますが、劇的な効果ではありませんでした。

しかし、FPGA の処理時間の大部分は A/D コンバータからの値読み込みであり、それを除けば9μs (Encoder, Calcの合計) です。A/D コンバータのチップと FPGA の間の SPI 通信時間が最短の制御周期を決めているといえます。更に仮に SPI 通信時間が何らかの形で短くなったとしても、A/D コンバータの A/D 変換時間の下限もあるので、そこが制御周期の下限になります。

一方、この倒立振子の制御に120Hz以上 (8.3ms以下) の高速制御が必要なのか、というと、そうとも言えないようです。ただし、高速制御が必要なシステムも世の中にはありますから (例:高速モータの制御など)、そういった場面では FPGA による高速な制御のための計算が役に立つと考えられます。

まとめ

今回は、ロボットの定義と目的を考えた上で、小さいロボットシステムの事例を通じて FPGA が活用できる場面について検討しました。

ロボットの定義は時代によって変わりますし、目的も人や場面によって様々です。ただし、ロボットが人間の望む目的に向かって動作するためには、何らかの「計画」によって制御対象を「制御」する必要があります。そしてそれらの大部分がソフトウェアで実現される時代であり、ソフトウェアに代わって FPGA が有効な場面があると考えられます。

また、FPGA による「制御」の実例を紹介しました。FPGA は演算処理の並列性を生かすことで制御のための演算処理を大幅に短縮し、高速な制御を可能にします。ただしセンサからの入力にかかる時間は制約となるので、注意が必要です。

次回以降も、ロボットシステムにおける様々な場面での FPGA 活用について紹介したいと思います。

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

参考文献

[1] NEDO ロボット白書2014 (2014年3月)
https://www.nedo.go.jp/library/robot_hakusyo.html
[2]辰野恭市, 松日楽信人,”ロボットの基盤技術整備 ― 今後容易となるロボットシステム構築”, 東芝レビュー2001年9月
https://www.toshiba.co.jp/tech/review/2001/09/56_09pdf/a02.pdf
[3] 総務省 情報通信白書平成27年版 第2部 第1節(2)ロボットの定義とパートナーロボット (2015)
https://www.soumu.go.jp/johotsusintokei/whitepaper/ja/h27/html/nc241320.html
[4] 政府「ロボット新戦略」(2015年1月23日)
https://www.kantei.go.jp/jp/singi/keizaisaisei/pdf/robot_honbun_150210.pdf
[5] 植竹 大地,大川 猛,横田 隆史,大津 金光,馬場 敬信,“倒立振子ロボットのFPGAを用いた超高速制御”,情報処理学会第75回全国大会講演論文集,pp.1-137~1-138, 2013年3月7日.
[6] Takeshi Ohkawa, Daichi Uetake, Takashi Yokota, Kanemitsu Ootsu, Takanobu Baba, “Reconfigurable and Hardwired ORB Engine on FPGA by Java-to-HDL Synthesizer for Realtime Application,” Proc. 4th International Symposium on Highly Efficient Accelerators and Reconfigurable Technologies (HEART 2013), pp.45-50, June 2013.
[7] Takeshi Ohkawa, Daichi Uetake, Takashi Yokota, Kanemitsu Ootsu, “Component-Based FPGA Circuit Design and Verification for Robotic Systems Using JavaRock and ORB Engine – A Case Study.” Applied Mechanics and Materials, vol. 433-435, Trans Tech Publications, Ltd., Oct. 2013, pp. 1849-1852, 2013.
[8] 植竹 大地,大川 猛,三好 健文,横田 隆史,大津 金光, “高位合成ツールJavaRockによる倒立振子制御処理の高速化”,信学技報, vol. 113, no. 221, RECONF2013-29, pp. 55-60, 2013年9月19日.

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