[Pepper] Pepperアプリケーション開発 ~データベースを利用してみよう~

前回は、Pepperに写真を撮影して貰うアプリケーションを作成しました。
今回は、Pepperでデータベース(sqlite)を利用してみようと思います。

データベースを扱うことが出来れば、Pepper自身が経験したことをデータとして蓄積したり、
インターネットに接続できない環境下でも規模の大きなデータを扱うことが出来るようになります。

■今回実現するアプリケーション
今回は、データベースを扱えるということを確認するために、以下のような簡単なアプリケーションを作成しました。
1)Pepperに名前を伝えます
2)その人物の電話番号を、データベースから検索します(今回の目的)
3)検索した電話番号を答えてもらいます

■前準備 データベースファイルを用意
Pepperでは sqlite を扱うことが出来ますので、FireFoxのアドオンである「SQLiteManager」を利用して、
図1のようにデータベースファイルを作成しました。



図1 sqlite データベース

中身はpeopleテーブルのみで、列として名前、年齢、電話番号を持っています。
このファイルを、Pepperで検索します。

■プロジェクト作成
では、早速アプリケーションの中身を見て下さい。



図2 今回作成したアプリケーション全体

Pepperに名前を伝える部品と、検索した電話番号を答えてもらう部品は、以前ご紹介した記事にも登場しています。
今回新規に作成したのは、真ん中の「データベース内に登録されている人物の、電話番号を検索する」部品です。

部品を配置し終えたので、前準備で用意したsqliteファイルをプロジェクトにインポートします。
画面左側にある「+」ボタンを押下して、「ファイルのインポート」を選択します(図3)。
その後、図1で作成したsqliteファイルを選択して(図4)、「オープン」ボタンを押下することで、
プロジェクト内にファイルを取り込むことができます。
今回は、同じ要領で作成した「db」というフォルダの中に、pepper.sqliteを格納しました(図5)。



図3 ファイルをインポートする



図4 sqliteファイルを選択して取りこむ



図5 sqliteファイルをdbフォルダに格納しました

次に、このファイルをプログラムでopenし、実際に人物を検索して電話番号を取り出す部分を説明します。
完成したプログラムは、以下の通りです。

import os
import sqlite3

class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self)

    def onLoad(self):
        #put initialization code here
        pass

    def onUnload(self):
        #put clean-up code here
        pass

    def onInput_onStart(self):
        #self.onStopped() #activate the output of the box
        pass

    def onInput_onStop(self):
        self.onUnload() #it is recommended to reuse the clean-up as the box is stopped
        self.onStopped() #activate the output of the box

    def onInput_inputName(self, p):
        self.frameManager = ALProxy("ALFrameManager")
        db_filename = os.path.join(self.frameManager.getBehaviorPath(self.behaviorId), "../db/pepper.sqlite")
        self.log(db_filename)
        with sqlite3.connect(db_filename) as conn:
            c = conn.execute("select name,age,phone from people where name = '" + p + "'")
            row = c.fetchone()
            output_data = str(row[2])
            self.outputName(output_data)
            self.onStopped()
            conn.close

        pass

onInput_inputName メソッドが、データベースからデータを検索するメソッドになります。

以下の部分で、図5でインポートしたデータベースファイルまでのフルパスを設定しています。
self.frameManager.getBehaviorPath(self.behaviorId) までで、図2の左側にあるファイルツリーの、「behavior.xar」が存在するパスを
取得することが出来ますので、そこから相対的に、「../db/pepper.sqlite」と指定すると、インポートしたファイルへアクセスできます。

self.frameManager = ALProxy("ALFrameManager")
db_filename = os.path.join(self.frameManager.getBehaviorPath(self.behaviorId), "../db/pepper.sqlite")

以下の部分で、データベースファイルをopenして、select文を発行してデータを検索し、
取得結果のうち電話番号を、この部品からの出力としています。
この部品は、文字列を出力する必要があるため、出力するデータをstr(row[2])と、文字列型に置換しています。

with sqlite3.connect(db_filename) as conn:
    c = conn.execute("select name,age,phone from people where name = '" + p + "'")
    row = c.fetchone()
    output_data = str(row[2])
    self.outputName(output_data)
    self.onStopped()
    conn.close

■実行
このシーケンスを実行すると、名前の受付に入ります。
ここでは、試しに「sasaki」と入力しました。
すると、データベースに登録してある電話番号通り、Pepperが「09022222222」と応答してくれました(図6)



