青いポールに関してはフィルタも良く働き、きれいにポールを画像から切り出
せていましたが、赤いポールに関しては、ポールが小さいということもあり、
なかなかうまく検出ができませんでした。また良く見ないと分かりませんが、
実は廊下の壁の一番下の部分は少し赤みがかっていて、しかも画面上では大き
く横に広がっているために、フィルタをかけてもその部分がノイズとして位置
検出に大きな影響を与えてしまっていました。
初期のkoikoiシリーズでは、フィルタの反応したドットのx座標の合計を求め、 それを、フィルタに反応したドット数で割るという方法を用いていました。こ の方法だと、前述のような問題点があります。そこで、次のような方法を考え ました。
以上のような方法を用いることによりポールを画面上に捕らえている際にはか なりの性能改善が見られましたが、YosaQが壁の方を向いてしまったときにはな かなかうまく行きません。
そこで、画素の隣接性を用いることにしました。早い話が、フィルタに反応し た画素がどの程度となりあっているかといことを調べて、画素がバラバラになっ てくっついていない場合は、ポールではないという判断を下せるように更なる 改良を行っていきました。しかし、ふつうの画像処理の教科書にでてくるよう な「ラベリングのアルゴリズム」などは処理が重く、制御にも支障をきたすか も知れないので、簡易的にだいたいどの程度画素がつながっているのかがわか るという程度の方法を考え出しました。それは、次のような方法です。
以上の方法を用いれば、おそらく出力される値は0~2(大きいほど、フィル
タに反応した画素数が多く、隣接度合いが強い)の間に収まるはずなので、そ
れを見れば、画面上にあらわれた物体がポールかどうかという判断の一助には
なります。実際には、経験上ぐらいをポールだと判断するための
閾値に設定していました。
これで、自分から見てどの程度左右にずれたところにポールがあるかの判断は できるようになりました。あとは距離が分かれば、ポールの位置が決定できま す。この決定法については、走行アルゴリズムのところに詳しく書いてあるの で、ここには簡単に書きます。
フィルタに反応して画面上にあらわれた最大の物体(一番手前にある物体)の
画素数を数え、画素数が多ければ近くに、少なければ遠くにあると判断するよ
うにしてあります。ただし、赤と青ではポールの大きさが違うので同じ距離に
あったときでも画面上の画素数が違うので、別々の計算式を使って距離を求め
ることになります。とは言っても、基本的には同じ式を用いていて、少々パラ
メーターが違う程度です。また、YosaQの視界にはポールしか映っていない
(はず)なので、ポール以外の物体までの距離は当然測れません。
以上で、ポールがYosaQの車体に対してどの程度左右にずれているのか、また ポールまでの距離はどの程度かということが分かるので、YosaQに対してのポー ルの位置が決定できたことになります。