自動運転分野でよく聞くSLAMとは一体なんなんでしょうか。

はじめに

近年、自動運転の話題がよくでます。自動運転車や、お掃除ロボットを含む自律移動ロボットが身近な例でしょう。自動運転車や自律移動ロボットは、人間の命令や操縦なしで、障害物を避けながら目的地まで行くことができます。

このような自動車やロボットの多くには、SLAMというアルゴリズムが使われています。この記事では、SLAMに関して、初見の方々にも分かるように説明していきます。

自己紹介

  • 自律移動ロボットの研究歴2年
  • 論文掲載学会発表経験あり

SLAMとは

SLAMとは、Simultaneous Localization And Mappingの略であり、自己位置推定地図生成同時に行うアルゴリズムです。

まずは、一文でSLAMについてまとめてみました。以下では、この一文を噛み砕きながら説明していきます。

自動運転技術に必要な技術要素

目的地にたどり着くタスクを考えた場合、主に以下の要素技術が必要になります。

  • 認識(Recognition)
  • 自己位置推定(Localization)
  • 経路計画 (Path Planning)
  • 経路追従 (Path Following)

流れをまとめると…

センサで認識した情報をもとに、ロボット(車)が環境内のどこにいるかを把握し、自分の位置から環境内の目的地までの経路を計算し、その経路に追従するための制御を行います。

本来はもっと複雑ですが、ザックリこんな感じです。

SLAMは自己位置推定のためのアルゴリズム

SLAMは4つの要素技術のうち、自己位置推定(Localization)のためのアルゴリズムです。

どんなセンサを使うの?

アルゴリズムの説明をする前に、イメージしやすいように、どんなセンサを使うのかを軽くご紹介しておきます。 SLAMでは主に、LiDARというレーザー距離センサを使います。レーザーをたくさん(2D、3D、180°、360°などなど)飛ばして、周辺の物体までの距離を測ることができます。

<図作成中>

このように、LiDARを使うことによって、周辺環境を点群データとして計測することができます。

ちなみに、LiDARを使わずにカメラだけでSLAMを行う手法もたくさんありますが、今回はイメージしやすいのでLiDARを想定しながら説明していきます。

なぜSLAMが有効なのか

SLAMが自己位置推定でよく使われる理由を説明していきます。

鳥と卵のジレンマ

正確な自己位置推定には正確な地図が必要

走行する環境の正確な地図がある場合、その地図と時々刻々におけるロボットに搭載したセンサ情報とを対応づけ(マップマッチング)することで、ロボットが地図内のどこにいるか正確に推定できます。

正確な地図を作成するには正確な自己位置推定が必要

一般的に、広域な地図を作成するには、ロボットにセンサを搭載して、ロボットを走らせながらセンサーデータを集めるのが効率的です。この際、地図を作成するためには、それぞれのセンサ情報が、環境内のどこで観測されたものなのかを知る必要があります。つまり、センサ情報と環境内の位置情報とを結びつけるため、センサ(ロボット)の自己位置推定が必要なのです。

鳥と卵

上記のように、正確な自己位置推定には正確な地図が必要な一方で、正確な地図を作成するには正確な自己位置推定が必要であるという、「鳥と卵」状態になってしまいます。

自己位置推定 ⇄ 地図作成

解決策:同時にやってしまおう

このジレンマの解決策として提案されたのがSimultaneous Localization And Mapping(SLAM)です。文字通り、「自己位置推定と地図作成を同時にやってしまおう」というものです。「自己位置推定しながら地図を作成する」と言った方がイメージしやすいかもしれません。

具体的にはどうやって同時に行う?

SLAMの中でもベイズフィルタ系、グラフベース系など何種類かありますが、この記事ではLiDARを使ったスキャンマッチング系の一例で説明していきます。

スキャンマッチングの流れ(例)

1. 初期位置を原点に設定

未知の環境であるので、適当な位置を原点として座標系を設定する必要があります。

<図作成中>

2. 相対移動量を内界センサ(加速度センサ、角速度センサ、エンコーダなど)で推定

内界センサで計測された加速度、速度や角速度などを積算することで、相対移動量を推定します。

p_k+1 = p_k + v_k*t

このような単純な積算では、一般に、センサの計測誤差などが原因で、推定位置に積算誤差が発生します。下記の式のように、誤差を含んだセンサ情報をどんどん加算していけば、累積誤差が大きくなっていくのが、簡単に想像できます。

p_k+1 = p_k + (v_k + error)*t

(また、GPSを用いて位置を推定する手法もあります。)

<図作成中>

3. センサ情報と作りかけの地図を絵合わせして推定位置を微調整

LiDARで計測された点群と作りかけの点群地図を絵合わせすることで、ロボットの推定位置を微調整します。この絵合わせによって、2の積算誤差を補正できることが多いです。

点群の絵合わせは、繰り返し計算を行う手法が多いです。具体的には、点群を複数通り動かしてみて、最も地図にピッタリはまる位置と向きを探します。

有名な手法にICP(Iterative closest points)やNDT(Normal distributions transform)があります。より詳しく知りたい場合は、これらの名前で検索すると良いでしょう。

<図作成中>

4. 作りかけの地図に対して、推定位置にセンサ情報(点群)を追加

3で推定された位置にLiDARの点群を”置く”ことで、地図を拡大できます。

<図作成中>

5. 2にもどる

上記のように、自己位置推定と地図への情報追加を繰り返すことで、ロボットの移動とともに未知の環境の地図が出来上がっていきます。

<図作成中>

地図が出来たら...

一度その環境の地図を作ってしまえば、それ以降は、既存の地図と時々刻々のセンサ情報を絵わせすることで、精度の良い自己位置推定ができるようになります(マップマッチング)。

さいごに

自動運転車や自律移動ロボットでよく使われるSLAMというアルゴリズムに関して、簡単にまとめてみました。

Ad.