Dockerを使用してPepperをROSで動かす手順（Mac・Ubuntu対応）

# はじめに
この記事は、SoftbankのPepperをROSで動かすための手順をまとめた記事です。

ROSは**公式ではUbuntuのみ対応しています**。そのため、この記事ではDockerを使ってMac, Ubuntuユーザが手軽にROSを使えるようにしています。

WindowsでもPepperを動かせることは確認したのですが、画像等のGUI表示ができなかったのでここでは紹介しません。どなたかやり方知ってたら教えてください。

またこの手順は[Tech-Circleハンズオン](http://techcircle.connpass.com/event/29194/)の事前準備の手順も兼ねており、ハンズオンで必要なROSパッケージ等も含まれています。

# Docker is 何？
[Docker](https://www.docker.com/)を使えば、ROSを手元のPCに直接インストールすることなく、ROSに必要な環境がまるまる手に入るので、煩わしいインストール・セットアップ作業が不要になります。そのために、その環境が入ったDockerイメージをダウンロードする必要があります。

この記事では [ykoga/pepper-ros-handson](https://hub.docker.com/r/ykoga/pepper-ros-handson/) というTech-Circleハンズオンのためのイメージをダウンロードする例を示します。

# PeppeをROSで動かす手順（所要時間　約4０分）
1. Naoqi-SDKのダウンロード、解凍
2. Dockerインストール
3. 使用するDockerイメージのダウンロード(約2.3GB)
4. 動作確認
5. PepperをROSで動かす

1.〜４.が準備、5.が実際にROSで動かす部分です。ハンズオンの事前準備は、4.動作確認　まで行ってください。
MacとUbuntuでやることが異なりますので、分けて解説します。

# Mac
## [Mac] 1. Naoqi-SDKのダウンロード、解凍
右上の sign in をクリックして、 アカウント作成 をクリックしてください。（既にアカウントをお持ちの方はサインインしてください。）
https://www.aldebaran.com/ja


![範囲を選択_019.png](https://qiita-image-store.s3.amazonaws.com/0/60470/b75e9517-afd7-c4d7-24e2-35938f21367e.png)

Aldebaranアカウントでログインした状態で、Developper Program に登録してください。Developper Programに登録することで下記SDKがダウンロードできるようになります。

https://community.aldebaran.com/ja/developerprogram

![image](https://qiita-image-store.s3.amazonaws.com/0/60470/7529ef22-2607-a1e2-e3b1-2c8097634ae4.png)

以下のPepper-SDK(Naoqi-SDK)を選んでダウンロードし、解凍してください。Macユーザであっても必ずLinux版をダウンロードしてください。

解凍した２つのディレクトリはどこにおいてもいいのですが、ここではホームディレクトリに置いておきましょう。

* Python 2.7 SDK 2.4.2 Linux 64
* C++ SDK 2.4.2 Linux 64

https://community.aldebaran.com/en/resources/software/language/en-gb

![範囲を選択_021.png](https://qiita-image-store.s3.amazonaws.com/0/60470/7fa6e2fc-5eed-d447-1ac8-2eceeca47144.png)

## [Mac] 2. Dockerインストール

**2016/3/29 追記**
Macでは、Dockerをインストールする前にVirtual Boxが必要です。
インストールされていない場合は、[こちら](https://www.virtualbox.org/wiki/Downloads)でMac用インストーラをダウンロードしてインストールしてください。

次に、Dockerのインストールです。

```bash
# docker, docker-machineのインストール
brew install docker
brew install docker-machine

# defaultという名前のvirtualboxイメージを作成する
# VBoxManage list vmsで確認できる
docker-machine create --driver virtualbox default

## Docker起動
docker-machine start default

# Dockerで使う設定を反映
# ターミナルごとに実行する必要がある
eval $(docker-machine env default)
```

３,4行目は、Docker QuickStart Terminalというインストールされたアプリを開くと自動でやってくれます。その場合は、defaultという名前のvirtualboxイメージが作成されます。


* Dockerコンテナ内でGUIを表示できるようにするためのツールのインストール   
[こちら](http://www.xquartz.org/)のインストーラを使ってQuartzインストールします。インストール後、一度ログアウトしてログインしなおしてください。その後、socatをインストールします。

```bash:socatインストール
brew install socat
```

## [Mac] 3. 使用するDockerイメージのダウンロード

ROSとPepper関連パッケージが入ったDockerイメージをダウンロードします。

```bash:Dockerイメージをダウンロード
docker pull ykoga/pepper-ros-handson

# 正常にダウンロードされたことを確認
docker images
# REPOSITORY                 TAG                   IMAGE ID            CREATED             VIRTUAL SIZE
# ykoga/pepper-ros-handson   latest                0f1c04860a76        29 minutes ago      2.344 GB
```

Macの方でdocker pull、run動作時にエラーが出た場合は、一番下の"参考"を参照してください。

## [Mac] 4. 動作確認

```bash:コンテナを起動
# ターミナル１
# GUI表示のために必要
socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"

# ターミナル２
# コンテナ起動
# DISDPLAY=192.168.99.1:0には、ifconfigで調べたvbox0のIPアドレスを入力する
# --volume 以下には、保存したNaoqi-SDKのフォルダの絶対パスを入力する（Python,C++両方）。以下はホームディレクトリに置いた例
docker run -it --rm --name pepper_robot --hostname pepper_robot --env ROS_HOSTNAME=pepper_robot --env DISPLAY=192.168.99.1:0 --volume="$HOME/pynaoqi-python2.7-2.4.2.26-linux64/:/root/pynaoqi" --volume="$HOME/naoqi-sdk-2.4.2.26-linux64:/root/naoqi-sdk" ykoga/pepper-ros-handson terminator
```

新規にウィンドウが立ち上がるので、そこに以下のように入力します。
（水平分割は　右クリック＋Split Horizontally または Ctrl+Shit+o
　垂直分割は　右クリック＋Split Vertically または Ctrl+Shit+e　）

```bash:立ち上がったターミナルで動作確認
# rqt_plotを起動するために必要
roscore

# GUIが使えるか確認
rqt_plot

# Naoqi-SDKがマウントできているか確認
ls ~/naoqi-sdk/
ls ~/pynaoqi/
```

下図のように表示されれば準備OKです。

![範囲を選択_025.png](https://qiita-image-store.s3.amazonaws.com/0/60470/57da70ed-f35e-16ec-6d0a-daadc2ec000d.png)


## [Mac] 5. PepperをROSで動かす
ではいよいよPepperをROSで動かしてみましょう

```bash:コンテナ内でPepperを起動する
# ターミナル1
roscore

# ターミナル2
roslaunch pepper_bringup pepper_full.launch nao_ip:=PepperのIPアドレス nao_port:=9559 network_interface:=eth0
```

正常にROSでPepperと接続できれば下図のように表示されると思います。

![pepper_bringup_full.png](https://qiita-image-store.s3.amazonaws.com/0/60470/fee78f58-92c0-066a-51c4-1d9bca498d1f.png)

（ターミナルの色が違うのは気にしないでください）

以下のコマンドでノードやトピックを調べて正常にデータを受信できているか確認しましょう。

* rosnode list
* rostopic list
* rqt_image_view

例）rqt_image_view でPepperのカメラ画像を表示させた例
![image](https://qiita-image-store.s3.amazonaws.com/0/60470/a03508a7-9149-7c0d-9b9a-d2f0826de7df.png)


# Ubuntu
## [Ubuntu] 1. Naoqi-SDKをダウンロードし、解凍する
手順はMacと同じためそちらを参照してください。

## [Ubuntu] 2. Dockerインストール

以下の手順はDocker1.9をインストールする例です。
もし既にDockerをインストール済みの方は、あまり古くなければ動作可能だと思います。

```bash:Dockerのインストール
curl -sSL https://get.docker.com | sh

# バージョンの確認
docker --version
#Docker version 1.9.1, build a34a1d5

# sudoをつけずにdockerコマンドを実行する
# 設定を反映するにするには再起動必要かも
sudo usermod -aG docker ＄USER

# この後、一旦ログアウトしログインしなおす
```

## [Ubuntu] 3. 使用するDockerイメージのダウンロード

```bash:Dockerイメージをダウンロード
docker pull ykoga/pepper-ros-handson

# 正常にダウンロードされたことを確認
docker images
# REPOSITORY                 TAG                   IMAGE ID            CREATED             VIRTUAL SIZE
# ykoga/pepper-ros-handson   latest                0f1c04860a76        29 minutes ago      2.344 GB
```

## [Ubuntu] 4. 動作確認


```bash:コンテナを作成
# GUI表示のために必要
xhost +

# コンテナ起動
# --volume 以下には、保存したNaoqi-SDKのフォルダの絶対パスを入力する（Python,C++両方）。以下はホームディレクトリに置いた例
docker run -it --rm --name pepper_robot --hostname pepper_robot --env DISPLAY=unix$DISPLAY --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" --volume="$HOME/pynaoqi-python2.7-2.4.2.26-linux64:/root/pynaoqi" --volume="$HOME/naoqi-sdk-2.4.2.26-linux64:/root/naoqi-sdk" ykoga/pepper-ros-handson terminator

# セキュリティ向上のためにコンテナから出たら戻しておくこと
# xhost -
```

新規にウィンドウが立ち上がるので、そこに以下のように入力します。
（水平分割は　右クリック＋Split Horizontally または Ctrl+Shit+o
　垂直分割は　右クリック＋Split Vertically または Ctrl+Shit+e　）

```bash:立ち上がったターミナルで動作確認
# rqt_plotを起動するために必要
roscore

# GUIが使えるか確認
rqt_plot

# Naoqi-SDKがマウントできているか確認
ls ~/naoqi-sdk/
ls ~/pynaoqi/
```

下図のように表示されれば準備OKです。

![範囲を選択_025.png](https://qiita-image-store.s3.amazonaws.com/0/60470/57da70ed-f35e-16ec-6d0a-daadc2ec000d.png)

## [Ubuntu] 5. PepperをROSで動かす

ではいよいよPepperをROSで動かしてみましょう。手順はMacと同じためそちらを参照してください。

# 参考

## Macのdocker周りのエラー
以下の二つのエラーについては、dockerの再起動、再設定で解決できます。

* docker pull時に "Network timed out" エラーが出てDockerイメージがダウンロードできない

```bash
Network timed out while trying to connect to https://index.docker.io/v1/repositories/library/node/images. 
You may want to check your internet connection or if you are behind a proxy.
```

* dokcerコマンドを使うと、Cannot connect to the Docker daemon. Is the docker daemon running on this host?と出る

以下のようにしてdockerの再起動、再設定をしてください。

```bash
docker-machine restart default
eval $(docker-machine env default) 
```