作者: 古川誠
from openravepy import Environment, poseFromMatrix, quatFromAxisAngle, axisAngleFromQuat, quatRotate, quatMult, poseMult
from numpy import pi, r_
env = Environment()
env.SetViewer('qtcoin')
body = env.ReadKinBodyXMLFile(filename='data/mug2.kinbody.xml')
env.AddKinBody(body)
body.SetTransform([1,0,0,0,0,0,0])
pose = poseFromMatrix(body.GetTransform())
handles=[]
handles.append(env.drawarrow(p1=[0.0,0.0,0.0],p2=[0.5,0.0,0.0],linewidth=0.01,color=[1.0,0.0,0.0]))
handles.append(env.drawarrow(p1=[0.0,0.0,0.0],p2=[0.0,0.5,0.0],linewidth=0.01,color=[0.0,1.0,0.0]))
handles.append(env.drawarrow(p1=[0.0,0.0,0.0],p2=[0.0,0.0,0.5],linewidth=0.01,color=[0.0,0.0,0.1]))
deg = raw_input('X軸の回転角度を入力して下さい.[degree] X = ')
if len(deg) == 0:
deg = -45
rot_quat = quatFromAxisAngle([1,0,0],float(deg)*pi/180.0)
print 'AxisAngle = ',axisAngleFromQuat(rot_quat)
pose[0:4] = quatMult(rot_quat, pose[0:4])
body.SetTransform(pose)
P1 = quatRotate(rot_quat, [0,0,1])
handles.append(env.drawarrow([0.0,0.0,0.0],P1,linewidth=0.01,color=[1.0,1.0,0.0]))
deg = raw_input('Y軸の回転角度を入力して下さい.[degree] Y = ')
if len(deg) == 0:
deg = 45
rot_quat = quatFromAxisAngle([0,1,0],float(deg)*pi/180.0)
print 'AxisAngle = ',axisAngleFromQuat(rot_quat)
pose[0:4] = quatMult(rot_quat, pose[0:4])
body.SetTransform(pose)
P2 = quatRotate(rot_quat, P1)
handles.append(env.drawarrow([0.0,0.0,0.0],P2,linewidth=0.01,color=[1.0,1.0,0.0]))
while True:
raw_input('キーを押すと回転しながら移動します.')
posedelta = r_[quatFromAxisAngle([0,0,0.5]), 0, 0, 0.01]
pose=poseMult(pose, posedelta)
body.SetTransform(pose)
openrave.py --example tutorial_004
チュートリアルを実行すると,OpenRAVEのGUIが立ち上がり,下のような画像が現れます.
画面内で矢印は座標軸を表し,RGBの色はそれぞれXYZ軸に対応しています.n X軸の回転角度を入力してみましょう.矢印の向きに向かって反時計まわりがプラスの回転方向です.
例ではX軸に-45度回転させました.新しく現れた黄色の矢印はカップの上方向が回転した結果の向きを示しています.n 次にY軸の回転角度を入力してみましょう.
例ではY軸に+45度回転させました.黄色の矢印は先ほどと同じくカップの上方向が回転した結果の向きを示しています.n 次に何かキーを押してみましょう.
この次からは,キーを押す度に先ほどの黄色の矢印を軸にしてマグカップが回転しながら移動します.
#!/usr/bin/env python
from openravepy import Environment, poseFromMatrix, quatFromAxisAngle, axisAngleFromQuat, quatRotate, quatMult, poseMult
from numpy import pi, r_
env = Environment()
env.SetViewer('qtcoin')
body = env.ReadKinBodyXMLFile(filename='data/mug2.kinbody.xml')
env.AddKinBody(body)
body.SetTransform([1,0,0,0,0,0,0])
pose = poseFromMatrix(body.GetTransform())
handles=[]
handles.append(env.drawarrow(p1=[0.0,0.0,0.0],p2=[0.5,0.0,0.0],linewidth=0.01,color=[1.0,0.0,0.0]))
handles.append(env.drawarrow(p1=[0.0,0.0,0.0],p2=[0.0,0.5,0.0],linewidth=0.01,color=[0.0,1.0,0.0]))
handles.append(env.drawarrow(p1=[0.0,0.0,0.0],p2=[0.0,0.0,0.5],linewidth=0.01,color=[0.0,0.0,0.1]))
deg = raw_input('X軸の回転角度を入力して下さい.[degree] X = ')
rot_quat = quatFromAxisAngle([1,0,0],float(deg)*pi/180.0)
print 'AxisAngle = ',axisAngleFromQuat(rot_quat)
pose[0:4] = quatMult(rot_quat, pose[0:4])
body.SetTransform(pose)
P1 = quatRotate(rot_quat, [0,0,1])
handles.append(env.drawarrow([0.0,0.0,0.0],P1,linewidth=0.01,color=[1.0,1.0,0.0]))
deg = raw_input('Y軸の回転角度を入力して下さい.[degree] Y = ')
rot_quat = quatFromAxisAngle([0,1,0],float(deg)*pi/180.0)
print 'AxisAngle = ',axisAngleFromQuat(rot_quat)
pose[0:4] = quatMult(rot_quat, pose[0:4])
body.SetTransform(pose)
P2 = quatRotate(rot_quat, P1)
handles.append(env.drawarrow([0.0,0.0,0.0],P2,linewidth=0.01,color=[1.0,1.0,0.0]))
while True:
raw_input('キーを押すと回転しながら移動します.')
posedelta = r_[quatFromAxisAngle([0,0,0.5]), 0, 0, 0.01]
pose=poseMult(pose, posedelta)
body.SetTransform(pose)
from openravepy import Environment, poseFromMatrix, quatFromAxisAngle, axisAngleFromQuat, quatRotate, quatMult, poseMult
from numpy import pi, r_
pose = poseFromMatrix(body.GetTransform())
handles=[]
handles.append(env.drawarrow(p1=[0.0,0.0,0.0],p2=[0.5,0.0,0.0],linewidth=0.01,color=[1.0,0.0,0.0]))
handles.append(env.drawarrow(p1=[0.0,0.0,0.0],p2=[0.0,0.5,0.0],linewidth=0.01,color=[0.0,1.0,0.0]))
handles.append(env.drawarrow(p1=[0.0,0.0,0.0],p2=[0.0,0.0,0.5],linewidth=0.01,color=[0.0,0.0,0.1]))
deg = raw_input('X軸の回転角度を入力して下さい.[degree] X = ')
rot_quat = quatFromAxisAngle([1,0,0],float(deg)*pi/180.0)
print 'AxisAngle = ',axisAngleFromQuat(rot_quat)
pose[0:4] = quatMult(rot_quat, pose[0:4])
body.SetTransform(pose)
P1 = quatRotate(rot_quat, [0,0,1])
handles.append(env.drawarrow([0.0,0.0,0.0],P1,linewidth=0.01,color=[1.0,1.0,0.0]))
deg = raw_input('Y軸の回転角度を入力して下さい.[degree] Y = ')
rot_quat = quatFromAxisAngle([0,1,0],float(deg)*pi/180.0)
print 'AxisAngle = ',axisAngleFromQuat(rot_quat)
pose[0:4] = quatMult(rot_quat, pose[0:4])
body.SetTransform(pose)
P2 = quatRotate(rot_quat, P1)
handles.append(env.drawarrow([0.0,0.0,0.0],P2,linewidth=0.01,color=[1.0,1.0,0.0]))
while True:
raw_input('キーを押すと回転しながら移動します.')
posedelta = r_[quatFromAxisAngle([0,0,0.5]), 0, 0, 0.01]
pose=poseMult(pose, posedelta)
body.SetTransform(pose)