calibration_transform_publisher_ptu.py
Go to the documentation of this file.
00001 #!/usr/bin/python
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             #print("publishing")
00037             self.transform.header.stamp = rospy.Time.now()# + rospy.Duration(0.5)
00038             #self.pub.sendTransform(self.transform)
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                     #self.tf.waitForTransform("/camera_4", "/ptu_mounting", t, rospy.Duration(10.0))
00058                     arm_position, arm_orientation = self.tf.lookupTransform("/camera_4", "/ptu_mounting",rospy.Time(0))
00059                     success = 20
00060                 except:
00061                     #print "Unexpected error:", sys.exc_info()[0]
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 #                pose = posemath.toMsg(f1)
00086 #                print("%s relative pose of to %s"%(camera,camera0))
00087 #                print(pose)
00088 #                self.publish_list[camera] = CameraPublisher(pose, camera, camera0)
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             #print("\b%c"%psym[self.count % 4], end="")
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()
 All Classes Namespaces Files Functions Variables Typedefs Defines


openni_cam
Author(s): Alexander Shekhovtsov
autogenerated on Sun Dec 1 2013 17:19:20