Simulink実行​中に大きな配列データ​を保持する方法,また​終了時にその配列デー​タを出力する方法

조회 수: 7 (최근 30일)
nito
nito 2022년 6월 2일
댓글: nito 2022년 6월 4일
ロボットモデル(simscape mutibody)のシミュレーションを行っており,simulink実行中にロボット動作によって逐次更新されるmapデータ(1000×1000程度の2次元配列)を扱いたいと考えています.
※シミュレーションは固定ステップ,ステップ時間1msec,終了時間300秒ほど
  全体の流れ 
  1. matlabスクリプトでmap初期値を定義
  2. map初期値を与えてsimulinkモデル実行
  3. simulink終了時に更新後のmapデータをワークスペース等に出力
現在は「matlab-Functionブロック」内の永続変数としてmapデータを格納し,データ出力は「条件付きサブシステム」と「To Workspaceブロック」を用いて行っています.本件に関して,以下3点を教えていただけますでしょうか.
  1. simulinkで大きめな配列データ(状態値)を保持する方法としてどのようなものがあるか ※できるだけ計算時間を短くしたい
  2. またsimulink終了時にその配列データを出力する方法
  3. simulink実行中にBase Workspace,Model Workspaceの変数を編集することは可能なのか?
↓現状の実装

채택된 답변

Toshinobu Shintai
Toshinobu Shintai 2022년 6월 2일
質問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のサイズを減らしたり、記録のためのサンプリングタイムステップを長くしたりすることで、より高速化できます。
以上、参考になりましたら幸いです。

추가 답변 (1개)

nito
nito 2022년 6월 3일
ご回答ありがとうございます.
質問①について,ご助言頂いた通り「MATLAB Function」を参照モデル化し,アクセラレータモード実行することで数倍早くなることを確認できました.mapサイズ,サンプリングタイムステップも効果を確認しながら調整したいと思います.
それとお願いと1点質問があるのですが,
まず私のmatlab環境が2021bのため(ライセンスの都合上),お手数ですが上のモデルを2021b以前バージョンで再度添付いただけますでしょうか.
次に「Terminate Function」ブロックで「To Workspace」ブロックを使用する件についてですが,
試してみたところ以下のエラーが発生しました.「Terminate Function」で何か設定等が必要なのでしょうか?
(同名の別ブロックを使用している?)
↓ エラー内容
↓ 「Terminate Function」内部
  댓글 수: 2
Toshinobu Shintai
Toshinobu Shintai 2022년 6월 3일
편집: Toshinobu Shintai 2022년 6월 3일
R2021bへ変換しました。
そして、To Workspaceがエラーとなる件、失礼しました。21bへ変換した後では、確かにエラーとなります。以前のモデルでなぜエラーが出なかったのかは分かりません。
To Workspaceの代わりに、以下のようにすることでエラーなくデータをログできます。信号線にmap_dataと名前を付け、シミュレーションデータインスペクターへのログ設定を行います。
実行後、以下のようにして結果を取り出すことができます。
logged_map_data = out.logsout.get('map_data').Values.Data;
nito
nito 2022년 6월 4일
ありがとうございます.無事データ取得できました.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 コンポーネントベースのモデル化에 대해 자세히 알아보기

제품

Community Treasure Hunt

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

Start Hunting!