2021-10

事例

【PyFMI】最小構成のMBD事例 第2章 その137【CAN連携①】

さらなるHILSっぽさを求めて外部入力を検討。 ECUのインターフェースを想定すると分かり易い。 インターフェースは様々ではあるが、とりあえずCANであれば融通が利きそう。 CANからADC、DAC、PWMへの変更はそれほど大変ではない。 よって、今後はCANをインターフェースの前提として話を進める。
事例

【PyFMI】最小構成のMBD事例 第2章 その136【リアルタイム描画㉚】

マルチプロセス化実験コードを実際に動作させてみた。 一応負荷は下がったが、それでも50ms間の負荷がかかるポイントが散見される。 結果としてはPipeのプロセス間通信のオーバーヘッド。 他のプロセス間通信でもこのオーバーヘッドはそれほど変わらない。 今後の実験は通常のシングルプロセス版のコードをベースとする。
事例

【PyFMI】最小構成のMBD事例 第2章 その135【リアルタイム描画㉙】

マルチプロセス化した実験コードを提示。 基本的な流れは一緒だが、Pipe関連のコードが増えた。 deque毎にsend_bytesで送信。 Scaleの入力やsin波生成指示を描画のメインプロセスからFMUのサブプロセスに送ってる。 sin波をサブプロセス側にしないと、結局描画負荷でsin波が崩れる。
事例

【PyFMI】最小構成のMBD事例 第2章 その134【リアルタイム描画㉘】

Pipeの受信処理のコードを提示。 受信自体は一関数だが、byte配列からdoubleに直すのに手間がかかってる感じ。 Pipeの受信確認。 受信関数自体は受信が来るまで戻ってこないので、無条件では呼びたくない。 よって、poll関数で受信有無を確認した後に実際の受信処理をする。 次回から実際のコードと動作確認。
事例

【PyFMI】最小構成のMBD事例 第2章 その133【リアルタイム描画㉗】

Pythonでサブプロセスの生成と開始について説明。 Process関数を呼ぶだけ。 引数にサブプロセス開始時に呼び出す関数とそれに対する引数を渡せる。 今回はPipeを渡しておく。 Pipeによる送信について説明。 send_bytesを呼ぶだけ。 dequeのままでは渡せないのでdouble型のarrayにする。
事例

【PyFMI】最小構成のMBD事例 第2章 その132【リアルタイム描画㉖】

Pythonでマルチプロセスをする上での手順確認。 Pipeを使ったプロセス間通信が面倒そう。 追加コードについては今回は触り程度。 要importのライブラリ。 multiprocessingのProcessとPipe。 Pipeの生成。 送受信の2つが取得できる。 引数自体で双方向、片方向が切り替わる。
事例

【PyFMI】最小構成のMBD事例 第2章 その131【リアルタイム描画㉕】

スレッド以外で処理分散を検討。 マルチプロセスでやれば分散できるかもしれない。 マルチプロセスを実現するにはプロセス間通信が必要。 Queue、Pipe、共有メモリとあるが、今回はPipeを使用してみる。 ただし、通常の文字列送信方式ではなく、バイナリ方式。 文字列方式は型を維持できて便利だがオーバーヘッドが大きい。
事例

【PyFMI】最小構成のMBD事例 第2章 その130【リアルタイム描画㉔】

描画を止める以外で負荷低減方法を検討してみた。 スレッドの利用案が出たが以下の理由で不可。 GIL(Global Interpreter Lock)仕様の影響で期待するスレッドのコンテキストスイッチにならない。 よって、負荷はほぼ減らない。 下手したら増える可能性もある。 というわけで対策としては見送り。
事例

【PyFMI】最小構成のMBD事例 第2章 その129【リアルタイム描画㉓】

前回の負荷を安定化する方法を検討。 描画に処理時間を持っていかれているっぽからpauseで描画だけ停止していた。 案の定、負荷安定化。 上記より、フェーズを分けた利用法が考えられる。 デバッグフェーズは波形を見ながら。 ある程度デバッグが完了したら波形無しの高精度状態で検証する。
事例

【PyFMI】最小構成のMBD事例 第2章 その128【リアルタイム描画㉒】

修正コードでとりあえず動作させてみた。 問題無く動作した。 負荷確認実施。 カクついているが人間の操作のせいの可能性もある。 sin波の自動入力で確認。 やはりカクついている。 よって、操作の問題ではない。 CPU負荷を見て、さらにmatpotlibの波形拡大で詳細確認。 FMU処理以外の処理負荷大きそう。