# ロボットのローカリゼーション = ロボットの位置推定 2つの基本的なアプローチ: - 環境内の人工的なランドマークまたはセンサの使用 - ロボットに搭載されたセンサの使用 (「自己位置推定」) - オドメトリ - 環境地図 + 搭載されたセンサ(距離センサ、カメラ、など) --- ## オドメトリ 移動モデルと測定された車輪の速度に基づいてロボット位置の推定。 ### オドメトリの誤差 - オドメトリ計算はエラーの影響を受けます - 例えば、速度測定に不確実性があります - 推定誤差は時間の経過とともに蓄積されます - オドメトリだけで直すことができません ロボットの実際の位置とオドメトリに基づく推定の比較の例 <img src="./v5_media/odom_error0.png" alt="" style="width: 30%;"/> &nbsp;&nbsp; <img src="./v5_media/odom_error1.png" alt="" style="width: 30.8%;"/> --- ### よりいい位置推定 - ロボットの周辺で、検出可能で正確な位置がわかっている物体を使用します - 物体の実際の位置が含まれていろ*環境の地図*をあらかじめに用意します - 知覚センサ(カメラ、距離センサ、など)を使用して、物体を検出します - 検出された位置を地図と比較し、ロボットの位置推定を修正します ⇒ *地図に基づくローカリゼーション* --- ## 不確実性モデリング *確率*を使用します - ロボットの状態(位置、向きなど)は単一の値ではなく、確率分布で表します。 例:オドメトリを使用して決定された位置の不確実性分布(より黒くなっているところにはロボットがある可能性が高い) <img src="./v5_media/banana1.png" alt="" style="width: 30%;"/> <img src="./v5_media/banana2.png" alt="" style="width: 30%;"/> ### 不確実性パラメータ 速度の標準誤差偏差のモデリング: <img src ="./v5_media/eq_speednoise.png" alt="" style="height: 17pt; display: inline-block;" /> (αはパラメータです) <br> 例: a)どちらの誤差も比較的大きくない、 b)直線速度誤差が比較的大きい(α1とα2が大きい)、c)角速度誤差が比較的大きい(α3とα4が大きい) a) <img src="./v5_media/param0.png" alt="" style="width: 25%;"/> &nbsp;&nbsp; b) <img src="./v5_media/param2.png" alt="" style="width: 25%;"/> &nbsp;&nbsp; c) <img src="./v5_media/param1.png" alt="" style="width: 25%;"/> --- ### 確率分布の近似 確率分布を正確に推定することは困難です(正規分布などの特殊な場合を除く)。 その代わりに、サンプルによる近似を使うことができます。 <img src="./v5_media/param0_s.png" alt="" style="width: 20%;"/> &nbsp;&nbsp; <img src="./v5_media/param2_s.png" alt="" style="width: 20%;"/> &nbsp;&nbsp; <img src="./v5_media/param1_s.png" alt="" style="width: 20%;"/> ⇒ 確率分布の代わりに、サンプルを使用します。各サンプルは1つの可能な値を表します。 - サンプルが多い場所 = 確率が高い - 十分な数のサンプルがあれば、適切な近似が得られます --- ## モンテカルロローカリゼーション(MCL) ### パーティクルフィルタ (粒子フィルタ、モンテカルロフィルタ)  = 時間的に変化する変数の値の推定に使われるアルゴリズムです。 - 変数を直接測定できませんが、関連する値を観測できます - 不正確性がサンプルによって近似されます(サンプルは「パーティクル」・「粒子」と呼ばれる) - (逐次)ベイズ推定を利用 → [Wikipedia](https://ja.wikipedia.org/wiki/%E7%B2%92%E5%AD%90%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF) → [追加演習の「パーティクルフィルタについて」](vextra_pf.html) 新しい観測を取得したたびに: 1. 時間変化モデルに基づくパーティクルの新しい状態の予測。 2. 観測に基づくパーティクルの更新 - 重み付け:観測とよく一致する粒子は、より高い重みを付ける - サンプリング:重みの大きいパーティクルをより多く選択し、重みの小さいパーティクルを少なくし、新しいパーティクルのセットを作成する ### ローカリゼーションにパーティクルフィルタを使用  ⇒ *モンテカルロローカリゼーションアルゴリズム*(MCL) - 最もよく使われているローカリゼーションアルゴリズムの1つ - パーティクルフィルタ:パーティクルはロボットの位置と向きを示しれます MCLの更新 1. オドメトリモデルに基づいて各パーティクルの状態を更新します 2. それぞれのパーティクルがどれぐらいセンサの観測と一致するかを確認します(つまり、ロボットがパーティクルが定義している位置・向きにあったら、そのセンサ観測が本当に得られますか?)   - よく一致するパーティクルが残ります、一致しないパーティクルは削除します --- ### 距離センサを使ったMCLの例 初期粒子分布 - ロボットがどこにあるかはまったくわからないので、環境全体にパーティクルを散乱します <img src="./v5_media/mcl_prox01.png" alt = "" style = "width:65%;" /> --- 距離の測定 - レーザースキャナーを使用していますが、不正確な測定がかなりあります。 (図では、レーザー光線はロボットの(未知の)実際の位置を起点としている) <img src="./v5_media/mcl_prox02.png" alt = "" style = "width:65%;" /> --- 重み付け - (この図で見ずらいですが)重みの高いパーティクルは濃い色で表しています <img src="./v5_media/mcl_prox03.png" alt = "" style = "width:65%;" /> --- (次はサンプリングをやりますがその図がありません) --- 予測(オドメトリ) - ロボットの速度の値を使って、パーティクルが次どこまで進むかを予測します <img src="./v5_media/mcl_prox04.png" alt = "" style = "width:65%;" /> --- 測定 <img src="./v5_media/mcl_prox05.png" alt = "" style = "width:65%;" /> --- 重み付け (濃い色のパーティクルで重みが高いです) <img src="./v5_media/mcl_prox06.png" alt = "" style = "width:65%;" /> --- サンプリング - 重みが大きいほうのパーティクルが残ります <img src="./v5_media/mcl_prox07.png" alt = "" style = "width:65%;" /> --- 予測 <img src="./v5_media/mcl_prox08.png" alt = "" style = "width:65%;" /> --- 測定 <img src="./v5_media/mcl_prox09.png" alt = "" style = "width:65%;" /> --- 重み付け <img src="./v5_media/mcl_prox10.png" alt = "" style = "width:65%;" /> --- サンプリング <img src="./v5_media/mcl_prox11.png" alt = "" style = "width:65%;" /> --- 予測 <img src="./v5_media/mcl_prox12.png" alt = "" style = "width:65%;" /> --- 測定 <img src="./v5_media/mcl_prox13.png" alt = "" style = "width:65%;" /> --- 重み付け (この時点ではロボットの位置が大体わかりました) <img src="./v5_media/mcl_prox14.png" alt = "" style = "width:65%;" /> --- サンプリング <img src="./v5_media/mcl_prox15.png" alt = "" style = "width:65%;" /> --- 予測 <img src="./v5_media/mcl_prox16.png" alt = "" style = "width:65%;" /> このまま続きます... --- --- # 環境地図について 環境地図の種類が様々ですが、ローカリゼーションによく使われているのは「占有グリッド地図」(英語:occupancy grid map) --- ## 占有グリッド地図 - スペースは正方形セグメント(セル)に分割されます - セグメントは画像のピクセルみたいです - 各セグメントについて、「何かがある」または「何もない」のいずれかであると想定します --- 占有率 - p = 1 ⇒ その場所に何かがある - p = 0 ⇒ その場所に何もない - p = 0.5 ⇒ わからない <img src="./v5_media/map_occgrid_model.png" alt="" style="width: 65%;"/> --- 例 (建物の中): - 壁、家具などの所は「黒い」 p≈1 - 廊下、通れる部分は「白い」 p≈0 - 壁の後ろので、センサが測定できなかった場所は「灰色」 p≈0.5 <img src="./v5_media/map_occgrid.png" alt="" style="width: 85%;"/> --- --- # 環境地図構築 ローカリゼーションを説明したときには、地図が既にあると想定していました。 - 多くの場合はそうではありません ⇒ 地図を作成する必要があります --- ## 問題点 - 地図構築とロボットの位置推定は相互に依存しています - 地図を作成するには*ロボットがどこにあるかを知る必要があります*が、ロボットの位置をわかるにはには*地図が必要です* - ⇒ これはいわゆる**SLAM**問題です(**自己位置推定及び環境地図構築の同時実行**、Simultaneous Localization And Mapping) --- ## パーティクルフィルタを使ったSLAM パーティクルフィルタ(MCLアルゴリズム)を地図構築にどのように適用すればいいですか? 基本的なアプローチ: 1. これまで作成した地図をによって位置推定 ⇒ MCLアルゴリズムを使用します 2. 推定した位置を使って占有グリッド地図を更新します - 実は、各パーティクルが自分の地図を持っていて、更新しています - 一番重みの大きいパーティクルの地図が「一番正しい」とします 1、2を繰り返します このアルゴリズムはRBPFまたはFastSLAMと呼ばれます。 (簡単に思えるかもしれませんが、SLAM問題の最初の定義からこのアルゴリズムが開発されるまでは約10〜15年かかりました。現在、これはSLAM(地図構築)の標準アルゴリズムの1つです。) --- ### センサ測定による地図の更新 - センサのビームがどこに当たらず通ったところ → 占有確立を下げる - センサのビームがモノに当たったところ → 占有確立を上げる 緒音波センサの例: <img src="./v5_media/inv_sensor_model_sonar.png" alt="" style="width: 60%"/> --- ### 地図構築:例 レーザースキャナーの測定 - ロボットのポーズはオドメトリによって得られたので、測定がずれています。 <img src="./v5_media/mapping_raw.png" alt="" style="width: 45%;"/> マップ構築結果 <img src="./v5_media/mapping_result.png" alt="" style="width: 48%;"/> --- ### パーティクルフィルタのSLAM 動画 <iframe width = "560" height = "315" src = "https://www.youtube.com/embed/jBPZIU6AIS0" frameborder = "0" allowfullscreen> </iframe> - 地図の構築が大体終わっているときに、MCLとほぼ同様に機能します(地図を少しだけ更新して、位置推定を行う) --- → [実習その1](v5_1.html) ↑ [ホームページ](index.html)