図6 sqlite 内データ検索結果

■まとめ
以上で、Pepperでデータベースを扱う紹介は終了です。
今回は、予め準備しておいたデータを検索するだけに留まりましたが、データベースを扱えることがわかりましたので、
Pepperが経験したことをデータとして蓄積したり、そのデータを以前紹介した通信処理を用いてサーバにアップロードして
他のPepperとデータを共有していく等の用途として利用できると思います。

次回も引き続き、Pepperアプリケーションに触れて行く予定です。


弊社では全国各地の請負い(ご自宅)で作業協力頂ける、フリーランスエンジニアの方を常時探しております。
ご興味ある方は、お気軽にお問い合わせ下さい。


6 comments for “[Pepper] Pepperアプリケーション開発 ~データベースを利用してみよう~

  1. Shuichi Ito
    2015年1月14日 at 7:10 PM

    こちらを参考に実行してみたのですが、どうもimport sqlite3でエラーになっているようです。何か別途手順が必要なのでしょうか?

    [ERROR] behavior.box :FMBox::createPythonModule:0 _Behavior__lastUploadedChoregrapheBehaviorbehavior_12006587632__root__PythonScript_1: User class evaluation failed with the error:

    No module named _sqlite3

    • arit.dev.wp.staff
      2015年1月22日 at 5:57 PM

      Shuichi Ito様
      コメントのご投稿ありがとうございます。 ご返信が遅くなりました事、お詫び申し上げます。

      早速ですが、コメント頂きました件につきまして回答させて頂きます。
      sqlite3 については、Python のバージョン 2.5 で追加されたライブラリとなっておりますので、Pythonのバージョンが旧バージョンで有る場合には、ご連絡頂きましたエラーが表示されます。
      現在の Python のバージョンをご確認頂き、もし2.5未満でしたらアップデートして頂いた上で、再度お試し頂けますと幸いです。

      • Taro
        2015年3月12日 at 12:03 PM

        いつも参考になる記事をありがとうございます。

        私もItoさんと同様のエラーが出てしまいます。
        Choregraphe2.1.2.17 Windowsで動かしています。
        AldebaranのサイトからダウンロードしたChregrapheのファイルを見ると、pythonのバージョンは2.7と思われます。

        Choregrapheとは別にWindowsにインストールしたpython2.7.9の中にあるsqlite3関連ファイルを探してたところ、DLLsフォルダの中に_sqlite3.pydがありました。これがChoregrapheの方は抜け落ちてるのかしら、なんて思います。試しにそのままこのpydファイルをChoregraphe Suite2.1/lib/python2.7/Libの中にコピーしたところ

        DLL load failed: �w�肳�ꂽ���W���[�������‚����܂����B

        というエラー内容に表示が変わりました。

        もし解決策がわかりましたらお教え下さい。

        • arit.dev.wp.staff
          2015年8月27日 at 8:00 PM

          返信が大変遅くなり、申し訳ございません。
          調査したところ、Python2.6以降では、sqlite3は標準ではインストールされないようになっておりました。
          このため、Python とは別に、sqlite3 をインストールする必要がございます。

  2. t.shibano
    2015年3月17日 at 8:19 PM

    サイトいつもとても参考にさせていただいております。
    Shuichi Ito様と同じエラーが出ております。

    Choregrapheのバージョンが2.1.2.17でPytonは2.7なのですが、エラーになります。
    コマンドラインよりPythonを実行した場合は「import sqlite3」でエラーは発生しないのですが、
    Choregrapheのpythonボックスで「import sqlite3」を実行すると
    「[ERROR] behavior.box :FMBox::createPythonModule:0 _Behavior__lastUploadedChoregrapheBehaviorbehavior_11852653984__root__test_1: User class evaluation failed with the error:

    No module named _sqlite3」
    のエラーになります。
    何か確認すべき事項がありましたら教えて頂けませんでしょうか。

  3. Akira
    2015年8月27日 at 5:03 PM

    こちらを参考にしてみたのですが、Shuichi Ito さん同様
    import sqlite3でエラーが出ます。

    Choregraphe2.3.1を使用しています。

    [ERROR] behavior.box :FMBox::createPythonModule:0 _Behavior__lastUploadedChoregrapheBehaviorbehavior_1298293968__root__sample04_3: User class evaluation failed with the error:

    No module named _sqlite3

    この記事に書かれていること以外で何か手順が必要なのでしょうか?

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*