00001
00002
00003 import numpy as np
00004 import copy
00005
00006 import roslib
00007 roslib.load_manifest('hrl_ellipsoidal_control')
00008 import rospy
00009 import tf.transformations as tf_trans
00010
00011 from hrl_ellipsoidal_control.msg import EllipsoidParams
00012 from geometry_msgs.msg import PoseStamped, PoseArray, Vector3
00013 from hrl_geom.pose_converter import PoseConv
00014 from hrl_ellipsoidal_control.ellipsoid_space import EllipsoidSpace
00015 from visualization_msgs.msg import Marker, MarkerArray
00016 from std_msgs.msg import ColorRGBA
00017
00018
00019 head_poses = {
00020
00021 "near_ear" : [(4 * np.pi/8, -3 * np.pi/8, 1), (0, 0, 0)],
00022 "upper_cheek" : [(4 * np.pi/8, -1.5 * np.pi/8, 1), (0, 0, 0)],
00023 "middle_cheek" : [(4.5 * np.pi/8, -2 * np.pi/8, 1), (0, 0, 0)],
00024 "jaw_bone" : [(5.1 * np.pi/8, -2 * np.pi/8, 1), (0, 0, 0)],
00025 "back_neck" : [(5.1 * np.pi/8, -3 * np.pi/8, 1), (0, 0, 0)],
00026 "nose" : [(4 * np.pi/8, 0 * np.pi/8, 1), (0, 0, 0)],
00027 "chin" : [(5.4 * np.pi/8, 0 * np.pi/8, 1), (0 * np.pi / 2, np.pi/8, 0)],
00028 "mouth_corner" : [(4.5 * np.pi/8, -0.9 * np.pi/8, 1), (0, 0, 0)]
00029 }
00030
00031 def create_arrow_marker(pose, m_id, color=ColorRGBA(1., 0., 0., 1.)):
00032 m = Marker()
00033 m.header.frame_id = "/ellipse_frame"
00034 m.header.stamp = rospy.Time.now()
00035 m.ns = "ell_pose"
00036 m.id = m_id
00037 m.type = Marker.ARROW
00038 m.action = Marker.ADD
00039 m.scale = Vector3(0.19, 0.09, 0.02)
00040 m.color = color
00041 m.pose = PoseConv.to_pose_msg(pose)
00042 return m
00043
00044 class HeadToolPoseServer(object):
00045 def __init__(self):
00046 self.ell_space = EllipsoidSpace()
00047 self.ell_sub = rospy.Subscriber("/ellipsoid_params", EllipsoidParams, self.read_params)
00048
00049 self.lock_ell = False
00050 self.found_params = False
00051
00052
00053 def lock_ell_model(self, lock_model):
00054 self.lock_ell = lock_model
00055
00056 def read_params(self, e_params):
00057 if not self.lock_ell:
00058 self.ell_space.load_ell_params(e_params.E, e_params.is_oblate, e_params.height)
00059 self.found_params = True
00060
00061 def get_many_vectors(self):
00062 arrows = MarkerArray()
00063 coords = []
00064 i = 0
00065 color = ColorRGBA(0., 1., 0., 1.)
00066 for lat in np.linspace(0, np.pi, 10):
00067 color.g += 0.1
00068 color.b = 0
00069 for lon in np.linspace(0, 2 * np.pi , 10):
00070 color.b += 0.1
00071 coords.append((lat, lon, 1, i, copy.copy(color)))
00072 i += 1
00073 arrows.markers = [create_arrow_marker(self.ell_space.ellipsoidal_to_pose(lat, lon, height), i, clr)
00074 for lat, lon, height, i, clr in coords]
00075 return arrows
00076
00077 def get_pose_markers(self):
00078 arrows = MarkerArray()
00079 coords = []
00080 i = 0
00081 color = ColorRGBA(0., 1., 0., 1.)
00082 for name in head_poses:
00083 arrows.markers.append(create_arrow_marker(self.get_head_pose(name), i, color))
00084 i += 1
00085 return arrows
00086
00087 def get_head_pose(self, name, gripper_rot=0.):
00088 lat, lon, height = head_poses[name][0]
00089 roll, pitch, yaw = head_poses[name][1]
00090 pos, rot = PoseConv.to_pos_rot(self.ell_space.ellipsoidal_to_pose(lat, lon, height))
00091 rot = rot * tf_trans.euler_matrix(yaw, pitch, roll + gripper_rot, 'rzyx')[:3, :3]
00092 return pos, rot
00093
00094 def get_head_pose_srv(self, req):
00095 if req.name not in head_poses:
00096 pose = (np.mat([-9999, -9999, -9999]).T, np.mat(np.zeros((3, 3))))
00097 else:
00098 pose = self.get_head_pose(req.name, req.gripper_rot)
00099 frame = "/ellipse_frame"
00100 pose_stamped = PoseConv.to_pose_stamped_msg(frame, pose)
00101
00102 return pose_stamped
00103
00104 def main():
00105 rospy.init_node("head_tool_pose_server")
00106 htps = HeadToolPoseServer()
00107 pub_arrows = rospy.Publisher("visualization_markers_array", MarkerArray)
00108 if False:
00109 while not rospy.is_shutdown():
00110 arrows = htps.get_pose_markers()
00111 for arrow in arrows.markers:
00112 arrow.header.stamp = rospy.Time.now()
00113 pub_arrows.publish(arrows)
00114 rospy.sleep(0.1)
00115 else:
00116 while not rospy.is_shutdown():
00117 arrows = htps.get_many_vectors()
00118 for arrow in arrows.markers:
00119 arrow.header.stamp = rospy.Time.now()
00120 pub_arrows.publish(arrows)
00121 rospy.sleep(1)
00122
00123 if __name__ == "__main__":
00124 main()