Go to the documentation of this file.00001
00002
00003 import roslib; roslib.load_manifest('camera_pose_calibration')
00004 import tf
00005 import rospy
00006 import sys
00007 import PyKDL
00008 import time
00009 import threading
00010 from tf_conversions import posemath
00011 from geometry_msgs.msg import TransformStamped, Pose
00012 from camera_pose_calibration.msg import CameraCalibration
00013
00014
00015 class CameraPublisher:
00016 def __init__(self, pose, child_frame_id, parent_frame_id):
00017 self.lock = threading.Lock()
00018 self.pub = tf.TransformBroadcaster()
00019 self.set_pose(pose, child_frame_id, parent_frame_id)
00020
00021 def set_pose(self, pose, child_frame_id, parent_frame_id):
00022 with self.lock:
00023 self.transform = TransformStamped()
00024 self.transform.header.frame_id = parent_frame_id
00025 self.transform.child_frame_id = child_frame_id
00026 self.transform.transform.translation.x = pose.position.x
00027 self.transform.transform.translation.y = pose.position.y
00028 self.transform.transform.translation.z = pose.position.z
00029 self.transform.transform.rotation.x = pose.orientation.x
00030 self.transform.transform.rotation.y = pose.orientation.y
00031 self.transform.transform.rotation.z = pose.orientation.z
00032 self.transform.transform.rotation.w = pose.orientation.w
00033
00034 def publish(self):
00035 with self.lock:
00036
00037 self.transform.header.stamp = rospy.Time.now()
00038
00039 q = (self.transform.transform.rotation.x,self.transform.transform.rotation.y,self.transform.transform.rotation.z,self.transform.transform.rotation.w)
00040 self.pub.sendTransform((self.transform.transform.translation.x,self.transform.transform.translation.y,self.transform.transform.translation.z),q,self.transform.header.stamp,self.transform.child_frame_id,self.transform.header.frame_id)
00041
00042
00043 class CalibrationPublishManager:
00044 def __init__(self):
00045 self.lock = threading.Lock()
00046 self.publish_list = {}
00047 self.sub = rospy.Subscriber('camera_calibration', CameraCalibration, self.cal_cb)
00048 self.count = 0
00049 self.tf = tf.TransformListener(True, rospy.Duration(15.0))
00050
00051 def cal_cb(self, msg):
00052 with self.lock:
00053 success = 0
00054 while success<20:
00055 try:
00056 t = rospy.Time.now()
00057
00058 arm_position, arm_orientation = self.tf.lookupTransform("/camera_4", "/ptu_mounting",rospy.Time(0))
00059 success = 20
00060 except:
00061
00062 time.sleep(0.3)
00063 success = success+1
00064 print(arm_position)
00065 arm_pose = Pose()
00066
00067 arm_pose.position.x, arm_pose.position.y, arm_pose.position.z = arm_position[0], arm_position[1], arm_position[2]
00068 arm_pose.orientation.x, arm_pose.orientation.y, arm_pose.orientation.z, arm_pose.orientation.w = arm_orientation[0], arm_orientation[1], arm_orientation[2], arm_orientation[3]
00069 arm = posemath.fromMsg(arm_pose);
00070 self.publish_list = {}
00071 i = 0
00072 camera0 = None;
00073 f0 = None;
00074 for pose, camera in zip(msg.camera_pose, msg.camera_id):
00075 i= i+1
00076 if i==1:
00077 print(camera)
00078 print(pose)
00079 f0 = posemath.fromMsg(pose)
00080 print(f0)
00081 camera0 = camera
00082 continue
00083 f = posemath.fromMsg(pose)
00084 f1 = f0.Inverse()*f
00085
00086
00087
00088
00089 print("%s relative pose of to %s"%(camera,"/ptu_mounting"))
00090 f2 = arm.Inverse()*f1;
00091 pose = posemath.toMsg(f2)
00092 print(pose)
00093 self.publish_list[camera] = CameraPublisher(pose, camera, "/ptu_mounting")
00094 sys.stdout.write(" ")
00095
00096
00097 def publish(self):
00098 with self.lock:
00099 self.count = self.count+1
00100 psym = "-\\|/"
00101 sys.stdout.write("\b%c"%psym[self.count % 4])
00102 sys.stdout.flush()
00103
00104 for name, pub in self.publish_list.iteritems():
00105 pub.publish()
00106
00107
00108
00109 def main():
00110 rospy.init_node('calibration_tf_publisher')
00111 r = rospy.Rate(20)
00112 c = CalibrationPublishManager()
00113 while not rospy.is_shutdown():
00114 c.publish()
00115 try:
00116 r.sleep()
00117 except:
00118 print "Shutting down"
00119
00120
00121 if __name__ == '__main__':
00122 main()