ROSのLidarSLAMまとめ

##目的
LidarからのTopic:[sensor_msgs/LaserScan](http://docs.ros.org/api/sensor_msgs/html/msg/LaserScan.html)に対応している車輪ロボット向けのROSの2D/3D-SLAMパッケージをまとめた。Lidar単体では、原理上3DOF(X方向・Y方向・θ方向)姿勢までしか検出できないが、パッケージによっては、Lidar＋IMU or Lidar＋回転雲台を使って、6DOF(X方向・Y方向・θ方向)姿勢を検出できるものもある。
これ以外にもROSにはSLAMパッケージがあるが、個人的に使ったことあるものを記載。

##一覧
| 名前                 | 作者             | アルゴリズム   | loop closure |DOF(検出姿勢の自由度)|補足    |
|----------------------|----------------------|------------------------|----------------------|----------------------|----------------------|
| [Gmapping](http://qiita.com/nnn112358/private/814c0fb0d2075eb71da0#gmapping)  | フライブルク大学, サピエンツァ大学,チューリッヒ工科大学| Rao-Blackwell定理を用いた Particle Filter                |有|3DOF(Odom+Lidar)| 最もメジャー|
| [Hector SLAM](http://qiita.com/nnn112358/private/814c0fb0d2075eb71da0#hector-slam)| ダルムシュタット工科大学|Scan-Matching +拡張カルマンフィルタ|無|3DOF(Lidar) 6DOF(IMU+Lidar) |RoboCup 2011向けに開発・odometoryフリー動作可|
| [Karto SLAM](http://qiita.com/nnn112358/private/814c0fb0d2075eb71da0#karto-slam)  | SRI International  | Graph-based SLAM  |有| 3DOF(Odom+Lidar)| |
| [Google Cartographer](http://qiita.com/nnn112358/private/814c0fb0d2075eb71da0#google-cartographer)   | Google | Graph-based SLAM  |有| 3DOF(Lidar) 6DOF(IMU+Lidar)|odometoryフリー動作可・現時点OpenSourceの2D-SLAMではロバスト性最も良い？(2017/5)|
| [Ethzasl icp mapping](http://qiita.com/nnn112358/private/814c0fb0d2075eb71da0#ethzasl-icp-mapping)   | チューリッヒ工科大学 | ICP-based SLAM |無 | 3DOF(Lidar) 6DOF(RDB-D Camera/3D-Lidar)|



上記のモジュールはROS上の互換性であり、
map→odom→base_footprint→base_link→base_scanのtfを発行していれば、
下記のlaunchファイルを使って呼び出すことで、map topicを発行することができる。

##動作確認環境
Ubuntu16.04 (x64)
ROS Kinetic


-----------------
###・Gmapping
[Improved Techniques for Grid Mapping with Rao-Blackwellized Particle Filters](http://www2.informatik.uni-freiburg.de/~stachnis/pdf/grisetti07tro.pdf
)
http://www.openslam.org/gmapping

ROSWiki: http://wiki.ros.org/gmapping
Github:  https://github.com/ros-perception/slam_gmapping

Install:

```
$ sudo apt-get install ros-kinetic-gmapping 
```


Launch:

```
<?xml version="1.0"?>
<launch>
  <node pkg="gmapping" type="slam_gmapping" name="kobuki_slam_gmapping" output="screen">
    <remap from="scan" to="scan"/>
    <param name="base_frame" value="base_footprint"/>
    <param name="odom_frame" value="odom"/>
    </node>
</launch>
```

-----------------

###・Hector SLAM
[A Flexible and Scalable SLAM System with Full 3D Motion Estimation](http://www.gkmm.informatik.tu-darmstadt.de/publications/files/slam2011.pdf)

ROSWiki: http://wiki.ros.org/hector_slam
Github:  https://github.com/tu-darmstadt-ros-pkg/hector_slam

Install:

```
$ sudo apt-get install ros-indigo-hector-*
```

Launch:

```
<?xml version="1.0"?>

<launch>
  <param name="pub_map_odom_transform" value="true"/> 
  <param name="map_frame" value="map"/> 
  <param name="base_frame" value="base_frame"/> 
  <param name="odom_frame" value="odom"/>

  <node pkg="tf" type="static_transform_publisher" name="map_2_odom" args="0 0 0 0 0 0 /map /odom 100"/>
  <node pkg="tf" type="static_transform_publisher" name="base_link_2_base_stabilized_link" args="0 0 0 0 0 0 /base_link /_base_stabilized 100"/> 
  <node pkg="tf" type="static_transform_publisher" name="base_stablized_2_base_frame" args="0 0 0 0 0 0 /_base_stabilized /base_frame 100"/> 
  <node pkg="tf" type="static_transform_publisher" name="base_2_nav_link" args="0 0 0 0 0 0 /base_frame /nav 100"/>

  <include file="$(find hector_slam_example)/launch/default_mapping.launch"/> 
  <include file="$(find hector_geotiff)/launch/geotiff_mapper.launch"/>

</launch>
```

-----------------

###・Karto SLAM

kartorobotics:  https://www.kartorobotics.com/
ROSwiki:  http://wiki.ros.org/karto
Github:  https://github.com/ros-perception/open_karto

Install:

```
$ sudo apt-get install ros-indigo-open-karto 
$ sudo apt-get install ros-indigo-slam-karto 

```

Launch:

```
<?xml version="1.0"?>
<launch>
  <node pkg="slam_karto" type="slam_karto" name="slam_karto" output="screen">
    <remap from="scan" to="scan"/>
</launch>
```

-----------------

###・Google Cartographer
[Real-Time Loop Closure in 2D LIDAR SLAM](https://static.googleusercontent.com/media/research.google.com/ja//pubs/archive/45466.pdf)

https://google-cartographer.readthedocs.io/en/latest/
Github:  https://github.com/googlecartographer/cartographer

Install:
>[Google Cartographer+Gazeboで地図をつくる
](http://qiita.com/nnn112358/items/c2291650271243eb2f91)

-----------------


###・Ethzasl icp mapping
チューリッヒ工科大が公開している、ROSのICPのSLAMモジュール。
RGB-Dカメラ・3D-Lidarからの3Dのポイントクラウド入力を前提としているが、Lidarでも動作可能。
やや古く、最新のROS環境でコンパイル通すには手間がかかる。

[WillowGarage Blog: Real-Time Modular 3D Mapping](http://www.willowgarage.com/blog/2013/01/29/real-time-modular-3d-mapping?page=4)
[ethz-asl/ethzasl_icp_mapping Github](https://github.com/ethz-asl/ethzasl_icp_mapping)
[ROS WIKI ethzasl_icp_mapping](http://wiki.ros.org/ethzasl_icp_mapping)

Install:
>[ROSでETH Zurichの3D-SLAMを動かしてみた。](http://qiita.com/nnn112358/items/a4baab45f06279f130f5
)


-----------------

参考資料：
[RPLidar For ROS Based SLAM and Navigation/SLAMTEC](http://www.robotics.sei.ecnu.edu.cn/ros2016/docs/RPLidar%20For%20ROS%20Based%20SLAM%20and%20Navigation_slamtec_KintZhao.pdf)
[An Evaluation of 2D SLAM Techniques Available in Robot Operating System](https://pdfs.semanticscholar.org/6b9c/afcf9aef5b4c0c338c44a581236d54caddbd.pdf)
[An Evaluation of 2D SLAM Techniques Available in Robot Operating System (ROS)](http://home.isr.uc.pt/~davidbsp/publications/Poster_SSRR2013.pdf)