NAOqi
Pepper
Choregraphe

超簡単にPepperを使ってプレゼンをする

More than 1 year has passed since last update.

pepper_wcan1.jpg

12/12(土) WCAN 2015 WinterでPepper にLTをさせました がLTをやりました。
こちらは、アプリを起動しただけで終わるまで、まったく操作せず、プレゼン資料をめくるのも、Pepperにやってもらいました。
その仕組みを、こちらで解説いたします。

条件

・なるべく簡単に実装する。

せっかくなので、Pepperを開発している人、誰でもできてしまうくらいのレベルで考えました。

PowerPointを操作するのは、そもそもmacユーザだし、今更VB書きたくなかったので、却下。(でも、この記事を書いてて、おもしろいかもとか思い出した。)

ということで、ブラウザを使って実装することにしました。

準備

・impress.jsをダウンロード
https://github.com/impress/impress.js

・以下をローカルにダウンロード
http://{pepperのIP}/libs/qimessaging/1.0/jquery.min.js
http://{pepperのIP}/libs/qimessaging/1.0/qimessaging.js

index.html
<script src="js/jquery.min.js"></script>
<script src="js/qimessaging.js"></script>
<script src="js/impress.js"></script>

impress.js の使い方

index.js
var pp = impress();
pp.init(); // 初期化
pp.next(); // 次へ進む
pp.prev(); // 前へ戻る
pp.goto("id"); // htmlで設定したidのページに進む

超簡単!

イベントの取得は、

index.js
$('#id').on('impress:stepenter', function() {
    // ページが表示された時
}).on('impress:stepleave', function() {
    // ページから離れた時
});

Choregraphe

Dialog

Dialogは、文字列の出力を新しく作成します。

ボックスの編集 > 出力 > +ボタン押下
Name : turnPage
Type : 文字列

playAGameは、邪魔なんで削除しちゃいましょ。

イベント発行は、ダイアログファイルで、プレゼン用のhtmlで設定したidを指定しましょう。

ExampleDialog_jpn.top
$turnPage=id # id名

Raise Event

変数: keyにjsで設定したイベント名を記述しましょう。
今回だと、PepperPowerPoint/GoTo ですね。

実装イメージ

最小限の実装だとこんなかんじでしょうか?
スクリーンショット 2015-12-03 18.40.19.png
他のボックスを使った場合は、Text Editボックスを挟めばいけそうですね。

Pepperとの同期

QiMessaging.jsは、Socketで通信するPepper用のライブラリになります。
これを使って、コレグラフで発生させたカスタムイベントを受信すれば、いい感じにできそうですね。

index.js
var pepper,
    eventList = [
    {
        key: 'PepperPowerPoint/GoTo', // Pepperから、発行するイベント名
        callback: function(data){
            console.log(data);
            pp.goto(data);
        }
    }
];

// Pepperと通信を接続する。
pepper.qi = new QiSession(pepper_ip);
pepper.qi.socket().on('connect', function(){
    console.log('pepper:connect');
}).on('disconnect', function(){
    console.log('pepper:disconnect');
});

// カスタムイベントを受信するためのAPI
pepper.qi.service('ALMemory').done(function(memory){
    console.log('ALMemory : OK');
    customEvent(memory, eventList);
}).fail(function(err){
    console.log('ALMemory : NG', err);
});

// カスタムイベントを受信するための登録処理
function customEvent(ALMemory, eventList) {
    $.each(eventList, function(i, v){
        ALMemory.subscriber(v.key).done(function(sub){
            sub.signal.connect(v.callback);
            console.log('ALMemory : ' + v.key + ' : OK');
        }).fail(function(err){
            console.log('ALMemory : ' + v.key + ' : NG', err);
        });
    });
}

備考

ひょっとしてパワポ側をいじって、Pepperを操作するほうが需要あるのでしょうか。
まぁそれも、ブラウザ側でカスタムイベントを発生させて、Pepper側で受信すれば、できそうですね。ネットワークが弱いと不具合を起こしやすいので、そこは、かなりネックとなりますが。