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

23 Ansichten (letzte 30 Tage)
海斗 鈴木
海斗 鈴木 am 26 Mai 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()

Antworten (1)

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

Kategorien

Mehr zu MATLAB の Python ライブラリ finden Sie in Help Center und File Exchange

Produkte


Version

R2022a

Community Treasure Hunt

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

Start Hunting!