05-07-2019 10:04 PM
初めまして,私は大学院にてドローンの研究を行っているものです.
myRIOのwhileループとグラフの時間について質問をしたく投稿させていただきました.
現在の状況といたしましてはmpu6050という慣性計測装置(以下IMU)をmyRIOと合わせて利用しています.このIMUは角速度と加速度の算出が可能であるため、それらの値を利用してmathscriptにてカルマンフィルタの設計を行いました.
カルマンフィルタの計算量によりwhileループ周期に悪影響を及ぼしていないかの検証を行うためwhileループ周期の確認をおこなえるようにしたいのですがどのようにすればよいのかわかりません.
また,上記のセンサー値やカルマンフィルタによって算出した角度をグラフに表示した際の時間軸が[秒]と[ミリ秒]とも言えない謎の時間になっていると思うのですがどうすれば[s]単位で表示できるのかわかりません.
誰かご教授いただけると幸いです.よろしくお願いいたします.
05-08-2019 07:19 PM
平素よりお世話になっております。
日本NIの立木と申します。
ループ周期についてはティックカウントを使用して調べることが出来ると思います。イメージとしては添付図のようなものです。
また、既にご存知のこととは思いますが、LabVIEWでは「グラフ」と「チャート」は異なります。添付いただいたプログラムでは、「チャート」を使用されている状態ですが、このチャートは、特殊な数値表示器のようなイメージになります。数値を表示するだけなので、時間情報を持たず、あくまで「何番目に取得されたデータか」という順の番号がX軸になります(要するに、何番目のデータか、という値がXに、そのデータの値がYにきます)。一つ一つのデータが取得されているタイミングが1秒ごとでしたら、X軸の値は(擬似的に)秒単位となりますが、そうではない場合には「謎の時間」になっているように見えると思います。
まずは、ループの速度の制御に、「次のミリ秒倍数まで待機」を使用して、様子を見られてはいかがでしょうか?
宜しくお願い致します。
日本NI
立木
05-09-2019 03:39 AM
日本NI 立木様 返信ありがとうございます.
NIの製品を使ってから日が浅く明確な区別がついていなかったため,勉強になりました.その結果「グラフ」と「チャート」の問題は解決できたと考えております.アドバイスありがとうございました.
ループの速度に関してですが「次のミリ秒倍数まで待機」ブロックを使用せず、添付させていただいた画像1,画像2のようにループ周期の決定を行っているのですがこの方法は適切ではないのでしょうか?
またループ周期に関して前回回答にあった「loop_time.png 」を作成し確認したのですが本来は1[ms]周期でwhileループを回しているのですが,時折2[ms]になったりしていることがわかりました.
この原因としてチャートの表示機能をmyRIOで処理しているため処理に負荷がかかり遅延していると考えているのですがこの機能を現在使用しているデスクトップPCのlabviewに転送をかけて表示をするといったことは可能なのでしょうか?
大変拙い文章での質問ですが回答していただけると恐縮です.
05-09-2019 04:59 AM
添付いただいた、タイミングループによるループ周期を使用された場合でも、タイミングに対して、より確定的な動作を行なわせることが可能です。
それでも時折2 msになってしまう、ということは、ご推察の通りどこかしらの処理に負荷がかかっていることが考えられます(チャート表示の部分とは限りません)。
LabVIEWでは、処理を分散させるという考えがあり、その組み方の例として、
・キューを用いてループを複数に分ける
・別の端末にデータを飛ばして処理する
といったことが挙げられます。kome-19214様が指摘されているのは後者ですね。
LabVIEWでは、一つのループに入った処理が全て終わるまで、次のループに進みません。したがって、データ取得、解析、あるいは保存などをまとめて一つのループに入れた際に、思ったとおりのループ速度にならない場合がおきます。その際に考慮して頂く組み方として比較的よく使われるのがキューを用いたプログラミングです。
キューとは何ですか? - National Instruments
https://knowledge.ni.com/KnowledgeArticleDetails?id=kA00Z000000P7OfSAK&l=ja-JP
ただし、myRIO上で動作させる際には、RT FIFOというものをキューの代わりに使用していただく形になります(キューはwindows OS上で動作するプログラムで使用します)。これには、関数としてRT FIFOを有効にするか、あるいはシェア変数のオプションでFIFOを有効にするかといった選択肢があります。使用については、以下のサンプルや資料が参考になるかもしれません。
Simple Real-Time FIFO Example for LabVIEW - NI Community
https://forums.ni.com/t5/Example-Programs/Simple-Real-Time-FIFO-Example-for-LabVIEW/ta-p/3507189
Real-Time FIFO Frequently Asked Questions - National Instruments
http://www.ni.com/product-documentation/54516/en/
LabVIEW Real-Timeで初回の計測を行う(データロギング) - National Instruments
http://www.ni.com/tutorial/11198/ja/
また、シェア変数を用いてホストPCにデータを転送する方法については、簡単なサンプルを作成いたしましたので、ご確認いただければと思います。
あまり慣れていらっしゃらないとのことで、初めて目にする用語等も多いかとは思いますが、宜しくお願い致します。
05-10-2019 02:03 AM
NI日本 立木様
迅速な返信ありがとうございます.
「RT FIFO」については今後必要になったときに備えて勉強をしていこうと思います.
「別の端末にデータを飛ばして処理する」についてですが添付していただいたsample viを参考にした結果host PC上でチャートの表示が可能になりました.
しかしながら,現状の問題であったループ周期が未だに2[ms]となる場合があるのですが他に考えられる処理動作に負荷が生じる場所はありますでしょうか?
初歩的な質問ではありますが,よろしくお願いいたします.
05-10-2019 03:51 AM
ループ周期が改善されない、とのことですが、負荷がかかっている部分としては、やはりmathscriptの計算処理に原因があると考えます。例えば、極端に考えて、mathscriptの部分が全くない状態では、毎回必ず1 msで回るでしょうか?
あるいは、どういった入力値がmathscriptで処理されたときに2 msかかってしまうようになるのか、傾向を把握することは出来るでしょうか?
また、後からのご案内になって申しわけございませんが、タイミングループの機能として経過時間を見る機能があるのですが、こちらを使用しても2 msとなる場合があるかもご確認いただけないでしょうか?
宜しくお願い致します。
05-12-2019 08:17 PM
NI日本 立木様
返信ありがとうございます。
土日に調査を行った結果立木様のおっしゃる通りMathscript内に原因があるように思います。
Mathscript内のatan2関数の数を増やすと遅延が生じやすくなっているように感じられます。
またループ周期についてですが「timing_loop_period.png 12 KB」の周期検出であれば1[ms]と表示されるのですが、
最初の質問の回答にあった「loop_time.png 43 KB」だとほぼ[1ms]と表示されるのですが時折[2ms]と表示されます。
どちらのループ周期が正しいのか判断しかねます。
度重なる質問となりますがよろしくお願いいたします。
05-12-2019 08:52 PM
ループが、タイミングループで指定したタイミングで回っているかどうかについては、「遅れて終了」というノードの出力がTRUE、FALSEどちらになるかで確かめることが出来ますので、こちらで判断できるかもしれません。これは、添付pngファイルに記載のある部分から使用することが出来る機能です。
例えば、タイミングループでdt=100としている場合、これは、100 ms周期で繰り返す、という指示になっているため、常に100 ms周期で回っているのであれば、「遅れて終了」はFALSEのままになります。しかし、この周期から外れてしまうと、「遅れて終了」はTRUEを返します。そのあと再び100 ms周期に戻ればFALSEとなります。
この機能を使用したときに、どのような結果になるか、ご確認いただけないでしょうか?
宜しくお願い致します。
05-16-2019 02:56 AM
NI日本 立木様
返信が遅れてしまい申し訳ありません。
提案していただいた方法でのループ周期の確認を行ってみたところ、FalseとTrueを行き来する様子が観測できました。結論といたしましては1[ms]でプログラムが回っていないと思われます.。
また、ループが1[ms]で回らない主な原因とされるMathscript部分をダイアグラム無効ストラクチャで囲んでみた結果1[ms]でループしたためやはりMathscriptに問題があると考えられます。
返信が遅くなり申し訳ありませんがよろしくお願いいたします。
05-16-2019 07:45 PM
検証結果をお知らせいただきありがとうございます。
結果から推察いたしますと、プログラムでこれ以上動作を早くさせるのは難しいかもしれません。ただし、今回はMathScriptの部分が処理遅れの原因になっている可能性が高いという状態であるため、ここについてもう少し検討されると良いかもしれません。
大変恐れ入りますが、kome-19214様がMathscriptの中で記述されているコードを十分理解できていないため、具体的なアドバイスとはならず申し訳ございませんが、記述の仕方で処理速度が改善される可能性があるようです。ディスカッションフォーラムで検索をすると、いくつか参考になりそうな記事が見つかりそうです。例えば、以下のようなものがございました。
how improve MathScript speed & how much fast in 8.2 - NI Community
https://forums.ni.com/t5/LabVIEW-MathScript-RT-Module/how-improve-MathScript-speed-how-much-fast-in-...
Execution speed MathScript vs Matlab Script in LV - NI Community
https://forums.ni.com/t5/LabVIEW-MathScript-RT-Module/Execution-speed-MathScript-vs-Matlab-Script-in...
解決済み: Re: LabVIEW MathScript computation speed improvement - NI Community
https://forums.ni.com/t5/LabVIEW-MathScript-RT-Module/LabVIEW-MathScript-computation-speed-improveme...
英語で検索をすると記事が多く見つかります。まずは上記資料等を確認し、改善されるかご確認いただけますでしょうか?
宜しくお願い致します。