2 import roslib; roslib.load_manifest(
'ptu_control')
4 from sensor_msgs.msg
import JointState
5 from logitech_pantilt.msg
import PanTilt
6 from ptu_control.Calibration
import pantiltReset
8 import ptu_control.ptu_tracker
13 import geometry_msgs.msg
22 state_lock = threading.Lock()
24 kf = ptu_control.ptu_tracker.PanTiltKF()
30 self.
PTU_FRAME = rospy.get_param(
'parent_frame',
'ptu')
34 self.
joint_pub = rospy.Publisher(
'state', JointState)
35 self.
ptu_pub = rospy.Publisher(
'/pantilt', PanTilt)
36 self.
as_goto = actionlib.SimpleActionServer(
'SetPTUState', \
37 ptu_control.msg.PtuGotoAction, execute_cb=self.
cb_goto)
38 self.
as_reset = actionlib.SimpleActionServer(
'ResetPtu', \
39 ptu_control.msg.PtuResetAction, execute_cb=self.
cb_reset)
42 self.
br = tf.TransformBroadcaster()
50 self.state_lock.acquire()
51 pan, tilt, pan_vel, tilt_vel = msg.pan, msg.tilt, msg.pan_vel, msg.tilt_vel
57 pan_cmd = pan - self.
pan
58 tilt_cmd = tilt - self.
tilt
60 self.
pan, self.
tilt = self.kf.control((pan_cmd, tilt_cmd))
65 if pan_cmd == 0
and tilt_cmd == 0:
68 self.ptu_pub.publish(PanTilt(pan=pan_cmd,tilt=tilt_cmd,reset=
False))
70 result = ptu_control.msg.PtuGotoResult()
71 result.state.position = [self.
pan, self.
tilt]
72 self.state_lock.release()
73 self.as_goto.set_succeeded(result)
80 self.state_lock.acquire()
82 result = ptu_control.msg.PtuResetResult()
85 self.state_lock.release()
86 self.as_reset.set_succeeded(result)
89 self.state_lock.acquire()
92 self.
pan, self.
tilt = self.kf.measurement((msg.pan, msg.tilt))
93 self.state_lock.release()
98 while not rospy.is_shutdown():
99 self.br.sendTransform(
101 tf.transformations.quaternion_from_euler(0, self.
tilt, self.
pan),
108 if __name__ ==
'__main__':
109 rospy.init_node(
'ptu_node')