PepperをROSで動かす（１）　準備～キーボードテレオペまで

ここ一週間、Pepperを扱う機会があったので、ROSでPepperをうごかしてみました。何がわかって、何がわからなかったのかを備忘録的にまとめます。

#なぜPepperでROS？
* ROSの豊富なパッケージが使える（特に自律移動やアーム制御、認識系）
* ROSに対応しているロボットやロボットパーツが[これだけ](http://wiki.ros.org/ja/Robots)あるため、Pepperと他のロボット間連携がしやすくなる

#準備
**Naoqi SDK等のインストール～起動方法は、yonekenさんが公開している情報で基本的に起動できます。感謝。**
http://www.slideshare.net/k_yone/pepper-meets-ros-52177729

ただし、P.14の「PepperのROSパッケージが依存しているパッケージのインストール」で、私の環境ではros-indigo-naoqi-poseが足りなかったので、apt-getで追加でインストールしました。

#Pepper起動
ここで言う「起動」とは、ROSによってPepperとの接続が完了し、ROSからPepperが制御できるようになる状態です。PepperがRestモードから起き上がるということではないです。
1. Pepperの胸のボタンを押して、IPアドレスを確認（例えば、192.168.0.2など）
2. 起動するPCがPepperと同じネットワークにいることを確認して、そのIPアドレスのネットワークインタフェースをifconfigで確認する（例えば、有線ならeth0, 無線ならwlan0など。）
3. 以下のコマンドで起動する

```bash:Pepper起動
roslaunch pepper_bringup pepper_full.launch nao_ip:=PepperのIPアドレス network_interface:=Pepperにつなぐインタフェース
```

例えば、以下のように入力します。

```bash:Pepper起動
roslaunch pepper_bringup pepper_full.launch nao_ip:=192.168.0.2 network_interface:=wlan0
```

起動した結果、次のように出ればOKです。
![ros-pepper-launch-1.png](https://qiita-image-store.s3.amazonaws.com/0/60470/e5abc9b1-38d7-23f7-343e-00538e3c296a.png)

（出力結果の続き）
![ros-pepper-launcg-2.png](https://qiita-image-store.s3.amazonaws.com/0/60470/efb06bc5-f819-ee69-d5a0-a72d3f765791.png)

#わかったこと
##その１：起動時、ChoregrapheでPepperに繋ぐ必要はない
上記のように、ROSコマンド一発でPepperを起動できるので、ChoregrapheからPepperに接続する必要はないようです。Choregrapheは、以下のような状況で利用しました。

* もしPepperがRestモードになっていたら、Choregrapheから起こしてあげる（胸のボタンを二回押でも可能）
* もしPepperがAutonomousLifeモードになっていたら、Choregrapheから切る
（切らなくてもよいが、切ってあげたほうが種々プログラムのデバッグしやすいため）
* Pepperの関節角を固定する（Choregrapheの右側のインスペクタタブから）

##その２：Choregrapheのビヘイビア制御と、ROSの制御は共存できる
上でROSでPepperを起動するのに「Choregrapheでpepperに繋ぐ必要はない」と書きましたが、Pepperを開発をする上では、Choregrapheを使ったほうが楽なのは事実です。例えば、Choregrapheのほうで対話やモーションを開発し、ROS側で自律移動制御を開発したい、といったこともあると思います。

まだ深くは触れていませんが、私が確認したところ、Choregraphe→NaoqiとROS→Naoqiはバッティングせず、同時に接続ができます。これにより、例えばROSで自律移動させている途中にChoregraphe側で喋らせたりモーションをさせたりといったことを並行してできます。ただし、同じ部位を両方から制御した場合の動作は不明です。

注意点としては、Choregraphe⇔NaoqiとROS⇔Naoqiは可能ですが、Choregraphe⇔ROSは（おそらく）現段階だと不可能なので、ChoregrapheとROSを組み合わせた動作計画を作るのは難しいと思います。

#Pepperをキーボードで動かす
では、まずキーボードでPepperを動かしてみましょう。はじめに必要なパッケージをインストールします。

```bash
# キーボードでテレオペさせるためのパッケージをインストール
sudo apt-get install ros-indigo-teleop-twist-keyboard
# ROSシステム側へ読み込ませる
source /opt/ros/indigo/setup.bash
```

では、起動しましょう。

```bash:ターミナル１:Pepper起動
roslaunch pepper_bringup pepper_full.launch nao_ip:=192.168.0.2 network_interface:=wlan0
```

```bash:ターミナル２:キーボードでテレオペ起動
rosrun teleop_twost_keyboard teleop_twist_keyboard.py
```

![ros-pepper-keyboard.png](https://qiita-image-store.s3.amazonaws.com/0/60470/abf22000-3325-a01d-ea7e-438aa5bfa274.png)


起動すると、ターミナルにも指示があるように、iで前進、,で後退、lで右回り、jで左回り、他のキーで停止します。スピードも変えることができます。Pepperが移動しますので、安全のために十分なスペースをとってから行うようにしましょう。

ここではキーボードでPepperを制御しましたが、もしプレステなどのUSBに対応したジョイスティックコントローラを持っている場合は、それを使うこともROSなら簡単にできます。詳しくは[ここ](http://wiki.ros.org/ja/turtlebot_teleop/Tutorials/Joystick%20Teleop)で説明されています。

#備考：Pepperの衝突防止機能
Pepperには衝突防止機能が備わっており、Pepperがある程度まで障害物に近づいたら勝手に止まるようになっています。上のようにPepperをキーボードなどで操作していて、Pepper急にとまることがあれば、衝突防止機能が働いていると考えれれます。
この機能の振る舞いを簡単に変更するには、qicliコマンドでNaoqi SDKのAPIをたたいてあげればよいです。衝突防止に関連したAPIには以下のようなメソッドがあります。

・[ALMotion.setExternalCollisionProtectionEnabled](http://doc.aldebaran.com/2-1/naoqi/motion/reflexes-external-collision-api.html#ALMotionProxy::setExternalCollisionProtectionEnabled__ssCR.bCR)
パーツごとorすべてのパーツの衝突防止機能ON/OFFが可能（すべての場合はオーナー権限が必要らしい。未確認。）

・[ALMotion.setOrthogonalSecurityDistance](http://doc.aldebaran.com/2-1/naoqi/motion/reflexes-external-collision-api.html#ALMotionProxy::setOrthogonalSecurityDistance__floatCR)
衝突防止機能ONの場合、Pepperの前方向の障害物までの設定距離を設定できる（下図参照）

・[ALMotion.setTangentialSecurityDistance](http://doc.aldebaran.com/2-1/naoqi/motion/reflexes-external-collision-api.html#ALMotionProxy::setTangentialSecurityDistance__floatCR)
衝突防止機能ONの場合、Pepperの周りの障害物までの設定距離を設定できる。ただし、Orthogonal security distanceは、Tangential security distanceより大きくないといけない。

![alnavigation.png](https://qiita-image-store.s3.amazonaws.com/0/60470/576398f7-ea1a-66a1-bfa9-96618d392fbe.png)
参考 http://doc.aldebaran.com/2-1/naoqi/motion/reflexes-external-collision.html

```bash
# Pepperにsshでログイン
ssh nao@PepperのIPアドレス

# 前方向の衝突防止範囲を設定する。デフォルトでは0.4m
qicli call ALMotion.setOrthogonalSecurityDistance 0.2
# 0.2に設定されているか確認する
qicli call ALMotion.getOrthogonalSecurityDistance

# ロボット周りの衝突防止範囲を設定する。デフォルトでは0.1m
qicli call ALMotion.setTangentialSecurityDistance 0.2
# 0.2に設定されているか確認する
qicli call ALMotion.getTangentialSecurityDistance
```

パラメータを色々変更してみて、Pepperの停止距離が変わるのを確認してください。その際は、衝突にはくれぐれも気をつけてください。

#次回
次回はROSでPepperのビジョンを触ってみた記事です。