Google Cartographer でSLAMデータを保存する

##目的
Google CartographerのAssets writer マニュアルを翻訳しました。

原文：[googlecartographer assets_writer.rst](https://github.com/googlecartographer/cartographer_ros/blob/master/docs/source/assets_writer.rst)
Github:[cartographer_ros](https://github.com/googlecartographer/cartographer_ros)

Google Cartographerでは、SLAMのmapデータ・statusデータをAssets writerで保存します。
Assets writerで保存したデータは、Cartographerでまた呼び出して、状態を復元することができます。

###Assets writer
SLAMの目的は、1つのセンサの軌跡を距離空間で計算することです。
より高いレベルでは、SLAMの入力はセンサデータであり、その出力はその時点までの軌道の最尤推定値となります。
リアルタイムで効率的なものにするために、Cartographerはセンサデータの大部分をすぐに送り出します。
軌道だけに興味があることは稀ですが、一度最尤の軌道が確立されると、全てのセンサデータを使用して、その周囲の情報を導き可視化することができます。Cartographerはこの目的で、assets writerを提供します。

以下のものを入力することができます。
　1.ROS bagファイルの中で、SLAMに送り込まれる、元のセンサデータ
　2.cartographerの状態、SLAMが生成する.pbstreamの中に含まれている。
　3.センサー以外(i.e. rosbagからのTFデータやURDFファイル),
　4.パイプラインの設定、.luaファイルで定義されているもの

Assets writerは、センサデータを通して、既知の軌跡をまとめます。
SLAMの点群データの色付け、フィルタリング、およびエクスポートにさまざまな形式で使用できます。
アセットライターの使用方法の詳細については、下記の例と[cartographer/io](https://github.com/googlecartographer/cartographer/tree/30f7de1a325d6604c780f2f74d9a345ec369d12d/cartographer/io)のヘッダーファイルを参照してください。

###Sample usage

```
# Download the 3D backpack example bag.
wget -P ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/backpack_3d/b3-2016-04-05-14-14-00.bag

# Launch the 3D offline demo.
roslaunch cartographer_ros offline_backpack_3d.launch bag_filenames:=${HOME}/Downloads/b3-2016-04-05-14-14-00.bag
```

オフラインノードが終了するまで、コマンドラインで出力を監視します。
すべてのデータを処理してすべての最適化を完了した後、Cartographerの状態を表す"b3-2016-04-05-14-14-00.bag.pbstream"が書き込まれます。オンラインノードを実行して呼び出しても、同じ状態データを取得できます。

```
# Finish the first trajectory. No further data will be accepted on it.
rosservice call /finish_trajectory 0

# Ask Cartographer to serialize its current state.
rosservice call /write_state ${HOME}/Downloads/b3-2016-04-05-14-14-00.bag.pbstream
```

3Dバックパックの[サンプル設定ファイル](https://github.com/googlecartographer/cartographer_ros/blob/44459e18102305745c56f92549b87d8e91f434fe/cartographer_ros/configuration_files/assets_writer_backpack_3d.lua)を使用してAssets writerを実行します。

```
roslaunch cartographer_ros assets_writer_backpack_3d.launch \
   bag_filenames:=${HOME}/Downloads/b3-2016-04-05-14-14-00.bag \
   pose_graph_filename:=${HOME}/Downloads/b3-2016-04-05-14-14-00.bag.pbstream
```

執筆時点では、~/.rosに生成されます。


###Configuration

assets writerは、パイプラインとしてモデル化されています。
これは、[PointProcessors](https://github.com/googlecartographer/cartographer/blob/30f7de1a325d6604c780f2f74d9a345ec369d12d/cartographer/io/points_processor.h)と[PointsBatchs](https://github.com/googlecartographer/cartographer/blob/30f7de1a325d6604c780f2f74d9a345ec369d12d/cartographer/io/points_batch.h)で構成されています。
データは最初のプロセッサから次のプロセッサに流れ、各プロセッサには通過する前にPointsBatchを修正する機会があります。

例えば、[assets_writer_backpack_3d.lua](https://github.com/googlecartographer/cartographer_ros/blob/44459e18102305745c56f92549b87d8e91f434fe/cartographer_ros/configuration_files/assets_writer_backpack_3d.lua)は、min_max_range_filterを使用して、センサから離れすぎている、もしくは離れすぎている点を削除します。その後、X-Raysを書き込み、センサフレームIDに応じてPointsBatchの色を付け直し、X-Raysのセットごとに新しい色を使って書き込みます。
個々のPointsProcessorsはすべて[cartographer/io](https://github.com/googlecartographer/cartographer/tree/30f7de1a325d6604c780f2f74d9a345ec369d12d/cartographer/io)サブディレクトリにあり、個々のヘッダーファイルにドキュメント化されています。


###First-person visualization of point clouds

視点を動かして、点群見るためには2ステップの方法があります
まず最初に、可視化したい点を含むPLYファイルを作成し、可視化には[point_cloud_viewer](https://github.com/googlecartographer/point_cloud_viewer)を使用します。

最初のステップは通常、[IntensityToColorPointsProcessor](https://github.com/googlecartographer/cartographer/blob/30f7de1a325d6604c780f2f74d9a345ec369d12d/cartographer/io/intensity_to_color_points_processor.cc)を使用して点に白以外の色を与え、次にそれらを[PlyWritingPointsProcessor](https://github.com/googlecartographer/cartographer/blob/30f7de1a325d6604c780f2f74d9a345ec369d12d/cartographer/io/ply_writing_points_processor.h)を使用してPLYに書き込むことによって成し遂げます。

例として、[assets_writer_backpack_2d.lua](https://github.com/googlecartographer/cartographer_ros/blob/44459e18102305745c56f92549b87d8e91f434fe/cartographer_ros/configuration_files/assets_writer_backpack_2d.lua)があります。

PLYを取得したら、[point_cloud_viewer](https://github.com/googlecartographer/point_cloud_viewer)のREADMEに従ってディスク上のoctreeデータ構造を生成します。
その構造は、同じリポジトリ内のビューアの1つが表示することができます。