chevron_left

メインカテゴリーを選択しなおす

cancel
KEI
フォロー
住所
未設定
出身
未設定
ブログ村参加

2020/02/11

arrow_drop_down
  • 【XCP】最小構成のMBD事例 第2章 その147【XCP Basic①】

    「HILSもどき」を利用した試したい事はXCPを利用することらしい。 XCPはBypass関連の記事で一年以上前にやったことはある。 BypassはECUの一部の機能をXCPを使って疑似化するもの。 今回やろうとしていることはECUの外側をXCPを使って疑似化するもの。 詳細は次回説明予定。

  • 【PyFMI】最小構成のMBD事例 第2章 その146【CAN連携⑩】

    「指令器」と「FMU処理&グラフ描画処理」の結合実験実施。 共に問題無く動作。 CANの送信周期が100msというのもあって、波形もキレイ。 上記の状況を動画で確認。 「HILSもどき」というおおよそ目的を達成した気もするが、他のアプローチも試したいのでこのシリーズはまだまだ続く。

  • 【PyFMI】最小構成のMBD事例 第2章 その145【CAN連携⑨】

    CAN連携の受信側(FMU処理、グラフ描画)のコードを開示。 __init__にバズ初期化とチェックボックス配置。 FMU_handlerでCAN受信。 ただし、タイムアウト0秒のポーリング方式。 一応起動することだけは確認済み。 あとは指令器側のCAN送信との連携を試すのみ。

  • 【PyFMI】最小構成のMBD事例 第2章 その144【CAN連携⑧】

    GUI(tkinter)にチェックボックス追加。 「can rcv」というチェックボックス。 チェック時に受信有効になる想定。 CAN受信にチェックボックス判定追加。 if文を追加したのみ。 バス初期化、チェックボックス生成は__init__メソッドに追加予定。 CAN受信はFMU処理のタイマハンドラ内に追加予定。

  • 【PyFMI】最小構成のMBD事例 第2章 その143【CAN連携⑦】

    CAN受信用にモード切替のUIが必要。 チェックボックスで実施予定。 CAN受信のimport、バス初期化はCAN送信側といっしょ。 実際の想定受信コードも記載。 スレッドを使うことも可能だが、タイムアウトを0秒にするポーリング型を想定。 とりあえず、負荷に影響を与えない&シンプルな実装にする。

  • 【PyFMI】最小構成のMBD事例 第2章 その142【CAN連携⑥】

    Python-CANで送信確認。 送信は成功している。 BusMasterで確認。 送信状況はモニタできている。 100ms周期より若干上振れしている。 Sleepで周期を作っているため、どうしても上振れ方向になる。 よって、今回は気にせず指令器としてはOKとする。

  • 【PyFMI】最小構成のMBD事例 第2章 その141【CAN連携⑤】

    Python-CANで指令値送信のコードを提示。 CAN関連の前回までの復習の話のまんま。 利便性を上げるためにコマンドライン引数を取り込む機能追加。 送信周期変更と繰り返し処理切替を追加。 動作確認はBusMasterでモニタすることで実施予定。 実際のCANだと対抗機が必要だがVirtual CAN Busでは不要。

  • 【PyFMI】最小構成のMBD事例 第2章 その140【CAN連携④】

    バックナンバーはこちら。はじめに前回はCAN経由で渡した情報やPython-CANのインストール、importの話。今回はバス初期化、送信の仕方の復習になる。一応、同じ話は過去記事でも扱ってはいる。登場人物博識フクロウのフクさんイ...

  • 【PyFMI】最小構成のMBD事例 第2章 その139【CAN連携③】

    CAN経由で渡したい情報として指令値を仮定義。 Ramp Up、Ramp Down、Stepなどの組み合わせ Python-CANの復習。 インストールの話。 pip使えばOK。 importの話。 canをimportすればOK。 以降はバス初期化、送受信などの話が続く予定。

  • 【PyFMI】最小構成のMBD事例 第2章 その138【CAN連携②】

    CANをHILSのインターフェースにするには本来では専用のインターフェース装置が必要。 しかし、今回はVector社のXL Driver Library付属のVirtual CAN Busを使用。(無償) 実験構成は指令値をCANで指定。 前回までのtkinterに対して追加する。 入力パターンが増えるイメージ。

  • 【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処理以外の処理負荷大きそう。

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

    実験用Pythonコードのクラス化。 基本、関数横断変数をメンバ変数にした。 つまり、メンバ変数になっているものが暗黙的なグローバル変数だった。 「実はグローバル変数だったのかー!」ってのはあるある。 前回と同様の動きはしていそうなので、このコードをベースに実験を継続する。 特に負荷関連が残っている。

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

    現状のソースコード確認。 暗黙的なものも含めてグローバル変数が点在している。 GUIイベントとかタイマハンドラで関数が分離しているので仕方ない面もある。 折角なのでクラスとしてまとめてみようと試みる。 基本的なロジックは出来ているのでそれほど修正時間はかからない見込み。

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

    現状のコードで動作確認をしてみた。 FMUの波形表示OK。 Scaleで指令値変更OK。 まだ以下の課題が残っている。 ソースコードがちょっとヤッツケ。 負荷関連の評価が出来ていない。 実際の負荷状態。 描画処理の影響有無の評価。 なんとなく現状でも負荷の影響が見え隠れはしている。

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

    plot_handlerことmatplotlibリアルタイム更新処理のコード提示。 以前のリアルタイム描画実験との差は以下。 deque使用。 plot時にnp.arrayに変換しているが無くてもOK。 CPU負荷描画チェックボックス確認。 dequeのように要素数が分からない場合は-1による末尾指定が便利。

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

    FMU_handlerことFMUシミュレーション用処理のコードを提示。外部の変数を使用するためにglobal定義している変数あり。実時間の経過を元にFMUシミュレーション時間を決定している。 実時間にシミュレーション時間を追いつかせる方式。ただし、開始と終了のstepが重複したり欠落したりするので微小時間の調整が必要。

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

    必要なタイマハンドラは2つ FMU処理用とmatplotlib描画用。 描画用側の負荷が高いので、こっちは長めの周期で実施。 FMU処理用タイマハンドラ内で時間関連の演算が入るため、タイマハンドラ外で下準備が必要。 Masterの初回呼び出し時のオプションと2回目以降で変える必要がある。initializeオプション。

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

    FMU関連処理前準備を一気に説明。 いままでやってきたものなので細かい説明は省略。 deque関連の初期化。 dequeはcollectionsライブラリの一部。 maxlenで最大要素数を指定できる。 指定なしの場合は無限に入れられる。 実際には物理的な限界はあるだろうが・・・。

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

    FMU関連処理追加がそこそこいろいろあるので情報整理。 基本はいままでのFMU処理ではある。 追加でdequeが必要そう。 シミュレーションデータ全てを保持すると、記憶する配列が膨大になる可能性が高い。 よって、描画に必要なデータだけを格納するためにdequeを使用。 dequeの使用方法を追々説明予定。

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

    いままでごちゃごちゃと追加してきたコードを再確認。 tkinterによるリアルタイム描画の動作確認。 sin波が流れるように描画されていることを確認。 pauseで一時停止もできることを確認。 FMU関連処理はまだ未実装だが、tkinterによるリアルタイム描画はできそう。

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

    タイマ処理にmatplotlibの描画更新処理を入れてみる。 現時刻をベースに過去8秒分の時間軸を生成し、それをsin関数に入れてsin波生成。 relimメソッドを使うと縦軸が自動調整される。 pauseのチェックボックスを設置していたので、チェック状態を確認して更新するかしないかの判定に使う。

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

    まずはtkinterのタイマ処理から確認。タイマ処理に描画処理、FMU処理を組み込むためまずはタイマ。 タイマ処理はafterメソッドに指定時間とタイマハンドラを渡すことで実施できる。しかし、一回コールバックするとそれで終了。 よって、周期的に処理したい場合はタイマハンドラ内で再度afterメソッドを呼び出す必要あり。

arrow_drop_down

ブログリーダー」を活用して、KEIさんをフォローしませんか?

ハンドル名
KEIさん
ブログタイトル
シミュレーションの世界に引きこもる部屋
フォロー
シミュレーションの世界に引きこもる部屋

にほんブログ村 カテゴリー一覧

商用