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

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

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

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