#author("2020-03-21T07:36:23+00:00","default:ail-wiki","ail-wiki")
#author("2020-03-21T09:07:32+00:00","default:ail-wiki","ail-wiki")
[[太田研 公開用Wiki]]
*つくばチャレンジに向けた移動ロボットの自律走行システムの開発 [#e1cc02b2]

#contents
*はじめに [#s961176d]
近年のロボット技術の向上により,産業用ロボットなど特殊な環境での活動を想定されたものだけでなく,家庭用ロボットや人間の身近な環境で活動するロボットに対する研究が進んでいる.ロボットが人間と同じ環境で活動するためには,周囲の環境を自動的に正確に認識し,適切に行動可能であることが必要不可欠である.

そのなかで,実環境下でロボットを自律走行させる技術チャレンジである「つくばチャレンジ」が毎年茨城県つくば市で開催されている.この技術チャレンジに参加するために,移動ロボットのための自律走行システムを開発する.

**つくばチャレンジについて [#cf913aa8]
つくばチャレンジは,2007年からつくば市で毎年開催されている,遊歩道等がある市街地や,公園や駅等の人々が普段生活する空間そのままの実環境で,移動ロボットを自律走行させる技術チャレンジである.実環境下であるため,時刻や季節によって周辺環境の変化が起こることや,実際に人々が歩行し,車が走行しているなかでそれを検知し,停止や回避行動を取りながら安全に走行する技術が求められる.これらの技術を,参加者それぞれが開発・実験を行い,結果や経験,知識を互いに共有することで,全体のロボット技術の向上を目指し,現在のロボット技術について一般の人々に理解してもらうことを目標にしている.

このつくばチャレンジは,5年毎に大きく課題が変更され,2007年から2011年までを第1ステージ,2013年から2017年までを第2ステージとし,2018年から第3ステージとし場所をつくば市役所と研究学園駅前公園を中心としたコースに設定された.第3ステージの必須課題として約2.5kmのコースを自律走行すること,選択課題として信号機の認識や特定物体の探索等があり,2019年度の課題については以下のように設定されている.

-必須課題
--つくば市役所からゴールまでの約2.5kmの課題コースを自律走行
-選択課題
--A 事前データ取得なし走行
--B 信号認識横断
--C チェックポイント通過+経路封鎖迂回
--D 探索対象発見

2018年度から変更があり,つくば市役所を出発し,信号のある交差点で横断歩道を渡り,研究学園駅を経由後,公園内に入り折り返し地点を通過し,再度交差点の横断歩道を横断後,つくば市役所正面に位置するゴールまでが課題コースとなる.

CENTER:#ref(task_course.png,center,80%)
CENTER:図1: つくばチャレンジ2019の課題コース

次に選択課題について説明する.課題Aについては本走行当日のみロボットの侵入が許可された市役所庁舎内を自律走行する必要がある.課題Bでは,駅へ向かう時と,公園からゴールへ向かう時に横断歩道を渡る際に信号認識を行い,状況に応じて横断する.この課題を実施しないチームについては安全を確認して走行再開を行う.課題Cでは,公園内に予め図2のようにチェックポイントが指定されており,指定されたチェックポイントを全て通過する必要がある.2018年度では通過するだけであったが,2019年度からはランダムなチェックポイント間に経路封鎖看板が設置されており,看板を認識し封鎖されている経路を迂回しながら全てのチェックポイントを通過しなければならない.課題Dでは特定の服装をしたマネキンを探索する.マネキンは複数の服装と2つのサイズが用意されており,実験走行及び本走行の前日に通知される.

CENTER:#ref(checkpoint.png,center,80%)
CENTER:図2: 公園内のチェックポイント

*使用したロボット [#c471e3b5]
つくばチャレンジ2019にて実際に走行したロボットの外観を図3,ロボットの仕様を表1として示す.このロボットは株式会社リバストが開発・販売を行っている,移動ロボットプラットフォーム Mercury Robots シリーズのスキッドステアモデルをベースとしている.

CENTER:#ref(mercury.jpg,center,20%)
CENTER:図3: 使用したロボット

CENTER:表1 ハードウェア構成
|CENTER:外形寸法|CENTER:W0.65 x L0.75 x H1.0m|
|CENTER:ホイール径|CENTER:300mm|
|CENTER:総重量|CENTER:89.0kg|
|CENTER:動力源|CENTER:DCブラシ付きモータ x 4|
|CENTER:最大速度|CENTER:0.9m/s|
|CENTER:センサ|CENTER:40Layer 3D-LiDAR x 1|
|~|CENTER:4Layer 3D-LiDAR x 1|
|~|CENTER:2D-LiDAR x 1|
|~|CENTER:産業用カメラ x 3|
|~|CENTER:ソナーセンサー x 7|
|~|CENTER:エンコーダ x 4|
|~|CENTER:9軸ジャイロセンサ x 1|
|CENTER:制御PC|CENTER:Intel i7 5650U|
|~|CENTER:(2.2GHz 2Core 4Thread)|
|~|CENTER:メモリ8GB|

ロボットには様々なセンサーが搭載されており,ロボット上部と中部に3D-LiDAR二つ,下部に2D-LiDARが一つ,カメラが前方と左右斜め方向の三つが取り付けられている.加えて四つのモーターによりロボットは四輪駆動で動作し,各モーター毎にエンコーダが用意されている.

*開発したシステム [#kde994ea]
**システムの構成 [#bb2bd319]
開発したシステムの構成を図4として示す.センサーとして三つのLiDARがある.Mercury ClientはMercury Robotsシリーズに搭載されているロボットのモータ制御等の制御モジュールであり,エンコーダからモータの回転数を取得しロボットのオドメトリを求めることや,モータに指令値を与えて回転させることができる.

CENTER:#ref(auto_system.png,center,50%)
CENTER:図4: 開発した自律走行システムの構成

Locatorモジュールは,上部のLiDARのみから点群を取得しロボットの自己位置推定を行う.3D-LiDARを使用しているため,取得される点群は三次元情報で表されるが,このモジュールでは画像(二次元平面)に変換して処理を行うため,出力される自己位置(Pose)は二次元情報(x,y)とロボットの向いている水平方向で表される.

ObstacleDetectorモジュールは,三つ全てのLiDARを使用して障害物検知を行う.このモジュールでも同じく点群を画像に変換して障害物の検知を行い,検知した障害物を直線と矩形で表し,最後にその直線上と矩形の点群に変換することで障害物を表す.

PathPlannerモジュールは,推定された自己位置の結果と障害物の情報から経路計画を行う.このシステムでは,ウェイポイント方式を採用しており,あらかじめ設定したウェイポイントに沿って走行する.自己位置の結果からウェイポイントの到達判定を行いつつ,次に向かうべきウェイポイントの方向から経路を求める.この時,障害物が存在すればその障害物を回避しながら次のウェイポイントに向かう経路を求める.

MovementControllerモジュールは,自律走行モードの切り替えを行う.ロボットに繋いだジョイスティックコントローラの入力から自律走行のオンオフを切り替え,自律走行モードがオンの時は経路計画の結果からモータ制御を行い,自律走行モードがオフの場合にはジョイスティックコントローラからロボットを操作することができる.そのため,自律走行をせずに自己位置推定や障害物の検知を行うことができる.

**各モジュールについて [#l5056291]
***自己位置推定 [#a87a23e7]
自己位置推定には,ロボット上部に取り付けられた3D-LiDARから取得した点群を利用して二次元画像に変換することで推定を行う.このLiDAR点群を画像に変換することは,太田研究室で以前から研究されているピラミッド画像によるマッチング手法であり,そのマッチング手法をベースとした処理を自己位置推定に用いる.

LiDARから得られる点群から図5のような点群画像を生成する.

CENTER:#ref(pyramid_image2.png,wrap,center,100%)
CENTER:図5: LiDAR点群から生成される画像

次に,この点群画像を用いて自己位置推定を行う.まず,画像サイズを縮小しながら現在観測される点群から図6のように複数サイズの点群画像を生成する.この画像群をピラミッド画像と呼ぶ.

CENTER:&ref(pyramid_image3.png,wrap,center,70%); &ref(pyramid_image2.png,wrap,center,70%); &ref(pyramid_image1.png,wrap,center,70%);
CENTER:図6: 生成したピラミッド画像

今回自己位置推定を行うにあたり,ロボット中心から半径100m(全長200m)の範囲を画像として生成した.

次に,図7で表されるような環境地図を用いて,直前の自己位置推定結果とロボットのオドメトリの差から予測される現在地周辺を画像として切り取り,現在観測点群からピラミッド画像を生成し画像を回転させながらマッチングを行う.環境地図というのは,一度走ったルートのログデータから事前に生成した,周辺環境を表す画像のことであり,自己位置はこの画像上での相対的な位置として求める.

CENTER:#ref(tsukuba_map.png,wrap,center,30%)
CENTER:図7: 生成したつくばチャレンジ課題コースの環境地図

画像のマッチングにはテンプレートマッチングを用いており,OpenCVの関数matchTemplateを使用した.スコアの算出関数としてCV_TM_CCORR(相互相関)を使用し,出力されたスコアに対して現在観測点群画像で表される点群数で割ったものを真のスコアとして用いた.

***障害物検知 [#w20b4e87]
障害物検知では,自己位置推定時のようにLiDARから得られる点群から点群画像を生成して処理を行い,障害物を矩形と直線で表す.自己位置推定ではロボット上部のLiDARのみの利用であったが,障害物検知では搭載されている3つのLiDAR全てを使用する.これは上部のLiDARの設置位置が地上から約1mの高さであるため,近距離の物体が点群として取得出来ないためである.中部のLiDARと下部のLiDARによって,縁石等の定位置に存在する物体や,ロボット正面に近距離の物体が現れた場合でも点群を取得することができる.

実際に生成した点群画像に対して,ラベリング処理とハフ変換による直線検出を行うことで障害物の認識を行い,その結果が図8となる.
CENTER:&ref(obst_line.png,center,100%); &ref(true_obst.png,center,100%);
CENTER:図8: ラベリングと直線検出で検出された障害物

検出された障害物については,線分と矩形で表されているため,点群に変換する.線分については,線分を10分割した線分上の点を点群として表す.矩形については,ロボットに近い矩形の辺上に辺を10分割した位置の点を点群と表すこととする.

***経路計画 [#wd590cb3]
経路計画とは,自己位置推定の結果と環境地図等の情報からロボット自身が走行するルートを決定するものである.今回は環境地図上に走行するべきルートをウェイポイントとして定義することで,ウェイポイントに沿った走行をしつつ,障害物が存在する等,状況に応じて停止したり,走行時の局所的な最適ルートを計算して次に向かうべき方向を出力する.

今回経路計画にはポテンシャル法を用いて実装を行った.ポテンシャル法とは,ロボット位置,障害物位置,目標位置を用いて任意の座標について,ポテンシャル関数と呼ばれる関数によって,その座標のポテンシャルを求め,その勾配から進行方向を求める手法である.通常はポテンシャルの勾配を求めて,その勾配に沿って進行するように方向を定めるが,今回の実装では勾配を求めずに,ポテンシャルの値から進行方向を求める.

ポテンシャルは以下のポテンシャル関数によって求めた.
CENTER:#ref(poten_func.png,center,70%)

P_o,P_d,Pはそれぞれ,障害物のポテンシャル関数,目的地のポテンシャル関数,ポテンシャルの値を表し,(x, y, z),(x_o, y_o, z_o),(x_d, y_d, z_d), w_o, w_dはそれぞれロボットの位置座標,障害物の座標,目的地の座標,障害物のポテンシャルに対する重み,目的地のポテンシャルに対する重みを表す.

2つのポテンシャル関数を見てわかるように,障害物のポテンシャル関数は正の値,目的地のポテンシャル関数は負の値を定義することから,目的地のポテンシャルの値は低くなる.

今回はポテンシャルを各座標について求めるだけでなく,図9のように進むべき方向のポテンシャルとして1方向につき3段階の距離でポテンシャルを求め,その総和から最適な方向を求めることとした.理由として,求めたポテンシャルだけを用いた場合,障害物を考慮しなければ予め設定されたルートに沿った行動を取ることが出来たが,障害物が存在する場合に上手く回避行動を取れないことがあったためである.

CENTER:#ref(ext_poten.png,wrap,center,50%)
CENTER:図9: ポテンシャルによる実際のルート推定の様子

*つくばチャレンジ2019での結果 [#q2f0d143]
つくばチャレンジ2019での結果は,スタートから500m地点,信号のある交差点での停止線超過の為,非常停止による終了となった.本走行中の自己位置推定等には異常はなく,ウェイポイントの設定による停止位置の設定ミスが原因となった.以下に課題等を含めた本走行の結果を表2として示す.

CENTER:表2: つくばチャレンジ2019本走行の結果
|走行距離|完走|選択課題A|選択課題B|選択課題C|選択課題D|
|CENTER:約500m|CENTER:x|CENTER:不実施|CENTER:不実施|CENTER:不実施|CENTER:不実施|

*考察 [#gdd7b255]
開発したシステムについて考察を述べる.

自己位置推定については,LiDARの計測周期が20Hzであることから,今回使用したロボットの構成では2倍まで速度を向上させて実装出来る.自己位置推定が早ければ早いほど,他の処理にコンピューターのリソースが割けるだけでなく,経路計画の細かさにも影響する.今回は理論的には非常に高速な手法を元としているため,実装する際のプログラミングでの高速化を図ることで,より早い自己位置推定を行えると考えている.

障害物検知については,実験走行での検知ミスがあったため,改善する必要がある.今回は矩形と直線により障害物を検知していたが,この矩形で表す部分にミスがあったのではないかと考えられる.自律走行実験中にログデータを保存出来なかったため,実際にどうなっていたかわからないが,モジュールの説明部分でも述べたように,実際の物体と矩形領域の誤差が発生していたと考えられる.今後,LiDARから取得した点群についてロボットから半径10m以内の生点群について障害物として経路計画を行い,実際の経路計画を観察することと,今回の実装との比較をする必要がある.

経路計画については,実装コストの面からポテンシャル法を用いたが,実際の自律走行の様子を見ると,障害物をしっかり検知していても,綺麗な回避行動が取れないことがあり,他の手法の比較を行うことで,経路計画の見直しを図るべきであると感じた.

開発したシステム全体としては課題が残るものの,ある程度自律走行可能なシステムとして構築出来たと考えられる.今後は修正点について改善していくと共に,つくばチャレンジでの選択課題に向けたモジュール開発も行っていければ,自律走行システムとしてより良いシステムが構築出来ると考える.

*まとめ [#u6285389]
本論文では,つくばチャレンジでの課題である完走を目標に,移動ロボットの為に開発した自律走行システムについて述べた.開発したシステムは,既存の自律走行パッケージを使用しないこととし,安全にロボットが自律走行できるシステムとすることに気をつけ開発を行った.

システムのモジュールとして,自己位置推定,障害物検知,経路計画等の基本的なロボットが自律走行するために必要な機能についての実装となった.自己位置推定にはLiDARから得られる3次元点群を画像に変換し,ピラミッド構造によるマッチングを行うことで高速かつ精度の高い位置の推定を行うことが出来た.障害物についてはLiDARから得られる点群を使用するが,そのまま点群を扱うのではなく,画像に変換し矩形と直線で表すことで処理数を減らすこととした.経路計画については実装コストの面からポテンシャル法による実装を行い,進むべき方向を求めることとした.

開発したシステムはつくばチャレンジの実験走行及び,群馬大学桐生キャンパス構内で実際に自律走行を行うことで検証した.群馬大学構内では,高い建物に囲まれた狭い通りについては回避行動を取った場合に自己位置を見失うことがあったが,環境地図を作成した全域についてほとんどの場合,自己位置推定が破綻することなく走行出来た.つくばチャレンジにおける実験については,障害物の検知ミスが何度かあったものの,基本的には環境地図中のどの位置でも自己位置推定が正しく行われており,問題なく走行することが出来た.

つくばチャレンジ2019における本走行については,スタートであるつくば市役所から約500m付近の,信号のある交差点での停止線超過による走行失敗となり終了となった.原因にはシステム外で設定する,ルートファイルのウェイポイント設定の誤差が影響していた.

今後の課題としては,開発したシステムのさらなる高速化と,モジュール毎に新たな手法の検証を行うことが挙げられる.加えて,つくばチャレンジ2019の選択課題については何も実施出来なかったことから,選択課題を達成するためのモジュールも開発することでつくばチャレンジの課題完全達成を目指したい.


*参考文献 [#y55ce366]

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