NAO ハンズオン(基礎編)開催します
以前告知していた NAO ハンズオン、第一回目を開催してみます。
イベント告知ページ
social-robots-japan.connpass.com
すでに参加の表明をいただいている方が何名かおり、告知ページからの募集は2枠だけですが、、
これからも定期的に勉強会、開催できればと思っています!
JSON データを NAO/Pepper で扱うときの文字列の問題
忘却録としてのメモです。
過去何度か JSON データを NAO/Pepper で扱うと文字化け問題が起こり、都度場当たり的な対応をしていました。根本的に解決する方法がわかればいいのですが、そこに行き着くまでに、まず、同じことを何度も調べ直さなくてもいいように少し場当たり的だけど簡単な解決方法を残しておきます。
問題を引き起こす可能性が高いのは
json.loads()
これは JSON 形式の文字列を Python のオブジェクトに変換してくれる非常に便利なメソッドですが、ここで変換された値が文字列の場合、unicode 文字列になっていると。NAO/Pepper の TTS などには utf-8 文字列を渡してあげる必要があり、ここでデータ形式の不整合が発生します。
これに対する少し場当たり的だけど最も簡単な解決方法は、取り出したデータを都度 .encode("utf-8") として utf-8 でエンコードしなおしてあげると
以下、確認用のテストコード。'{"text":"おはよう"}' という文字列が来た想定で、要素 text の値を取り出し、変数 textValue に代入
import json jsonText = '{"text":"おはよう"}' data = json.loads(jsonText) textValue = data['text'].encode('utf-8')
(Pepper) レーザーセンサー活用サンプル、近付いてきている物体を捉える
つい先日 Pepper アプリ開発ハッカソン、「Pepper at BEAMS JAPAN Hack 2016」に参加しました。
そこで実装した機能の一部、色々なシーンで流用ができそうな部品を github に公開しました。
これはPepper のレーザーセンサーを活用して周辺で近づいてきたものを捉えるボックスサンプルです。ハッカソンではこれを利用して近づいてきたものの方を向き、人物だったら「すいませんなんでもありせん」などと言って振り向いて立ち去っていくという動作をさせています。ちなみにハッカソンで作ったアプリは「コミュ障の Pepper 」でした、、
ボックスの出力からは検出された物体の角度が出てきます。ハッカソンではその方向に人物がいるかどうかを見て、人がいたら180度回転してモゴモゴ言いながら立ち去っていくと、、
レーザーセンサーを使った理由はハッカソン会場、人が多い場所なので、顔認識だけだと近づいてきた人だけを認識するということが期待通りにいかないと思われたからです。
このボックス、用途としては例えば監視ロボットとして Pepper を使うとか。前180度(左右30度のブラインドゾーンがあるけど)を同時に捉えることができるので、カメラより視野が広いのと真っ暗闇でも機能するので、夜間でも大丈夫。
遠方を無視するパラメータと、首を近づいてきた物体の方に向けるかどうかのパラメータがあります。そのあたりはサンプルプログラムにコメントで残しておいたので確認ください。
ハッカソンメイドの即席なのでバグはあるかも。その時はごめんなさい。何れにしてもレーザーセンサーに直接アクセスして情報を取ってくる例、少ないかなと思い、参考になればと思います。
ハッカソンではこれ以外に、チャットサービスに、テキスト / 写真を投稿する機能を用意、これも再利用できそうな形で公開できればなと思います。ちなみにハッカソンで作ったアプリは、人と出会うたび Pepper が「やべえ変な奴きた」みたいなことチャットサービスに投稿したり、勝手に写真撮って投稿して「こいつのファッションどう思う?」みたいな暴言を吐きまくってました、、
審査員も含め皆さんに楽しんでいただき、それなりに評価もいただきよかった。
アイデアを具現化するためのテクノロジーが骨組ならば、喋らせることばや動作が血や肉ですね。これらが合わさって一つの作品になる。そんなことが体験できた貴重な機会でした。
OpenNAO OS VirtualBox を使って NAO (Pepper) を機能拡張してみる
Softbank Robotics デベロッパーコミュニティーサイト(旧アルデバラン コミュニティーサイト)から入手できるソフトウェアの一つに 「OpenNAO OS VirtualBox」なるものがあります。 NAO/Pepper は Gentoo Linux 上で NAOqi OS が動いているわけですが、「OpenNAO OS VirtualBox 」はこの Gentoo Linux 部分について NAO と同様のものを VirtualBox 上の仮想環境で動かすことができるものです。 肝心の NAOqi が入っていないので、ロボットのエミュレータとしては使えないのですが、代わりにコンパイラなどの開発に必要なツールがインストールされています。
OpenNAO OS VirtualBox 2.1.2 とリアルロボットのアプリ開発に関連した機能の比較
名前 | カーネル | NAOqi | C/C++コンパイラ | emerge | pip |
---|---|---|---|---|---|
OpenNAO OS VirtualBox 2.1.2 | 2.6.33.9-rt31-aldebaran-rt | no | gcc version 4.5.3 | yes | yes |
NAO (NAOqi 2.1.4) | 2.6.33.9-rt31-aldebaran-rt | yes | no | no | no |
Pepper(NAOqi 2.4.3 | 3.10.33-rt33-aldebaran-rt | yes | no | no | no |
pip は Pythonのパッケージの管理ツール。例えば、公開されている Python パッケージを NAO の中で動かしたい場合、OpenNAO OS VirtualBox 2.1.2 で構築したインストール構成を移行するという手法が取れそうです。
emerge は Gentoo Linux のパッケージ管理ツール。これを使って特定の Linux ベース機能を拡張することができそうです。
Cコンパイラは Linux プラットフォーム内のライブラリを使うようなネイティブコードのコンパイルに使えそうです。ただ NAOqi が 入っていないので、NAOqi と連携するネイティブプログラムのコンパイルに使うのは少し難しそうです。 ネイティブモジュールの開発には C++ NAOqi SDK を使うのが常套手段です。
OpenNAO OS VirtualBox を使って ffmpeg にネットワーク機能、h264 エンコーダなどの機能を追加する
ffmpeg は動画と音声を変換することのできるソフトウェアーです。動画ファイルから、音声だけを抜き出したり、動画ファイルを複数の画像ファイルで切り出したり、様々なことをコマンドラインツールを使って行うことができます。このツール NAO/Pepper の中にも組み込まれているのですが、幾つかの機能が落とされています。特許やライセンスが関わっている機能なので、おそらく意図的に落としているのでしょう。 商用でアプリ配信をする場合、これら機能を使うこと一定の配慮が必要そうですが、デモンストレーショや個人での利用においては、特に問題ないかと思います。 ffmpeg の機能拡張版を OpenNAO OS VirtualBox 2.1.2 で作ってみましょう。
次から手順を説明します。
1. OpenNAO OS VirtualBox 2.1.2 のダウンロード
OpenNAO OS VirtualBox 2.1.2 は Softbank Robotics コミュニティーサイトより入手できます。(コミュニティーサイトにアクセスするにはまず コミュニティーサイトにユーザーされている必要があります。ユーザー登録は
Create New Customer Account から行います)
コミュニティーサイト、リソースページより OpenNAO OS VirtualBox 2.1.2 をダウンロードします。
https://community.ald.softbankrobotics.com/en/resources/software/
2. VirtualBox で OpenNAO OS VirtualBox 2.1.2 を実行
VirtualBox のインストール、セットアップについては外部のサイトを参考にしてください。
OpenNAO OS VirtualBox 2.1.2 は GUI を持っていません。基本、操作は全てコマンドラインで行うことになります。ログイン ID は nao、パスワードも nao でログインできます。
この後の作業を進める前に一つ変更しておきたい設定があります。仮想環境のネットワーク設定を開き、接続方法を Bridge にします。
変更したら一旦仮想環境を再起動、再度ログインしたら ifconfig コマンドを実行 IP アドレスを調べておきます。
VirtualBox から開かれる仮想環境のターミナルはコピー&ペーストができないなど何かと使い勝手が悪いので、以降の作業は ssh で仮想環境にアクセスして操作することをお勧めします。
3. emerge を実行してカスタム ffmpeg を作る
sudo USE="faac network librtmp x264 static-libs" emerge media-video/ffmpeg
ここでは ffmpeg にネットワークストリーミング機能、h264 エンコーディング機能、aac エンコーディング機能、rtmp ストリーミング機能を有効にしています。emerge、と各オプションの詳細については外部サイトを参考にしてください。
4. NAO に持って行く
構築されたファイルは /home/nao/opennao-distro/packages 配下に保存されています。これを NAO に持って行きましょう。
まずはファイルが複数あるので、移動用にアーカイブします。
仮想環境にて
cd /home/nao/opennao-distro/packages zip -r ../../myffmpeg.zip media-libs media-video
次にいったん PC にファイルを持ってきます。
PC にて
scp nao@<仮想環境のIPアドレス>:./myffmpeg.zip ./
これを NAO に持って行きます。
PC にて
scp ./myffmpeg.zip nao@<NAOのIPアドレス>:./
5. NAO に配置
ssh で NAO にログイン
ssh nao@<NAOのIPアドレス>
次のコマンドで myffmpeg ディレクトリを作成、配置
mkdir myffmpeg mv myffmpeg.zip myffmpeg cd myffmpeg/ unzip myffmpeg.zip tar -jxvf media-libs/faac-1.28-r1.tbz2 tar -jxvf media-libs/libmp4v2-1.9.1.tbz2 tar -jxvf media-libs/x264-0.0.20110426.tbz2 tar -jxvf media-video/ffmpeg-0.7.8.tbz2
どのように使えるのか?
今回、ffmpeg にライブエンコーディングの機能とネットワークストリーミングの機能を追加しました。これらを使って NAO のカメラ画像、マイク音声をストリーミングサーバーを介して遠隔に届けることが可能です。これはつい先日行われた「DO-IT Japan2016」の「Pepperのプログラミング教室」の中で遠隔地から会場の状況を確認し、ロボットを遠隔操作できる仕組みとして試験的に導入されました(この時は Pepper を使用)。
(参考:「DO-IT Japan2016」の「Pepperのプログラミング教室」に関するロボットスタートの記事
障害のある学生たちにICT教育を行う「DO-IT Japan」でソフトバンクがPepper講義 | ロボスタ )
今回有効にした h264 エンコーダなどは商用利用においては特許やライセンスなどでクリアしなければならないところがあるのですが、デモ出展、試験導入的な利用では問題ないでしょう。その他 OpenNAO OS VirtualBox 色々使い道ある気がしますので、是非一度お試しいただければと思います!
WebSocket サーバーを NAO 上で稼働させる
Android や iPhone と NAO を連携させたい。方法はいくつもありますが、NAO 本体で WebSocket サーバーを立ち上げてしまうというのはその中の一つ、比較的簡単に実現できるので、サンプルプログラムを作ってみました。
(なお、サンプルプログラムは NAO でしか動作確認をしていませんが、Pepper でも同様に動くと思います)
WebSocket サーバーを NAO 本体内で立ち上げるサンプルプログラム:
サンプルプログラムでは WebSocket サーバーが 9091 番ポートでリクエストを待っています。
サンプルプログラムの使い方
ChoregrapheProject 内のアプリ、NAOWebSocketServerSample を NAO で実行(これで WebSocketサーバーが立ち上がります)
↓
sample.html をPC のブラウザーなどから開く
↓
ロボットの IP アドレス:9091 を NAO IP Address に入力
↓
[Connect] ボタンを押す。
↓
Say にテキストを入力して [Say] ボタンを押すと、NAO が発話、また NAOの接触センサーを触ると、それに応じて From NAO テキストボックスにメッセージが表示さる。
sample.html のスクリーンショット:
サンプルプログラムの実装のについて
WebSocket サーバーは SRNAOWebSocketService というカスタムサービスで稼働させています。 実装コードはコレグラフプロジェクトの services/SRNAOWebSocketSerivce.py にあります。サービスは クライアントからのメッセージを ALMemory のキー SRNAOWebSocket/from で通知、また SRNAOWebSocket/to にイベントを投げることでクライアントにメッセージを伝播します。
カスタムサービスとして実装する利点は、専用のプロセスが立ち上げるので、何か不具合が発生した場合も NAOqi 本体へ致命的な影響を与えないことです。Choregrapheで普通に作ったプログラムは NAOqi 本体内で実行されるため、特定の処理が致命的な障害を起こすと NAOqi 自体が止まってしまいます。 常駐処理系はカスタムサービス化するのがオススメです。
カスタムサービスの起動、停止はサンプルプロジェクト内「Start Service」ボックスで行っています。
( カスタムサービスについては次も参考:
qiita.com )
まとめ
クライアント連携の手法としてはこれ以外にも qimessaging を使う方法などありますが、普通に使う場合 NAO 本体のパスワードで basic 認証を通す必要があったりと使い勝手が良くない場面もあるかと思います。サンプルでは認証系の処理は入れませんでしたが、NAO に接続するために独自の認証手順を取らせたい場合などに今回の手法、使えるのではと思います。
参考になれば幸いです!
NAOqi マイク -> PCスピーカ サンプルコードの改善
で紹介していたサンプルプログラムのマイク音声処理側の実装を大幅に書き換えました。
最新のコードは同じ github にアップしています。
音声の遅延の問題は大幅に改善されました。結局これまで Qt のライブラリの使い方がよくありませんでした。これを改めることで実装がシンプルになるとともに遅延のかなり改善しました。音切れがときどき発生するのがまだ改善したい部分ではあります。
と組み合わせて、ストリーミングサーバーにつなげれば遠隔と Pepper/NAO を通してお話ができるようになりそうです。
ストリーミングサーバーとの接続部分あまり詳しくないので、このあたりは知人の協力を得つつチャレンジしたいと思っています。
PC のマイク音声をライブで Pepper/NAO のスピーカーに送るサンプル
PC のマイク音声をライブで Pepper/NAO のスピーカーに送るサンプルを作ってみました。
NAOqi API の ALAudioDeviceProxy::sendRemoteBufferToOutput() を使っています。
ソースコードを次に公開しています。
実装してみたインプレッションとしては、遅延が結構あります。2秒ぐらい遅れてスピーカーから音声が再生されます。NAOqi 側のバッファリングの問題かと思うのですが、この遅延を短くする方法はまだ見つかっていません。
クロスプラットフォームな Qt ならびに NAOqi SDK を使っていますので、理屈上 Windows, Mac, Linux で動くはずです。ただ現状 Mac でしか動作確認はしていません。
ソースコードはコンパイル、実行する上で幾つか注意があります。
C++ SDK Installation — Aldebaran 2.1.3.3 documentation
- 開発ツールは 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 ディレクトリとプロジェクトディレクトリの NAOqi 配下の build/lib ディレクトリを追加します。(アプリとしてパッケージするときには install_name_tool を使うことでこのあたりの煩わしさを解消できるようです。)