Go to the documentation of this file.00001
00002 import roslib; roslib.load_manifest('iri_common_smach')
00003 import rospy
00004 import smach
00005 import smach_ros
00006 import geometry_msgs
00007
00008 from geometry_msgs.msg import *
00009
00010 import csv
00011
00012 """
00013 Reads PoseStamped list from a csv file
00014 format of the file:
00015 # allowed comments using '#' at the beginning of the line
00016 frame_id, pos_x, pos_y, pos_z, ori_x, ori_y, ori_z, ori_w
00017 """
00018 def get_list_of_stamped_poses_from_csv_file(filename):
00019 list_of_poses = []
00020
00021 with open(filename,'rb') as f:
00022 reader = csv.reader(f)
00023
00024 try:
00025 for row in reader:
00026 if row:
00027 if row[0][0] != '#':
00028 tmp_pose = geometry_msgs.msg.PoseStamped()
00029 tmp_pose.header.frame_id = row[0]
00030 tmp_pose.header.stamp = rospy.Time.now()
00031 tmp_pose.pose.position.x = row[1]
00032 tmp_pose.pose.position.y = row[2]
00033 tmp_pose.pose.position.z = row[3]
00034 tmp_pose.pose.orientation.x = row[4]
00035 tmp_pose.pose.orientation.y = row[5]
00036 tmp_pose.pose.orientation.z = row[6]
00037 tmp_pose.pose.orientation.w = row[7]
00038 list_of_poses.append(tmp_pose)
00039 except csv.Error as e:
00040 sys.exit('file %s, line %d: %s' % (filename, reader.line_num, e))
00041
00042 return list_of_poses
00043
00044
00045 class GetListOfPoseStampedFromCsvFile(smach.State):
00046 """
00047 GET A LIST OF STAMPED POSES FROM A CSV FILE
00048
00049 @type file_name: string
00050 @param file_name: URI of the csv file
00051 @type list_of_stpose: PoseStamped[]
00052 @param list_of_stpose: List of PoseStamped
00053
00054 """
00055 def __init__(self, file_name):
00056 smach.State.__init__(self,
00057 outcomes = ['success','fail'],
00058 input_keys = [],
00059 output_keys = ['list_of_stpose'])
00060
00061 self.file_name = file_name
00062
00063 def execute(self, userdata):
00064 rospy.loginfo('Executing GetListOfPoseStampedFromCsvFile')
00065
00066 try:
00067 list_of_stamped_poses = get_list_of_stamped_poses_from_csv_file(self.file_name)
00068 userdata.list_of_stpose = list_of_stamped_poses
00069 if list_of_stamped_poses == None:
00070 rospy.logerr('No list received from %s', self.file_name)
00071 return 'fail'
00072
00073 except rospy.ServiceException, e:
00074 return 'fail'
00075
00076 return 'success'
00077