filter.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 import rospy
4 import tf
5 from sensor_msgs.msg import LaserScan
6 from nav_msgs.msg import OccupancyGrid
7 from tf.transformations import euler_from_quaternion
8 import math
9 
10 
11 class MapLaser(object):
12  def __init__(self):
13  rospy.init_node('map_laser_filter')
14  self.pub = rospy.Publisher('/base_scan_filter',
15  LaserScan,
16  queue_size=10)
18  self.map = None
19  self.save = None
20  self.sub = rospy.Subscriber('/scan_filtered',
21  LaserScan,
22  self.laser_cb,
23  queue_size=1)
24  self.sub2 = rospy.Subscriber('/map', OccupancyGrid, self.map_cb)
25 
26  def map_cb(self, msg):
27  self.map = msg
28 
29  def get_laser_frame(self, msg):
30  now = msg.header.stamp
31  f2 = msg.header.frame_id
32  f1 = '/map'
33  self.listener.waitForTransform(f1, f2, now, rospy.Duration(.15))
34 
35  return self.listener.lookupTransform(f1, f2, now)
36 
37  def is_occupied(self, x, y):
38  N = 2
39  for dx in range(-N, N + 1):
40  for dy in range(-N, N + 1):
41  index = (x + dx) + (y + dy) * self.map.info.width
42  if index < 0 or index > len(self.map.data):
43  continue
44  value = self.map.data[index]
45  if value > 50 or value < 0:
46  return True
47  return False
48 
49  def laser_cb(self, msg):
50  if self.map is None:
51  return
52  try:
53  (trans, rot) = self.get_laser_frame(msg)
54  self.save = (trans, rot)
55  except tf.Exception:
56  if self.save is None:
57  return
58  (trans, rot) = self.save
59 
60  yaw = euler_from_quaternion(rot)[2]
61 
62  nr = []
63 
64  for (i, d) in enumerate(msg.ranges):
65  if math.isnan(d) or d > msg.range_max or d < msg.range_min:
66  nr.append(msg.range_max + 1.0)
67  continue
68  angle = yaw + msg.angle_min + msg.angle_increment * i
69  dx = math.cos(angle) * d
70  dy = math.sin(angle) * d
71  map_x = trans[0] + dx
72  map_y = trans[1] + dy
73 
74  grid_x = int((map_x - self.map.info.origin.position.x) / self.map.info.resolution)
75  grid_y = int((map_y - self.map.info.origin.position.y) / self.map.info.resolution)
76 
77  if self.is_occupied(grid_x, grid_y):
78  nr.append(msg.range_max + 1.0)
79  else:
80  nr.append(d)
81 
82  msg.ranges = nr
83  self.pub.publish(msg)
84 
85 
86 if __name__ == '__main__':
87  x = MapLaser()
88  rospy.spin()
filter.MapLaser.save
save
Definition: filter.py:19
filter.MapLaser.is_occupied
def is_occupied(self, x, y)
Definition: filter.py:37
filter.MapLaser.laser_cb
def laser_cb(self, msg)
Definition: filter.py:49
filter.MapLaser.listener
listener
Definition: filter.py:17
filter.MapLaser.__init__
def __init__(self)
Definition: filter.py:12
filter.MapLaser
Definition: filter.py:11
filter.MapLaser.pub
pub
Definition: filter.py:14
filter.MapLaser.get_laser_frame
def get_laser_frame(self, msg)
Definition: filter.py:29
filter.MapLaser.map
map
Definition: filter.py:18
filter.MapLaser.sub2
sub2
Definition: filter.py:24
tf::TransformListener
filter.MapLaser.map_cb
def map_cb(self, msg)
Definition: filter.py:26
filter.MapLaser.sub
sub
Definition: filter.py:20


map_laser
Author(s): David V. Lu!!
autogenerated on Wed May 14 2025 02:53:41