02-14-2012 04:18 AM
LabVIEW 2010で
メインのVIを毎回「実行」→「停止」する作りが煩わしかったため
最上位にタイマ待ちを入れたループを配置して連続で動作を行えるよう
添付のファイルのようなイメージで作りを修正しました。
ところが以下の問題が発生しました。
●フィードバックノードの初期化を"最初の呼び出しで初期化"で行っていたため
メインのVIが一度しか実行されなくなった事により、必要なタイミングで初期化が
行われない。
元々、私が作成したものではないので、大きな修正を加えることなく
フィードバックノードの初期化タイミングを直したいのですが、
何かよい方法は無いでしょうか?
よろしくお願いします。
Solved! Go to Solution.
02-14-2012 08:48 PM
tnishiki様
平素よりNI製品をご利用頂きまして誠に有難うございます。
日本ナショナルインスツルメンツ技術部の山田と申します。
tnishiki様の添付して頂きましたVIに関して確認させて頂きたい事がございます。
動作としては各メニューのボタンを選択するとケーストラクチャ内の処理を行うよう作っているのでしょうか。
またフィードバックノードが添付されたファイルには無かったので、どのようににフィードバックノードを配線されていたのかを教えていただけると幸いです。
以上の情報をもとに調査を行い、再度ご連絡差し上げます。
またLabVIEWサンプルファインダの基本機能→ループとストラクチャにフィードバックノードに関してのサンプルVIがございますが、ご存知でしょうか。
参考までにご参照くださいませ。
宜しくお願い致します。
山田
日本ナショナルインスツルメンツ技術部
02-15-2012 01:03 AM
日本ナショナルインスツルメンツ技術部 山田様
早速回答を頂き、ありがとうございます。
問題のサブVIが小さいファイルなので、ファイルをそのまま添付させていただきます。
少々長くなりますが、修正の前後の使用方法の説明をさせていただきます。
LabVIEWは、無線で加速度・角速度の計測値を送信するセンサーとペアで使用しております。
無線センサーは全7つで、腰と左右の大腿・下腿足の甲に装着しています。
加速度センサからは、計測開始時の各センサの姿勢と、運動時の重力加速度の変化を計測しています。
(運動化速度ももちろん乗りますが、ローパスで運動成分の大半をカットしています)
角速度船さからは、計測前の0deg/sのオフセット値と、運動時の角速度の変化を計測しています。
【修正前】
メニューには以下の項目がありました
1.センサー初期化
2.センサーオフセット計測 ※今回の問題とは無関係です
3.センサー初期角度計測 ※立った状態・座った状態等、複数回計測します
4.運動計測
以下、添付した各サブVIの簡単な説明です。
<2次バターワースLPF>:加速度センサーからの入力値を任意のパラメータでフィルタリングし
重力加速度から求めるセンサーの傾斜角度変化と初期状態の角度算出に使用しています。
メニュー3、4で使用
<ジャイロ積分>:角速度センサーの入力値をフィードバックノードを使用して積分しております。
(本当はグローバル変数を用いて、フィードバックノードを使用せずに積分したいのですが、元が存在し
可能な限り修正を行いたくなかったので、この形になっております)
メニュー4で計測
<カルマンフィルタ>:フィルタを通過させた重力加速度の値と、積分したジャイロの角度を元に、
オフセットドリフトを除去した角度の算出を行っております。
メニュー4で計測
---------------------------
修正前は、各計測の度にメインVIを【開始】していたので問題は発生しませんでしたが
メニュー4の運動計測を連続で行う際に、オペレーションが煩雑になるため変更を行いました。
すると、フィードバックノードを[最初の呼び出しで初期化]する部分で不都合が発生したという次第です。
(よくありそうな話で済みません)
何か、少ない手数で修正できる方法(トップレベルVIが再度【開始】したと判断させるなど)は無いでしょうか
以上、よろしくお願い致します。
02-15-2012 08:13 PM
tnishiki様
日本ナショナルインスツルメンツ技術部 山田です。
お忙しい中ご連絡を頂きましてありがとうございました。
添付ファイルを拝見させていただきました。
こちらについて確認させて頂きたい事がございます。
簡単に運動計測をメインVIのケースストラクチャのケース1内(メニューA動作のコメントがあったケースです)に配置して現象を再現をしてみました。
メインVI実行後、メニューAボタンを押すとフィードバックノードが初期化され、出力、△bに値を表示します。
その後は、メニューAボタンを押すとフィードバックノードが前回のループで保存した値を元に新しい値を表示しました。
上記で説明した現象が発生しているのでしょうか?
初期化はどのようなタイミングで行われたいのでしょうか。
私の理解不足で申し訳ございませんが上記内容をご確認の上、お手数ですが再度ご連絡願います。
宜しくお願い致します。
山田
日本ナショナルインスツルメンツ技術部
02-15-2012 09:09 PM
日本ナショナルインスツルメンツ技術部 山田
回答ありがとうございます。
説明不足で申し訳ありませんでした。
実際の操作は、例で示すと以下のようになります。
メニューA:初回1回のみ
---(X)---
メニューB
メニューB (1回~最大4回実行)
メニューC
メニューC
メニューC (1回~制限なし)
---(Y)---
以後、(X) →(Y)を複数回繰り返して実行します。
上記の例で、メニューBに相当する処理からは【2次バターワース】を
メニューCからは、【ジャイロ積分】と【カルマンフィルタ】をコールします。
各サブVI内のフィードバックノードは、【各メニュー】が実行される度に初期化を行いたいのですが、
メニュー内では各々のサブVIが複数回コールされており、初期化を行いたいタイミングは
新たにメニューを起動された後の初回コールの時のみです。
なので、トップレベルVIで新たなアクションを起こした時にだけ、
下位層で使用しているフィードバックノードに対して、『初回起動だからフィードバックノードの初期値設定をせよ』
というアクションを実行させたいという状況です。
以上、よろしくお願い致します。
02-15-2012 09:11 PM
日本ナショナルインスツルメンツ技術部 山田様
大変失礼致しました、申し訳ございません。
02-19-2012 09:09 PM
tnishiki様
日本ナショナルインスツルメンツ技術部 山田です。
私の理解が正しければ以下の方法で初期化をメニューの初回コールで行えます。
選択関数をメニューのケース内で使用し、メニューが初回コールされた場合には初期値を呼び出し、
初回コールで無かった場合にフィードバックノードで前回保存された値を呼び出す。
選択関数が初回コールか判断する方法は比較関数を使用して前回にコールされたメニューと一致しているか比較します。
上記の内容をサンプルにて添付いたしましたのご参照くださいませ。
サンプルでは各ケースが紹介コールされるたびに初期化されます。
フロントパネルに列挙体がございますが、
tinishiki様の添付して頂きましたVIはメニューコールはボタンでの操作でしたが、VI内に「実際には、番号を入れ替える処理が入っています」とのコメントがございましたので、ケースストラクチャのケースを呼び出すために列挙体と置換致しました。
tinishiki様のVIとはメニューの動作が異なりますが、メニューの初期化をご覧になって頂きたいと思いサンプルを作成致しました。
列挙体でメニューの変更をして頂くとメニューBとCが初回でコールされましたら、初期化が行われます。
メニューBとC内の処理は簡単に足算を行なっています。
上記内容をご確認の上、意図されている動作が確認できますか、経過をお知らせください。
宜しくお願い致します。
山田
日本ナショナルインスツルメンツ技術部
02-19-2012 11:01 PM
日本ナショナルインスツルメンツ技術部 山田様
トップレベルからコールした時には、フィードバックノードをリセット
各メニュー内からコールした時には、値を加算する動作が確認できました。
ありがとうございます。
02-20-2012 12:39 AM
tnishiki様
日本ナショナルインスツルメンツ技術部 山田です。
お忙しい中、解決のご返信を頂きまして有難うございます。
少しでもお力添えでき大変光栄です。
今後とも弊社製品を末永くご愛顧いただけますよう宜しくお願い申し上げます。
山田
日本ナショナルインスツルメンツ技術部