沼津高専 電子制御工学科
MIRS0205 技術調査
ソフトウェア
MIRS0205-TECH-0008
改訂記録
版数 作成日 作成者 承認 改訂内容
A01 2002.12.15 齋藤 齋藤 初版

目次

  1. はじめに
  2. RT-Linuxとは
  3. API関数とは
  4. 超音波センサによる環境マッピング

1. はじめに

 今年度のMIRSには、ISAバス仕様のI/Oボードが搭載される。それに従い新しいMIRSのOSには、RT-Linux (RealTime-Linux) が使用される。そのため各センサおよびPWMをRT-タスクモジュールおよびデバイスドライバで制御する必要がある。またLCDが使用されるため、これを制御するデバイスドライバも新たに必要となる。 さらに自分たちの班で使用する超音波による環境マッピングについて述べる。

2. RT-Linuxとは

 RT-LINUXとはリアルタイム処理が可能なOSである。Linuxを使用して計測や制御向けのハードウェア、リアルタイム処理を実現するための拡張機能として開発されたもので、通常のLinuxカーネルを書き換えることで使用可能となる。ただし、RT-Linuxは厳密な意味ではリアルタイムOSではなく、スケジューラとプロセス間通信のみ提供している。仮想マシンをLinuxに提供し、Linuxを1つのリアルタイムプロセスとして実行することでリアルタイム処理と従来のLinuxの処理の共存を可能にしている。

  2.1 リアルタイム処理

 実時間処理。他のデバイスからの入力信号や、プログラムからの要求に対して、リアルタイムにこれを処理する方式。制御システムなどでは、一定時間内に処理を確実に終了しなければならない場合があり、このような実時間性と許容時間内での処理の完了を保証する処理方式がリアルタイム処理である。

  2.2 RT-LINUXのスケジューリング

 リアルタイムカーネルは、リアルタイムプロセスとLinuxカーネルを対象にしたスケジューリングを行う。このときリアルタイムプロセスの優先度のほうがLinuxカーネルよりも高く、リアルタイムプロセスの優先度は任意に決めることができる。
 Linuxでは、スケジューリング間隔が10ms程度であるが、PC/AT機の内蔵タイマICにより1μs程度の間隔になっている。このためLinuxではハードウェア割り込みを受け付けてISR(インタラプトサービスルーチン)を呼び出すまでに600μ〜20msぐらいかかるが、RT-Linuxではこれを15μs程度の短縮している。つまり、リアルタイムカーネルがCPU割り込み制御の主導権を握ってスケジューラも兼ねることによって、時間要素をLinuxカーネルに依存せずに自身で制御できるようにしている。
 このようにMIRSの制御に普通のLinuxではなくRT-Linuxを使用しているのは、ハードウェア割り込みがあったときのスケジューリングの処理方法の違いが大きな要素としてある。


  2.3 リアルタイムタスクのプログラミング


 3. API関数

 APIとは、OSとOS上で稼働するインターフェース規定のこと。 RT-LinuxのAPIは、V1.xのときはわずか15個であり、機能は大きく5つに分かれていた。下記にその機能、API及び対応するV2.x系のAPIを表す。


POSIXスタイルインターフェース関数
機能 API関数
スレッドの生成 Pthread_create
スレッドの終了 Pthread_exit
スレッドへのシグナル送信 Pthread_kill
スレッドIDの取得 Pthread_self
スレッドアトリビュートオブジェクトの初期化 Pthread_attr_init
スタックサイズ属性の取得 Pthread_attr_getstacksize
スタックサイズ属性の設定 Pthread_attr_setstacksize
スレッドのCPU明け渡し指 Pthread_yield
スケジューリング属性の変更 Pthread_setschedparam
スケジューリングプライオリティ属性の取得 Pthread_attr_getschedparam
スケジューリング属性の取得 Pthread_getschedparam
スケジューリングプライオリティ属性の設定 Pthread_attr_setschedparam
タイマー値の取得 Clock_gettime
タイマー値の設定 clock_settime
タイマー分解能の取得 clock_getres
スケジューリングポリシー毎のプライオリティの最大値の取得 sched_get_priority_max
スケジューリングポリシー毎のプライオリティの最小値の取得 sched_get_priority_min
Mutex属性オブジェクトのプロセス間共有設定の取得 pthread_mutexattr_getpshared(3)
Mutex属性オブジェクトのプロセス間共有設定の設定 pthread_mutexattr_setpshared(3)
Mutex属性オブジェクトの生成、初期化 pthread_mutexattr_init(3)
Mutex属性オブジェクトの破棄 pthread_mutexattr_destroy(3)
Mutexタイプ属性の設定 pthread_mutexattr_settype(3)
Mutexタイプ属性の取得 pthread_mutexattr_gettype(3)
Mutexの初期化 pthread_mutex_init(3)
Mutex破棄 pthread_mutex_destroy(3)
Mutexのロック pthread_mutex_lock(3)
Mutexのロック pthread_mutex_trylock(3)
Mutexのアンロック pthread_mutex_unlock(3)
非POSIXスタイル関数
機能 API関数
CPU IDのスレッド属性オブジェクトの設定 pthread_attr_setcpu_np
CPU IDのスレッド属性オブジェクトの取得 pthread_attr_getcpu_np
スレッドの周期実行の抑制(wait) pthread_wait_np
スレッドの削除 pthread_delete_np
スレッドの浮動小数・演算の使用許可 pthread_setfp_np
スレッドのリアルタイム実行条件を指示 pthread_make_periodic_np
スレッドをサスペンド pthread_suspend_np
サスペンド中のスレッドを再開 pthread_wakeup_np


表中に出てくる用語の解説

 4. 超音波センサによる環境マッピング

 超音波距離センサを用いることにより,ポストまでの距離を取得することが可能だが,比較的幅が広い指向性がある場合,一地点からのセンシングだけでポストの正確な位置を取得するのは難しい。そこでMIRS0205ではソナーリング(センサを円形に並べて計測)で、さらに計測範囲を重ね複数地点から距離計測を行うことで,ポストの位置取得の精度を上げることにする。
 MIRSがある地点で獲得した距離情報は,超音波のポストからの反射点が,その指向性内の円弧上にあることを示すのみであり,その位置を特定することはできない。そのため超音波距離センサの受信信号を処理し,2点以上で獲得した距離情報によって作られる円弧の交点を計算することで角度と距離が算出される。このようにポストの位置の特定を行い、環境マッピングの能力を向上させる。

 ポストの位置データはリアルタイム処理によって何秒毎に算出し、距離と角度の曲座標からデカルト座標に直して保存しておく。可能ならば位置データの差とモーターの移動距離を比較して誤差を計算する事も考えたい。2回目の競技では位置データを元にポストの位置を特定し、大体の見当をつけてポストに向かう。ポスト付近にきたら再度計測し、本当にポストが存在しているかを確認する。
 超音波による環境マッピングには移動制御が正確なのは当然で、さらに超音波センサによる測定距離がある程度正確で、距離データがリアルタイム処理可能であることが求められる。処理したデータは保存して次の行動パターンの決定に用いるのでデータ入出力が激しくなる。これら問題点の解決はCPUボード、及び超音波センサの調査も必要なので調査終了時に考えたい。


関連文書
BROKEN's Advanced Vehicle Laboratory
複数対象物を検知可能な超音波距離センサを用いた環境マッピング(著:飯野正和他)