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

조회 수: 28 (최근 30일)
海斗 鈴木
海斗 鈴木 2023년 5월 26일
답변: Toshinobu Shintai 2023년 5월 26일
強化学習環境を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()

답변 (1개)

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

카테고리

Help CenterFile Exchange에서 Python からの MATLAB の呼び出し에 대해 자세히 알아보기

제품


릴리스

R2022a

Community Treasure Hunt

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

Start Hunting!