Python を用いて実行中の Simulink の値を取得することができません。

20 views (last 30 days)
Kaito Okada
Kaito Okada on 18 Nov 2020
Python と MATLAB, Simulink を連携させてドローンを制御するプログラムを構築しているのですが、Simulink 側で計算した結果を Python の方で取得する際にエラーが出てしまいます。
現在は上の図に示してあるように計算結果を「To File」を用いて mat ファイルとして保存しています。
function [Vwa_x, Vwa_y] = Get_Param_XY()
load Data_XY.mat Res ;
Vwa_x = Res.Data(end,1) ;
Vwa_y = Res.Data(end,2) ;
end
保存したデータを上のプログラムを Python 側から以下のように実行してデータを取得する方法をとっています。
(「Data_Z.mat」についても同様の方法です)
V_wa_xy = eng.Get_Param_XY( nargout = 2 )
1度目の処理では問題なく実行でき、Python でデータを取得できるのですが、2度目の処理では
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\ProgramData\Python\Python37\lib\site-packages\matlab\engine\matlabengine.py", line 71, in __call__
_stderr, feval=True).result()
File "C:\ProgramData\Python\Python37\lib\site-packages\matlab\engine\futureresult.py", line 67, in result
return self.__future.result(timeout)
File "C:\ProgramData\Python\Python37\lib\site-packages\matlab\engine\fevalfuture.py", line 82, in result
self._result = pythonengine.getFEvalResult(self._future,self._nargout, None, out=self._out, err=self._err)
matlab.engine.MatlabExecutionError:
File C:\省略\Get_Param_XY.m, line 2, in Get_Param_XY
ファイル C:\省略\Data_XY.mat を読み取れません。
となってしまいます。
どのようにすれば、この問題を解決することができますか。
また、他の方法があれば教えて下さると幸いです。

Answers (1)

交感神経優位なあかべぇ
1度目の処理では問題なく実行でき、2度目の処理では失敗する原因ですが、おそらくこれは、2度目の処理だから失敗しているわけではなく、Simulink実行中に、Get_Param_XYの関数を実行し、Data_XY.matファイルをロードしようとしていることが原因だと思います。
SimulinkのTo Fileブロックが、Data_XY.matファイルの書き込み、読み込み権限を占有してしまっているので、外部からData_XY.matファイルのロードができなくなってしまっている状態です。
回避策の例として、To Fileブロックを使用するのではなく、下記図のようにMATLAB Functionを使用して、入力されたデータをベースワークスペースに書き込みをします。
そして、Pythonで下記のスクリプトを実行することで、ベースワークスペースに保存されている変数Resの値をPythonに取得させることができます。
V_wa_xy = eng.workspace['Res']

Products


Release

R2020a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!