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

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

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

NAOqi 日本語での技術情報

Pepper の発表以来、その開発フレームワークで利用されている NAOqi も日本でも注目されるようになりました。

現在多くの方がその API 仕様や各技術情報の日本語化に取り組んでいるとともに、独自に情報を発信しています。

以下は「ロボットスタート」 (http://robotstart.co.jp/about.html) さんが翻訳された NAOqi のライブラリの情報とリンク集です。

コレグラフボックスライブラリ一覧【standard】 http://qiita.com/robotstart/items/fc922177d98e4f28d0ee

コレグラフボックスライブラリ一覧【advanced】 http://qiita.com/robotstart/items/00088ff7af1f0af44728

コレグラフボックスライブラリ一覧【tablethttp://qiita.com/robotstart/items/612ead54876fb6328585

NAOqi / コレグラフセンサー 一覧 http://qiita.com/robotstart/items/fdab274fcc23a4e9777f

コレグラフ開発者向けリンク集 http://qiita.com/robotstart/items/7d90b6d2bf6bf2efb715


役に立ちますね!

2足歩行研究プラットフォームとしての NAO の可能性

NAO にはあらかじめ用意された2足歩行プログラムがあり、比較的簡単に2足歩行させることができます。 しかしちょっとした段差で転びますし、歩行中押されたりすると簡単に転びます。

NAO をより洗練した2足歩行ロジックを確立するための研究プラットフォームとして使うことはできないでしょうか? わたしはできると思っています。 NAO の胴体には加速度センサーと、角度センサーが内蔵されており、胴体の傾きや、突発的な動きか発生した時の移動量をリアルタイムで捉えることができます(センサーリスト)。 また両足の裏にはそれぞれ前後、左右で合計4つの圧力センサーが内蔵されており、それぞれの足にかかっている重量をリアルタイムに捉えることができます(センサーリスト)。 また NAOqi フレームワークには各関節をより低レベルでコントロールするために DCM というインターフェースが用意されています。 これを使って予め用意しておいた動作をリアルタイムに調整することもできます。

たとえばNAOとおなじ重量配分、関節の自由度を人間に課して、NAO が搭載するのと同じセンサーで、様々な環境での歩行方法を計測、ここから得た情報を機械学習させ、この結果を NAO に取り込むとかできないでしょうか? ここ最近、人工知能研究は画像認識や、音声認識といった何らかの情報を分類するという分野に目覚ましい成果を出してきているようですが、こういった研究成果がロボットを中心とした機械制御の分野に応用されること、またその研究開発プラットフォームとして NAO が使われるようになるといいなと思っています!

参考まで、歩行時の各センサーの値をリアルタイムに取得、表示するプログラムを作ってみました。 実際動かしてみると、ネットワーク経由でデータを取っていることもあり、データがドロップしたり、遅延したりというところも見受けられましたが、同じ値は NAO 本体で補足、処理させることも可能です。 ここで見られる遅延はリアルタイム制御における問題にはならないと思っています。

# -*- coding: UTF-8 -*-

import matplotlib.pyplot as pyplot
import matplotlib.animation as animation
from naoqi import ALProxy


global AX_lf
global AX_lr
global AX_c
global AX_rf
global AX_rr
global AX_plots
global NAO_memoryProxy
global NAO_watchDataList

# animation
def _update_plot(i):

	dataList = NAO_memoryProxy.getListData(NAO_watchDataList)
	if len(NAO_watchDataList) != len(dataList):
		return

	#inertial sensors
	angleX = dataList[0]
	angleY = dataList[1]
	gyroX = dataList[2]
	gyroY = dataList[3]
	gyroZ = dataList[4]

	#left foot wight	
	l_fl = dataList[5]
	l_fr = dataList[6]
	l_rl = dataList[7]
	l_rr = dataList[8]

	#right foot wight
	r_fl = dataList[9]
	r_fr = dataList[10]
	r_rl = dataList[11]
	r_rr = dataList[12]
	
	 #remove previous frame
	while len(AX_plots) > 0:
		AX_plots[0].remove()
		AX_plots.pop(0)

	AX_plots.append(AX_c.scatter(angleX, angleY, color="r"))
	AX_plots.append(AX_c.scatter(gyroX,gyroY, color="b"))

	x = (1,2)
	width = 0.8

	AX_plots.append(AX_lf.bar(x, (l_fl,l_fr), width, color='r', edgecolor='k', align="center"))
	AX_plots.append(AX_lr.bar(x, (l_rl,l_rr), width, color='r', edgecolor='k', align="center"))
	AX_plots.append(AX_rf.bar(x, (r_fl,r_fr), width, color='r', edgecolor='k', align="center"))
	AX_plots.append(AX_rr.bar(x, (r_rl,r_rr), width, color='r', edgecolor='k', align="center"))

	AX_lf.legend(("L-Front",))
	AX_lr.legend(("L-Rear",))
	AX_rf.legend(("R-Front",))
	AX_rr.legend(("R-Rear",))
	AX_c.legend(("Inertial","Gyro",)) 


if __name__ == '__main__':
	import sys
	args = sys.argv
	robotIp = "localhost"
	robotPort = 9559
	if len(args) > 1:
		robotIp = str(args[1])
	if len(args) > 2:
		robotPort = int(args[2])

	NAO_memoryProxy = ALProxy("ALMemory",robotIp,robotPort)

	fig =  pyplot.figure()

	AX_lf = fig.add_subplot(2,4,1)
	AX_lr = fig.add_subplot(2,4,5)
	AX_c = fig.add_subplot(1,2,2)
	AX_rf = fig.add_subplot(2,4,2)
	AX_rr = fig.add_subplot(2,4,6)

	AX_c.set_xlim([-1.5, 1.5])
	AX_c.set_ylim([-1.5, 1.5])

	AX_lf.set_ylim([0,3.0])
	AX_lr.set_ylim([0,3.0])
	AX_rf.set_ylim([0,3.0])
	AX_rr.set_ylim([0,3.0])
	AX_lf.set_xticks((1,2))
	AX_lf.set_xticklabels(("L","R"),)
	AX_lr.set_xticks((1,2))
	AX_lr.set_xticklabels(("L","R"),)
	AX_rf.set_xticks((1,2))
	AX_rf.set_xticklabels(("L","R"),)
	AX_rr.set_xticks((1,2))
	AX_rr.set_xticklabels(("L","R"),)
	
	NAO_watchDataList = [
		"Device/SubDeviceList/InertialSensor/AngleX/Sensor/Value",
		"Device/SubDeviceList/InertialSensor/AngleY/Sensor/Value",
		"Device/SubDeviceList/InertialSensor/GyroscopeX/Sensor/Value",
		"Device/SubDeviceList/InertialSensor/GyroscopeY/Sensor/Value",
		"Device/SubDeviceList/InertialSensor/GyroscopeZ/Sensor/Value",
		"Device/SubDeviceList/LFoot/FSR/FrontLeft/Sensor/Value",
		"Device/SubDeviceList/LFoot/FSR/FrontRight/Sensor/Value",
		"Device/SubDeviceList/LFoot/FSR/RearLeft/Sensor/Value",
		"Device/SubDeviceList/LFoot/FSR/RearRight/Sensor/Value",
		"Device/SubDeviceList/RFoot/FSR/FrontLeft/Sensor/Value",
		"Device/SubDeviceList/RFoot/FSR/FrontRight/Sensor/Value",
		"Device/SubDeviceList/RFoot/FSR/RearLeft/Sensor/Value",
		"Device/SubDeviceList/RFoot/FSR/RearRight/Sensor/Value"]

	AX_plots = [] 

	# start animation
	ani = animation.FuncAnimation(fig, _update_plot, frames=600, interval = 10) 
	pyplot.show()



NAO 歩行に関係するセンサー - YouTube


NAOqi ダイアログ機能

NAOqi 2.1 にダイアログという機能があります。

こう聞こえたら、こう答えて、次にこう質問して、その質問がこうだったら次にこうするみたいな感じで NAO や Pepper の動き方を定義できるというものです。

Aldebaran の CEO ブルーノ・メゾニエのプレゼントを聞いているとダイアログというキーワードが何度か出てくるんですが、多分にこれのことを言っているのかなと。

ざっくりどんな感じで定義するのかというと

まず、相手から言われる言葉をグループ化して定義します。たとえば Yes というグループで「はい」、「いいね」、「そうしよう」。 hello というグループで「こんにちは」、「おはよう」、「どうも」といった具合。定義ファイルにはこんな感じで記述します。

concept:(yes) [はい そうですね 賛成です そうしましょう ぜひ ぜひぜひ]
concept:(no) [いいえ いやです やめときます またこんど いまはいいです]
concept:(how) [げんきですか ちょうしどう げんき]
concept:(hello) [こんにちは おはよう どうも] 

 

そして、それぞれのキーワードを聞いたときに何をするかを定義。たとえば hello で定義されたキーワードを聞いた時、あいさつのジェスチャーをして「こんにちは」と返事をし、次に howAreYou の処理に移動するというのはこんな感じで書きます

 

u:(~hello) ^start(animations/Stand/Gestures/Hey_1) こんにちは ^wait(animations/Stand/Gestures/Hey_1) ^goto(howAreYou)    

ここで howAreYou の処理はこんな感じで記述。ここでは、質問を尋ねるジェスチャーをして、「調子はどうですか」と質問、その結果を受けて処理を切り替えています。(~happy) (~sad), (~repeat)は (yes),(no), (hello) 同様 (happy), (sad), (repeat) としてあらかじめキーワードを登録しておきます。

proposal: %howAreYou ^startTag(show) 調子はどうですか?
    u1:(~happy) よかったです! ^goto(favoriteColor)
    u1:(~sad) ざんねんです  ^nextProposal
    u1:(~repeat) もう一回いってください ^sameProposal

一連の操作は Choregraphe で行えます。ダイアログ機能は一つのボックスとして処理されるので、他の機能との連携も簡単です。

f:id:takuji_kawata:20141026140042j:plain

 

NAOqi 2 からみる Aldebaran Robotics の目指している方向性

 NAOqi 2 の新機能を通して、Aldebaran Robotics のロボットと、それを取り巻く様々な新しい仕掛けを理解しようとしています。 

まず、その方向性としてはっきりと読み取れるのが、一般家庭で使えるロボットを目指していること、そして、ロボットの上で動くアプリを作り、販売するという形で開発者が自由に参入できる仕組みを作り、市場の活性化を目指しているということです。ブルーノ・メゾニエ自身が色々な場面でいっている、スマートフォーンの成長モデルが次はロボットにくるいうストーリー、これが現実のものになるための基盤作り、そんな感じでしょうか。

NAO にはもともと NAOStore というアプリストアを通したアプリの流通の仕組みなどあり、その方向性を目指していたことは明らかですが、今回のリリースはこのあたりを一度仕切り直して、開発者ではない、一般ユーザーの使用にも堪える形で再構築したといった感じです。

以下、これまで見てきたなかで気づいた点をいくつかあげます

 

気づいた点1.アプリストアが一新された

新しいアプリストアは https://cloud.aldebaran-robotics.com/ 。NAOqi 2 以降のフレームワークを使う Aldebaran Robotics のロボット向けのアプリはここを通して流通されるようです。

アプリストアのメニューを見ると、既に Aldebaran Robotics のロボット、Pepper と Romeo の名前も見て取れ、Pepper 向けアプリもここを通して流通されるものと想像できます。

 

気づいた点2.アプリの基本情報をプロパティとして持つように

アプリ毎に、そのアプリの基本的な内容を示す情報が付与されるようになり、これを編集する機能が Choregraphe にも備わりました。アプリの名前やバージョン、概要などの情報に加え、どのロボット(NAO, Pepper やそれぞれのバージョン)を動作対象としているか、対応する言語は何か(日本語で対話ができるかなど)、また後で説明する、アプリ起動の条件などを設定できます。

 f:id:takuji_kawata:20140703000345p:plain

 

気づいた点3.アプリの起動、終了に関するフレームワークが整理された

アプリはアクティビティというもので構成されます。アクティビティーには一連の動作がプログラムされます。 アクティビティは大きく2つのタイプに区別されるようになりました。一つ目は Interactive というタイプで、もう一つは Solitary というタイプです。Solitary とは一人ぼっちという意味で、つまりは人と会話などでやり取りをすることがないタイプのアクティビティです。対してInteractive は人とやり取りするタイプのアクティビティ。Interactive は、始まると、そのアクティビティが終了状態になるまで、他のアプリが割り込むことはありません。対して Solitary タイプのアクティビティは途中で割り込まれることがあります。アクティビティにはそれぞれ起動条件を設定できるようになっています。これを設定す場所は前述のプロパティで、特定の言葉を聞いたことをトリガーとしたり、カメラが人の存在を認識したのをトリガーとしたり、逆に何秒間人の存在が確認でなかった場合という条件でトリガーを設定することもできるようになっています。

f:id:takuji_kawata:20140703002114p:plain

 

気づいた点4.オートノマスライフ (ALAutonomousLife)

上記、 NAO の周辺の状況を常に監視し、条件に応じてインストールされている複数のアプリから適切なものを選択、起動するのが ALAutonomousLife という新しいフレームワークのようです。これは前回のエントリでも紹介した、人を見つけたらそっちのほうに振り向いたり、腰を左右にゆっくりと振ったり、腕を上下に少しだけ動かして「生きている感」を演出したりということをしているもので、そんなことをしながら周辺の状況を常に監視し、条件に合ったアプリが見つかると、そっちに実行を移し、そしてそのアプリの実行が終了するとまた、ALAutonomousLife フレームワークの実行が戻ると、そんな感じで動くようです。

PCからの指令で直接アプリを実行させたいときとかはこのフレームワークが邪魔になってしまうので、このような時、この機能を停止されます。停止ボタンは Choregraphe についていて、ハートのボタン。このセンス、僕は結構好きです。 

f:id:takuji_kawata:20140703000807p:plain



NAOqi 2.1

最新の NAO システムイメージが NAOqi 2.1 として Aldebaran Robotics のサイトよりダウンロード可能になりました。早速ダウンロード、わたしの NAO (V4) にインストールしてみました。これで開発フレームワークのベースという観点では Pepper と同じになったはずです。
Choregraphe も最新の 2.1 をインストール、それぞれ色々な部分で進化を感じます。

NAOqi は最新版になって、一番わかりやすい進化は、標準で自動起動するアプリがあらかじめ用意されていて、電源を入れると、何もアプリをインストールしなくとも、しばらくして自ら動き出すということです。以前はまず PC を通してアプリをNAO の中にインストールするなどの作業をしなければ、動き出すことはありませんでした。
この自動起動する動作「オートノマスライフ」というらしく、人物を見つけて振り向く、音や、動き、触られたことに反応する、簡単な質問に答える、などの機能を持っているようです。何もしていない時も、微妙に体を左右にスライドさせたり、手を少しだけ上下に動かしたりといった動作も演出しており、「生きている感」を色々な形で演出しています。NAO の声もそうなんですが、下手に「人間そっくり」を目指しているのではなく、あくまでロボットとしての生き物感というところにこだわっている感じで、このあたりセンスを感じます。

標準では少なくとも Pepper で紹介された クラウド AI が搭載されているわけではないので、何か会話ができたりというものではなかったりするようなのですが、なんだか何も用事がなくてもずっと電源を入れておいてあげたい感じがしたりします。

実はシステムインストールが何度試行しても「405」というワーニングメッセージが原因で正常終了することができず、更新が完全に完了できていません。これが原因でか、歩行動作などもいまいちうまくいかなくなってしまい、実はちょっと困った状態。
現在コミュニティーサイトで問い合わせ中。ちなみに世界中のデベロッパーが活発に情報交換をし、助け合っているのも NAO の魅力です。

アプリケーションストアが、Aldebaran Store という新しいサービスに変わりました。 Pepper も含めた Aldebaran Robotics の各ロボットのアプリが共通して流通できるアプリケーションストアになるのかと想像します。
以前のアプリストア NAOStore は、アプリ開発者が収益を得る場所として利用するという点においては成功していたという感じではありませんでした。今後 Pepper など一般家庭をターゲットとしたロボットが増えていく中で、新しいアプリケーションストアには可能性を感じていたりします。