PythonとSim​ulinkをリアルタ​イムで連携したい。

44 views (last 30 days)
海斗 鈴木
海斗 鈴木 on 26 May 2023
Answered: Toshinobu Shintai on 26 May 2023
強化学習環境をSimulinkで作り、Pythonで作られた強化学習アルゴリズムとリアルタイムで連携することを考えています。
簡単な試みとして、Simulink内の一次遅れのステップ応答にPythonで1を加えるというコードを作成しようとしました。
while文で連携を試みていますが、Simulinkのfunctionブロック内のwhile文「'wait to receive input from python...'」から抜けられていないため、Python側の計算が同時並行で進行できていないようです。
解決策のヒントなどありましたらご教授お願いいたします。
function y = fcn(x)
coder.extrinsic('assignin','evalin')
assignin('base','obs',x)
assignin('base','start_py',true)
while not(evalin('base','send_done'))
pause(0.1)
disp('wait to receive input from python...')
end
assignin('base','send_done',0)
assignin('base','start_py','False')
u_temp = 0.0;
u_temp = double(evalin('base','u'));
y = u_temp;
import matlab.engine
from time import sleep
eng = matlab.engine.connect_matlab()
eng.workspace['obs'] = 0
eng.workspace['u'] = 0
eng.workspace['send_done'] = 0
eng.workspace['start_py'] = False
session = eng.sim('RL_ENV',background=True)
while not session.done():
while not eng.workspace['start_py']:
sleep(0.1)
print('wait...')
obs = eng.workspace['obs']
eng.workspace['u'] = obs + 1.0
eng.workspace['send_done'] = 1
eng.quit()

Answers (1)

Toshinobu Shintai
Toshinobu Shintai on 26 May 2023
Simulinkは基本的に、1ステップの計算が終わるまでワークスペースの変数を更新することができません。従って、MATLAB Function ブロックで while文を記述し、その中でベースワークスペースの更新を待つ処理を行うと、いつまで待ってもwhileを抜けることができなくなります。
一番簡単な対処法としては、リアルタイム連携(MATLABとPythonのコシミュレーション)ではなくて、Pythonで作られた強化学習アルゴリズムをSimulinkにインポートし、Simulinkベースでシミュレーションを実行する方法です。
以下の記事をご参照ください。
コシミュレーションをしたいということであれば、UDPを使ったアプリ間通信をする方法もあります。

Products


Release

R2022a

Community Treasure Hunt

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

Start Hunting!