デュアルブートしたubuntu 18.04にiai_kinect2をインストール

##前提知識
###ROS
ロボットを動かす上で便利なライブラリ。ざっくりとした利点は以下のとおり。
具体的な話は参考書とか公式サイトを参照してください。

- ロボットをシミュレーションするアプリケーション等を利用できる
- 異なる言語のファイル同士を通信システムによって同時に扱える

###libfreenect2
KinectV2を動かす上で必要なライブラリ。
画像処理の流れとしては、libfreenectのクラスを用いてKinectから画像を取得→OpenCVなどで画像処理、みたいな感じ。

###iai_kinect2
ROS上でlibfreenectを動かすもの。
KinectV2をロボットに実装する場合、あると便利。pythonファイル等も扱えるようになる。

#インストール
###実行環境
デュアルブートしたubuntu 18.04で行った。
lscpuコマンドで表示されるcpuに関する情報は以下の通り。

```
$ lscpu
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              4
On-line CPU(s) list: 0-3
Thread(s) per core:  2
Core(s) per socket:  2
Socket(s):           1
NUMA node(s):        1
Vendor ID:           GenuineIntel
CPU family:          6
Model:               158
Model name:          Intel(R) Core(TM) i3-7100 CPU @ 3.90GHz
Stepping:            9
CPU MHz:             1100.009
CPU max MHz:         3900.0000
CPU min MHz:         800.0000
BogoMIPS:            7824.00
Virtualization:      VT-x
L1d cache:           32K
L1i cache:           32K
L2 cache:            256K
L3 cache:            3072K
NUMA node0 CPU(s):   0-3
//以下省略
```
##nvidia driverのインストール
最初にこれをやっておくと後々エラー処理しなくて済む。(経験談でしかないが…)
PCのGUI自体のドライバらしい。
Kinectを動かしてフリーズすることがある場合は、このドライバを正しくインストールし直すと正常に動くようになる。
[こちら](https://www.server-world.info/query?os=Ubuntu_18.04&p=nvidia)を参考にしてインストールした。
かなり根幹に関わる部分なので何が起こっても自己責任でお願いします。

まず、`sudo vi /etc/modprobe.d/blacklist-nouveau.conf`でエディタを開き、以下を最終行に記述。
(ない場合は新規作成)

```vim:/etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0 
```

設定を更新して再起動。

```
$ sudo update-initramfs -u
$ reboot
```

再起動が終わるとGUIが変になる。
これはデフォルトで入っているnouveauドライバーを一時的に無効にしたため。

次に、上記の参考サイトの中で、

>事前に NVIDIAサイトより、コンピューターに搭載されているグラフィックカード用のドライバーに対応するドライバーバージョンを確認しておきます。
⇒ https://www.nvidia.com/Download/index.aspx?lang=en 

とあるので自分のグラフィックボードにあったドライバのバージョンを探す。
グラフィックボード自体の確認は、`lspci | grep VGA`で行える。
自分は以下をインストール。

```
$ sudo apt -y install nvidia-driver-390 
```

また、自分の場合はsecure bootに関する権限がないとかで上記コマンド実行中に止まったので、エラーメッセージに言われるがまま以下を実行。

```
$ sudo dpkg --configure -a
```

その後、再起動したら元のGUIに戻りました。これで完了。

##libfreenect2
###インストール
基本的にこういうのは公式ページを参考にすれば良いが、[こちら](https://demura.net/%E6%9C%AA%E5%88%86%E9%A1%9E/13560.html)のブログがiai_kinectのインストールまで書いていて分かりやすい。
自分が行ったことをまとめる。

```
$ cd
$ sudo apt-get install build-essential cmake pkg-config libusb-1.0-0-dev libturbojpeg libjpeg-turbo8-dev libglfw3-dev
$ git clone https://github.com/OpenKinect/libfreenect2.git
$ cd libfreenect2
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/freenect2
$ cmake .. -Dfreenect2_DIR=$HOME/freenect2/lib/cmake/freenect2
$ make -j8
$ sudo make install
$ sudo cp ../platform/linux/udev/90-kinect2.rules /etc/udev/rules.d/
```

###実行テスト
実行テストは以下のコマンドで行える。
ubuntu18.04ではsudoを付けないとうまくusbポートを読み込めないらしい。
実行結果も添付する。

```
$ cd
$ sudo ./libfreenect2/build/bin/Protonect
```
![Screenshot from 2019-06-24 19-51-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208979/b4f4cd17-c42a-dc59-1452-c1518a7062ef.png)

##iai_kinect2
###ROSのインストール
ROSが入っている人は飛ばしてください。
自分はデュアルブートをしてまっさらな状態だったのでROSのmelodicをインストールした。
詳しい解説等は[公式サイト](http://wiki.ros.org/melodic/Installation/Ubuntu)を参照してください。

```
$ 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://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
$ sudo apt update
$ sudo apt install ros-melodic-desktop-full
$ sudo rosdep init
$ rosdep update
```

setup.bashのパスだけ、公式サイトに則らず、よく他のチュートリアルが参照しているところに設定。

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

### iai_kinect2のインストール
これも[先程のサイト](https://demura.net/%E6%9C%AA%E5%88%86%E9%A1%9E/13560.html)を参考にさせて頂いた。
rosdepのとこで一箇所スペルミスがあったのでそっちを見ながらやる人は注意してください。

```
$ mkdir ~/catkin_ws
$ mkdir ~/catkin_ws/src
$ cd ~/catkin_ws/src/
$ git clone https://github.com/code-iai/iai_kinect2.git
$ cd iai_kinect2
$ rosdep install -r --from-paths .
```

最後のrosdepでは以下のようなエラーっぽいものが出ます。

```
ERROR: the following packages/stacks could not have their rosdep keys resolved
to system dependencies:
kinect2_viewer: Cannot locate rosdep definition for [kinect2_bridge]
iai_kinect2: Cannot locate rosdep definition for [kinect2_registration]
kinect2_calibration: Cannot locate rosdep definition for [kinect2_bridge]
kinect2_bridge: Cannot locate rosdep definition for [kinect2_registration]
Continuing to install resolvable dependencies...
#All required rosdeps installed successfully
```

ただ、[公式](https://github.com/code-iai/iai_kinect2)に以下のように書いてあるとおり無視して大丈夫。
>*Note: rosdep will output errors on not being able to locate [kinect2_bridge] and [depth_registration]. That is fine because they are all part of the iai_kinect2 package and rosdep does not know these packages.*

最後にrosのmakeコマンド、`catkin_make`を実行で無事終了。

```
$ cd ~/catkin_ws
$ catkin_make -DCMAKE_BUILD_TYPE=”Release” -Dfreenect2_DIR=~/freenect2/lib/cmake/freenect2
```

###実行テスト
ターミナルを3つ立ち上げて、それぞれ以下のように実行。
(ROS使うなら、「Ctrl」＋「Shift」＋「T」で新しいタブにターミナルを立ち上げるショートカットは覚えておくといいかも。)

```sh:ターミナル1
$ roscore
```

```sh:ターミナル2
$ roslaunch kinect2_bridge kinect2_bridge.launch
```

```sh:ターミナル3
$ rosrun kinect2_viewer kinect2_viewer kinect2 sd cloud
```

![Screenshot from 2019-06-24 20-22-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208979/6f14bfeb-9d16-bf4d-95f7-a8e89738c15c.png)

カオナシ怖いですね笑

##参考サイト

- [NVIDIAドライバーをインストールする](https://www.server-world.info/query?os=Ubuntu_18.04&p=nvidia)
- [Ubuntu16.04: Kinect V2の設定(demura.net)](https://demura.net/%E6%9C%AA%E5%88%86%E9%A1%9E/13560.html)
- [libfreenect(github)](https://github.com/OpenKinect/libfreenect)
- [Ubuntu install of ROS Melodic(ROS.org)](http://wiki.ros.org/melodic/Installation/Ubuntu)
- [iai_kinect2(github)](https://github.com/code-iai/iai_kinect2)