ブロックを積みながら(189) Scilab/Xcos、Xcosデモ、カルマンフィルタ

Joseph Halfmoon

制御素人老人がScilab/Xcosのデモを動かしながら「制御」を学ばんと無謀な試み。前回は連続系の制御対象を離散的な制御器で制御するデモでした。ムツカシイのよ。今回はカルマンフィルタです。素人老人はカルマンと聞いただけでビビリます。もっとムツカシイに決まってる。しかし今回はWeb上の情報源多数。読んでも分からん?

※「ブロックを積みながら」投稿順 index はこちら

※動作確認にはWindows 11の パソコン(64bit)上にインストールしたScilabの以下バージョンを使用しています。

    Scilab 2024.0.0

カルマンフィルタ

素人老人がビビる「カルマンフィルタ」について、Googleの生成AI、Gemini様に易しく解説してくださるようにお願いしてみました。geminiKalman

ほんわかしたところは、分かるような気がしないでもないけれども、具体的なところには踏み込めないっす。上記に続けてごにょごにょ書いてある中に以下を見つけました。geminiKalmanREF

黄色くマーカをひいてありますが、なにやら地層が御専門の組織にてカルマンフィルタの解説ページがあるみたい。カルマンフィルタ素人老人には、地層とカルマンフィルタという組み合わせがまったくもってピンとこなかったので、調べてみました。以下『(株)地層科学研究所』様のページです。

地盤内部の変形発生領域を推定

上記を拝見するに、「地盤内部での変形」を「地上での測定値」からカルマンフィルタと3次元有限要素法を駆使して「逆解析」できるみたいです。

おお、今まさに下水道管崩落事故あり。全国民が「地盤内部での変形」に注目しておりますぞ。ホントか? もしかしてカルマンフィルタがお役に立つのか? 知らんけど。

『(株)地層科学研究所』様は、地下のやれやこれやをコンピュータで解決するのが御専門みたいで、カルマンフィルタについても解説ページが充実してます。その第1回が以下に。

第1回 カルマンフィルタとは

上記の連載を勉強すれば、有限要素法とカルマンフィルタで地下の様子を推定する方法が分かるみたい。なお、第2回にはExcelのVBAを使ったカルマンフィルタの計算例もあり。なお、上記の連載ページは『(株)地層科学研究所』様の創業者にして会長様の里優様の御執筆らしいです。

一方『(株)地層科学研究所』様は、カルマンフィルタの考え方を勉強するのに『logics of Blue』様の以下ページをご推薦です。

カルマンフィルタの考え方

いってみたらば確かに分かりやすいです(でも自力で計算してみないと腑に落ちんぜよ、凡人は。)なお『logics of Blue』様は、「Rと予測と意思決定」を標榜されているサイトです。ここにはR言語で書かれたカルマンフィルタの例があります。

一方、Scilab/Xcos(古のお名前Scicos)でも、まさにピッタンコの日本語論文があることに気づきましたぞ。『三菱電機ソフトウエア』矢田部学様の

フリーソフトウエアScilab/Scicosによる数値計算

です。まさにScicos使ってカルマンフィルタを計算されてます。

ううむ、VBA、RにScilab/Scicosと例多数。後でやってみるしかないでしょうな。繰り返し計算すれば、お惚け老人も腑に落ちるか?ホントか?

Scilab/Xcosのデモ例

今回動作させてみた(分かってないケド)カルマンフィルタのデモは以下です。demoKalmanFilter

開いたところのフローが以下に。KalmanFilterFlow

「思った」よりもシンプルですが、メンドクセーところは皆Super Blockの中に押し込まれているに決まってます。

まず観測対象である(状態を内部に含む)Systemの中を開いたものが以下に。SystemSuperBlock

例によって、CLSS、連続系状態空間システム・ブロックを使って記述されとります。D matrixがゼロであるのは良いとして、C matrixのところが単位行列になってます。なんじゃらほい?どうも「2」の出口から状態変数 x そのものを取り出したかった(誤差を計算する)ためのテクみたいです。本来の y 出力は「1」の出口に出る前にCをかけているみたい。実際の、A、B、Cなどの値はContextの中で定義されております。KalmanContext

それにしてもなあ、状態変数 x は3要素デス。も少し簡単な奴の方が素人老人にはわかりやすかったんだけれども。ブツブツ言ってもノージンジャー。

一方、Kalman Filterと燦然とコメントしてあるSuperBlock内が以下に。KalmanFilterSuperBlock

思ったとおりだな、結構、複雑。素人老人が取り付く島もないです。もっと簡単な例でお勉強して出直して参ります。

ノイズを与えている乱数ジェネレータの設定が以下に。KalmanRandomGen

システムへの入力波形 u が以下に。KalmanInputU

Scilab/Xcosによるシミュレーション結果

結果(カルマンフィルタによる状態変数の推定値の誤差、誤差計算するのに本来は見えない状態変数自体を取り出して計算している)のグラフが以下に(各要素毎の色わけ。)KalmanFilterSimResult

確かに、ちょっと時間がたつと誤差は0近くで微妙に変動しているだけな感じ。

計算はできたけれども、もっと簡単な例で練習しておきたいぞ、これは。

ブロックを積みながら(188) Scilab/Xcos、Xcosデモ、離散的制御器の接続 へ戻る

ブロックを積みながら(190) Scilab/Xcos、Xcosデモ、離散カルマンフィルタ へ進む