RealSense D400シリーズとROSを使った三次元顔検出

#TL;DR
- RealSense SDKでの顔検出とかの提供をインテルがやめてしまった[1]。
- しかし、インテルが提供しているROSラッパーを使えば、ラッパー経由で何個かROSの顔検出パッケージが使えるっぽい。
- そこで、今回はROSラッパーを使った顔検出ROSパッケージの使い方を説明する。

# はじめに
本記事は先日書いた[3D Face Detection with RealSense D400 series and ROS](https://qiita.com/alfredplpl/items/3ed0d9a40d277a19cf7a)を和訳しただけのものになります。
ただ、その記事を書いていた頃から状況が変わったため、インストール手順が若干楽になるように修正しました。

# 必要なもの
- インテル製CPU (x86) とUSB 3.0以上が載っているパソコン
- パソコンのOSは、Ubuntu 16.04 (LTS)。 （VMは非推奨）
- RealSense D415 か D435

# インストール方法
1. 以下のROSのホームページを読みつつ、ROS Kinetic (LTS)をダウンロードする。個人的にはdesktop-fullがおすすめ。
     - http://wiki.ros.org/kinetic/Installation/Ubuntu

1. 以下のインテルのgithubを読みつつ、aptでRealSense SDK（バージョン2.8.1）をインストールする。
    - https://github.com/IntelRealSense/librealsense/blob/master/doc/distribution_linux.md
    - なお、バージョンを指定してインストールする場合はlibrealsense2をインストールする直前に下記のコマンドを入力する

```
sudo apt install librealsense2-udev-rules=2.8.1-0~realsense0.41
sudo apt install librealsense2-dkms=1.3.1-0ubuntu3
sudo apt install librealsense2=2.8.1-0~realsense0.41
sudo apt install librealsense2-utils=2.8.1-0~realsense0.41
sudo apt install librealsense2-dev=2.8.1-0~realsense0.41
sudo apt install librealsense2-dbg=2.8.1-0~realsense0.41
```
   
1. 以下のインテルのgithubを読みつつ、ROS Wrapper 2.0 for Intel RealSense Devices (build 2.0.1)をダウンロードする。
     - https://github.com/intel-ros/realsense/releases/tag/2.0.1

1. 以下のインテルのgithubを読みつつ、ROS Wrapperをインストールする。
     - https://github.com/intel-ros/realsense/tree/2.0.1

1. ロボット界のパロアルト研究所と呼ばれるらしいWillow Garageが作った顔検出のROSパッケージをダウンロードする。
     - https://github.com/wg-perception/people/releases/tag/1.0.11

1. 以下のコマンドをbashに打ち込むことでROSパッケージをインストールする。

```bash
cd ~/Downloads
unzip people-1.0.11
cp -r people-1.0.11 ~/catkin_ws/src/
cd ~/catkin_ws/

#Navigation package was required by people package.
sudo apt-get install ros-kinetic-navigation

catkin_make
```

# 使い方

- RealSenseカメラノードを立ち上げるために、端末を開いて以下のコマンドを打つ。

```bash
roslaunch realsense_ros_camera rs_camera.launch
```
- 顔検出ノードを立ち上げるために、別の端末を開いて以下のコマンドを打つ。

```bash
roslaunch face_detector face_detector.rgbd.launch \
 rgb_ns:=color image_topic:=image_raw \
 depth_ns:=depth depth_topic:=image_raw
```
- ロボット用可視化ツールrvizを立ち上げるために、さらに別の端末を開いて以下のコマンドを打つ。

```bash
rosrun rviz rviz
```
- すると、以下のようなrvizウィンドウが立ち上がる。
![Screenshot from 2018-02-12 22-17-46.png](https://qiita-image-store.s3.amazonaws.com/0/78052/b3a0c424-8f1f-05c0-6667-15330a5278ce.png)

- rviz内の世界座標系を固定するために、"Fixed Frame"の横にあるコンボボックスの中から"camera_link"を選択する。
![cameralink.png](https://qiita-image-store.s3.amazonaws.com/0/78052/9d72f276-29bd-3603-ec04-a34cbbbb12a3.png)

- 顔の位置を表示するために、"Add"ボタンを押して、"/face_detector/faces_cloud/PointCloud"を追加する。
![addpointcloud.png](https://qiita-image-store.s3.amazonaws.com/0/78052/7958341d-c988-8619-68ff-11f8b48e44d8.png)

- 【任意】 顔の位置を見やすくするために、まず、"PointCloud"の横にある三角形をクリックします。その後、"Style"の"Flat Squares"をSpheres"に変えます。最後に"Size(m)"を"0.01"から"0.2"に変える。 
![showpc.png](https://qiita-image-store.s3.amazonaws.com/0/78052/ecc22aad-1c0d-1b5a-70ad-8a90a2fbb0d5.png)


# 結果
rvizウィンドウの中に赤い点で顔の座標が三次元として表示されます。
![face.png](https://qiita-image-store.s3.amazonaws.com/0/78052/8dbc82a6-5857-b3b4-be79-37ded6f41415.png)


また、顔検出ノードを起動している端末には以下のような検出結果が表示されているはずです。

```bash
[ INFO] [s.s]: Detection duration = 0.0598671sec
[ INFO] [s.s]: Found face to match with id 0
[ INFO] [s.s]: Number of faces found: 1, number with good depth and size: 1
```

# まとめ
以上で、ROSパッケージを使った顔検出ができるようになりました。
他にもいろいろなROSパッケージを試してみてください。

# 参考文献
[1] https://software.intel.com/en-us/realsense-sdk-windows-eol
[2] http://wiki.ros.org/face_detector