[[太田研 公開用Wiki]]

*自律走行ロボットの道なり走行のための消失点検出方法 [#o2398d7d]
#contents
*はじめに [#j05b81c6]
自律走行ロボットは主に,LiDARやカメラ、GNSSなどの外界センサを用いて自己位置推定を行い、進行方向を決めている。
しかしながら遮蔽物があった場合などにそれらのセンサを用いた自己位置推定が難しく走行が困難になる場合がある。
それに対し、人間は目で見て道路の状況を確認し、道なりに歩いて自分の知っている地点まで移動することができる。
本研究では、このような道なり走行をロボットに行わせるための消失点の検出を目的とする。
提案手法としては、始めにカメラ画像からエッジ情報を取得する。取得したエッジ情報にHough変換を行い、
直線を出力し、出力した直線の交点を求める。求めた交点が多く集まる範囲を求め、範囲内の交点の座標を平均化し、
平均化した座標を消失点として設定するよう設計した。

*消失点 [#b2f505e1]
消失点とは3次元的に見て本来路面に対して平行な建造物の屋根や窓枠などから伸ばした直線が画像上ではある一点で交わる点のこと。
この点は理論的には無限遠法である。また、消失点は遠近法により現れるため、正面以外にも現れる。
消失点は立体を描く際にも描く指標となる。消失点を一つ設定して描く場合には一点透視、二つの時は二点透視、三つのときは三点透視と呼ばれる。

消失点は建造物に囲まれている道では正面に現れる。
そのためそのような道を道なりに進む場合、消失点が進行方向と一致する。
ゆえに消失点検出を行うことで自律走行ロボットに道なり走行を行わせるための目的地として設定することが可能となる。

*提案手法 [#d93ccc79]
はじめにカメラ画像からエッジ検出を行う。
まずカメラ画像をグレー画像に変換する。
エッジ検出を行う場合、画像中に含まれ明るさなどが急に変化している箇所などの情報が必要となり、
カメラ画像に含まれる色情報は不要となる。
そのためエッジ検出を行う前にグレー画像に変換することで、
不要な色情報を削除する。
CENTER:#ref(bg.jpg,center,20%)
CENTER:&size(14){図1:グレースケール};

次に変換されたグレー画像にCanny法を行う。
なお、今回は影の影響を抑えるためヒストグラム平坦化を行い、平坦化したグレー画像から
エッジ情報を所得する。
CENTER:#ref(result000000_0_g.jpg,center,20%)
CENTER:&size(14){図2:平坦化したグレースケール};
CENTER:#ref(result000000_0_c.jpg,center,20%)
CENTER:&size(14){図3:エッジ画像};

**直線検出 [#aea9969c]
次に直線検出を行う。
今回は自律走行ロボットに搭載することを想定して計算量の少ない確率的Hough変換を用いて直線検出を行う。

取得したエッジ画像に確率的Hough変換を行い、求めた直線を元のカメラ画像に出力する。
求めた直線は赤で出力した。
CENTER:#ref(result000000_0_bl.jpg,center,20%)
CENTER:&size(14){図4:直線検出};

また、消失点検出を行う際に3次元的に路面に水平な直線を用いるため、
路面の模様や建造物の壁の縁や窓枠の縦部分などは削除する。
そのため直線の角度を計算し、直線を区別する必要がある。

直線を区別するため、Hough変換で求められるθを復元する必要がある。
そのため2点(x_1 , y_1),(x_2 , y_2)を通る直線の方程式を用いて求める。
確率的Hough変換では直線の両端点の座標が分かっているため、3角形の底辺の長さをαとしてα = x_2 - x_1、高さをβとするとβ = y_2 - y_1になる。
3角形の高さと底辺が分かることで求める角度θは次の式で求めることができる。

CENTER:θ = atan(β/α)

θの値が0に近い、すなわち画像に対して水平に近い直線を緑、
θの値が1.25より大きい、または-1.25より小さい場合は画像に対して垂直な線を青、
その他、消失点検出に必要な直線を赤でそれぞれ示した。

CENTER:#ref(result000000_0_l.jpg,center,20%)
CENTER:&size(14){図5:色分けした直線};

**交点検出 [#x88526e0]
求めた2直線の方程式を連立して解いて交点の座標を求める数式を導き出した。
2直線の通る点をそれぞれ(x_1 , y_1) , (x_2 , y_2)と(x_3 , y_3) , (x_4 , y_4)
として2直線の方程式を解く。
a_1 = (y_2 - y_1)/(x_2 - x_1) , a_3 = (y_4 - y_3)/(x_4 - x_3)として、交点の座標は以下の式になる。
CENTER:x = (a_1*x_1-a_3*x_3-y_1+y_3)/a_1-a_3
CENTER:y = a_1*{((x_1-x_3)*a_3-y_1+y_3)/(a_1-a_3)} + y_1

で表すことができる。

交点の検出には区別した赤線のみを使用した。以下の画像では赤円の中心が求めた交点となる。
CENTER:#ref(result000000_0_x.jpg,center,20%)
CENTER:&size(14){図6:交点検出};

**消失点検出 [#s2a6dca1]
求めた交点から消失点を求める。

まず求めた交点の一つを選択し、その交点を中心として±10画素の範囲を設定、
その範囲内にある交点の数をカウントする。
この動作を求めた交点すべてを中心として行い、範囲内の交点の数を比較する。

最も多くの交点が含まれる範囲を選択し、範囲内の交点の座標(x , y)をそれぞれ
平均化し、得た値を消失点の座標(x_v , y_v)とする。

求めた消失点を以下の画像に緑色の円の中心として設定している。
CENTER:#ref(result000000_0_v.jpg,center,20%)
CENTER:&size(14){図7:消失点検出};

*実験 [#q9a8ae70]
今回実験に使用する画像群として実際に自律走行ロボットのカメラを用いて撮影した
群馬大学桐生キャンパス構内の画像を使用した。

実際に使用した画像として3号館裏の通路10枚、6号館横の通路10枚を選択した。
ファイルの容量上添付はしていない。

結果画像として3枚ずつ添付する
#ref(result000000_0_v.jpg,center,20%)
#ref(result000001_0_v.jpg,center,20%)
#ref(result000002_0_v.jpg,center,20%)
CENTER:&size(14){図8:結果画像群1};

図8から3枚の連続した画像の出力した消失点の位置はおよそ同じ位置が取られていることが分かる。

#ref(result000050_0_v.jpg,center,20%)
#ref(result000051_0_v.jpg,center,20%)
#ref(result000052_0_v.jpg,center,20%)
CENTER:&size(14){図9:結果画像群2};

図9の画像を見ても図8と同じようにおよそ同じ位置に消失点が出力されている。

*考察 [#g4cceadc]
結果画像から今回の手法を用いて消失点を検出することが可能であることが分かった。
また消失点が正面でない場合、すなわち実験画像群2の場合でも検出することが確認できた。
このことから今回の手法は消失点を検出する上で効果的な手法であると考えられる。

しかし、画像ごとにズレがあることも分かる。
このズレの原因といては、消失点検出を行う上で必要のない直線が作用していることが考えられる。
直線検出を行うタイミングで水平線と垂直線は除外しているが他の必要のない赤線が検出されていると考えられる。
結果画像から考えられる必要のない赤線は短い直線が多い。
そのため、直線を検出するタイミングで今回設定したパラメータより短い直線を出力しないパラメータに設定を行うことで解決すると考えられる。
しかし、短い直線を除外すると消失点検出に必要な直線も除外されることも考えられる。
そのため、今回の手法で求めた消失点の信頼度が下がると考えられる。

また、実際に自律走行ロボットに搭載する場合、リアルタイムで検出を行うためこの
ズレが走行中に大きなズレを生み出すことが考えられる。
自律走行ロボットに搭載する場合、消失点が常にカメラ画像の中心に来るように制御することを想定している。
そのため検出した消失点が正面からずれるとそのズレを修正しようとロボットは向きを変える。
向きを変えた後にも消失点検出を行うためさらにロボットの向きを変えてしまう。
このことから画像上では小さなズレが実際に走行させると大きくずれることが考えられる。
この解決策として、消失点の表示する位置を画像の中心に近い位置に指定することがあげられる。
しかし、この解決策を実行すると消失点が検出されず、ロボットの制御が行われなくなることも考えられる。
そのため消失点の検出を常に行うのではなく、ロボットが数メートル動くごとに検出を行うことでこの問題が解決すると考えられる。

今後、実際に自律走行ロボットに搭載し、そのような走行を行うか確認し、消失点検出を行う時点で問題が解決するか、
走行の制御中に解決するか決定する必要があると考えられる。

*まとめ [#c4d637d2]
本論文では自律走行ロボットの走行補助のため消失点検出を行う手法を提案した。
提案手法では直線検出を行う手法としてHough変換を用いた。
自律走行ロボットに搭載することを考え、その中でも計算量の少ない確率的Hough変換を用いた。
求めた直線の方程式をたて、この方程式から交点を求める。
求めた交点が最も多く集中している範囲を選択し、範囲内にある交点の座標を平均化し、
平均化した座標を消失点とした。

実験として、実際に自律走行ロボットのカメラで撮影した画像群に対して、
提案手法を実行した。
今回使用した画像群として、まっすぐに進んだ画像と、右にずらした画像群の二組を用意した。
結果画像からまっすぐに進んだ場合だけでなく、カメラの向きが右にずれている画像でも
正常に検出が行われていることを確認した。

今後の課題として、実際に自律走行ロボットに搭載し、走行実験を行う。
実験を行った結果を確認し、見つかった問題点に対する解決策を考案する必要がある。
また、今回は直線道路を走行することを想定しており、曲がり角に関する状況は想定していない。
そのため、今回の手法以外に曲がり角を正常に走行する手法が別途必要になると考えられる。

*参考文献 [#rdd7df62]
{1}コンピュータ画像処理・田村秀行編著

{2}平成23年度修士論文 路面パターンと画像直線を用いた自律移動ロボットにおける自己位置推定 群馬大学大学院 工学研究科 情報工学専攻 角田 勇樹

{3}建築画像の消失点検出手法の開発とそれに基づく3次元建築モデルの再構成手法 山中俊介 加藤直樹 藤澤克樹

{4}C言語で学ぶ実践画像処理 井上誠喜 八木信行 林正樹 中須英輔 三谷公二 奧井誠人

{5}https://opencv.org/
 
{6}A Mobility Aid System with Image Sencers for Blind:Detection of stairs, YAMANAKA Kenzo, WU Haiyuan, SHIOYAMA Tadayoshi

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS