##1. はじめに
Pepperのモーションをタイムラインボックスを利用して作成したとき、「同じモーションなんだけどゆっくりにしたい」だとか、「複数のタイムラインボックスの動きを簡単につなげたい」なんて言いながら、結局、別のタイムラインボックスを作ったりすることがあったりなかったり。
というわけで、タイムラインボックスで作成したモーションをpythonボックスにしてみようと思います。
##2.手順
###2.1 タイムラインボックスでモーションを作成する
とりあえず、適当なモーションを作成します。
###2.2 タイムラインボックスからpythonのコードをエクスポートする
タイムラインボックスを開き、タイムライン上で右クリックして、「クリップボードにモーションをエクスポート」-「Python」-「ベジエ曲線」でモーションをエクスポートします。
###2.3 コードを加工する
pythonボックスで利用するために、エディタ等でエクスポートしたコードを加工します。
エクスポートしたコードがこちらです。
# Choregraphe bezier export in Python.
from naoqi import ALProxy
names = list()
times = list()
keys = list()
names.append("HeadPitch")
times.append([0.966667, 1.96667, 2.96667, 3.96667])
keys.append([[-0.380427, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.205554, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.380428, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.200952, [3, -0.333333, 0], [3, 0, 0]]])
names.append("HeadYaw")
times.append([0.966667, 1.96667, 2.96667, 3.96667])
keys.append([[0.0230098, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.00153399, [3, -0.333333, 0], [3, 0.333333, 0]], [0.0230097, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.00460196, [3, -0.333333, 0], [3, 0, 0]]])
names.append("HipPitch")
times.append([0.966667, 1.96667, 2.96667, 3.96667])
keys.append([[-0.0306797, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.0322137, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.0306797, [3, -0.333333, -0.000511328], [3, 0.333333, 0.000511328]], [-0.0291457, [3, -0.333333, 0], [3, 0, 0]]])
names.append("HipRoll")
times.append([0.966667, 1.96667, 2.96667, 3.96667])
keys.append([[-0.00766993, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.00613594, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.00766992, [3, -0.333333, 6.76193e-09], [3, 0.333333, -6.76193e-09]], [-0.00766993, [3, -0.333333, 0], [3, 0, 0]]])
names.append("KneePitch")
times.append([0.966667, 1.96667, 2.96667, 3.96667])
keys.append([[-0.00460196, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.0184078, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.00460196, [3, -0.333333, -0.00153399], [3, 0.333333, 0.00153399]], [-0.00306797, [3, -0.333333, 0], [3, 0, 0]]])
names.append("LElbowRoll")
times.append([0.966667, 1.96667, 2.96667, 3.96667])
keys.append([[-1.43413, [3, -0.333333, 0], [3, 0.333333, 0]], [-1.31177, [3, -0.333333, 0], [3, 0.333333, 0]], [-1.43413, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.524621, [3, -0.333333, 0], [3, 0, 0]]])
names.append("LElbowYaw")
times.append([0.966667, 1.96667, 2.96667, 3.96667])
keys.append([[-0.983282, [3, -0.333333, 0], [3, 0.333333, 0]], [-1.93128, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.983282, [3, -0.333333, 0], [3, 0.333333, 0]], [-1.22105, [3, -0.333333, 0], [3, 0, 0]]])
names.append("LHand")
times.append([0.966667, 1.96667, 2.96667, 3.96667])
keys.append([[0.165202, [3, -0.333333, 0], [3, 0.333333, 0]], [0.855009, [3, -0.333333, 0], [3, 0.333333, 0]], [0.165202, [3, -0.333333, 0], [3, 0.333333, 0]], [0.603691, [3, -0.333333, 0], [3, 0, 0]]])
names.append("LShoulderPitch")
times.append([0.966667, 1.96667, 2.96667, 3.96667])
keys.append([[0.682622, [3, -0.333333, 0], [3, 0.333333, 0]], [0.447922, [3, -0.333333, 0], [3, 0.333333, 0]], [0.682621, [3, -0.333333, -0.186634], [3, 0.333333, 0.186634]], [1.56773, [3, -0.333333, 0], [3, 0, 0]]])
names.append("LShoulderRoll")
times.append([0.966667, 1.96667, 2.96667, 3.96667])
keys.append([[0.265379, [3, -0.333333, 0], [3, 0.333333, 0]], [0.406505, [3, -0.333333, 0], [3, 0.333333, 0]], [0.265379, [3, -0.333333, 0.0472977], [3, 0.333333, -0.0472977]], [0.122719, [3, -0.333333, 0], [3, 0, 0]]])
names.append("LWristYaw")
times.append([0.966667, 1.96667, 2.96667, 3.96667])
keys.append([[0.615176, [3, -0.333333, 0], [3, 0.333333, 0]], [0.863684, [3, -0.333333, 0], [3, 0.333333, 0]], [0.615176, [3, -0.333333, 0.141398], [3, 0.333333, -0.141398]], [0.0152981, [3, -0.333333, 0], [3, 0, 0]]])
names.append("RElbowRoll")
times.append([0.966667, 1.96667, 2.96667, 3.96667])
keys.append([[1.43413, [3, -0.333333, 0], [3, 0.333333, 0]], [1.31177, [3, -0.333333, 0], [3, 0.333333, 0]], [1.43413, [3, -0.333333, 0], [3, 0.333333, 0]], [0.524621, [3, -0.333333, 0], [3, 0, 0]]])
names.append("RElbowYaw")
times.append([0.966667, 1.96667, 2.96667, 3.96667])
keys.append([[0.983282, [3, -0.333333, 0], [3, 0.333333, 0]], [1.93128, [3, -0.333333, 0], [3, 0.333333, 0]], [0.983282, [3, -0.333333, 0], [3, 0.333333, 0]], [1.22718, [3, -0.333333, 0], [3, 0, 0]]])
names.append("RHand")
times.append([0.966667, 1.96667, 2.96667, 3.96667])
keys.append([[0.165202, [3, -0.333333, 0], [3, 0.333333, 0]], [0.855009, [3, -0.333333, 0], [3, 0.333333, 0]], [0.165202, [3, -0.333333, 0], [3, 0.333333, 0]], [0.605448, [3, -0.333333, 0], [3, 0, 0]]])
names.append("RShoulderPitch")
times.append([0.966667, 1.96667, 2.96667, 3.96667])
keys.append([[0.682622, [3, -0.333333, 0], [3, 0.333333, 0]], [0.447922, [3, -0.333333, 0], [3, 0.333333, 0]], [0.682621, [3, -0.333333, -0.185612], [3, 0.333333, 0.185612]], [1.56159, [3, -0.333333, 0], [3, 0, 0]]])
names.append("RShoulderRoll")
times.append([0.966667, 1.96667, 2.96667, 3.96667])
keys.append([[-0.265379, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.406505, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.265379, [3, -0.333333, -0.0472977], [3, 0.333333, 0.0472977]], [-0.122719, [3, -0.333333, 0], [3, 0, 0]]])
names.append("RWristYaw")
times.append([0.966667, 1.96667, 2.96667, 3.96667])
keys.append([[-0.615176, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.863684, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.615176, [3, -0.333333, -0.141128], [3, 0.333333, 0.141128]], [-0.016916, [3, -0.333333, 0], [3, 0, 0]]])
try:
# uncomment the following line and modify the IP if you use this script outside Choregraphe.
# motion = ALProxy("ALMotion", IP, 9559)
motion = ALProxy("ALMotion")
motion.angleInterpolationBezier(names, times, keys)
except BaseException, err:
print err
上記コードを下記のように加工します。
(変数に"self"を付けただけです。)
# Choregraphe bezier export in Python.
from naoqi import ALProxy
self.names = list()
self.times = list()
self.keys = list()
self.names.append("HeadPitch")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[-0.380427, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.205554, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.380428, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.200952, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("HeadYaw")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[0.0230098, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.00153399, [3, -0.333333, 0], [3, 0.333333, 0]], [0.0230097, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.00460196, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("HipPitch")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[-0.0306797, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.0322137, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.0306797, [3, -0.333333, -0.000511328], [3, 0.333333, 0.000511328]], [-0.0291457, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("HipRoll")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[-0.00766993, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.00613594, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.00766992, [3, -0.333333, 6.76193e-09], [3, 0.333333, -6.76193e-09]], [-0.00766993, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("KneePitch")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[-0.00460196, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.0184078, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.00460196, [3, -0.333333, -0.00153399], [3, 0.333333, 0.00153399]], [-0.00306797, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("LElbowRoll")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[-1.43413, [3, -0.333333, 0], [3, 0.333333, 0]], [-1.31177, [3, -0.333333, 0], [3, 0.333333, 0]], [-1.43413, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.524621, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("LElbowYaw")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[-0.983282, [3, -0.333333, 0], [3, 0.333333, 0]], [-1.93128, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.983282, [3, -0.333333, 0], [3, 0.333333, 0]], [-1.22105, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("LHand")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[0.165202, [3, -0.333333, 0], [3, 0.333333, 0]], [0.855009, [3, -0.333333, 0], [3, 0.333333, 0]], [0.165202, [3, -0.333333, 0], [3, 0.333333, 0]], [0.603691, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("LShoulderPitch")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[0.682622, [3, -0.333333, 0], [3, 0.333333, 0]], [0.447922, [3, -0.333333, 0], [3, 0.333333, 0]], [0.682621, [3, -0.333333, -0.186634], [3, 0.333333, 0.186634]], [1.56773, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("LShoulderRoll")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[0.265379, [3, -0.333333, 0], [3, 0.333333, 0]], [0.406505, [3, -0.333333, 0], [3, 0.333333, 0]], [0.265379, [3, -0.333333, 0.0472977], [3, 0.333333, -0.0472977]], [0.122719, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("LWristYaw")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[0.615176, [3, -0.333333, 0], [3, 0.333333, 0]], [0.863684, [3, -0.333333, 0], [3, 0.333333, 0]], [0.615176, [3, -0.333333, 0.141398], [3, 0.333333, -0.141398]], [0.0152981, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("RElbowRoll")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[1.43413, [3, -0.333333, 0], [3, 0.333333, 0]], [1.31177, [3, -0.333333, 0], [3, 0.333333, 0]], [1.43413, [3, -0.333333, 0], [3, 0.333333, 0]], [0.524621, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("RElbowYaw")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[0.983282, [3, -0.333333, 0], [3, 0.333333, 0]], [1.93128, [3, -0.333333, 0], [3, 0.333333, 0]], [0.983282, [3, -0.333333, 0], [3, 0.333333, 0]], [1.22718, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("RHand")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[0.165202, [3, -0.333333, 0], [3, 0.333333, 0]], [0.855009, [3, -0.333333, 0], [3, 0.333333, 0]], [0.165202, [3, -0.333333, 0], [3, 0.333333, 0]], [0.605448, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("RShoulderPitch")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[0.682622, [3, -0.333333, 0], [3, 0.333333, 0]], [0.447922, [3, -0.333333, 0], [3, 0.333333, 0]], [0.682621, [3, -0.333333, -0.185612], [3, 0.333333, 0.185612]], [1.56159, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("RShoulderRoll")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[-0.265379, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.406505, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.265379, [3, -0.333333, -0.0472977], [3, 0.333333, 0.0472977]], [-0.122719, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("RWristYaw")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[-0.615176, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.863684, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.615176, [3, -0.333333, -0.141128], [3, 0.333333, 0.141128]], [-0.016916, [3, -0.333333, 0], [3, 0, 0]]])
try:
# uncomment the following line and modify the IP if you use this script outside Choregraphe.
# motion = ALProxy("ALMotion", IP, 9559)
self.motion = ALProxy("ALMotion")
self.motion.angleInterpolationBezier(self.names, self.times, self.keys)
except BaseException, err:
print err
###2.4 加工後のコードをpythonボックスに反映する
各関節のモーションデータはonLoad()に、onInput_Start()にモーション実行部分を反映します。
from naoqi import ALProxy
class MyClass(GeneratedClass):
def __init__(self):
GeneratedClass.__init__(self)
def onLoad(self):
#各関節のモーションデータ
self.names = list()
self.times = list()
self.keys = list()
self.names.append("HeadPitch")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[-0.380427, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.205554, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.380428, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.200952, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("HeadYaw")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[0.0230098, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.00153399, [3, -0.333333, 0], [3, 0.333333, 0]], [0.0230097, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.00460196, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("HipPitch")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[-0.0306797, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.0322137, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.0306797, [3, -0.333333, -0.000511328], [3, 0.333333, 0.000511328]], [-0.0291457, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("HipRoll")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[-0.00766993, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.00613594, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.00766992, [3, -0.333333, 6.76193e-09], [3, 0.333333, -6.76193e-09]], [-0.00766993, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("KneePitch")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[-0.00460196, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.0184078, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.00460196, [3, -0.333333, -0.00153399], [3, 0.333333, 0.00153399]], [-0.00306797, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("LElbowRoll")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[-1.43413, [3, -0.333333, 0], [3, 0.333333, 0]], [-1.31177, [3, -0.333333, 0], [3, 0.333333, 0]], [-1.43413, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.524621, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("LElbowYaw")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[-0.983282, [3, -0.333333, 0], [3, 0.333333, 0]], [-1.93128, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.983282, [3, -0.333333, 0], [3, 0.333333, 0]], [-1.22105, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("LHand")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[0.165202, [3, -0.333333, 0], [3, 0.333333, 0]], [0.855009, [3, -0.333333, 0], [3, 0.333333, 0]], [0.165202, [3, -0.333333, 0], [3, 0.333333, 0]], [0.603691, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("LShoulderPitch")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[0.682622, [3, -0.333333, 0], [3, 0.333333, 0]], [0.447922, [3, -0.333333, 0], [3, 0.333333, 0]], [0.682621, [3, -0.333333, -0.186634], [3, 0.333333, 0.186634]], [1.56773, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("LShoulderRoll")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[0.265379, [3, -0.333333, 0], [3, 0.333333, 0]], [0.406505, [3, -0.333333, 0], [3, 0.333333, 0]], [0.265379, [3, -0.333333, 0.0472977], [3, 0.333333, -0.0472977]], [0.122719, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("LWristYaw")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[0.615176, [3, -0.333333, 0], [3, 0.333333, 0]], [0.863684, [3, -0.333333, 0], [3, 0.333333, 0]], [0.615176, [3, -0.333333, 0.141398], [3, 0.333333, -0.141398]], [0.0152981, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("RElbowRoll")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[1.43413, [3, -0.333333, 0], [3, 0.333333, 0]], [1.31177, [3, -0.333333, 0], [3, 0.333333, 0]], [1.43413, [3, -0.333333, 0], [3, 0.333333, 0]], [0.524621, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("RElbowYaw")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[0.983282, [3, -0.333333, 0], [3, 0.333333, 0]], [1.93128, [3, -0.333333, 0], [3, 0.333333, 0]], [0.983282, [3, -0.333333, 0], [3, 0.333333, 0]], [1.22718, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("RHand")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[0.165202, [3, -0.333333, 0], [3, 0.333333, 0]], [0.855009, [3, -0.333333, 0], [3, 0.333333, 0]], [0.165202, [3, -0.333333, 0], [3, 0.333333, 0]], [0.605448, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("RShoulderPitch")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[0.682622, [3, -0.333333, 0], [3, 0.333333, 0]], [0.447922, [3, -0.333333, 0], [3, 0.333333, 0]], [0.682621, [3, -0.333333, -0.185612], [3, 0.333333, 0.185612]], [1.56159, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("RShoulderRoll")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[-0.265379, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.406505, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.265379, [3, -0.333333, -0.0472977], [3, 0.333333, 0.0472977]], [-0.122719, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("RWristYaw")
self.times.append([0.966667, 1.96667, 2.96667, 3.96667])
self.keys.append([[-0.615176, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.863684, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.615176, [3, -0.333333, -0.141128], [3, 0.333333, 0.141128]], [-0.016916, [3, -0.333333, 0], [3, 0, 0]]])
#put initialization code here
pass
def onUnload(self):
#put clean-up code here
pass
def onInput_onStart(self):
#モーション実行部分
try:
self.motion = ALProxy("ALMotion")
self.motion.angleInterpolationBezier(self.names, self.times, self.keys)
except BaseException, err:
print err
self.onStopped() #activate the output of the box
pass
def onInput_onStop(self):
self.onUnload() #it is recommended to reuse the clean-up as the box is stopped
self.onStopped() #activate the output of the box
motion_test.pyのコードをpythonボックスにコピー&ペーストしてchoregrapheで実行するとPepperが両手を挙げる動作をします。
##3.モーションの実行時間を変えてみる
motion_test.pyのモーションは2秒で作成しているのですが、これをpythonボックスに引数pで数字を指定して「2*p秒」で実行するように変えてみます。
onLoad()で各関節ごとにtimesへタイムラインの時間を設定しているのですが、この部分をonInput_onStart()でまとめて変更できるようにします。
from naoqi import ALProxy
class MyClass(GeneratedClass):
def __init__(self):
GeneratedClass.__init__(self)
def onLoad(self):
self.motion = ALProxy("ALMotion")
self.names = list()
self.times = list()
self.keys = list()
self.names.append("HeadPitch")
self.keys.append([[-0.380427, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.205554, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.380428, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.200952, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("HeadYaw")
self.keys.append([[0.0230098, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.00153399, [3, -0.333333, 0], [3, 0.333333, 0]], [0.0230097, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.00460196, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("HipPitch")
self.keys.append([[-0.0306797, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.0322137, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.0306797, [3, -0.333333, -0.000511328], [3, 0.333333, 0.000511328]], [-0.0291457, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("HipRoll")
self.keys.append([[-0.00766993, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.00613594, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.00766992, [3, -0.333333, 6.76193e-09], [3, 0.333333, -6.76193e-09]], [-0.00766993, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("KneePitch")
self.keys.append([[-0.00460196, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.0184078, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.00460196, [3, -0.333333, -0.00153399], [3, 0.333333, 0.00153399]], [-0.00306797, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("LElbowRoll")
self.keys.append([[-1.43413, [3, -0.333333, 0], [3, 0.333333, 0]], [-1.31177, [3, -0.333333, 0], [3, 0.333333, 0]], [-1.43413, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.524621, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("LElbowYaw")
self.keys.append([[-0.983282, [3, -0.333333, 0], [3, 0.333333, 0]], [-1.93128, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.983282, [3, -0.333333, 0], [3, 0.333333, 0]], [-1.22105, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("LHand")
self.keys.append([[0.165202, [3, -0.333333, 0], [3, 0.333333, 0]], [0.855009, [3, -0.333333, 0], [3, 0.333333, 0]], [0.165202, [3, -0.333333, 0], [3, 0.333333, 0]], [0.603691, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("LShoulderPitch")
self.keys.append([[0.682622, [3, -0.333333, 0], [3, 0.333333, 0]], [0.447922, [3, -0.333333, 0], [3, 0.333333, 0]], [0.682621, [3, -0.333333, -0.186634], [3, 0.333333, 0.186634]], [1.56773, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("LShoulderRoll")
self.keys.append([[0.265379, [3, -0.333333, 0], [3, 0.333333, 0]], [0.406505, [3, -0.333333, 0], [3, 0.333333, 0]], [0.265379, [3, -0.333333, 0.0472977], [3, 0.333333, -0.0472977]], [0.122719, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("LWristYaw")
self.keys.append([[0.615176, [3, -0.333333, 0], [3, 0.333333, 0]], [0.863684, [3, -0.333333, 0], [3, 0.333333, 0]], [0.615176, [3, -0.333333, 0.141398], [3, 0.333333, -0.141398]], [0.0152981, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("RElbowRoll")
self.keys.append([[1.43413, [3, -0.333333, 0], [3, 0.333333, 0]], [1.31177, [3, -0.333333, 0], [3, 0.333333, 0]], [1.43413, [3, -0.333333, 0], [3, 0.333333, 0]], [0.524621, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("RElbowYaw")
self.keys.append([[0.983282, [3, -0.333333, 0], [3, 0.333333, 0]], [1.93128, [3, -0.333333, 0], [3, 0.333333, 0]], [0.983282, [3, -0.333333, 0], [3, 0.333333, 0]], [1.22718, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("RHand")
self.keys.append([[0.165202, [3, -0.333333, 0], [3, 0.333333, 0]], [0.855009, [3, -0.333333, 0], [3, 0.333333, 0]], [0.165202, [3, -0.333333, 0], [3, 0.333333, 0]], [0.605448, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("RShoulderPitch")
self.keys.append([[0.682622, [3, -0.333333, 0], [3, 0.333333, 0]], [0.447922, [3, -0.333333, 0], [3, 0.333333, 0]], [0.682621, [3, -0.333333, -0.185612], [3, 0.333333, 0.185612]], [1.56159, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("RShoulderRoll")
self.keys.append([[-0.265379, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.406505, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.265379, [3, -0.333333, -0.0472977], [3, 0.333333, 0.0472977]], [-0.122719, [3, -0.333333, 0], [3, 0, 0]]])
self.names.append("RWristYaw")
self.keys.append([[-0.615176, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.863684, [3, -0.333333, 0], [3, 0.333333, 0]], [-0.615176, [3, -0.333333, -0.141128], [3, 0.333333, 0.141128]], [-0.016916, [3, -0.333333, 0], [3, 0, 0]]])
#put initialization code here
pass
def onUnload(self):
#put clean-up code here
pass
#引数pを加える。
#choregrapheのほうでもpythonボックスのボックス編集からonStartに変数(数字)を追加してください。
def onInput_onStart(self,p):
self.basetime = [0.966667, 1.96667, 2.96667, 3.96667]
self.basetimelist = list()
#引数を使って時間を変える
for x in self.basetime:
self.basetimelist.append(float(x * p))
#各関節数分のデータを作成
self.times = list()
for i in range(len(self.names)):
self.times.append(self.basetimelist)
try:
self.motion.angleInterpolationBezier(self.names, self.times, self.keys)
except BaseException, err:
print err
self.onStopped() #activate the output of the box
pass
def onInput_onStop(self):
self.onUnload() #it is recommended to reuse the clean-up as the box is stopped
self.onStopped() #activate the output of the box
pythonボックスの前にNumberEditボックスを置いたりして、引数の値を変えて動かしてみてください。(値を小さくすると動きが激しくなるのでご注意を)
##4.まとめ
工夫次第でいろいろとできそうだなと思います。
##ALMotion APIについて
→ Naoqi2.5 ドキュメント ALMotion API