Go to the documentation of this file.00001
00002
00003 import numpy as np
00004 import optparse
00005
00006 import roslib;
00007 roslib.load_manifest('hrl_haptic_manipulation_in_clutter_msgs')
00008 roslib.load_manifest('m3skin_ros')
00009 roslib.load_manifest('geometry_msgs')
00010 import rospy
00011 from geometry_msgs.msg import WrenchStamped, Transform
00012 from hrl_haptic_manipulation_in_clutter_msgs.msg import TaxelArray
00013 from m3skin_ros.msg import TaxelArray as M3TaxelArray
00014 from m3skin_ros.srv import None_TransformArray, None_TransformArrayResponse, None_String
00015
00016 class WrenchToTaxelArray(object):
00017 def __init__(self, opt=None):
00018
00019 raw_data_topic = 'wrench_stamped'
00020 output_data_topic = 'ft_taxel_array'
00021 m3_output_data_topic = 'pr2_ft_sensor/taxels/forces'
00022 scaling_param_name = '~magnitude_scale'
00023
00024 transform_service_name='/pr2_ft_sensor/taxels/srv/local_coord_frames'
00025 taxel_string_service_name='/pr2_ft_sensor/taxels/srv/link_name'
00026
00027 if opt:
00028 if opt.raw_data_topic:
00029 raw_data_topic = opt.raw_data_topic
00030 if opt.output_data_topic:
00031 output_data_topic = opt.output_data_topic
00032 if opt.scaling_param_name:
00033 scaling_param_name = opt.scaling_param_name
00034 if opt.m3_output_topic:
00035 m3_output_data_topic = opt.m3_output_topic
00036
00037 self.wrench_sub = rospy.Subscriber(raw_data_topic, WrenchStamped, self.wrench_stamped_cb)
00038 self.taxel_array_pub = rospy.Publisher(output_data_topic, TaxelArray)
00039 self.m3_taxel_array_pub = rospy.Publisher(m3_output_data_topic, M3TaxelArray)
00040 self.scaling = rospy.get_param(scaling_param_name, 1.0)
00041 self.transform_service = rospy.Service(transform_service_name, None_TransformArray, self.local_coord_frames_ft_cb)
00042 self.taxel_string_service = rospy.Service(taxel_string_service_name, None_String, self.link_name_ft_cb)
00043 self.ft_link_name = self.link_name_ft_cb(None)
00044
00045 def link_name_ft_cb(self, req):
00046 return '/l_force_torque_link'
00047
00048 def local_coord_frames_ft_cb(self, req):
00049
00050 transform = Transform()
00051 transform.rotation.w = 1.0
00052 resp = None_TransformArrayResponse()
00053 resp.data = [transform]
00054 return resp
00055
00056 def wrench_stamped_cb(self, ws):
00057 """BEWARE DIRTY HACK IN COORDINATE FLIPPING!!!!"""
00058 force_vec = np.array([ws.wrench.force.x, ws.wrench.force.y, ws.wrench.force.z])
00059 scaled_vec = np.multiply(force_vec, self.scaling)
00060 mag = np.linalg.norm(force_vec)
00061 normalized_vec = np.divide(force_vec,mag)
00062
00063 ta = TaxelArray()
00064 ta.header.frame_id = '/l_netft_frame'
00065 ta.header.stamp = rospy.Time.now()
00066 ta.sensor_type = 'force'
00067 ta.link_names = ['wrist_roll']
00068 ta.centers_x = [0.]
00069 ta.centers_y = [0.]
00070 ta.centers_z = [0.]
00071 ta.normals_x = [-normalized_vec[0]]
00072 ta.normals_y = [-normalized_vec[1]]
00073 ta.normals_z = [-normalized_vec[2]]
00074 ta.values_x = [-scaled_vec[0]]
00075 ta.values_y = [-scaled_vec[1]]
00076 ta.values_z = [-scaled_vec[2]]
00077
00078 self.taxel_array_pub.publish(ta)
00079
00080 m3ta = TaxelArray()
00081 m3ta.header.frame_id = '/l_netft_frame'
00082 m3ta.header.stamp = rospy.Time.now()
00083 m3ta.sensor_type = 'force'
00084 m3ta.link_names = ['wrist_roll']
00085 m3ta.centers_x = [0.]
00086 m3ta.centers_y = [0.]
00087 m3ta.centers_z = [0.]
00088 m3ta.normals_x = [normalized_vec[0]]
00089 m3ta.normals_y = [normalized_vec[1]]
00090 m3ta.normals_z = [normalized_vec[2]]
00091 m3ta.values_x = [scaled_vec[0]]
00092 m3ta.values_y = [scaled_vec[1]]
00093 m3ta.values_z = [scaled_vec[2]]
00094
00095 self.m3_taxel_array_pub.publish(m3ta)
00096
00097 if __name__=='__main__':
00098 p = optparse.OptionParser()
00099 p.add_option('-i', '--input', dest="raw_data_topic", help="Raw data input topic. Default: \'wrench_stamped\'")
00100 p.add_option('-o', '--output', dest="output_data_topic", help="Processed data output topic (TaxelArray). Default: \'ft_taxel_array\'")
00101 p.add_option('-m', '--m3_output', dest="m3_output_topic", help="Processed data output topic (M3TaxelArray). Default: \'pr2_ft_sensor/taxels/forces\'")
00102 p.add_option('-s', '--scaling', dest="scaling_param_name", help="Scaling parameter name. Default: \'~magnitude_scale\'")
00103
00104 (opt,args) = p.parse_args()
00105
00106 rospy.init_node('ft_to_taxel_array_node')
00107 rospy.loginfo("Initialising FT to TaxelArray Node")
00108 wrench_to_taxel = WrenchToTaxelArray(opt)
00109 rospy.loginfo("Running FT to TaxelArray converter")
00110 rospy.spin()