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()