アンオフィシャル - Aldebaran Robotics NAO とそのほかロボットについて

NAO とそのほかロボットについての情報を発信。ここの情報はアルデバラン非公式です。内容に誤りがあった場合はごめんなさい。

Aldebaran Robotics 社の NAO、そのほかロボットに関連する情報を発信します。

Pepper/NAO で ローカル SQLite ファイルにアクセス

Pepper, NAO の Python から SQLite の機能に直接アクセスできるようなので、ちょっとサンプルを作ってみた。

github.com

PythonSQLite モジュールは複数のスレッドで一つのコネクションを共有することができないようで、SQLite 処理専用のスレッドを作り、これが SQL リクエストを受けるようにしています。

サンプルの概要は以下のスクリーンショットの通り。SQLite query ボックスをコピー、いろいろな用途で再利用できるかと。

f:id:takuji_kawata:20150503012925j:plain

入力で渡された文字列を SQL コマンドとして実行するので、理屈的には更新系の処理も実行できそうですが、アプリ内のデータベースファイルがロボット本体内で書き換えられたとしても、それを外部からメインテナンスするのが若干面倒なので、基本はあらかじめ用意された DB ファイルをアプリ内でQクエリ実行して利用するというのが使い道かと思っています。

参考まで。

バーチャルロボットで Pepper のタブレットをエミュレート

バーチャルロボットでもタブレットのテストができるようにという挑戦です。

次の方法で実現しています

  • Pepper 内部と同じ Web サーバー nginx を PC にインストールして、Pepper 内部と同様の設定を行う
  • ShowImage などをまかなう ALTabletService が バーチャルロボットにはついてこないので、これと同名のサービスをオリジナルで作ってサービスに登録、各メソッドを PC 内部で動かすよう独自実装する
  • タブレット画面はとりあえずブラウザーで代用。将来、より洗練された方法を検討
  • qimessaging はゲートウェイサービスが動いていないと使えないようなので、これも PC 上で稼働させる。

まずは Mac で実現させています。他のプラットフォームも各種依存するソフトのインストールの手順さえわかれば対応可能かと思います。

とりあえず ShowImage, loadApplication ボックス、 loadUrl での特定の URL の読み込みなどできるようにしています。qimessaging API も動きます。ALTabletService からのイベントにはまだ対応できていません。ページを開く処理が要求されるたびに新しく ブラウザーのタブが開かれるなどまだまだ改善の余地はありますが、まずはコンセプトとして公開します。

github.com


提供ファイルの「インストール手順」に従い設定、「エミュレータ起動手順」に従いエミュレータを起動、起動できていれば、バージャルロボットでタブレットサービスを使ったアプリを実行してもエラーになりませんし、showImage ボックスなどはブラウザーが対応します。

開発と言える開発はまだしていません。とりあえずセットアップ方法を導き出すまでやってみたということで。
一つのアプローチとして参考にしていただけると幸いです。また開発部分助けてくれる方いれば歓迎です。

NAOqi フレームワークだけで実現させたロボット間の同期

ちょっと前に試したものですが


youtu.be


youtu.be

ソースコードも公開していますが、アプリからFTP でパッケージファイルを別のロボットに送りつけていたりとちょと強引なことしています。
アプリのできとしてはまだまだ改善の余地ありです、、

Pepper 狭いところを通れるように

Pepper はレーザーセンサー、3D深度センサーなどで周囲を確認、移動中ぶつかりそうになると自動停止します。
この限界距離 40センチですが、この距離が原因で狭い場所を通れない場合があります。
解決方法の一つはこの限界距離を短くするということ。こんな感じの Python ボックスを作ってあげることで簡単に変えることができます。

