tilt_laser_assembler.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 import rospy
3 try:
4  from laser_assembler.srv import *
5 except:
6  import roslib; roslib.load_manifest("laser_assembler");
7  from laser_assembler.srv import *
8 
10  cloud_pub = None
11  joint_sub = None
12  assemble_srv = None
13  command_pub = None
14  prev_angle = None
15  max_angle = None
16  min_angle = None
17  lower_threshold = None
18  upper_threshold = None
19  scan_time = None ###
20 
21  def init(self):
22  rospy.init_node('tilt_laser_assembler')
23  self.joint_name = rospy.get_param("~tilt_joint_name", "tilt_joint")
24  self.cloud_pub = rospy.Publisher('assemble_cloud', sensor_msgs.msg.PointCloud2)
25  self.command_pub = rospy.Publisher('/tilt_controller/command', std_msgs.msg.Float64)
26  self.joint_sub = rospy.Subscriber('joint_states', sensor_msgs.msg.JointState, self.joint_callback)
27  self.assemble_srv = rospy.ServiceProxy('assemble_scans2', AssembleScans2)
28 
29  if not self.max_angle:
30  self.max_angle = rospy.get_param('~tilt_joint_max_angle', default=0.70)
31 
32  if not self.min_angle:
33  self.min_angle = rospy.get_param('~tilt_joint_min_angle',default=-0.95)
34  if not self.scan_time:
35  self.scan_time = 8.0
36  if not self.lower_threshold:
37  self.lower_threshold = self.min_angle
38  if not self.upper_threshold:
39  self.upper_threshold = self.max_angle
40 
41  def move_to_angle(self, angle):
42  self.command_pub.publish(std_msgs.msg.Float64(angle))
43 
44  def joint_callback(self, msg):
45  pos = None
46  try:
47  pos = msg.position[msg.name.index(self.joint_name)] ###
48  rospy.logdebug('pos = %f'%pos)
49  except:
50  # do nothing
51  rospy.logdebug('exept')
52 
53  if pos:
54  if not self.prev_angle:
55  self.prev_angle = pos
56  if pos - self.min_angle > self.max_angle - pos:
57  self.prev_time = msg.header.stamp
58  self.move_to_angle(self.max_angle + 0.01)
59  else:
60  self.prev_time = msg.header.stamp
61  self.move_to_angle(self.min_angle - 0.01)
62  return
63  if pos > self.max_angle:
64  self.move_to_angle(self.min_angle - 0.01)
65  if self.prev_angle < self.upper_threshold and pos > self.upper_threshold:
66  self.scan_and_publish(self.prev_time, msg.header.stamp)
67 
68  if self.prev_angle > self.lower_threshold and pos < self.lower_threshold:
69  self.scan_and_publish(self.prev_time, msg.header.stamp)
70 
71  if pos < self.min_angle:
72  self.move_to_angle(self.max_angle + 0.01)
73  # update timestamp
74  if pos < self.min_angle or pos > self.max_angle:
75  self.prev_time = msg.header.stamp
76  self.prev_angle = pos
77 
78  def scan_and_publish(self, begin, end):
79  req = AssembleScans2Request()
80  req.begin = begin
81  req.end = end
82  try:
83  ret = self.assemble_srv(req.begin, req.end)
84  if ret:
85  rospy.logdebug('publish')
86  self.cloud_pub.publish(ret.cloud)
87  except:
88  # do nothing
89  rospy.logerr('error calling service')
90 
91  def spin(self):
92  rospy.spin()
93 
94 if __name__=='__main__':
96  a.init()
97  a.spin()


jsk_tilt_laser
Author(s): YoheiKakiuchi
autogenerated on Tue Feb 6 2018 03:45:14