まとめ:SLAMの要点
- SLAMは「未知の環境に置かれたロボットが、地図を作りながら、その地図の中での自分の位置を同時に求める」問題です。自己位置推定だけを指す言葉ではありません。
- 本体はループ閉じ込み(loop closure)です。同じ場所に戻ってきたと判定できる仕組みが無ければ、どれだけ高度な最適化を回してもSLAMは単なるオドメトリに退化します。本記事ではポーズグラフを自作して、この退化を実測で示します。
- アルゴリズムはEKF-SLAM・FastSLAM・Graph SLAMの3系統で、現在の実装の主流はGraph SLAMです。EKF-SLAMは共分散の記憶量がランドマーク数の2乗で増え、実測でもランドマーク800個で共分散だけが約20MiBに達しました。
- センサーの選択(LiDARかカメラか)は精度の優劣ではなく、環境の形状が単調かどうか、明るさが安定しているかで決まります。どちらも苦手な環境があります。
- 2026年9月時点でROS 2上の実装を選ぶなら、更新が続いているのはslam_toolboxとRTAB-Mapです。Cartographerは公式に「もはや積極的には保守されていない」と表明しており、ORB-SLAM3も2021年を最後にリリースが止まっています。
SLAMとは:地図作成と自己位置推定を同時に解く問題
定義と、自己位置推定との違い
SLAMはSimultaneous Localization and Mapping(同時自己位置推定・地図作成)の頭字語です。分野の標準的なチュートリアルであるDurrant-WhyteとBaileyの論文は、この問題を次のように定義しています。
The Simultaneous Localisation and Mapping (SLAM) problem asks if it is possible for a mobile robot to be placed at an unknown location in an unknown environment and for the robot to incrementally build a consistent map of this environment while simultaneously determining its location within this map.
(未知の環境の未知の場所に置かれた移動ロボットが、その環境の一貫した地図を逐次的に構築しながら、同時にその地図の中での自らの位置を決定できるか、を問うのがSLAM問題である)
ここで重要なのは「同時に」の部分です。地図が既にあれば自己位置推定は比較的容易で、自己位置が正確に分かっていれば地図作成も容易です。SLAMが難しいのは、どちらも分かっていない状態から両方を同時に求めなければならない点にあります。GPSが届かず、使える地図も無い屋内・地下・トンネル・水中のような環境では、この同時推定が必要になります。逆に既存の地図や外部の測位設備が使える場合は、地図作成を伴わない自己位置推定(ローカライゼーション)だけでも移動できます。
「SLAMとは自己位置推定のことか」と問われれば、答えは「半分だけ正しい」です。自己位置推定は出力の一方でしかなく、地図という成果物が同時に生まれることがSLAMの定義に含まれます。
SLAMの起源と頭字語の命名時期
同じ論文は、この問題の起源と命名の時期を次のように記録しています。
- 1986年:サンフランシスコで開催されたIEEE Robotics and Automation Conferenceが確率的SLAM問題の出発点になりました。論文の逐語は「The genesis of the probabilistic SLAM problem occurred at the 1986 IEEE Robotics and Automation Conference held in San Francisco.」です。
- 1995年:SLAMという頭字語そのものが最初に提示されたのは、1995年のInternational Symposium on Robotics Researchで発表された移動ロボティクスのサーベイ論文です(逐語「the coining of the acronym ‘SLAM’ was first presented in a mobile robotics survey paper presented at the 1995 International Symposium on Robotics Research」)。
この時期に判明した鍵が、ランドマーク同士の相関でした。当初、研究者の多くはランドマーク間の相関を小さく抑えようとしていましたが、実際には逆で、論文は「the more these correlations grew, the better the solution」(相関が大きく育つほど解は良くなる)と書いています。地図の要素を互いに独立に扱わず、1つの結合状態として解くという設計が、ここで確立しました。
その後の整理としては、Cadenaらの2016年のサーベイが期間を区切っています。1986年から2004年をclassical age(確率的定式化が出そろった時期)、2004年から2015年をalgorithmic-analysis age(可観測性・収束性・一貫性といった性質の解析と、主要なオープンソース実装が生まれた時期)と呼び、その先をrobust-perception ageと位置づけています。
SLAMの仕組み:フロントエンドとバックエンド
2つの層の役割分担
Cadenaらの2016年のサーベイは、SLAMの処理を低位のフロントエンドと高位のバックエンドに分けて整理しています。
- フロントエンド:センサーの生データを幾何的な拘束に変換する層です。LiDARならスキャンマッチング、カメラなら特徴点の抽出と対応付けを行い、「1つ前の姿勢から見て、今の姿勢はこれだけ動いた」という相対姿勢の観測を作ります。同じ場所に戻ってきたことを検出するループ閉じ込みの判定も、ここの仕事です。
- バックエンド:フロントエンドが作った拘束の集合を、最も矛盾が小さくなるように一括で解く層です。本記事で扱うポーズグラフ方式であれば、姿勢をノード、相対姿勢の拘束をエッジとして非線形最小二乗を解きます。方式によっては、ランドマークも推定変数に含めたり、フィルタで逐次更新したりします。
ループ閉じ込み拘束の有無による軌跡誤差の比較
Cadenaらのサーベイは、SLAMとオドメトリの境界をひとことで示しています。
The keyword here is “loop closure”: if we sacrifice loop closures, SLAM reduces to odometry.
(鍵となるのはループ閉じ込みである。ループ閉じ込みを手放せば、SLAMはオドメトリに退化する)
この主張がどの程度のものかを確かめるため、2次元のポーズグラフSLAMをnumpyだけで実装して測りました。1辺25歩の正方形を1周する軌跡(105ノード・104拘束)に、1歩あたり位置0.02メートル・角度1度の雑音を載せたオドメトリを与え、Gauss-Newton法で最適化します。
import numpy as np
def wrap(a):
return (a + np.pi) % (2 * np.pi) - np.pi
def t2v(T): # 同次変換行列 -> [x, y, theta]
return np.array([T[0, 2], T[1, 2], np.arctan2(T[1, 0], T[0, 0])])
def v2t(v): # [x, y, theta] -> 同次変換行列
c, s = np.cos(v[2]), np.sin(v[2])
return np.array([[c, -s, v[0]], [s, c, v[1]], [0, 0, 1]])
def optimize(poses, edges, iters=30):
"""edges: (i, j, 相対姿勢の観測z, 情報行列omega)"""
x = poses.copy()
n = len(x)
for _ in range(iters):
H = np.zeros((3 * n, 3 * n))
b = np.zeros(3 * n)
for i, j, z, omega in edges:
Zij, Xi, Xj = v2t(z), v2t(x[i]), v2t(x[j])
e = t2v(np.linalg.inv(Zij) @ (np.linalg.inv(Xi) @ Xj))
e[2] = wrap(e[2])
A = np.zeros((3, 3)) # 数値微分でヤコビアンを作る
B = np.zeros((3, 3))
dlt = 1e-6
for k in range(3):
dxk = np.zeros(3)
dxk[k] = dlt
ei = t2v(np.linalg.inv(Zij) @ (np.linalg.inv(v2t(x[i] + dxk)) @ Xj))
ej = t2v(np.linalg.inv(Zij) @ (np.linalg.inv(Xi) @ v2t(x[j] + dxk)))
ei[2], ej[2] = wrap(ei[2]), wrap(ej[2])
A[:, k] = (ei - e) / dlt
B[:, k] = (ej - e) / dlt
I, J = slice(3 * i, 3 * i + 3), slice(3 * j, 3 * j + 3)
H[I, I] += A.T @ omega @ A
H[I, J] += A.T @ omega @ B
H[J, I] += B.T @ omega @ A
H[J, J] += B.T @ omega @ B
b[I] += A.T @ omega @ e
b[J] += B.T @ omega @ e
H[0:3, 0:3] += np.eye(3) * 1e6 # 先頭ノードを固定
dx = np.linalg.solve(H, -b).reshape(n, 3)
x = x + dx
x[:, 2] = wrap(x[:, 2])
return x
# ループ閉じ込み=始点と終点が同一地点だと判定できたときに足す1本の拘束
def loop_closure_edge(n_poses):
return (0, n_poses - 1, np.zeros(3),
np.diag([1 / 0.05 ** 2, 1 / 0.05 ** 2, 1 / np.deg2rad(2) ** 2]))
実行結果は次のとおりです(Python 3.9.6・numpy 2.0.2・macOS 26.6.2・x86_64、2026年9月19日実行)。
| 条件 | 軌跡の位置RMSE(ATE) | 終端の位置ずれ |
|---|---|---|
| デッドレコニング(オドメトリ積分のみ) | 1.939 m | 4.683 m |
| ポーズグラフ最適化(ループ閉じ込みなし) | 1.939 m | 4.683 m |
| ポーズグラフ最適化(ループ閉じ込み拘束を1本追加) | 1.207 m | 0.002 m |
注目すべきは2行目です。今回のように拘束が隣接姿勢間のオドメトリだけの鎖状グラフでは、最適化を回しても誤差が1ミリも減りません。拘束が数珠つなぎのままでは、オドメトリを積分した軌跡がそのまま最小二乗解になるためです(別のセンサーによる拘束やランドマーク観測を持つグラフでは、ループ閉じ込みが無くても最適化は効きます)。逆に、始点と終点が同じ場所だと判定できた拘束をたった1本足すだけで、終端の位置ずれは4.683メートルから0.002メートルへ落ちます。
この結果は「高性能なバックエンドを入れれば精度が上がる」という直感が誤りであることを示します。この実験で改善に寄与したのは、正しいループ閉じ込み拘束の追加であって、最適化器の性能ではありませんでした。なお本実験は始点と終点の対応を正解として与えており、場所認識器そのものの性能は評価していません。実際Cadenaらは、視覚と慣性を組み合わせたオドメトリ(VIN)を「ループ閉じ込み(場所認識)モジュールを無効にした、縮退したSLAMシステム」と位置づけたうえで、その誤差が軌跡長の0.5パーセント未満に収まるとも書いています。ループを閉じないなら高精度オドメトリで十分、というのが裏返しの結論です。
SLAMアルゴリズム3方式の違い
EKF-SLAM:最初の定式化とその限界
EKF-SLAMは、ロボットの姿勢と全ランドマークの座標を1本の状態ベクトルにまとめ、拡張カルマンフィルタで逐次更新する方式です。相関を捨てずに保持するという原理には忠実ですが、その代償が計算量です。Durrant-WhyteとBaileyは「観測更新のたびに全ランドマークと結合共分散行列を更新する必要がある」と述べ、その帰結を「Naively, this means computation grows quadratically with the number of landmarks.」(素朴に実装すれば、計算量はランドマーク数の2乗で増える)と書いています。
この2乗則が実務でどの程度効くかを、共分散更新だけを取り出して測りました。状態次元は3プラス2×ランドマーク数です。表のメモリ値は共分散配列だけを対象とした値(1,024バイトを1KiBとして表示)で、プロセス全体のピークメモリではありません。なお更新式の書き方でも計算量が変わります。教科書どおりの (I – KH)P はd×d同士の行列積になるためO(d3)ですが、P – K(HP) と括ればHが2×dなのでO(d2)で済みます。両式が数値的に一致することを確認したうえで、両方の時間を並べました。
import time
import numpy as np
rng = np.random.default_rng(1)
def build(n):
d = 3 + 2 * n
P = np.eye(d) * 0.1
P += 1e-3 * (lambda A: A @ A.T)(rng.standard_normal((d, d)))
H = np.zeros((2, d))
H[0, 0] = H[1, 1] = -1.0
H[0, 3] = H[1, 4] = 1.0 # ランドマーク1つを観測
return d, P, H, np.eye(2) * 0.01
def update(P, H, R, efficient):
S = H @ P @ H.T + R
K = P @ H.T @ np.linalg.inv(S)
# efficient: H が 2 x d なので H @ P も K @ (H @ P) も O(d^2)
# 教科書形 (I - K @ H) @ P は d x d 同士の積になり O(d^3)
return P - K @ (H @ P) if efficient else (np.eye(P.shape[0]) - K @ H) @ P
| ランドマーク数 | 状態次元 | 共分散のメモリ | n=50比 | O(d2)形の1更新 | O(d3)形の1更新 |
|---|---|---|---|---|---|
| 50 | 103 | 82.9 KiB | 1.0倍 | 0.118 ms | 0.238 ms |
| 100 | 203 | 321.9 KiB | 3.9倍 | 0.301 ms | 0.707 ms |
| 200 | 403 | 1,268.8 KiB | 15.3倍 | 1.376 ms | 3.504 ms |
| 400 | 803 | 5,037.6 KiB | 60.8倍 | 6.411 ms | 21.986 ms |
| 800 | 1,603 | 20,075.1 KiB | 242.2倍 | 91.565 ms | 208.528 ms |
読み取れることが3つあります。第一に、メモリはランドマーク数が倍になるごとにほぼ4倍(1.0倍・3.9倍・15.3倍・60.8倍・242.2倍)で、2乗則どおりに増えています。ここは実装の書き方に依存しない、定義そのものの帰結です。
第二に、更新式の書き方だけで所要時間が約2倍変わります。教科書どおりに (I – KH)P と書くと、どの規模でもO(d2)形の2倍前後かかりました。自分で実装するなら、括り方を変えるだけで拾える差です。
第三に、時間の伸びは2乗則より急になる領域があります。O(d2)形でも、ランドマーク50個から400個(8倍)で54.3倍とおおむね2乗則に沿いますが、800個では775.1倍へ跳ねました。共分散が約20MiBになりCPUキャッシュに収まらなくなるためで、計算量ではなくメモリ帯域が効いています。したがって、この表の時間はこの実装・この環境での値であり、EKF-SLAM一般の処理時間ではありません。
そのうえで実務的な目安としては、この実装・計測環境では、共分散更新だけでランドマーク800個のときに100ミリ秒の周期を超えています。センサーが10ヘルツで回るなら、この規模では共分散更新以外に使える時間が残りません。EKF-SLAMを採用するかどうかは、計算順序を整えた実装で、想定するランドマーク数と観測頻度に対する処理時間を測って判断してください。原典も、効率化した変種では数千のランドマークを扱うリアルタイム実装が実証されていると述べています。
FastSLAM:粒子による軌跡表現とランドマーク別フィルタ
FastSLAMは、ロボットの軌跡を多数の粒子(パーティクル)で表現し、各粒子ごとにランドマークを独立した小さなフィルタで持つ方式です。軌跡を条件として与えればランドマーク同士が独立になるという性質(Rao-Blackwell化)を使い、EKF-SLAMの巨大な結合共分散を回避します。原典であるMontemerloらの2002年の論文は、この構成によって観測の取り込みが「地図内のランドマーク数に対して対数的にスケールする」と述べ、50,000個のランドマークでの動作を報告しています。同じ抄録はEKF系を「観測1つを取り込むのにランドマーク数の2乗の時間を要する」と対比させています。ただし前節で測ったのは実行時間ではなく記憶量の増え方であり、処理時間のほうは実装の書き方とメモリ帯域に左右されます。非線形性やマルチモーダルな分布に強い一方、粒子数を増やすほど計算量とメモリが増え、長時間走らせると粒子の多様性が失われる(粒子枯渇)という固有の課題があります。2次元の格子地図を作るLiDAR SLAMでは、この系統のgmappingが長く標準的な選択肢でした。
Graph SLAM:現在の実装の主流
Graph SLAMは、前章で実装したとおり姿勢をノード・拘束をエッジとするグラフを組み、全体を非線形最小二乗として解く方式です。時系列に沿って逐次的に絞り込むフィルタ系と違い、過去の姿勢を変数として保持し、後からまとめて修正できる点が決定的な差になります。EKF-SLAMもランドマークの再観測によって現在の姿勢と地図を補正しますが、過去の姿勢まで遡って再最適化することはできません。拘束行列が疎であることを利用すれば大規模でも解けるため、現在のROS 2向け実装はほぼこの系統です。
| 方式 | 状態の持ち方 | 過去の姿勢の修正 | 主な弱点 | 代表的な実装 |
|---|---|---|---|---|
| EKF-SLAM | 姿勢と全ランドマークを1本の状態ベクトルで結合 | できない(直近の状態のみ更新) | 計算量がランドマーク数の2乗で増える/線形化誤差の蓄積 | 教育・小規模の参照実装 |
| FastSLAM | 軌跡を粒子群、地図を粒子ごとの独立フィルタ | 粒子の重み付けを通じて間接的に | 粒子枯渇/粒子数に比例する計算量 | gmapping(2次元格子地図) |
| Graph SLAM | 姿勢のグラフと拘束の集合 | できる(全体を一括で再最適化) | ループ閉じ込みの誤検出が全体を壊す | slam_toolbox、Cartographer、RTAB-Map |
LiDAR SLAMとVisual SLAMの選び分け
センサーの違いは精度の優劣ではなく、何を手がかりに位置を合わせるかの違いです。LiDAR SLAMは形状を、Visual SLAMは見た目の模様を手がかりにします。したがって苦手な条件も異なります。ただし形状も模様も乏しい環境のように、両方が同時に失敗しやすい条件もあります。
| 観点 | LiDAR SLAM | Visual SLAM |
|---|---|---|
| 手がかり | 点群の形状(スキャンマッチング) | 画像の特徴点・輝度パターン |
| 明るさの影響 | 暗所・夜間でも測距できる(強い外光の影響は機種・条件による) | 大きく受ける(逆光・暗所・急な明暗変化で破綻) |
| 苦手な環境 | 長い直線廊下・トンネル・広場など形状が単調な場所(縦方向の拘束が効かず滑る) | 白い壁・一様な床など模様の乏しい場所 |
| 天候 | 雨・霧・粉塵で点群が乱れる | 雨滴・レンズ汚れの影響を受ける |
| 取得できる情報 | 距離が直接得られるため絶対スケールが決まる | 単眼画像だけでは絶対スケールが不定。実寸が必要なら追加の尺度情報を使う |
| コスト・搭載性 | センサーが高価で重い傾向 | カメラは安価で軽い |
実務では、片方だけで完結させるより運動条件や採用する方式に応じてIMU(慣性計測装置)を併用するほうが効果が大きい場面が多くあります。IMUは短時間の姿勢変化を保持できるためです(ただしIMUは姿勢の補助であって、単調な廊下で進行方向の拘束が失われる問題が必ず解消するわけではありません)。方式ごとに扱いも違い、たとえばCartographerの公式資料では2次元でのIMU入力は任意、3次元では必須とされています。センサー単体の仕様比較より先に、自分の現場が「形状が単調か」「明るさが変わるか」のどちらに寄るかを決めるのが選定の出発点になります。LiDARセンサーそのものの測距方式や点群処理については LiDARとは?仕組み・ToF方式・点群処理を実装目線で解説する技術ガイド で詳しく扱っています。
2026年にROS 2で使えるSLAM実装の現況
日本語の解説記事では今もCartographerとORB-SLAM3が代表例として挙げられますが、実装を選ぶ立場では「今も更新されているか」が先に効きます。次の表は、2026年9月19日時点でGitHub APIから取得した公開情報を比較したものです。リリースや更新が続いていることは、対象のROS 2ディストリビューションでの動作確認を意味しません(たとえばORB-SLAM3本家が同梱するROS例はROS 1系のものです)。
| 実装 | 系統 | ライセンス | 最新リリース | 最終push |
|---|---|---|---|---|
| slam_toolbox(SteveMacenski/slam_toolbox) | 2次元Graph SLAM | LGPL-2.1 | 2.10.0(2026-07-21) | 2026-09-17 |
| RTAB-Map(introlab/rtabmap) | RGB-D / ステレオ / LiDAR対応のGraph SLAM | BSD 3-Clause形式 | 0.23.8(2026-07-05) | 2026-09-13 |
| Cartographer(cartographer-project/cartographer) | 2次元・3次元Graph SLAM | Apache-2.0 | 2.0.0(2021-03-11) | 2024-01-05(積極的な保守は停止) |
| cartographer_ros(本家 / ROS 2フォーク) | CartographerのROS連携 | Apache-2.0 | 1.0.0(2018-05-30) | 本家 2024-03-10 / ros2フォーク 2025-05-24 |
| ORB-SLAM3(UZ-SLAMLab/ORB_SLAM3) | 単眼 / ステレオ / RGB-D対応のVisual-Inertial SLAM | GPL-3.0 | v1.0-release(2021-12-22) | 2024-07-24 |
読み取れることは3点です。
- 更新が続いているのはslam_toolboxとRTAB-Mapの2本です。ROS 2で新規に組むなら、2次元の屋内移動ロボットはslam_toolbox、3次元やRGB-Dを含むならRTAB-Mapが現実的な第一候補になります。slam_toolboxはNav2(ros-navigation/navigation2、2026年9月16日に1.5.2をリリース)と組み合わせる構成が標準です。
- Cartographerは積極的な保守と新規開発の停止が公式に明記されています。READMEに「Cartographer is no longer actively maintained.」(Cartographerはもはや積極的に保守されていない)とあり、続けて「まれに重大なプルリクエストがマージされることはあるが、issueへの返答を含め新規開発は行われていない」と書かれています。ROS向けの配布はros2/cartographerとros2/cartographer_rosというフォークが担っていますが、READMEはこのフォークも「限定的な範囲でのみ保守されている」としています。フォーク側も、リポジトリの最終pushは2025年5月です。新規案件で選ぶ理由は乏しく、既存システムの保守以外では推奨できません。
- ライセンスは必ず確認してください。ORB-SLAM3はGPL-3.0です。GPLの適用対象となるプログラムを製品に組み込んで第三者に頒布する場合、対応するソースコードの提供などが必要になります。社内利用だけで一般公開が義務づけられるわけではありませんが、slam_toolboxのLGPL-2.1やRTAB-MapのBSD 3-Clause形式とは制約の性質が違うため、研究用の評価から製品化へ移る段階で問題になりやすい箇所です。
ROS 2そのものの構成やディストリビューションの選び方は ROS(Robot Operating System)とは?ノードとDDS通信の構造・ROS 2世代の選び方を実装者目線で解説 と ROS1とROS2の違いを徹底比較|2026年の移行判断とディストリ選び方 にまとめています。
SLAMの用途と分野別の利用条件
- 自律移動ロボット(AMR)・ロボット掃除機:未知の屋内環境で地図を作る場面でSLAMが使われます。一度作った地図を使い回す運用では、走行時は自己位置推定だけを行う構成もあります。掃除機の「LiDAR搭載モデル」と「カメラ式モデル」の違いは、そのまま前章のLiDAR SLAMとVisual SLAMの違いです。
- 自動運転:走行中にゼロから地図を作るというより、事前に作成した高精度地図に対して現在位置を合わせる用途が中心です。ただしその高精度地図を作る工程自体がSLAMです。
- ドローン:橋梁の裏側・屋内・地下などGPSが届かない場所での自律飛行に使われます。積載量の制約が厳しいため、軽量なカメラとIMUを組み合わせる構成が選ばれやすい領域です。
- ARグラス・XRデバイス:現実空間に仮想物体を固定して見せるには、デバイス自身の姿勢を常時推定し続ける必要があります。
- 測量・インフラ点検:手持ちや背負い型のスキャナで歩きながら3次元点群を取得する手法が普及しています。据え置き型の地上レーザースキャナと比べる際は、要求精度・対象範囲・歩行経路・位置合わせと後処理を含めた総作業時間を、機種の仕様で確認してください。
いずれの用途でも、処理を機体上で完結させるか外部に投げるかが設計判断になります。機体側で回す場合の計算資源については NVIDIA Jetsonとは?Orin・Thorの違いと選定基準・量産判断を実装視点で解説【2026年版】 が参考になります。
参考資料
- H. Durrant-Whyte, T. Bailey, Simultaneous Localisation and Mapping (SLAM): Part I The Essential Algorithms, IEEE Robotics and Automation Magazine 13(2), 2006
- C. Cadena et al., Past, Present, and Future of Simultaneous Localization And Mapping: Towards the Robust-Perception Age, IEEE Transactions on Robotics 32(6):1309-1332, 2016
- M. Montemerlo, S. Thrun, D. Koller, B. Wegbreit, FastSLAM: A Factored Solution to the Simultaneous Localization and Mapping Problem, AAAI 2002
- SteveMacenski/slam_toolbox(GitHub)
- introlab/rtabmap(GitHub)
- cartographer-project/cartographer(GitHub)
- UZ-SLAMLab/ORB_SLAM3(GitHub)
- ros-navigation/navigation2(GitHub)
よくある質問
SLAMとは自己位置推定のことですか?
自己位置推定はSLAMの出力の片方です。SLAMの定義には「地図を同時に構築すること」が含まれるため、既存の地図に対して位置を合わせるだけの処理(ローカライゼーション)はSLAMとは呼びません。自動運転で高精度地図に位置合わせする処理は後者にあたります。
SLAMの読み方は何ですか?
日本語では「スラム」と読まれます。ただし検索結果には市街地の貧困地区を指す「スラム」が混在するため、技術文脈で検索するときは「SLAM 自己位置推定」「SLAM ロボット」のように語を足すほうが確実です。
EKF-SLAMは今でも使われていますか?
教育や参照実装では今も使われます。実機に使えるかどうかは実装と処理条件次第で、本記事の実測では、ランドマーク800個のとき共分散更新だけで約92ミリ秒かかりました(教科書どおりの書き方では約209ミリ秒)。センサーが10ヘルツで回る前提なら、この規模では更新以外に使える時間がほとんど残りません。新規に組む場合の主流はGraph SLAMです。カルマンフィルタそのものの仕組みは カルマンフィルタとは?仕組みと使い方をわかりやすく解説【線形の基礎から応用まで】 で解説しています。
ループ閉じ込みとは何ですか?なぜ重要なのですか?
一度通った場所に戻ってきたことを検出し、「この2つの姿勢は同じ場所である」という拘束をグラフに追加する処理です。重要な理由は本記事の実測が示すとおりで、この拘束が無いとポーズグラフ最適化を回しても誤差がまったく減りませんでした(ATEは1.939メートルのまま変化なし)。拘束を1本足しただけで終端の位置ずれが4.683メートルから0.002メートルへ縮みます。
LiDARとカメラはどちらが高精度ですか?
環境によって逆転するため、一般論としての優劣はつきません。LiDARは暗所でも動きますが、長い直線廊下のように形状が単調な場所では進行方向の拘束が効かず滑ります。カメラは模様のある環境に強い一方、白い壁や逆光では特徴点が取れません。自分の現場がどちらの弱点に当たるかで選ぶのが実務的です。
SLAMは完成した技術ですか?
Durrant-WhyteとBaileyは2006年の時点で「理論的・概念的なレベルではSLAMは解かれた問題と考えてよい」としつつ、「より一般的なSLAMの実現、とくに知覚的に豊かな地図の構築と利用には実務上の課題が残る」と書いています。Cadenaらの2016年のサーベイも、長期運用での頑健性、動的に変化する環境への追従、意味情報を含む地図といった論点を未解決の課題として挙げています。