フーリエ変換には角周波数を扱うものと周波数を扱うものがある。角周波数と周波数の間には角度と1回転という差があるのみ。よって、周波数に2πをかければ角周波数となる。
シミュレーションで実物を扱わなくても仕事ができる環境を目指す。つまり家に引きこもって外に出なくてもOKな世界。
【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メソッドを呼び出す必要あり。
「ブログリーダー」を活用して、KEIさんをフォローしませんか?
フーリエ変換には角周波数を扱うものと周波数を扱うものがある。角周波数と周波数の間には角度と1回転という差があるのみ。よって、周波数に2πをかければ角周波数となる。
動画作成関連のバックナンバー用ページ。立ち絵を作ったり、動画作ったり、アイキャッチ画像作ったりなどを掲載していく。
MATLAB,Python,Scilab,Julia比較するシリーズの第4章。第4章では分類問題で最終的にはニューラルネットワークや最適化アルゴリズムの話だった。第5章はフーリエ解析学から高速フーリエの話がメインとなる。
立ち絵の配置: PSDファイルをAviUtlに配置し、画面サイズやフレームレートを設定。のっぺらぼう化: 目と口を消して、アニメーション効果を追加。アニメーション効果: 目パチと口パクの設定を行い、リップシンクを調整。
フーリエ変換を定義。フーリエの積分公式の一部を抜き出す。逆フーリエ変換を定義。フーリエの積分公式にフーリエ変換を代入するだけ。
Δωで刻みにしたので、極限を利用して連続系へ。数式上は連続ではあるが、一般的な表現ではない。区分求積法とリーマン積分について。フーリエの積分公式を導出した。
VOICEVOXとAivisSpeechキャラと一緒に!AviUtlを使った動画作成 バックナンバーはじめに以前、AivisSpeechのAnneliというキャラの立ち絵を作成した。さらにそこに加えて、AivisSpeechのアイコン画像を...
PSDToolKitプラグインの導入の仕方を説明。PSDファイルを探してGIMPで内容を確認。GIMPで瞬き用、口パク用のレイヤー編集。
フーリエに積分公式は複素フーリエ級数と複素フーリエ係数から導出する。周期2Lの波の数を示すnを周期2πに於ける波の数である角周波数ωに変換。角周波数ωの刻みであるΔωについて説明。Δωを定義することで、離散的な係数算出が連続的な角周波数算出に近づけていっている。
区分求積法とリーマン積分について。離散と連続の分け目。フーリエの積分公式を導出した。演算したはずなのに変化しない。つまり変換、逆変換が成立することを示している。
Δωで刻みにしたので、極限を利用して連続系へ。数式上は連続ではあるが、一般的な表現ではない。よって、一般的な表現に書き換える必要がある。
角周波数ωの刻みであるΔωについて説明。Δωを定義することで、離散的な係数算出が連続的な角周波数算出に近づけていっている。
周期2Lの波の数を示すnを周期2πに於ける波の数である角周波数ωに変換。ω=nπ/Lを使用して変換するだけ。これにより少し数式がシンプルになった。
VOICEVOXとAivisSpeechキャラと一緒に!AviUtlを使った動画作成 バックナンバーはじめに以前、AivisSpeechのAnneliというキャラの立ち絵を作成した。ほぼ独自に作成したが、Anneliの画像自体はAivisS...
フーリエに積分公式は複素フーリエ級数と複素フーリエ係数から導出する。変換を想定した式に変換。複素指数関数との積と積分、総和を経由すると元に関数に戻るというイメージが重要。
AviUtlのセットアップと拡張編集Pluginの導入を行った。mp4ファイルの入力と出力の方法を説明。アニメーションgifの対応方法を説明。
分数は割り算の別表現として理解しやすく、逆数を掛けることで計算が簡単になる。これにより、小数の掛け算や割り算の理解が深まる。一次関数の数式をグラフにすることや、グラフから数式を導くことは、データのトレンド分析や物理現象の理解に役立つ。微分は関数の変化率を求める手法であり、数値微分を使って近似的に求めることができる。これにより、物理学や経済学など多くの分野で応用可能。
Youtube動画やブログ記事のアイキャッチ用に作成した、VOCEIVX(四国めたん、ずんだもん、春日部つむぎ)、AivisSpeech(Anneli)の画像たち。Stable Diffusionで生成&少しペン入れ&GIMPによる補正したものになります。
各種フーリエについてまとめてみた。いままでは級数→係数の順番でやっていたため、逆フーリエ変換→フーリエ変換の順番が自然。実際には「フーリエの積分公式を求める」ことになるが、これは逆フーリエ変換そのものである。
各種フーリエについてまとめてみた。いままでは級数→係数の順番でやっていたため、逆フーリエ変換→フーリエ変換の順番が自然。実際には「フーリエの積分公式を求める」ことになるが、これは逆フーリエ変換そのものである。
最適化アルゴリズム モーメンタムを用いて分類の学習をScilabで実現。 問題無く動作。 学習の収束が通常の勾配降下法よりも比較的早い。
最適化アルゴリズム モーメンタムを用いて分類の学習をScilabで実現。 問題無く動作。 学習の収束が通常の勾配降下法よりも比較的早い。
最適化アルゴリズム モーメンタムを用いて分類の学習をPythonで実現。 問題無く動作。 学習の収束が通常の勾配降下法よりも比較的早い。
最適化アルゴリズム モーメンタムを用いて分類の学習をMATLABで実現。 問題無く動作。 学習の収束が通常の勾配降下法よりも比較的早い。
モーメンタムを確認するプログラムの方針を確認。 以前の勾配降下法のプログラムをベースにする。 隠れ層のユニット数は4。 プログラムのフローを確認。 モーメンタム項とパラメータ更新が基本的な差分となる。
モーメンタムの更新式について確認。 指数移動平均を利用して直近の値を重視する。 モーメンタムの動作イメージについて確認。 最初は大きく更新して、最適解が近いと小さく更新。 勾配降下法で言うところの学習率が可変と同義な動きになる。
勾配降下法の更新式を確認。 勾配降下法の動作イメージを確認。 学習率が大きい場合と小さい場合で挙動が変わる。 ちょうど良い学習率を人間の手で探す。 これにより、一般的なパラメータとは異なるハイパーパラメータというカテゴリになる。
最適化アルゴリズムを取り扱う。 今回のネットワークだとさほど恩恵はないが知っていて損はない。 まずはモーメンタムから解説&実験をしていく。 最初は復習を兼ねて勾配降下法についても確認する。
モーメンタムを確認するプログラムの方針を確認。 以前の勾配降下法のプログラムをベースにする。 隠れ層のユニット数は4。 プログラムのフローを確認。 モーメンタム項とパラメータ更新が基本的な差分となる。
モーメンタムの動作イメージについて確認。 動作イメージの表現は難しい。 最初は大きく更新して、最適解が近いと小さく更新。 勾配降下法で言うところの学習率が可変と同義な動きになる。
モーメンタムの更新式について確認。 指数移動平均を利用して直近の値を重視する。 実際の指数移動平均とは異なっているので、その点は注意。
勾配降下法の動作イメージを確認。 学習率が大きい場合と小さい場合で挙動が変わる。 ちょうど良い学習率を人間の手で探す。 これにより、一般的なパラメータとは異なるハイパーパラメータというカテゴリになる。
今回改めてまじめに更新式を確認。 勾配降下法の更新式が一番シンプルなので今後の最適化アルゴリズムの更新式を見る際は比較対象になりやすい。
最適化アルゴリズムを取り扱う。 今回のネットワークだとさほど恩恵はないが知っていて損はない。 まずはモーメンタムから解説&実験をしてい 最初は復習を兼ねて勾配降下法についても確認する。
多層パーセプトロンの隠れ層のユニット数を2から4に変えたJuliaコードで分類を実施。 大きく2パターンの分類パターンがある。 やや複雑な分類パターンが4ユニットにすることで出てきたもの。
多層パーセプトロンの隠れ層のユニット数を2から4に変えたScilabコードで分類を実施。 大きく2パターンの分類パターンがある。 やや複雑な分類パターンが4ユニットにすることで出てきたもの。
多層パーセプトロンの隠れ層のユニット数を2から4に変えたPythonコードで分類を実施。 大きく2パターンの分類パタ やや複雑な分類パターンが4ユニットにすることで出てきたもの。
多層パーセプトロンの隠れ層のユニット数を2から4に変えたMATLABコードで分類を実施。 大きく2パターンの分類パターン やや複雑な分類パターンが4ユニットにすることで出てきたもの。
多層パーセプトロンの隠れ層のユニット数を2から4に変えたJuliaコードで分類を実施。 大きく2パターンの分類パターンがある。 やや複雑な分類パターンが4ユニットにすることで出てきたもの。
多層パーセプトロンの隠れ層のユニット数を2から4に変えたScilabコードで分類を実施。 大きく2パターンの分類パターンがある。 やや複雑な分類パターンが4ユニットにすることで出てきたもの。