【Ubuntu16.04】ROS:KineticでLSD-SLAMを実装させる

#<b>目標
<b>ROS:Kineticをインストールして、LSD-SLAMをビルドする。<b>

これをやりたくてめちゃくちゃ試行錯誤しました（大変だった...）。なかなかKineticでビルド成功したことについて、日本語でまとめられているサイトがなかったので自分でメモ的にまとめました。私のように苦しんでいる人の助けになれば嬉しいです。拙いところがあると思いますがご容赦ください。

手っ取り早く知りたい方は、[LSD-SLAMのビルド手順](https://qiita.com/yuna-s/items/e4383766b160e5f7f743#lsd-slam%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89%E6%89%8B%E9%A0%86)まで飛ばして読んでください。
英語が得意な人は[参考にしたサイト](https://github.com/kevin-george/lsd_slam/wiki/LSD-SLAM-with-ROS-and-Ubuntu-16.04)まで飛んでくと早いです。

#<b>環境
OS　　 　 　Ubuntu16.04LTS　64bit 日本語版
メモリ　　 　16GB
プロセッサ 　Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz
グラフィック　msi GeForce GTX 1060 6GB (製品型番: GeForce® GTX AERO ITX 6G OC)
<b>重要：　OpenCVがインストールされていない

#<b>注意！！
LSD-SLAMを動かすのにOpenCVが必要みたいな記事を見て、前もってインストールを行わないでください。
あとで地獄のようなエラーに陥ります。もし、参考にしたい場合は下の方に載せたので見てみてください。
OpenCVがもう入ってしまっている方は、
・アンインストール
・OpenCVが干渉しないような仮想空間でビルド
するか、もしくはOpenCVが入っている環境でもうまく動くやり方を探してください（もし知っている人がいれば教えてください）。
私は、手っ取り早く済ませたかったので<b>Ubuntu16.04をクリーンインストール</b>しました。

#<b>LSD-SLAMのビルド手順
###1. ROS:kineticのインストール
以下サイトの手順どおりにインストールを行ってください。
http://wiki.ros.org/kinetic/Installation/Ubuntu

英語が苦手だったり、サイトに飛ぶのが面倒な人は以下を一行づつ入力していってください。

```ROS-kineticインストール手順
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
sudo apt-get update
sudo apt-get install ros-kinetic-desktop-full
sudo rosdep init
rosdep update
echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
source /opt/ros/kinetic/setup.bash
sudo apt-get install python-rosinstall python-rosinstall-generator python-wstool build-essential
```

これでROSはインストールできました。

###2. LSD-SLAMをビルド
必要な依存環境などをインストールします。

```
sudo apt install libsuitesparse-dev libqglviewer-dev-qt4 ros-kinetic-libg2o
sudo ln -s /usr/lib/x86_64-linux-gnu/libQGLViewer-qt4.so /usr/lib/x86_64-linux-gnu/libQGLViewer.so
```


[公式で配っているLSD-SLAM](https://github.com/tum-vision/lsd_slam)だとビルドできないので、
以下のようにして[こちらのサイト](https://github.com/kevin-george/lsd_slam)から、Ubuntu16.04用にコードが書き換えられたものをクローンします。

```
mkdir -p ros_workspace/src
cd ros_workspace
git clone https://github.com/kevin-george/lsd_slam.git src/lsd_slam  
catkin_make
```

これでビルド成功するはずです。


PythonがAnacondaの方は、lpthreadsがないだとか、Python Moduleの"em"がないと怒られたりするらしいですが

```
pip install catkin_pkg
pip install rospkg
pip install empy
```

で解決するみたいです。間違っても、empyではなくemをインストールしないでください。
###3. セットアップ
これではまだパスが通ってないので、バッシュの中に書き込みます。

```
echo "source ~/ros_workspace/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
```

###4. ためしに動かしてみる

```~/ros_workspace
rosrun lsd_slam_viewer viewer
```

としてうまく動けばオッケーです。

#参考
##LSD-SLAMのビルドで起きるエラー
私はROSの対象となる（LSD-SLAMをクローンした）ディレクトリでcatkin_makeや、rosmakeした時、だいたいこんな感じのエラーが起きました。

```~/rosbuild_ws
.....

collect2: error: ld returned 1 exit status
make[3]: *** [../bin/videoStitch] Error 1
make[3]: Leaving directory /home/userx/rosbuild_ws/package_dir/lsd_slam/lsd_slam_viewer/build' make[2]: *** [CMakeFiles/videoStitch.dir/all] Error 2 make[2]: Leaving directory/home/userx/rosbuild_ws/package_dir/lsd_slam/lsd_slam_viewer/build'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/home/yudi/rosbuild_ws/package_dir/lsd_slam/lsd_slam_viewer/build'

```

とか

```~/rosbuild_ws
.....

 /opt/ros/kinetic/share/mk/cmake.mk:7: ターゲット ‘all’ のレシピで失敗しました

```

のような感じです。これらは、どうもOpenCV関連で起こるエラーみたいで、CMakeFiles.txtやCMakeLists.txtにいろいろ書き込んでみたりしましたが直りませんでした。

##ROSを入れなおした時のエラー

[ここ](https://github.com/ros-infrastructure/rosdep/issues/48)を参考にして解決しました。
ROSアンインストールして、その後再インストール時に、

```
$sudo rosdep init
  ERROR: default sources list file already exists:
    /etc/ros/rosdep/sources.list.d/20-default.list
    Please delete if you wish to re-initialize
```

のようなエラーが出ますが、`sudo rm -rf /etc/ros/rosdep/sources.list.d/*`と入力すれば、うまく行きました。

##オマケ：　自分がトライしてみたが結果的に直らなかったサイト
自分はできなかったですが、誰かの参考になれば嬉しいです。

・github系
https://github.com/tum-vision/lsd_slam/issues
(LSD-SLAMをビルドする際などで出てきたエラーに対しての解決方法であったりいろいろな考察)

・個人ブログ系
https://medium.com/@j.zijlmans/lsd-slam-bc80ae01a1bb
(一応、Ubuntu16.04で動くようにコードを書き換えてくれたらしいが私はエラーが出た)
http://mohsaad.com/2017/07/17/Installing-ROS-With-OpenCV/　
(違うversionのOpenCVならビルドできるかも？と思った)