ptu_node.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 import roslib; roslib.load_manifest('ptu_control')
3 import rospy
4 from sensor_msgs.msg import JointState
5 from logitech_pantilt.msg import PanTilt
6 from ptu_control.Calibration import pantiltReset
7 import actionlib
8 import ptu_control.ptu_tracker
9 import ptu_control.msg
10 import threading
11 
12 import tf
13 import geometry_msgs.msg
14 
15 
16 class PTUControl(object):
17  # setup some variables to keep track of the PTU's state (in degrees)
18  pan = 0
19  tilt = 0
20  pan_vel = 0
21  tilt_vel = 0
22  state_lock = threading.Lock()
23 
24  kf = ptu_control.ptu_tracker.PanTiltKF()
25 
26  def __init__(self, reset=True):
27  self.PAN_RANGE = rospy.get_param('pan_range', 70)
28  self.TILT_RANGE = rospy.get_param('tilt_range', 30)
29  self.PARENT_FRAME = rospy.get_param('parent_frame', 'odom')
30  self.PTU_FRAME = rospy.get_param('parent_frame', 'ptu')
31 
32 
33  # setup the subscribers and publishers
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)
40  rospy.Subscriber('ground_truth_pantilt', PanTilt, self.ground_truth_cb)
41 
42  self.br = tf.TransformBroadcaster()
43  threading.Thread(target=self.send_transform).start()
44 
45  if reset:
46  rospy.sleep(1.0)
47  pantiltReset(self.ptu_pub)
48 
49  def cb_goto(self, msg):
50  self.state_lock.acquire()
51  pan, tilt, pan_vel, tilt_vel = msg.pan, msg.tilt, msg.pan_vel, msg.tilt_vel
52  pan = min(pan, self.PAN_RANGE)
53  pan = max(pan, -self.PAN_RANGE)
54  tilt = min(tilt, self.TILT_RANGE)
55  tilt = max(tilt, -self.TILT_RANGE)
56 
57  pan_cmd = pan - self.pan
58  tilt_cmd = tilt - self.tilt
59 
60  self.pan, self.tilt = self.kf.control((pan_cmd, tilt_cmd))
61 
62  # self.pan = pan
63  # self.tilt = tilt
64 
65  if pan_cmd == 0 and tilt_cmd == 0:
66  pass
67  else:
68  self.ptu_pub.publish(PanTilt(pan=pan_cmd,tilt=tilt_cmd,reset=False))
69 
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)
74 
75  #TODO figure out when we're actually finished
76 
77  def cb_reset(self, msg):
78  self.kf.__init__()
79 
80  self.state_lock.acquire()
81  pantiltReset(self.ptu_pub)
82  result = ptu_control.msg.PtuResetResult()
83  self.pan = 0
84  self.tilt = 0
85  self.state_lock.release()
86  self.as_reset.set_succeeded(result)
87 
88  def ground_truth_cb(self, msg):
89  self.state_lock.acquire()
90  # self.pan = msg.pan
91  # self.tilt = msg.tilt
92  self.pan, self.tilt = self.kf.measurement((msg.pan, msg.tilt))
93  self.state_lock.release()
94 
95 
96  def send_transform(self):
97  rate = rospy.Rate(10)
98  while not rospy.is_shutdown():
99  self.br.sendTransform(
100  (0,0,0),
101  tf.transformations.quaternion_from_euler(0, self.tilt, self.pan),
102  rospy.Time.now(),
103  self.PTU_FRAME,
104  self.PARENT_FRAME
105  )
106  rate.sleep()
107 
108 if __name__ == '__main__':
109  rospy.init_node('ptu_node')
110  PTUControl()
111  rospy.spin()


ptu_control
Author(s): Dan Lazewatsky
autogenerated on Mon Mar 2 2015 01:32:49