NAO のプログラミング環境の基本(1) クロス・ランゲージ、クロス・プラットフォームな開発環境
NAO のプログラミングフレームワーク (NAOqi)は 「ユーザープログラム(アプリ)は プロキシ を通して、各モジュールを操作する」 という基本コンセプトの上に構築されています。
まず簡単な例を紹介します。これは C++ で NAO のプログラムを書いた例です。
#include <alcommon/alproxy.h> int main() { try { std::string naoIPAddress = "192.168.1.32"; // NAO の IP アドレス AL::ALProxy postureProxy("ALRobotPosture", naoIPAddress, 9559); AL::ALProxy textSpeechProxy("ALTextToSpeech", naoIPAddress,9559); textSpeechProxy.callVoid("setLanguage", std::string("Japanese")); textSpeechProxy.callVoid("say", std::string("シット のポーズをします")); postureProxy.callVoid("goToPosture", "Sit",0.5); textSpeechProxy.callVoid("say", std::string("クラウチ のポーズをします")); postureProxy.callVoid("goToPosture", "Crouch",0.5); textSpeechProxy.callVoid("say", std::string("スタンド のポーズをします")); postureProxy.callVoid("goToPosture", "Stand",0.5); textSpeechProxy.callVoid("say", std::string("スタンド イニット のポーズをします")); postureProxy.callVoid("goToPosture", "StandInit",0.5); textSpeechProxy.callVoid("say", std::string("スタンド ゼロ のポーズをします")); postureProxy.callVoid("goToPosture", "StandZero",0.5); textSpeechProxy.callVoid("say", std::string("レイング バック のポーズをします")); postureProxy.callVoid("goToPosture", "LyingBack",0.5); textSpeechProxy.callVoid("say", std::string("レイング ベリー のポーズをします")); postureProxy.callVoid("goToPosture", "LyingBelly",0.5); textSpeechProxy.callVoid("say", std::string("シット リラックス のポーズをします")); postureProxy.callVoid("goToPosture", "SitRelax",0.5); } catch(...) {} return 0; }
(C++を使う場合、各モジュール特化したプロキシを使うことによる、より効率的なプログラミングの手法が用意されています。この点については後ほど説明する予定です)
以下は実行したときの NAO の動きです。
ここで AL::ALProxy がプロキシ です。プロキシ のインスタンスは特定のモジュールと通信をし、モジュール内の機能を操作、また状態を確認したり、イベントを受け取ったりすることができます。
モジュールは機能ごとに細分化されています。 一つの プロキシ のインスタンスは一つのモジュールと通信をすることができます。
上のプログラムの例では プロキシ のインスタンス postureProxy は NAO のポーズを移行させる機能を持つ ALRobotPosture モジュールと通信を、 textSpeechProxy は NAO に言葉をしゃべらせる機能を持つ ALTextToSpeech モジュールと通信をします。
モジュールは自分で作り、NAO に搭載させることもできますが、通常は標準のモジュールを使います。
標準モジュールと、それらが提供する機能は次のページから知ることができます。
https://community.aldebaran-robotics.com/doc/1-14/naoqi/index.html#naoqi-api
通信を介さないといけないというのは、一見、冗長な仕組みのような気がしますが、この基本コンセプトは次のような利点をもたらしています。
- クロス・ランゲージ
モジュールとの通信は特定のプログラミング言語に依存しない方法で行われています。このため、同じプログラミングの手法が複数のプログラミング言語でサポートされています。
フレームワークが標準的なプログラム言語としてサポートしているプログラミング言語は Python と C++ です。さらに .Net, Java, Matlab, Urbi もサポートしてます。
例えば日本語で「シットのポーズをします」と発声するプログラムを Python で書くと
# coding: UTF-8 from naoqi import ALProxy naoIPAddress = "192.168.1.32" # NAO の IP アドレス textToSpeechProxy = ALProxy("ALTextToSpeech", naoIPAddress, 9559) textToSpeechProxy.setLanguage("Japanese") textToSpeechProxy.say("シット のポーズをします")
という感じです。
- クロス・プラットフォーム
通信によってモジュールを操作する仕組みから複数のプラットフォームへの対応を実現しています。 NAO のプログラムは Windows, Mac OSX, Linux 上で開発することができます。 また作成したプログラムをそれぞれのプラットフォーム上で動かし、通信を通して NAO をコントロールすることもできます。 NAO 本体に自分で作ったプログラムを搭載し、外部からのコントロールに頼らず NAO に自律的な動作をさせることも可能です。 この場合もプログラミングの方法は同じです。(ただし、標準では NAO に搭載できるのは Python で記述されたプログラム、または C++ で書かれ Linux 向けにコンパイルされたモジュール・プログラムとなっています。)