Simulink実行中に大きな配列データを保持する方法,また終了時にその配列データを出力する方法
4 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
nito
el 2 de Jun. de 2022
Comentada: nito
el 4 de Jun. de 2022
ロボットモデル(simscape mutibody)のシミュレーションを行っており,simulink実行中にロボット動作によって逐次更新されるmapデータ(1000×1000程度の2次元配列)を扱いたいと考えています.
※シミュレーションは固定ステップ,ステップ時間1msec,終了時間300秒ほど
全体の流れ
- matlabスクリプトでmap初期値を定義
- map初期値を与えてsimulinkモデル実行
- simulink終了時に更新後のmapデータをワークスペース等に出力
現在は「matlab-Functionブロック」内の永続変数としてmapデータを格納し,データ出力は「条件付きサブシステム」と「To Workspaceブロック」を用いて行っています.本件に関して,以下3点を教えていただけますでしょうか.
- simulinkで大きめな配列データ(状態値)を保持する方法としてどのようなものがあるか ※できるだけ計算時間を短くしたい
- またsimulink終了時にその配列データを出力する方法
- simulink実行中にBase Workspace,Model Workspaceの変数を編集することは可能なのか?
↓現状の実装
0 comentarios
Respuesta aceptada
Toshinobu Shintai
el 2 de Jun. de 2022
質問3についてですが、一応できるのですが、可能ならそれは避けた方が無難です。今回のモデルでは実行中に変数を書き換える必要は無いかと思います。
質問2についてですが、今の方法でも問題はありませんが、「Terminate Function」ブロックを使うとすっきりしたモデルになります。以下のように構成すれば、シミュレーション終了時にワークスペースにmapを保存してくれます。
Terminate Functionの中身
実行後のワークスペースにoutというオブジェクトが作成されており、その中にmap_dataがあります。
質問1についてですが、確かに見せていただいた通りにモデルを作ると、簡単なモデルでも実時間の6倍ぐらいの時間がかかってしまっています(test_model.slxとmy_script.mです。バージョンはR2022aで作成しました)。
シンプルな改善方法としては、シミュレーションモードを「ラピッドアクセラレーター」に設定することです。これにより、私のPCでは実時間ぐらいで実行できるようになりました。
全体をラピッドアクセラレーターモードで実行するのが不都合であれば、MATLAB Functionの所だけ参照モデル化し、そのブロックをアクセラレーターモードに設定することで、同じような高速化の恩恵を得ることができます。(test_model_2.slx, log_model.slx)
もし可能なら、mapのサイズを減らしたり、記録のためのサンプリングタイムステップを長くしたりすることで、より高速化できます。
以上、参考になりましたら幸いです。
0 comentarios
Más respuestas (1)
nito
el 3 de Jun. de 2022
2 comentarios
Toshinobu Shintai
el 3 de Jun. de 2022
Editada: Toshinobu Shintai
el 3 de Jun. de 2022
R2021bへ変換しました。
そして、To Workspaceがエラーとなる件、失礼しました。21bへ変換した後では、確かにエラーとなります。以前のモデルでなぜエラーが出なかったのかは分かりません。
実行後、以下のようにして結果を取り出すことができます。
logged_map_data = out.logsout.get('map_data').Values.Data;
Ver también
Categorías
Más información sobre コンポーネントベースのモデル化 en Help Center y File Exchange.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!