Simulink Desktop Real-Timeの実力
こんにちは。本日は私の専門分野とはかなりかけ離れているトピックをお届けしたいと思います。私は学生時代から主にMATLABのみを使ってきたのでSimulink系の製品に関しては基本的な知識しかありません。そういう事もありまして、同僚の “toshi | Simulink の中の人” さんがSimulinkについて書きたいと言ってくれた時は非常に嬉しかったです。とても濃い内容なので楽しく読んで頂ければと思います。
===============
こんにちは。アプリケーションエンジニアリング部の toshi | Simulink の中の人と申します。
今回ゲストブロガーとして、単発ですが記事を書かせていただきます。
普段のブロガーはMATLABサイドの人間が多く、Simulinkサイドの記事が少ないということで、私が呼ばれました。それならばと今回はがっつりSimulink、かつ組み込み制御設計に関わるお話をさせていただきます。
リアルタイムとは
私の専門は制御工学、制御設計でして、MATLAB と Simulinkで様々な制御アルゴリズムを設計・検証する仕事をしてきました。ところが昨今、制御工学の外の領域である機械学習の領域で発展してきた強化学習が、制御の領域にやってきて、制御設計に応用されるようになってきました。
私も日々強化学習について勉強しているのですが、ネット検索していろんな記事を見ていると、機械学習の領域出身の人が多いためか、言葉や文化の違いで読み解くのに苦労することがあります。
その中で、例えばリアルタイムという言葉があります。機械学習というか、データ解析の領域の人達にとっては、リアルタイムとは「現実世界で取得したデータをその場で解析する」という意味で捉えているかもしれません。もちろん、基本的にそれで間違ってはいないのですが、制御の領域ではリアルタイムとはもう少し多くの意味を持っています。
制御の領域では、リアルタイムとは
「決められた時間内に確実に計算を終え、結果を出力できること」
です。例えば、10msごとに繰り返し制御を行うシステムである場合、以下の図のようになります。
入力を受けて計算し、10ms以内に計算を終えて出力すればOK、10msを超えて出力してしまったらNGです。
「なんだ、大したことないな」と思った方、実は一般的な市販のPCは、こんなことすら出来ていないんですよ。
汎用OSはリアルタイムではない
PC用のOSと言えばWindows、Mac、Linuxですが、通常これらはどれもリアルタイムではありません。
上記のOSでは、複数のアプリを並列に処理しています。具体的に言うと、短い時間間隔で複数のプロセスを切り替えながら、CPUで処理をさせています。決して一つの処理を優先的に行うことはありません。
それによって何が起こるかというと、例えば上記のリアルタイムでしたい処理を行おうと思ったとき、10ms以内に計算を終えなければならないのですが、計算を終える前にOSが別の処理に切り替えてしまいます。戻ってくる頃には10msはとっくに過ぎてしまっていた、ということが起こります。なぜこんなことをするかというと、常にタスクを切り替えるほうが全体のスループットが向上し、CPU資源を効率よく使うことができるからです。
普通のPCではまず使われることがないですが、特定の処理を絶対的に優先して行うことができるOSも存在します。そのようなOSをリアルタイムOS(RTOS)と呼びます。制御設計では、実機試験を行う際には必ずRTOSを持つ機器を使います。
ちなみにもう一つ、PCが制御の実機試験で使われない理由としては、故障率の高さがあります。リアルタイム制御で扱う制御対象は大きなエネルギーを持つものが多く、一つのバグで人命に繋がる危険性があります。普通のPCではハード的にもソフト的にも故障率が高く、危なくて使えないということです。
そもそもなぜリアルタイムが必要か
ついでに制御初心者のために、そもそもなぜリアルタイムが必要なのかを説明しておきます。
制御理論は古典制御と呼ばれる学問領域から始まりました。伝達関数と呼ばれるダイナミクスを表現する手法がありまして、それを用いて周波数応答などを評価して望みの挙動を達成する制御理論です。
元々の伝達関数はs領域(ラプラス変換)という時間的に連続した世界で表現されていますが、昨今のデジタル制御機器ではs領域を使った連続制御を行うことができず、必ずある時間を費やしてから値を更新する離散制御となります。離散制御を連続制御に近づけるためには、時間間隔を無限小にする必要がありますが、計算リソースの限界があるために、そのようなことはできません。
そこで、s領域を離散の世界で表現したz領域(z変換)という表現手法が生まれました。デジタル制御機器の動作をまずz領域で表現し、s領域に戻してやることで従来の伝達関数による解析ができるようになります。そして、z領域で表現するためには値の更新間隔は一定でなければなりません。
またもう一つ理由がありまして、先程リアルタイム制御機器は危険だという話をしましたが、その際に確実に非常時の処理を実行できる能力も必要になります。その一定時間内に実行する確実性を担保するためにもリアルタイムは必要になります。
普通のPCのリアルタイム性能
ここで、普通のPCのリアルタイム性能を確認してみましょう。普通のPC代表ということで、私の私物PC「Surface Pro 6」君に頑張ってもらうことにします。
ハード的な性能は以下のようになっています。
- CPU:Core i5-8250U
- GPU:UHD Graphics 620
- RAM:8GB
- Storage:SSD, 256GB
そして、普通のOS代表ということで以下の二つのOSで実行します。下記はデュアルOSとしてインストール済みです。
- Windows10 Home 1903
- Ubuntu 18.04.3 LTS
一定の時間間隔は、SimulinkのSimulation Pacingという機能を使って作ります。MATLABのバージョンはR2019b Update4とします。
唯一の違いはOSのみということで、図らずもWindows vs Ubuntuという構図になりました。多くの皆さんが「Ubuntuが勝つのでは」と予想していると思いますが(私もそうですが)、果たしてどうでしょうか…
勝負の前に、実験環境についてもう少し説明します。
一定の時間間隔で実行できたかどうか、を測るには、外部の信頼できる測定装置が必要です。ここでは定番中の定番、オシロスコープを使います。私物ですが「OWON VDS 3102」という安価なオシロを持っていますので、それを使います。
PCからオシロで測定できる信号を出すために、FTDIのUSBシリアル変換ケーブルを使うことにしました。Instrument Control Toolboxを使うとSimulinkから簡単にアクセスできるようになります。出力するデータを0xFFとすると、スタートビットで0になり、後はずっと1をキープするという信号を作ることができます。
よって、その1から0に立ち下がったタイミングを二つ取り出せば、その間の時間間隔が実行周期であると見ることができます。
Simulinkモデルの基本サンプル時間を、50, 20, 10, 5, 2, 1msの6パターンで、それぞれオシロで200サンプル取得し、平均、標準偏差、範囲(最大と最小の差)を比較しました。その結果を以下に示します。
WindowsとUbuntuでほとんど差異がないということが分かりました。数値上はWindowsの方が総合的に勝っていますが、実行する時々で変わりますので、このデータだけでは明確に勝っているとは言えません。
2ms以下では相対的な偏差が大きくなりますし、1msではそもそも平均1msをキープすることすらできていません。現実的には5msが限界ということになります。もちろんこれはPCの性能、OSのバージョン、MATLABのバージョンに依存しますので、他の条件では全く異なる可能性もあります。あくまで参考までにしてください。
データの数も200サンプルでは不足している可能性があります。なるべく連続して取ったのですが、異常な外れ値などがたまに発生しているように見えましたが、うまく計測できませんでした。前職で愛用していたYOKOGAWAのDLなどがあれば長時間全取りできるのですが、残念ながら用意できませんでした。
普通のPCをリアルタイム化する
普通のPCの限界が分かったところで、リアルタイムを求めるシステムであれば通常はここから専用機器を使うことになりますが、ところで、本当にこれが限界でしょうか。実は、この普通のPCの限界を引き上げる魔法のツールボックスが存在します。それが「Simulink Desktop Real-Time」です。ようやく本題ですね。
もちろん別に魔法でも何でもなく、普通の技術です。今から説明していきますが、まずはSimulation Pacingから順に説明します。
Simulation Pacing
実行するタイミングが来たら処理を実行し、実行が終わった後、次の実行までの残り時間を測り続け、その時が来るまで何もせずに待ち続けるということをしています。
時間を測っているとはいえ、あくまでOSの支配下で行っているために、OSのタスク切替に対しては全く対処できません。
Simulink Desktop Real-Time Normal Mode
このツールボックスには大きく分けて二つのモードが存在します。一つ目がNormal Modeです。Accelerator Modeというのもありますが、こちらは単にSimulinkモデルをAccelerator Modeで動かしているだけで、本質的には同じです。
Normal ModeではOSの外側にI/Oデバイスの入出力タスクを置き、一定時間周期で入出力処理を行います。そのタイミングでSimulinkの実行を進めます。
Simulinkモデルの作り方としては、トップ階層のモデルキャンバスに「Real-Time Synchronization」を置き、Sample Timeを実行周期に設定します。さらに、Simulink Desktop Real-Timeに対応したI/Oブロックを置きます。
I/Oブロックが無くても、実はリアルタイム実行できます。しかし、タイマーとの同期が上手くいかないようで、結局Simulation Pacingと性能は何も変わりません。
それでは、ここでNormal Modeの実力を見てみましょう。Simulink Desktop Real-Timeに対応したデバイスはこのページに書かれています。この段階で気づいて申し訳ありませんが、対応OSはWindowsとMacのみで、Ubuntuでは使えないことが分かりました。しかもよく見るとPCI Busなどのインターフェースがメインで、ノートPCで使えるものがほとんど無いですね。
仕方ないので、唯一Thunderboltで接続できるHumusoft MF644を使うことにします。
…!?
なんと、Surface Pro 6のポートはThunderboltではないようです!! Display Portとしては問題なく使えていて、全く気づきませんでした。
ここにきてPCを変更せざるを得なくなりました。私が現在仕事で使っているPCはThinkpad T480sです。こちらはUSB-C(Thunderbolt 3)が付いていますので、StarTechのThunderbolt3とThunderboltを変換する変換器を使って接続します。
改めて、Thinkpad T480sの性能を示します。簡単に確認したところ、Simulation Pacingでの動作はSurface Pro 6とほとんど同じでした。
- OS:Windows10 Enterprise 1903
- CPU:Core i7-8650U
- GPU:UHD Graphics 620
- RAM:16GB
- Storage:SSD 512GB
Simulation Pacingで行った結果(TTL-232R)と比較した結果を以下に示します。
500μsでも平均をキープでき、標準偏差と範囲も全体的に良くなりました。文字通り桁違いの性能ですね。ただし、2ms以下では、Pacingと大差ない結果になっています。波形をじっと見ているとわかりますが、度々同期が外れたりします。その現象が外れ値として計測されています。
つまり、Normal Modeではモデルの実行がまだOSの支配下で行われているため、2ms以下では同期が難しいのですね。
Simulink Desktop Real-Time External Mode
最終形態のExternal Modeですが、こちらはモデルの処理もOSの外で行います。
具体的に言うと、まずモデルをSimulink CoderでCコード生成し、コンパイルして実行ファイルにします。それをOSのカーネルモードという特別な動作方法で実行させます。MATLABは単に通信してログを記録したり表示したりしているだけですね。
モデルの作り方としては、I/Oブロックを置き、コンフィギュレーションパラメータでコード生成のターゲットファイルを「sldrt.tlc」に設定します。
Normal Modeと比較した結果を以下に示します。もう面倒なので、External Modeは2ms以下しか計測していません。
Normal Modeと比較しても格段に良いことが分かります。100μsのときに、外れ値が計測されまして、標準偏差と範囲が大きくなっています。波形を見ていると、実はこの辺りから少しずつ不安定になってきていることが分かります。つまり、50μsでも少し不安定ですが、このときの計測ではその現象が拾えていません。
50μsまで来ると、I/Oデバイスの計測・通信遅延なども無視できなくなってくる世界です(今回は単純なデジタル入出力だけ使っているので全く問題ありませんが)。むしろ十分すぎるくらいではないでしょうか。
こんなに凄いExternal Modeですが、コード生成しなければならないので、Normal Modeと比較すると使える機能が限られてしまいます。ここはどうしてもトレードオフがあります。
最後に
いかがでしたでしょうか。「Simulink Desktop Real-Time、使える」と思った方は是非お試しください。
50μsでも安定した制御性能が欲しいという場合は、これとは別にSimulink Real-Timeという製品があります。speedgoatという専用のRTOS機器と連携し、リアルタイム制御を実現することができます。
5Gという新しい通信規格を使ったサービスも始まりつつありますが、なんと5Gは遠隔リアルタイム制御ができるほど信頼性が高いそうですね。いったいどれほどか、測ってやりたくなりませんか? その時が来たら是非皆さんで。
以上、長々とお読みいただき、ありがとうございました。
コメント
コメントを残すには、ここ をクリックして MathWorks アカウントにサインインするか新しい MathWorks アカウントを作成します。