head_tool_pose_server.py
Go to the documentation of this file.
00001 #! /usr/bin/python
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 #from hrl_rfh_fall_2011.srv import GetHeadPose 
00018 
00019 head_poses = {
00020     #             lat   lon    height    roll   pitch   yaw
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         #self.head_pose_srv = rospy.Service("/get_head_pose", GetHeadPose, self.get_head_pose_srv)
00049         self.lock_ell = False
00050         self.found_params = False
00051 #self.tmp_pub = rospy.Publisher("/toolpose", PoseStamped)
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 #self.tmp_pub.publish(pose_stamped)
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()


hrl_ellipsoidal_control
Author(s): Kelsey Hawkins
autogenerated on Wed Nov 27 2013 11:41:49