沼津高専 電子制御工学科 |
MIRS0403 標準動作プログラム ポスト探索モード取り扱い説明書 |
MIRS0403-SOFT-0004 |
|
改訂記録 |
版数 |
作成日 |
作成者 |
承認 |
改訂内容 |
A01 |
2005.2.7 |
柴田 龍治 |
上園 隆文 |
初版 |
目次
- はじめに
- 動作原理
- 動作における問題点とその対策
1.はじめに
本ドキュメントは、MIRS0403の行動制御プログラム中で使用するポスト探索モード用関数の機能と動作原理について述べたものである。
2.動作原理
ポスト探索モードにおけるポスト探索の動作原理を説明する。
一例としてポストが4つであった場合を考え、図解を下に示す。
@ポスト探索モード第一段階(step_seach())
プロペラを一周させて、1.8度ごとに超音波センサの値を読み取り、360度全方向のデータを200個とる。
このとき、得られたデータをMIRS を原点としてプロットすると、上図の赤線のようになる。(※ 理想的には、プロペラの延長線方向の値を超音波センサで検出したい。しかし、超音波が広がりを持ち、センサで約±30度の値まで検出してしまう特性から、プロペラの延長線上にポストがない状態でもポスト周辺ではポストの値を検出してしまう。)
この関数内では、超音波センサが USS_MAX(上図における青線)を超える値を検出した場合は0として保存するようにしている。すなわち上図の灰色の部分は0が保存された領域を意味する。
この関数内で得られた距離と角度のデータはそれぞれ、uss_data[]とuss_ang[]に保存される。
Aポスト探索モード第二段階(correct_post_data())
(i)step_search()で保存されたデータをポスト別に分けて保存する。
配列データ(uss_data[])を順番に見ていき、それぞれ前後の値を比較して同じポストに対するデータか否かを判断する。判断方法は以下のとおりである。
- データの値が0でなければ同じポストに対するデータと判断する。
⇒ つまり、値0をポスト間のデータの区切りとしている。これにより、上図における黄色の領域を各々のポストに対するデータであると判断できる。
- データの値が0でなくても、前の値との差がポストの直径以上あれば別のポストとみなす。
⇒ 前にも述べた超音波の特性から、二つのポスト間の距離が近いと間に値0が保存されない場合がある。この場合は前の値とを比較してポストの直径以上の差があれば、それは同じポストに対するデータではありえないので、別のポストと見なせる。
- 値0は、二つ以上連続で続かないとポスト間のデータの区切りと見なさない。
- 一つのポストに対して5つ以上データが取れなければ、それをポストと見なさない
最後の二つの条件は、まれに起こる超音波センサの誤検出を想定して、その影響を避けるために入れている。
この関数内でポスト別に分けられた距離と角度のデータはそれぞれ、構造体post_dataのメンバdisとangに二次元配列として保存される。二次元配列の第一要素はポスト番号を与え、第二要素に値を格納している。
(ii) ポスト別に分けられたデータの中から最適なデータを選ぶ。
ポスト別に分けられたデータ(post_data.dis[][])を順番に見ていき、前後の値を比較して得点化する。得点化の方法は以下のとおりである。
- 初期値(post_data.dis[][0])を得点0とする。
- 前のデータと比較して値が減っていれば、得点を+1する。
- 前のデータと比較して値が等しければ、得点を変えない。
- 前のデータと比較して値が増えていれば、得点を−1する。
これを行うことにより、最も得点の高いところのデータが、最も滑らかにデータが小さくなっていくところであり、ポストのほぼ中心に対するデータであると言える。わざわざ得点化しているのは、まれに起こる超音波センサの誤検出による影響を避けるためである。
こうして最終的に各ポストのデータが全て、構造体postに格納される。
3.動作における問題点とその対策
このプログラムは、ポストの配置しだいでは正確にポストを発見できない場合があり、まだ未完成といえる。このプログラムが抱える問題点と課題を以下に述べる。
ポスト探索モードで得られたポストの個数と実際のポストの個数が違ってしまう場合として、以下の二つのケースが考えられる。
- ポストとポスト間の距離が小さく、さらに二つのポストがMIRSからほぼ同じ距離に位置している場合
⇒ この場合、先にも述べたように超音波の特性から、ポストとポストとの間にUSS_MAXを超える値を検出できない。よって本来二つのポストに対するデータを同じ一つのポストに対するデータとしてみなしてしまう。「同じポストに対するデータでも、前後の距離データの差がポストの直径以上ある場合は別のポストとみなす」ようになっているが、この場合は二つのポストがMIRSからほぼ同距離にあるため、別のポストとみなすことができない。
- プロペラの初期位置(0度)付近にポストがある場合
⇒ この場合、0度付近と360度付近において同じポストに対するデータを重複して取ってしまう。今現在のプログラムでは、0度のデータと360度のデータを比較して同じポストに対するデータであるかどうかの判断を行っていないため、この場合はポストの数を一つ多く発見してしまうことになる。
対策と課題
- step_search()で得られたデータを先に説明した方法で全て得点化し、ポストに対するデータの判断を得点で行う。得点をグラフ上にプロットしたとき、滑らかな山の頂点がポストのほぼ中心に対するデータである。
⇒ プログラム内ではデータをグラフ上にプロットして判断するということが非常に困難である。どうやって得点の滑らかな山の頂点をプログラム内で判断させるか、そのアルゴリズムが課題である。
- 次のような動作プログラム内で行えばよい。0度でのデータと360度(実際は358.2度)でのデータを比較し、同じポストであるか否かを判断させる。同じポストであれば、360度側のデータで発見したポストの配列に0度側のデータで発見したポストの配列を後付し、0度側のデータを消去する。