Pepperの温度をBigQuery+Google Spreadsheetで見守ってみる

この記事は [ロボット Advent Calendar 2015](http://qiita.com/advent-calendar/2015/robot) の12日目の記事です。

今年はPepperのおかげで書籍執筆にがっつり取り組ませていただいたりして濃密な1年でした。Pepper自身も結構進化してきているので、いろいろアップデートしないとねえと思いつつ、いろいろな仕事に追われてしまっています。そんなわけで、あわててAdvent Calendarの記事を書かせていただきます・・・！

# Pepperと温度

Pepperの強みの1つはそのデカさだと思います。人間より少し小さいくらいのサイズ感であることで、人間、特に子どもとのコミュニケーションにパワーを発揮するのではないかと思います。

反面、このデカい身体を動かすためにはパワーも必要で、パワーを生み出そうとすれば熱も出ます。
気楽にバーチャルロボットで作ったモーションが実はすごい熱を持ってしまうモーションでしたみたいなこともよくあります。アプリ開発中には、5分動かしただけで関節の温度が70℃くらいになってしまい、そのまま強制的にRest状態に、みたいなことは割としょっちゅうあったりします。
また、Pepperはデカいので、安全性についてもよく考慮しなければなりません。温度上昇で強制的にRest状態に遷移する場合、例えば首のピッチのモーターが強制的にオフになったりするわけですが、このような場合は頭が胸のタブレットに勢いよく落ちてしまうおそれもあります。こういう事態はできるだけ回避したいところです。

ロボットのソフトウェア開発者としては、ロボット自身が自律的に温度上昇などを抑えるように振る舞えることが理想なのですが・・・少なくともPepperのFrameworkであるNAOqiは、開発者が指示したモーションやポーズをできる限り忠実に実行することを重視しているように見えます。
少なくとも現状においては、開発者はPepperの温度上昇などのハードウェア的な性質をよく考えて、モーションやポーズを設計できるようにならないといけなさそうです。

# モニタリングしようぜ

Pepperのハードウェア的な部分に配慮しようにも、少なくとも自分はまだ機械の身体ではないし、Pepperとは関節の構造も異なるのでよくわかりません。こんな時は、とりあえず、何が起きているのか事実を収集するのが一番の近道・・・ということでモニタリングについて考えてみます。

すでにPepperの温度のモニタリングは [Pepper君の関節温度をモニターする Webアプリ「drpepper」を作ってみた](http://qiita.com/Suna/items/abae56209c57c522c8b0) という例もあって非常に良い感じなのですが、今回は長期的に温度変化のデータを収集・蓄積して、解析できるようにしたい・・・ということで、以前書いた [Pepperのログや稼働情報をFluentd経由でBigQueryに突っ込んでみる](http://qiita.com/yacchin1205/items/11301d79380d08d2dbf6)で作ったPepper用のFluentロガーに温度監視の項目を追加することで、BigQueryに蓄積、解析できるようにすることを目指してみます。

## Pepperから温度情報を取り出す

PepperではALMemoryという機構を使って、アプリやデバイスの間でデータのやり取りや保存ができます。温度の情報も例外ではなくこのALMemoryから取得することができます。
具体的には、 `Device/SubDeviceList/ジョイント名/Temperature/Sensor/Value` キーを参照することで、ジョイントの温度が何℃なのかを得ることができます。

今回は、このキーの値を定期的に取得し、値をまとめてFluentdに送り付けるようなコードを https://github.com/yacchin1205/pepper-fluent-logger/ に追加しました。
具体的には、[fluentlogger.py](https://github.com/yacchin1205/pepper-fluent-logger/blob/master/fluentlogger/fluentlogger.py#L152-L166) に温度取得用のコードを追加しています。このコードにより、以下のようなデータをFluentdに送るようにしてみました。

```json
{"robot":"ロボット名","lshoulderroll":44,"lshoulderpitch":36,"rshoulderroll":41,"lelbowyaw":42,"lwristyaw":31,
"kneepitch":54,"hiproll":33,"wheelb":27,"rwristyaw":27,"wheelfr":29,"headyaw":36,"lelbowroll":39,"relbowyaw":43,
"relbowroll":40,"headpitch":46,"wheelfl":25,"hippitch":45,"rhand":28,"rshoulderpitch":36,"lhand":30}
```

このデータは、[Pepperのログや稼働情報をFluentd経由でBigQueryに突っ込んでみる](http://qiita.com/yacchin1205/items/11301d79380d08d2dbf6)のときと同様、Fluentdを経由してBigQueryに突っ込んでいってみています。(スキーマは[こんな感じ](https://github.com/yacchin1205/pepper-fluent-logger/blob/master/bqschema/pepper_temperature.json))

このようにして常時BigQueryに温度情報をためておくことで、何か温度関係のトラブルがあったとき、あとからPepperの状況と温度上昇の関係を解析していくことができるようにしています。

![image](https://qiita-image-store.s3.amazonaws.com/0/28770/54044d65-4b4d-98c3-583c-0bbd9e740e32.png)


## BigQueryにためた温度情報をGoogle Spreadsheetでグラフ化する

BigQueryのコンソールからSQLをバシバシたたくと温度の値が見えるわけですが、やっぱりグラフで時間ごとの変化をみたくなってきます。

これは[Googleスプレッドシートをコピーして作るBigQuery Dashboard](http://qiita.com/kazunori279/items/06b1f76293687bd819e5)にしたがってスプレッドシートを作成することで簡単に実現できます。非常にお手軽です。

![image](https://qiita-image-store.s3.amazonaws.com/0/28770/8b74bacc-2c1f-1012-2c0e-6e72fa7e8a5b.png)

なお、クエリは以下のような感じにしています。

```sql
SELECT
  STRFTIME_UTC_USEC(time * 1000000, "%Y-%m-%d %H:%M:%S") as tstamp,
  headpitch, headyaw, rshoulderroll, rshoulderpitch, relbowyaw, relbowroll, rwristyaw,
  rhand, lshoulderroll, lshoulderpitch, lelbowyaw, lelbowroll, lwristyaw, lhand, hippitch,
  hiproll, kneepitch, wheelfl, wheelfr, wheelb
FROM sample.pepper_temperature ORDER BY time DESC LIMIT 200
```

このクエリによって作成されたシートが、自動的にスプレッドシート上でグラフ化されてくれるわけです。

# Pepperの温度変化を見守ってみた

今回は記事のため、簡単なPepperの温度上昇について見てみます。
なお、Pepperが活動している環境や、本体の個体差により変化の仕方が異なる可能性があります。あくまでも参考までで。

## 静止状態: Wake Up状態 / Rest状態

まず、Wake Up状態と、Rest状態での温度変化を見てみました。

![image](https://qiita-image-store.s3.amazonaws.com/0/28770/5e6e8161-80f1-e4fc-7887-de02b3f46dbc.png)

この例では、 1:06ごろにWake Upして、そのまま1時間ほどたったのちRest状態に移行させています。
わかりやすさのため、腕とホイールに関する温度情報は除外しています。

ここではheadpitch, hippitch, kneepitchの温度上昇が目立ちます。
例えばheadpitchならば、頭の前後方向の制御をおこなうための首のモーターなわけですが、Wake Up直後の状態は少し胸を張ったポーズのため、頭が後ろに向かって落ちないように支えるためにエネルギーを使っているということなのかもしれません。

![image](https://qiita-image-store.s3.amazonaws.com/0/28770/7a174d23-b4b2-df1b-2d59-37004c474619.png)

Wake Up直後の姿勢を維持するだけでも、実はPepperはがんばっているんだぞ、ということなのかもしれませんねえ・・・。
ちなみに、温度上昇は徐々にゆるやかになっていますが、Wake Up直後のポーズでは温度が低下することはみられず、headpitchが70℃くらいまで上がることを確認しています。

また、当然ではありますが、Rest状態にしてあげると、温度は冷めていきます。周辺温度との関係もあるでしょうが、Rest状態のような状態をはさむことで、長時間運用しても熱くなりすぎないPepperになるかもしれません。

## オートノマスライフ状態

オートノマスライフでの温度変化を見てみます。Rest状態ののち、オートノマスライフ状態に移行すると、以下のような温度変化を示しました。

![image](https://qiita-image-store.s3.amazonaws.com/0/28770/166593e7-b9e3-431e-d8f4-06e8b8ed1f06.png)

静止状態と異なり、headpitchの温度が低下する場合も見られます。オートノマスライフの状態では周辺の状況により挙動が変わるので一概に言うことは難しいかもしれませんが、姿勢によって温度が上がりやすい姿勢、下がりやすい姿勢というものがあるのかもしれません。

このようなモニタリングをしながら開発をすることで、Pepperがしんどい姿勢とそうでない姿勢がわかって、よりPepperの気持ちがわかるようになるのかもしれません・・・！ということで。