こんにちは、ドルフィンシステムの笹生です。
今日は、「MATLAB で起きた不可解でとってもレアな現象」というタイトルでお送りしたいと思います。
無線通信の研究分野に身を置いておりますと、MATLAB の恩恵にあずかることは皆様も多くあると思います。充実したツールボックスや、強力な行列演算機能のおかげで、難解な無線通信の信号処理アルゴリズムもスマートに記述できてしまいます。
さてそんな素晴らしいツールの MATLAB なのですが、全く同じ構成の PC 上で動作させているのにも関わらず、ある関数で止まってしまう現象が起きました。しかもその発生頻度が PC 毎に異なるのです。と、言ってもなんのこっちゃという感じだと思いますので、もう少し具体的に書いていきたいと思います。
まったく同じはずなのに、、、
内容の詳細は伏せますが、USRP から取得した信号を LabVIEW から MATLAB にUDP で投げ、MATLAB のあるツールボックスの関数で解析したのち、その結果を LabVIEW に UDP で返すという装置を 4式作成する内容のお仕事で起きてしまいました。
下記の図のようなイメージです。
そして LabVIEW ソフトも MATLAB ソフトも EXE にし、スタートアップに登録して、電源を入れたら動作を開始できるしくみに 4式とも全く同様にしていました。
期待される通常の動作であれば、信号取り込みごとに解析動作を繰り返す予定です。
まったく同じ型番、構成も一緒、OS も一緒、すべて一緒の PC なので、当然に同じソフトをインストールすれば動作も一緒になるとこちらは思っています。
ところが 4式の PC のうち、ある PC A は全く問題がないのに、ある PC B は MATLAB から全く結果が返ってこない状態でした。また他の2式 PC C と D はそれぞれ 3割くらい結果が返ってこない状態で、PC によって結果が返ってこない頻度が違うのでした。
どこに原因があるのか手探りで調査してみたものの、、、
最初に疑ったのは、スタートアップでのソフトの起動順序や時間でした。
一旦、スタートアップからの起動はやめ、手動で時間をずらしたり、順番を変えて実行させてみたのですが、どうもそういう問題ではなかったようです。
次に疑ったのが、LabVIEW - MATLAB 間の UDP によるデータの受け渡し方法の部分でした。
余談ですが結構この UDP でデータの受け渡しするのは便利なんです。同じローカル PC 内でも特別な IF を用意せずに実装できますし、いざ別の PC 等に分けて実装してもデータの受け渡しが可能ですのでスケーラビリティが高いです。
この部分で他のアプリケーションと UDP のポートがぶつかっているような状況があると、うまくデータ受け渡しができないのでは?
と疑いました。
結果的には結果が戻ってこない原因もここでもありませんでした。
ではどこまでなら動作しているのか、調べたところ、MATLAB で実装したある関数まではきちんと動作していたのですが、そのある関数に入ったとき、その関数から戻ってこないでだんまりになってしまうことが判明しました。
しかも頻度は違うものの起きる際には必ず PC 起動後の最初の 1回目だけに起こる現象のようでした。
そしてだんまりになったときには、一度 MATLAB の EXE を終了し、再度実行させると今度はすんなり動作するようになりました。
しかし、PC を再起動すると、やはり最初の1回目にその関数でだんまりになってしまいました。
関数の入力引数が悪いのか?試行錯誤が続く。。。
関数の入力がある特定の信号だとだめなのかと思い、関数から返ってこなくなる時にその手前の状態のメモリをダンプしておきました。
そして、そのダンプデータをデバッグ環境でその関数の引数に与えたところ、問題なく結果を返してきました。
つまり入力引数に問題があるわけでもなかったようです。。。
回避策が見つかる!
毎回一度起動した MATLAB のEXEアプリを終了して再起動させることも技術的にできないことはないですが、ちょっとやりたくありませんでした。
そこで試しに帰ってこなくなってしまう該当関数を MATLAB の最初のほうでダミーの入力引数で一回だけ空実行させてみるソースコードに変更してみました。
すると、問題があった PC でも通常実行できるようになり、結果的に4式すべて問題なく動作をするようになりました。
まとめ
根本的な原因は残念ながら特定することはできませんでしたが、結果的に回避することはできました!
MATLAB サポートの方にも念のため相談をしましたが、こういうケースは他でも認識されておらず、ソースも見ていただきましたが残念ながらわからないそうでした。
やはりかなりのレアケースなんだと思います。
サポートの方にも感謝です。
とはいえ、今回のように LabVIEW+MATLAB の連携しての開発はかなり便利ですので今後も推進していけたらと思っています。
0 件のコメント :
コメントを投稿