バックナンバーはこちら
https://www.simulationroom999.com/blog/model-based-of-minimum-backnumber/
はじめに
前回、ACG(AutoCodeGenerator:自動コード生成)を実施し、そのコードを委託先へサンプルコードという位置づけで送付。
そろそろ成果物として上がってくるが・・・。
登場人物
博識フクロウのフクさん
![](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
![](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
ACGを元にした成果物
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
一応、PIDとフィルタのCコードが仕上がったみたいだよ。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
結構早かったね。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」20アップ.png)
でも、
本当にこれが良いか僕も委託先の方々も判断が付かなくてちょっと困ってるんだよね。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
まぁ、そうだろうね。
というよりも、
そこに疑問を持てることは良いことだよ。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者04.png)
おー。なんか普通に褒められた!
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
で、
なんか策があるようなこと言ってたけど。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
うん。
SimulinkのS-Functionという機能を利用したSILS(Software In the Loop System)をやってみようと思う。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
S-Function?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
説明をMathworks社Webサイトから抜粋してきた。
S-Function は MATLAB、C、C++ または Fortran で記述された Simulink ブロックをコンピューター言語で記述したものです。
C、C++、および Fortran S-Function は、mex ユーティリティを使用して MEX ファイルとしてコンパイルされます。
Mathworks社Webサイトより抜粋
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」10アップ.png)
????
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
簡単に言うと、Cコードの関数をSimulinkのブロックとして配置できるってイメージ。
絵で描くとこんなん。
![SimullinkのS-Functionの構造。内部構造はWindowsのDLLと同一。コントローラ、プラント、Cコード、コンパイル](https://www.simulationroom999.com/blog/wp-content/uploads/2020/06/02_S-Functionイメージ.png)
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
Simulinkブロックの中に
S-Function Builderってのがあるんで、
これを使うと簡単にできるよ。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者03アップ.png)
おー。
ソースコードとヘッダファイルを指定してあげれば良い感じだね。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
ちゃんとコンパイルが通れば、
Simulinkのブロックとして動作する。
PIDをS-Function
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
S-Functionができところでブロックを差し替える。
![PID制御ブロックをS-Functionブロックに差し替え、元々のPID制御モデルは横に捌ける。](https://www.simulationroom999.com/blog/wp-content/uploads/2020/06/03_PID差し替え-1024x676.png)
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
そして、シミュレーションしてみる。
![Simulinkシミュレーション結果、目標車速、実車速、乗っ取りモード、ユーザ操作AP開度、実AP開度](https://www.simulationroom999.com/blog/wp-content/uploads/2020/06/04_PID差し替えシミュレーション結果-1024x556.png)
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者03アップ.png)
おー。バッチリなんじゃない?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
まぁ、
精査は必要だとは思うが、
とりあえずはOKってところだね。
シグマフィルタのS-Function
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
次はシグマフィルタだね。
こっちは、元のSimulinkモデルと比較できるよう重ね合わせを想定しておこう。
![標準偏差σフィルタのSimulinkモデルをS-Functionブロックと並走して配置。元々の標準偏差σフィルタモデル、標準偏差σフィルタのS-Functionブロック追加](https://www.simulationroom999.com/blog/wp-content/uploads/2020/06/05_フィルタ比較用モデル-1024x672.png)
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
そして結果。
![S-FunctionブロックとSimulinkモデルの標準偏差σフィルタの出力比較](https://www.simulationroom999.com/blog/wp-content/uploads/2020/06/06_シグマフィルタシミュレーション結果-1024x734.png)
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
こっちもバッチリだね。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
特性も実際の出力結果も同一だし、
大丈夫と言えるだろう。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」08アップ.png)
手間とかは大してかかってないけど、
なんかすごいことしたような気分になる。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
実際すごいことだと思うよ。
これをモデルベース開発の概念無しでやろうと思ったら、
毎回実車で確認することになるから、結構時間が掛かるし、
場合によっては危険なことにもなるかもしれない。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
確かにそうだね。
モデルベース開発ってのは、
楽をするための物なんだね。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
その発想はとても良い。
「モデルベース開発はすごいもの」というよりも、
「いままで大変だったものが楽になるもの」と捉えた方が現実に即していると思うよ。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
うーん。
いろいろと目から鱗だった。
まとめ
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
まとめだよ。
- CコードをS-Function化することでSimuklinkブロックとして扱えるようになる。
- MILSの一部を差し替えても同様の動きになるかを確認できる。
- 元のSimulinkモデルと同一の入力にして出力を比較することで一致性確認ができる。
バックナンバーはこちら
コメント