Raspberry Pi 人工無脳ロボットに感情モデルを持たせる

自作のトイロボットに簡単な感情モデルを持たせてみました。ニューラルネットワークなどは使っていない単純な人工無脳です。こんな感じに動作します。

![1.gif](https://qiita-image-store.s3.amazonaws.com/0/47128/c3351e97-55b5-116d-f569-319a6f4ce4b2.gif)

感情モデルは-15〜15まで増減します。0〜15までは「Calm（落ち着いた状態）」で、マイナスになると「Anger（怒った状態）」になります。

液晶モジュールで「Calm」は緑、「Anger」は赤で表示させています。

![2.gif](https://qiita-image-store.s3.amazonaws.com/0/47128/ad5c5c4f-d459-0ae9-2456-640aa7dce690.gif)

波型のジェスチャーで擬似ドーパミンを送り感情モデルを+5増加させます。

「Joy（喜んだ状態）」は黄色で表示させてみました。

![3.gif](https://qiita-image-store.s3.amazonaws.com/0/47128/12718aed-411d-308f-5515-7275a871796d.gif)

接近のゼスチャーで擬似ノルアドレナリンを送り感情モデルを-5減少させます。

「Fear（怖がった状態）」は紫で表示させてみました。

擬似ドーパミンと擬似ノルアドレナリンのバランスを取るために擬似セロトニンを分泌させています。感情モデルがプラスの時は-0.5、マイナスの時は+0.5づつ１秒おきに変化し感情モデルが時間の経過と伴に0に戻る様にしました。

「Calm（落ち着いた状態）」と「Anger（怒った状態）」で、ロボットの行動に変化をつけてみました。時計回りのゼスチャーで「遊ぼう」と伝えてみます。

![4.gif](https://qiita-image-store.s3.amazonaws.com/0/47128/10366750-abdd-3561-8f21-0d8efc984406.gif)

「Calm（落ち着いた状態）」では「YES!」と答えて一緒に遊んでくれます。

![5.gif](https://qiita-image-store.s3.amazonaws.com/0/47128/4d9b7c54-bb23-fdcf-ca20-6aa7a47ab7af.gif)

「Anger（怒った状態）」では「NO...」とだけ答えてフイッと横を向いてしまいます。

## 環境

[こちら](http://qiita.com/PonDad/items/e5fedd419835d99e4d93) をご参照ください。

## 人工無脳の感情モデル

感情モデルは書籍　[恋するプログラム Rubyでつくる人工無脳](http://amzn.to/2olaI8Q) のサンプルプログラム、人工無脳「ノビィ」が待つ感情モデルを参考にしました。

「ノビィ」はチャットの言葉を辞書モデルと照らし合わせて感情モデルを増減させるのですが、今回は人工無脳へのインプットはゼスチャーで行うのでもう少し簡単にしています。

「ノビィ」の感情モデル、何かに似てるなあ。と思ったのですが、脳の３大ホルモン（ドーパミン・ノルアドレナリン・セロトニン）の分泌にそっくりです。

> ドーパミン（英: dopamine）中枢神経系に存在する神経伝達物質で、運動調節、ホルモン調節、快の感情、意欲、学習などに関わる。

> ノルアドレナリン（独: Noradrenalin、英: noradrenaline）　ストレス・ホルモンのうちの1つであり、注意と衝動性 (impulsivity) が制御されている生物の脳の部分に影響する。

> セロトニン（serotonin）　名称はserum(血清)とtone(トーン)に由来し、血管の緊張を調節する物質として発見・名付けられた[6]。ヒトでは主に生体リズム・神経内分泌・睡眠・体温調節などに関与する。

> Wikipedia

そこでこんな風に考えてみました。

![脳内ホルモン.png](https://qiita-image-store.s3.amazonaws.com/0/47128/05d1e2c8-525d-0aa4-2e5e-c062fee580d8.png)

Pythonで書くとこんな感じでしょうか。

```python:tiny_emotion.py
# -*- coding: utf-8 -*-
#!/usr/bin/env python
def action(input):
    MOOD_DOPAMINE = 5
    MOOD_NORADRENALIN = -5
    if input == "JOY":
        return MOOD_DOPAMINE
    elif input == "FEAR":
        return MOOD_NORADRENALIN
    else:
        return 0
def main():
    MOOD = 0
    MOOD_MIN = -15
    MOOD_MAX = 15
    MOOD_SEROTONIN = 0.5
    EMOTION = ["CALM","ANGER"]
    while True:
        inputs = input('> ')
        if MOOD >= 0:
            MOOD = MOOD + action(inputs)
            MOOD -= MOOD_SEROTONIN
            if MOOD > MOOD_MAX:
                MOOD = MOOD_MAX
            print(EMOTION[0], MOOD)
        elif MOOD < 0:
            MOOD = MOOD + action(inputs)
            MOOD += MOOD_SEROTONIN
            if MOOD < MOOD_MIN:
                MOOD = MOOD_MIN
            print(EMOTION[1], MOOD)
if __name__ == '__main__':
    main()
```

ロボットを喜ばせると擬似的にドーパミンが分泌され、機嫌が良くなります。逆に怖がらせると擬似的にノルアドレナリンが分泌され、機嫌が悪くなります。擬似的にセロトニンを分泌させることで機嫌の増減を調整して感情を安定させます。

## サンプルコード

トイロボットの動作は各メーカーのライブラリをそのまま利用しています。`app.py`と`action.py`のみサンプルコードを元に加工しました。

[PonDad/app.py - Gist](https://gist.github.com/PonDad/1d3765b064f4f5eaed6e0a3c66a22743)

## まとめ

簡単な感情モデルで行動を変えることが出来ました。

ただし、短期記憶だけだと一緒に遊んだ事をすぐに忘れてしまします。ロボットに擬似的な長期記憶を与えるにはどうすればいいのだろうか...そんな事を思案中です。では。

## 参考にさせていただきました

- [恋するプログラム Rubyでつくる人工無脳](http://amzn.to/2olaI8Q)
- [記述できない心を記述する（その１） - 人工無脳は考える](http://www.ycf.nanet.co.jp/~skato/muno/article4/01emotion1.html)
- [心を定量計測する技術 - AGI](http://www.agi-web.co.jp/docs/Univ-Tokyo.pdf)