ft_sensor_to_taxel_array.py
Go to the documentation of this file.
00001 #!/usr/bin/env python
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         # Default topic names:
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         #TODO: RETURN TRANSFORM TO FORCE VECTOR
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' #self.ft_link_name
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()


hrl_common_code_darpa_m3
Author(s): Advait Jain, Marc Killpack. Advisor: Prof. Charlie Kemp. Healthcare Robotics Lab, Georgia Tech
autogenerated on Wed Nov 27 2013 11:34:42