マイクロPCとRTAI-lab
目 次
  1. できるだけ容易に信号解析と制御システムを実現する。
  2. RTAI-lib(scilab/scicos)で付加された機能
  3. 実時間処理
  4. 開発用構成
  5. ターゲット用構成
  6. FFTのようなディスクリート・ブロック処理のサンプル
  7. Live-USB
 できるだけ容易に信号解析と制御システムを実現する。
 マイクロPCを用いればリアルタイム制御システムが比較的容易に作成できることが判った。そのRTAIではそこにMATLAB/Simulinkと同等なScilab/Scicosを導入すれば,ダイアログを接続するだけで解析制御システムの開発およびターゲットシステムが作成できるるRTAI-Labを提供している。
 
 ここでは、あくまでマイクロPCに拘ってDebian3.1+kernel2.6.17.14を使って作成した。なお、RTAI-lab開発者はFedora3、kernel2.4を推奨している。

○ ディスクレス・マイクロPCで動作する。 
○ 実行時はメモリ128Bb、フラッシュ256Mb程度に収める。

 開発時Scilib/Scicosでのダイアグラム作成は母艦上で行うのが、効率的であるが、あえてマイクロPC上で全て構築してみた。
 RTAI-lib(scilab/scicos)で付加された機能
 RTAI-labで、あらかじめ用意されたダイアグラムを次に示します。これを見ておおよその機能と使い方が予想できると思います。
  • 入力関係として波形生成(Sin,Square,Step,extdata、Sensor)がある。
  • 出力関係としてオシロスコープ、メータ、LED、Actuatorがあります。
  • 第一列の入力はこのダイアログ内で発生しています。第2列の出力はxrtailabが担当しそれぞれオシロスコープ、メータ表示Led表示を行います。
  • 第3列はメールボックスとrtFIFOであり他のリアルタイムタスクとの通信を行います。もし次のCOMEDIがない場合は実質的に入出力を扱うことになる。
  • 第4列のCOMEDIは専用I/Oドライバ群であり、メジャーなもの以外はサポートしていないでしょう。
  • 最後列のセマフォは同期用に用いられ実時間処理用の待ち合わせを実現します。
  実時間処理
システムはscicos支援のもとダイアログを用いてダイアログ・エディタでシステムを作成する。
 この時点で各機能のパラメータをセットしておく。そして,ブロック・ダイアログからCコード化してコンパイル・リンクしRTAIリアルタイムタスクを生成する。
 ここでScilab/Scicosの処理範囲は終わりです。
 Scilab/Scicosを離れて、通常のRTAIタスクと同様に実行する。一般に結果は外部機器へでるのであるが、xrtailabを用いて次のようにXwindow上に表示することができる。
  開発用構成
 RTAI-lab(Scila/scicos)の構成は大きく分けてダイア グラム作成と実行の二つになります。実行時は表示を担当するXwindowと(小さな)リアルタイムシステムになる。
 制御だけならばリアルタイムシステムシステムだけになり256MbフラッシュメモリのマイクロPCで充分である。
 ターゲット用構成
 フラッシュメモリのターゲット・マシン単独で動作しますが、開発及び動作確認のためRTAIとScilab/Scicosが動作する母艦があれば、なお使い易い。
 ターゲットマシンはRTAIシステムに若干のMesa/EfltkとX11ライブラリを追加すれば良い。
 一方母艦はRTAIの実行形式までを作成するためコンパイル機能が必要です。これは現在GCC3.3を要求するためと、Mesa、Efltkのコンパイル時、比較的新しいディストリビューションではワーニングとエラーの山を作る。RTAIが推奨するFedoaCore3かDebian3.1で作るのが安全策かな。
ターゲット・マシンのフラッシュ・イメージはここにあります。
 FFTのようなディスクリート・ブロック処理のサンプル
 SCICOSはSCICOS説明書にあるように、多くは微分方程式をシミュレーションするのですが、FFTのように時間軸のブロックを対象にして一括処理するものは用意されていない。必ずしもSCICOSと整合性はあまり無いのですが、在ればあったで便利なものです。
 私の場合MATLABでシミュレーションして、その結果に基づいてC言語で組み直して制御システムとすることが多い。また、このごろFFTの使用頻度が多くなっているので、ちょっと試してみた。
 例題は http://www.scicos.org/examples.html にあります。