class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self)
        self.initialized = False

    def _resetTheSecurityDistance(self):
        if self.initialized :
            self.logger.info("セキュリティー距離を元にもどします")
            self.motion.setOrthogonalSecurityDistance(self.od)
            self.motion.setTangentialSecurityDistance(self.td)


    def onLoad(self):
        self.motion = ALProxy("ALMotion")
        self.od = self.motion.getOrthogonalSecurityDistance()
        self.td = self.motion.getTangentialSecurityDistance()
        self.initialized = True

    def onUnload(self):
        self.logger.info("Unloading script box")
        #put clean-up code here
        self._resetTheSecurityDistance()

    def onInput_onStart(self):
        msg = "変更前:直行安全距離 %.2f  接線安全距離 %.2f" % (self.od,self.td)
        self.logger.info(msg)

        self.motion.setOrthogonalSecurityDistance(float(self.getParameter("Orthogonal Security Distance")))
        self.motion.setTangentialSecurityDistance(float(self.getParameter("Tangental Security Distance")))

        newod = self.motion.getOrthogonalSecurityDistance()
        newtd = self.motion.getTangentialSecurityDistance()
        msg = "変更後:直行安全距離 %.2f  接線安全距離 %.2f" % (newod,newtd)
        self.logger.info(msg)

        self.ready()


    def onInput_onStop(self):
        self._resetTheSecurityDistance()
        self.onStopped() #activate the output of the box

ボックスには 「Orthogonal Security Distance」、と「Tangental Security Distance」というパラメータを持たせます。
ボックスへのパラメータの追加の仕方は
http://tkawata.hatenablog.com/entries/2015/04/02
を参考に。
「Orthogonal Security Distance」は前方の障害物までの距離でデフォルト 0.4、「Tangental Security Distance」は周辺の障害物までの距離でデフォルト 0.1。
なお、上記ボックスはアンロードされる時に元の設定値に距離を戻すようにしています。

BasicAwareness やオートノマスライフで子供を見つけやすくするちょっとしたトリック

BasicAwareness を使っているときや、オートノマスライフが起動している時、気づけばロボットが上の方を向いていて子供とかが視界に入ってくれないということがよくあります。
これは音や画像の変化を検出した時、そちらの方向を向くと同時に人物の顔を検出しやすいように頭をおおよそ成人の人と目線を合うぐらいの高さまで見上げるという動作をしているということによるもののようです。
例えば来客が子供が中心の時など、この見上げる動作はかえって不都合だったりします。このような状況において取れるトリックの一つはロボットを「ちょっと高いところにいる」と思わせるということです。

ALAutonomousLifeProxy.setRobotOffsetFromFloor() がこの目的で使えます。

例えばこんなスクリプトを持つPython ボックスを作成します。

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

    def onLoad(self):
        self.al = ALProxy("ALAutonomousLife")

    def onUnload(self):
        pass

    def onInput_onStart(self):
        self.al.setRobotOffsetFromFloor(0.8)
        self.onStopped() 
        
    def onInput_onStop(self):
        self.onUnload() 
        self.onStopped() 

このボックスを呼び出して以降、オートノマスライフや BasicAwareness は動きや音を検出したときそっちの方向を向いた後少し下の方を向くようになるかと思います。0.8 のところをいろいろ変え、環境に応じて最適値を見つければいいのではと思います。
将来的には BasicAwareness の機能自体が上下全体を見渡すような動作をすべきではとは思います。それまでの暫定策ということで。

Choregraphe Dialog ボックスの音声認識閾値の変更

(2016/10/15 補足 NAOqi 2.4.2 以降を利用(Pepper の現行バージョンは 2.4.3) は次の記事も参考にしてください

Dialogの認識率変更の不具合 | SoftBank Robotics Community

Choregrahe Dialog の音声認識について、いまいち期待通りに認識してくれないなどの理由で Confidence Threshold (音声認識閾値)を変更したくなることがあります。
NAOqi のAPI としてはこの閾値を変更するインターフェースが用意されていますが、標準ボックスライブラリにはこれを変更できるものがなさそうです。

次のようなコードを持つスクリプトボックスを作ることで対応してみました。

class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self)
        try:
            self.prevThreshold = None
            self.dialog = ALProxy("ALDialog")
        except Exception as e:
            self.dialog = None
            self.logger.error(e)

    def onLoad(self):
        if self.dialog != None:
            self.prevThreshold = self.dialog.getASRConfidenceThreshold()

    def onUnload(self):
        if self.dialog != None and self.prevThreshold != None:
            self.dialog.setASRConfidenceThreshold(self.prevThreshold)


    def onInput_onStart(self):
        if self.dialog != None and self.prevThreshold != None:
            t = self.getParameter("ASR confidence threshold")
            self.dialog.setASRConfidenceThreshold(t)
            self.logger.info("Dialog ASRConfidenceThreshold changed fro :%0.2f to %0.2f" % (self.prevThreshold, t))
            self.onStopped()

    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

