Python

C++は大半のSLAMシステムのリアルタイムコアを動かすが、Pythonはそのコアの周囲にある全てのものの言語である。典型的なSLAMのワークフローでは、Pythonを3つの用途で使用する。

多くの中核的なSLAMライブラリはPythonバインディングを公開しているため、C++に触れずに完全なパイプラインをプロトタイピングできる。

ライブラリPythonエントリーポイント
OpenCVopencv-python (cv2)
GTSAM公式Pythonラッパー
g2oコミュニティによるバインディング(例: g2opy)
Open3DネイティブPython API(点群、ICP、TSDF)

一般的かつ生産的なパターンはPythonでプロトタイピングし、C++に移植することである。データセットに対してcv2とNumPyでアルゴリズムを検証し、設計が固まったらホットループをC++/Eigenに再実装する。Pythonにとどまる必要がある研究コードについては、pybind11によってパフォーマンスが重要なC++部分をラップしつつ、実験ロジックはPythonに残すことができる — 両方の利点を得られる。

早期に身につけておくべき実践的な習慣: プロジェクトごとに仮想環境(venv/conda/uv)を使用すること、再現性のために依存関係のバージョンを固定すること、そしてNumPyは行優先の規約を使い、OpenCVの画像は[row, col] = [y, x]でインデックスされることを覚えておくこと — これは座標の転置に関する典型的なバグの原因である。

PythonにおけるSLAMツールの一例

ツールボックスに持っておくべき最も有用な1つのスクリプトは軌跡評価である。閉形式の最小二乗剛体アラインメント(Umeyamaの方法、SVD経由)で推定値をグラウンドトゥルースに整合させ、ATE RMSEを計算するのは、NumPyでたった十数行で書ける。

import numpy as np

def align_and_ate(P_est, P_gt):          # both Nx3
    mu_e, mu_g = P_est.mean(0), P_gt.mean(0)
    U, S, Vt = np.linalg.svd((P_gt - mu_g).T @ (P_est - mu_e))
    D = np.diag([1, 1, np.sign(np.linalg.det(U @ Vt))])
    R = U @ D @ Vt                        # rotation aligning est -> gt
    t = mu_g - R @ mu_e
    err = P_gt - (P_est @ R.T + t)        # residuals after alignment
    return np.sqrt((err ** 2).sum(1).mean())   # ATE RMSE

これは基本的に、広く使われているevoパッケージ(pip install evo)が行っていることと同じである — 実際には、TUM/KITTI/EuRoCフォーマット、プロット、RPEにはevoを使うが、上記の数学を知っておくことで、その出力がブラックボックスにならなくなる。

Pythonを十分に高速にする

Pythonの遅さは、ほぼ全てループの問題である。以下は経験則である。

よくある落とし穴

SLAMにおける意義

現代のSLAM研究は幾何学と学習の交差点に位置しており、学習の側はPythonを言語としている。古典的なシステムであっても、評価・可視化・データセットツールのエコシステムはPythonベースである。それに習熟することで、実験を実行し、C++システムが実際に何をしているかを理解する速度が大幅に向上する。

ハンズオン

関連ノート