6.1 RTAIではCコンパイルして実行形式にしてから使用す
 上記のサンプルは肝心の FFTがカスタムブロックSciFuncで組まれているので、コンパイルできない。 SciFuncはScilab言語で組むことが出来るため大変便利ですが、残念ながらコンパイルできないので駄目でした。
 そこで 'SciFunc' 及び 'Mathematical Expression' を 'C Block2' で書き直しました。 ついでに時間軸で連続データとブロックデータ変換を行うブロックを作成する。 簡単なサンプルを下に示す。
6.2 シフトレジスタ
 Buffer/UnBuffer はシフトレジスタで構成されています。従って、FFTの計算開始イベントの発生時の最新のn個のデータを得ることが出来ます。n .> freq_dev であればデータをオーバーラップして演算を続けることになります。
int ser2par_bloc_outputs(scicos_block *block,int flag) 
{
    int n=block->outsz[0];
    int i; 
    for (i=0;i<n-1;i++){
        block->outptr[0][n-i-1]=block->outptr[0][n-i-2];  //出力をシフトして
   }     block->outptr[0][0]=block->inptr[0][0];  //最新データを補足する     return 0; }
この出力(**block->outptr)を次のブロックの入力とする。
6.3 ブロックの作成
 ブロックはSCICOSの説明書にあるようにカスタムブロックを作成すべきでしょう。この場合コンパイル済みCコードを使えるので、後々便利ですが、ここではPalettesのOthersにある 'C Block2' を使い気楽に作成する。これはブロックの中にCコードを埋め込む形で作成するので、単純な構造のコードに限られます。
 MATLAB/simulinkではもっとスマートなブロックが提供されていて、即使用可能となっていますが、半ばブラックボックス化しています。こんなプリミティブの方が直感的に判り易いと思うのですが・・・ 特に、Matlabの場合ブロック長さ分だけの遅延(時間遅れ)が固定的に生ずる。
それに対して、この場合Freq-Devの時間だけ遅れる(オーバーラップして演算を行う)だけです。実時間を要求される場合は有効です。
6.4 サンプルの実行結果
(6.1)のサンプルを(5)の構成で動作させた結果を下に示す。
FFT等の処理ブロックは、SCICOSでは、ほとんど用意されていないので全部作らなければならないが、その場でも容易に作成できるので、便利に使えそうです。
 なお、sample.cosはここにあります。filter_dataが間違っていたので修正しました。(07/6/29)ダウンロード後super blockを設定し、RTAIメニューのSetTargetとCodeGenを実行してコンパイルし て下さい。
 もう一つのサンプルとして FLMS Adaptive Filterを作ってみました。 FLMSを分解して構成できるかと思ったが、Algebraic Loopのエラーが出て一つのブロック内で記述しなければならなかった。
 なんとなくブラックボックスのようになってしまった。
 これを解消するにはLoopするブロックのイベント入力を僅かでも遅延させれば良いようです..下図の場合Filterの入力は1データブロックずれることになりAlgebraic Loopを避けることができる.
なお、線図がややこしくなるため、一部手抜きをしています
FLMS Adaptive Filterの結果を示す。
6.5 例えば、任意の周波数特性を有するランダム信号の生成
 LiveUSB-RTai-lab
 容易にRtaiあるいはRtai-labをテストできるようにLiveUSB版を作成しました。CompactFlashの代わりにUSBメモリ上に実行環境を全て載せました。総容量は256Mbを僅かに超えるので512Mb以上のUSB−FlashとUSBからロード出来るマシンが必要です。
 LiveUSB-Rtai-lab-01.imgはここからダウンロードできます。
実行例
user@debian:~$ cd /root 
user@debian:/root$ xinit  
(xterminal上で)
    twm&
    sudo su
    scilab
(scilab内で)
    scicos
    (scicosで/root/scilab-user/sample.cosの編集コンパイルを行う)
quit quit (必要あれば出力ディレクトリ内でmakeを実行する。) .rtenv make (ロードモジュールを作成) xterminal& (xrtailab実行用のxterminalを生成する。) ロードモジュールを実行 (別xterminal内で) .rtenv (pathの設定) rtim (insmodの実行) xrtailab (xrtailab内で表示の選択)
これで結果が表示される
マイクロPCとリアルタイムOS(RTAI)
PIC24FとFreeRTOS
Guest No.