ボックスパラメータ ASR confidence threshold で値を変更できるようにしています。ボックスが呼び出されると設定された値に変更。ボックスがアンロードされるタイミングでもとの値に戻しています。
アプリ起動時にこれを実行、その後 Dialog を呼び出すと Dialog ボックスはこのボックスで指定された音声認識閾値音声認識をしてくれるはずです。

デフォルトでは 0.5、NAO の場合 0.45 から 0.46 ぐらいが日本語認識において最も使い勝手がいいという噂があります、、

参考まで、ボックスパラメータの追加方法:
f:id:takuji_kawata:20150402122532p:plain

f:id:takuji_kawata:20150402122559p:plain

NAOqi ライブストリーミングについて

Pepper / NAO のカメラ、マイクの情報をライブでストリームできないかというお問い合わせをよく受けます。

「できるはずです。カメラ、マイクのライブ情報を取得するサンプルは

Capturing audio and video — Aldebaran 2.1.2.17 documentation

で確認できます。これをライブストリームするためには例えば ffmpeg などが使います。」

といった感じでお伝えしているのですが、実際自身で試したことがなく、どこまで実現性があるのか自分自身疑問ではありました。

 

で作ってみました。カメラ、マイクの情報をライブで取得し、PC に表示、ならびにマイクからの音を再生するところまで作ってみました。

f:id:takuji_kawata:20150327233256p:plain

C++ SDK を利用。UI 部分はQtで作っています。

ソースコードgithub にアップしました。

github.com

クロスプラットフォームな Qt ならびに NAOqi SDK を使っていますので、理屈上 Windows, Mac, Linux で動くはずです。ただ現状 Mac でしか動作確認はしていません。

 

ソースコードコンパイル、実行する上で幾つか注意があります。

  • 開発ツールは Qt Creator を使いました。
  • NAOqi は内部で Qt フレームワークを使っています。Qt Creator が使う Qt フレームワークのバージョンは NAOqi が利用している Qt ライブラリーとバージョンを一致させてください。 NAOqi が利用している Qt ライブラリーのバージョンは NAOqi SDK のディレクトリの中の lib ディレクトリのの中を調べればわかるかと思います。
  • NAOqi と連携するところは別ライブラリとしてコンパイルします。ビルドをするためのバッチを buildNAOqiInterface.sh というスクリプトで用意しました。Qt Creator でプロジェクトをビルドする前に、このスクリプトを実行し、NAOqi と連携するライブラリを生成しておきます。
  • 実行するには Mac の場合、環境編す DYLD_LIBRARY_PATH を編集します。Qt Creator の プロジェクト設定で環境変数を追加することで対応できます。DYLD_LIBRARY_PATH にNAOqi C++ SDK をインストールしているディレクトリ配下の /lib ディレクトリとプロジェクトディレクトリの一階層上に上がり build/lib ディレクトリを追加します。これらは DYLD_LIBRARY_PATH にもとから入っている環境変数よりも前に来るように定義します。(アプリとしてパッケージするときには install_name_tool を使うことでこのあたりの煩わしさを解消できるようです。)

 

PCに来た情報をインターネットにライブストリームするところはまだ作り込みできていません。まずは時間を見つけて音声周りの改善をもう少し検討したいと思っています。