« 第28回ROBO-ONE参加 | トップページ | 第28回ROBO-ONE自律賞 »

2016年2月14日 (日)

ROBO-ONE予選競技用自律プログラムの概略(画像認識を中心に)

第28回ROBO-ONEに参加した「Spirit」の自律歩行プログラムについて紹介します。

ハードウェアは今までと同様、前方斜め45度下方を見下ろすカラーカメラをセンサーとして使用しています。

ROBO-ONEの床は今までのところ白い化粧板を使用しています。ロゴが書かれていたり黒い四角形・帯状のシートがおかれることはあるものの、ほぼ白を基調とした単色になります。また会場は十分な照明が当てられていることが予想されます。これらの前提のもと、以下のような処理を行うようにしました。

Input

これはROBO-ONE会場の控室で調整中のものです。ロボットのカメラから得た画像です。見やすいようにカラーのまま載せましたが、以降の処理ではグレースケール(モノクロ写真)に変換して使用しています。(320x240に縮小しています)

Binarized

明るい部分(リング上の可能性が高い)と暗い部分に分けます。今回は大津の方法により閾値を決めての二値化を採用しました。大津の方法は判別分析法とも呼ばれています。画像が「明るいところ(前景)」「暗いところ(背景)」という2つの部分からなっていて、画素の明るさの頻度分布表のグラフ(ヒストグラム)が2つの山を持つような形になっていることを仮定していて、その2つをうまく分離するような最適な閾値を決める手法です。

Edge

エッジ抽出という処理です。エッジというのは色の異なる領域の間の境目です。今回はCannyのエッジ抽出器を使用しました。画像処理としては、色が急峻に変化するところが近いものになりますが、ぼやけている場合は多くの点が検出される、等も考慮する必要があります。Cannyのエッジ抽出器は画素の変化が最も急峻となる点を求めることで境界線の位置を決め、かつ近隣の点とつなげることで連続的な線を形成しつつ、ノイズに由来すると思われる短い線を捨てる、等の工夫がなされています。今回の問題設定では上の二値化処理が非常に良く働く状況が予想されたので、二値化した後の画像に対してエッジ抽出を行うようにしました。あまり正当なやり方ではないと思いますが、Cannyのエッジ抽出器にはいくつかパラメータ調整箇所があり、この調整の手間を省くための手抜きであったといえましょう。

Alllines

エッジ抽出ではまだ点の集合にしかなっていません。Hough変換という手法で、それらが並んでいるのであろう直線(の方程式の係数)を求めます。上の画像は、元の画像の上に検出された直線を描画して結果を可視化したものです。(直線検出の)Hough変換は、ざっくり言うと、上のエッジ点がそれぞれ「投票」して多数決を行い、より多くの票を得たような直線を採用するというものです。直線は2つの実数(角度と原点からの距離)の組み合わせで表すことができます。実数は連続的ですが、一周をn等分する等して離散化すれば有限の組み合わせの「候補」があると考えることができます。そしてある一点を通る直線というのは複数(全部の方向)考えられますが、もし点が直線上に並んでいればそれらが共通してその一つの直線に投票するため本当らしい直線は多くの得票を得る、というようなものです。ここでは一定以上の得票を得た直線を候補としました。

(なお、傾きが微妙に異なる線がいくつも描かれて太い線のようになっていますが、これはプログラムの誤りのためでした。レンズ歪みの補正という処理を入れるのを忘れていたため、実際は直線の物体が湾曲して写るためです。これを修正すればこの湾曲はずっと小さくなり、検出精度も向上します。)

ROBO-ONEのリングには模様が書かれている他、足を擦らない歩行や安定した姿勢制御の奨励のための障害物として黒いゴムやプラスチックのシートが置かれます。特に黒いシートの境界線も直線として出る上、時にそれはコースの端の直線を分断することがあります。今回は「左上(原点を含む側)が黒く、右下が白い」ような直線を選びやすいようにしました。上に少し見えるシートから検出された直線(あとで画像をわかりやすい別のものに差し替えます)は、直線を延長していくとコース外を通り、そこでは線の右下も黒いため区別できるであろう、というわけです。この「白い」か「黒い」かの判定で上の二値化処理の結果を使いました。

Coord_conversion

最後に、画像上で得たコースの端の直線を床平面上に投影します。これには直立時の姿勢で予め計測(カメラキャリブレーション)しておいたカメラと床の位置関係をもとに、幾何学的な計算を行います。右の図がその結果を表したグラフです。下の方にある原点がロボットの足先あたりに、画像横幅が900mmに相当します。ロボットはコース端から100mmぐらいのところにいて、進行方向は僅かに偏っている、ということがわかります。この例の実際の数値としては直線は原点から最も近い距離が85mmで、0.0365ラジアン(2.11度)右に傾いている、という結果でした。

コース縁の位置と向きがわかったということは、逆に捉えればロボット自身の位置と向きがわかったということになります。この情報をもとに、コース端との距離を100mm程度の一定値に、自分の向きをコースの進行方向に保とうとするフィードバック制御を行うことで自動走行を実現することができます。これは車両型のライントレースロボットで良く見られるような発想で、ROBO-ONE予選程度であればこれで十分と考えました。Spiritでは太腿のヨー軸を活用して一歩ごとに15度程度まで任意の角度に旋回しながらの前進ができますので、これを操作量とします。一見直進しているように見えても、一歩ずつ小さく旋回することで微調整をしているのです。

おまけです。歩いた際の画像と検出結果をアニメーションで表示したものです。

更に掘り下げていくと動作プランニング(もう少し理由のある次の一歩の決め方)や離散時間系(車型ロボットと違って一歩ごとにしか向きを変えられない)の話やカルマンフィルタ(歩いた時の移動に関する事前知識や、少し前までの記憶を使ったほうが良いのでは?)の話、歩行時にカメラが横に揺れているのはどうなっているのか等、色々話題はあるのですが、ロボットに搭載できた時にまた紹介したいと思います。

|

« 第28回ROBO-ONE参加 | トップページ | 第28回ROBO-ONE自律賞 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/123969/63210126

この記事へのトラックバック一覧です: ROBO-ONE予選競技用自律プログラムの概略(画像認識を中心に):

« 第28回ROBO-ONE参加 | トップページ | 第28回ROBO-ONE自律賞 »