EurekaMoments

ロボットや自動車の自律移動に関する知識や技術、プログラミング、ソフトウェア開発について勉強したことをメモするブログ

書籍「SLAM入門」の読書録~継承を利用したフレームワーク~

SLAM入門: ロボットの自己位置推定と地図構築の技術

SLAM入門: ロボットの自己位置推定と地図構築の技術

  • 作者:友納 正裕
  • 発売日: 2018/03/03
  • メディア: 単行本(ソフトカバー)

f:id:sy4310:20200629223934p:plain

目次

目的

  • C++における継承と仮想関数の基本について理解する。
  • 継承と仮想関数を利用したオブジェクト指向フレームワークについて理解する。

オブジェクト指向フレームワークの採用

クラスの継承と仮想関数を利用する事で、同じ関数でも内部のアルゴリズムを目的や条件に応じて切り替えられるようにしている。

仮想関数の基礎

  • 継承の元になるクラスを基底クラス、それを継承する事で生まれるクラスを派生クラスという。
  • カスタマイズしたい仮想関数は、基底クラスの中でvirtualというキーワードを付けて宣言する。(virtual void hoge()みたいに)
  • 仮想関数を派生クラスの中で再定義する事でカスタマイズが出来る。これをオーバーライドという。

抽象クラスと具象クラス

  • 継承について調べると、抽象クラスと具象クラスという呼び方の方が一般的な感じがする。
  • 継承関係にあるクラスの間では、「犬 is a 動物」のような親子関係が成り立つ。
  • ここでは動物クラスが抽象クラス、犬クラスが具象クラスであり、抽象/具象とは両者の関係性を表す呼び方と解釈できる。
  • それに対して基底/派生クラスは、単純なクラスとしての種類を表す呼び方であり、抽象クラスは基底クラス、みたいな言い方をされる。

フレームワークを用いるクラス

「SLAM入門」のサンプルプログラムでは、下記のクラスでフレームワークを採用している。

RefScanMakerクラス

  • スキャンマッチングでスキャン点の対応付けをする際の参照スキャン点(現在時刻のスキャン点と合わせる過去のスキャン点)を生成するクラス。
  • 直前の1スキャン分のデータのみを参照する(RefScanMakerBS)か、それまでに構築してきた地図データを参照する(RefScanMakerLM)かをカスタマイズできる。

f:id:sy4310:20200702224929p:plain

CostFunctionクラス

  • スキャンマッチングでスキャン点を対応付けする際のコスト関数を定義するクラス。
  • 点間の誤差をユークリッド距離とする(CostFunctionED)か、垂直距離とする(CostFunctionPD)とするかをカスタマイズできる。

f:id:sy4310:20200702230147p:plain

PoseOptimizerクラス

  • コスト関数を最小化する処理を定義するクラス。
  • 最小化する際の手法を最急降下法とする(PoseOptimizerSD)か、最急降下法 + 直線探索とする(PoseOptimizerSL)かをカスタマイズできる。

f:id:sy4310:20200702231421p:plain

DataAssociatorクラス

  • RefScanMakerクラスで生成した参照スキャン点の中から、現在スキャン点と最も近い点を見つけるクラス。
  • 単純な線形探索で最近傍点を見つける(DataAssociatorLS)か、格子テーブルを用いて見つける(DataAssociatorGT)かをカスタマイズできる。

f:id:sy4310:20200703222255p:plain

PointCloudMapクラス

  • スキャンした点群を地図データとして格納し管理するクラス。
  • 全スキャン点を格納していく(PointCloudMapBS)か、格子テーブルの構造にして格納していく(PointCloudMapGT)か、部分地図に分割して格納する(PointCloudMapLP)かをカスタマイズできる。

f:id:sy4310:20200703225930p:plain

LoopDetectorクラス

  • ループ検出を行うクラス。
  • 確実にループを検出するために部分地図を用いる(LoopDetectorSS)ようにカスタマイズできる。

参考資料

qiita.com

www.s-cradle.com

GitHub

記載されている各UMLのダイアグラムは、全て下記のGitHubにて公開済み。

github.com