2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Pepperに会えない日々が続くので、Google Home MiniとMESHでPepperの自作を試みた

Last updated at Posted at 2020-04-15

はじめに

筆者は趣味でコミュニケーションロボットPepperのアプリ開発をやる事があるのですが、自宅にPepperはおらず、いつもPepperアトリエを利用させて頂いています。しかしながら、本記事を書いている2020年4月現在、筆者は外出自粛中であり、かつアトリエも休業になってから1ヶ月以上が経っており、ここしばらくPepperに会えていません。
趣味を自粛するのもちょっと疲れてきたので、なんとか自宅にあるものでPepperを自作できないかと模索してみました。

材料

ingredient
  • Pepperぬいぐるみポシェット
  • Google Home Mini
  • MESHブロック「ボタン」と「動き」
    • 旧称:MESHタグ
  • MacBook (サービス常駐用。ラズパイに移行予定)
  • iPad mini(MESHアプリ対応のスマホやタブレットならなんでもOK)

Pepperポシェットの中にMESHブロック2つとGoogle Home Miniを入れてインタラクションをします。
inside_pepper
センサーブロック2つはちょうどお腹辺りに、Google Home Miniは頭部にすっぽり入ります。
inside_pepper
ぺたんこだった頭が少しふっくらして、ちょっとだけ本物に近づいてきた気がしますね。

Pepperの挙動を思い出してみる

要件定義の前に、Pepperのよくある挙動をなんとなく思い出してみます。

  • 「こんにちは」とか「ペッパー」と話しかけると、簡単な受け答えをしてくれる
  • センサーのある部位(頭とか手とか)を触ると、びっくりしたり、くすぐったがる
  • 定期的に「ねぇねぇ、何してるのぉ?」とか声かけてくる

これらは、Naoqi OS 2.5.x 版と言われる旧型のモデルの筐体が「オートノマスライフ」という自律モードで動いている時の挙動です。最新のAndroid版と呼ばれるPepperは会話エンジンが異なるのと、センサー値に応じた挙動も異なる可能性があります。
ただ、筆者が開発に利用しているのは前者の旧型ですので、これでよしとしましょう。

要件

記憶を辿った結果を受けて、ざっくり以下の要件を定義しました。

  1. ユーザーが話しかけたら、言葉を返す
  • センサーの値に応じて言葉を発する
  • 定期的にユーザーに対して言葉を発する

設計

処理フローは以下の通りです。
mofupepperflow.png
要件1については、Actions on Googleを使って、Pepperと会話しているような会話フローを作成します。要件2,3についてはgoogle-home-notifierを使い、センサーや時刻をトリガーとしてGoogle Homeに通知を飛ばす仕組みを利用します。

実装

1. Actions on Googleを使って、Pepperっぽい受け答えをするActionを作成

Actions Consoleから、新規プロジェクトを作成し、Dialogflowで以下のように作成しました。

  • Default Welcome Intentの編集
    アクション起動時のセリフとして以下を設定しました。
Default Welcome Intent
  • CallPepper intentを新規作成
    Training phrasesに"ペッパー/Pepper"を追加し、
CallPepper1 以下のような返答を返すようにしました。 CallPepper2

2. MESHアプリとMESH SDKでセンサー値に応じた発話を実装

こちらの記事を参考にさせて頂き、google-home-notifierの導入、およびMESHカスタムタグの作成をしました。
https://qiita.com/glory/items/a464872b9655a21e9f2f

複数の返答候補からランダムに選択するようにするため、トリガー時に渡すテキストを以下のような書式にしました。

・MESHのボタンが押された時
ナニー?, どうしたの?, おなか, くすぐったいよー

・動きを検出した時
きゃっハッハー, わあ, びっくりー

そして、MESHカスタムタグ内のコードについては以下のようにしました。

var endPointURL = "https://" + properties.ipAddress + "/google-home-notifier";

var resList = properties.speakText.split(','); //propertiesのspeakTextを配列に変換
var resText = resList[Math.floor( Math.random() * resList.length )]; //発話テキストをランダムに選択

ajax ({
    url : endPointURL,
    type : 'post',
    headers: {'Content-Type': 'application/x-www-form-urlencoded'},
    timeout : 5000,
	data:{text: resText},
    success : function ( contents ) {
		log('trigger success');
        callbackSuccess( {
            resultType : 'continue'
        } );_
    },
    error : function ( request, errorMessage ) {
		log("detail: " +  JSON.stringify(request));
        log('trigger : Network error');
		log(endPointURL);
		log('trigger  : ' + errorMessage);
        callbackSuccess( {
            resultType : 'continue'
        } );
    }
});
 
return {
    resultType : 'pause'
};

MESHアプリでは以下のようにフローを設定します。
mesh_flow
これで、お腹を押されたり、揺らされたら何らかの反応を示すようになりました。

3. IFTTTのDate/TimeとWebhookで定期的な発話を設定

IFTTTと、前節で設定したgoogle-home-notifierを使って、決まった時間に「ねぇねぇ、何してるのー?」と発話させます。IFTTTのトリガー(this)をDate&Timeにし、Webhookを使って(that)、毎時45分に稼働中のgoogle-home-notifierにリクエストを飛ばします。設定は以下のようにしました。
IMG_0426 2.jpg

実行結果

それでは、話しかけてみましょう。
[実行結果1] https://youtu.be/pRXoF8uH23c
Actionを実行

揺らしたり、お腹を押してみると。。。
[実行結果2] https://youtu.be/ksDXIohJB-w
センサー

google-home-notifierを使った方(2つ目の動画)はだいぶタイムラグはありますが、なんとかPepperらしく(?)リアクションしてくれました。

結論

・・・やっぱり本物が良いですね。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?