dummy_scan.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 ## @author Hiroaki Yaguchi JSK
4 
5 import rospy
6 import tf
7 import math
8 from sensor_msgs.msg import LaserScan
9 from nav_msgs.msg import OccupancyGrid, MapMetaData
10 
11 # [INFO] [WallTime: 1508148230.485155] msg:
12 # [INFO] [WallTime: 1508148230.485310] angle_min: -1.57079637051
13 # [INFO] [WallTime: 1508148230.485466] angle_max: 1.57079637051
14 # [INFO] [WallTime: 1508148230.485623] angle_increment: 0.00436332309619
15 # [INFO] [WallTime: 1508148230.485770] time_increment: 1.73611151695e-05
16 # [INFO] [WallTime: 1508148230.485927] scan_time: 0.0250000003725
17 # [INFO] [WallTime: 1508148230.486063] size(ranges): 721
18 # [INFO] [WallTime: 1508148230.486205] approx. size: 721
19 #range_min: 0.019999999553
20 #range_max: 30.0
21 
22 ## @brief publiush dummy scan range
23 class DummyScan:
24  def __init__(self):
25  self.pub = rospy.Publisher('scan', LaserScan, queue_size = 1)
27 
28  self.pi2 = math.pi * 2
29  self.pih = math.pi / 2
30  self.laser_height = 0.2344
31  self.mapgrid_list = []
32 
33  # emurate URG
34  self.scan = LaserScan()
35  self.scan.header.frame_id = 'wheels_base_laser_link'
36  self.scan.angle_min = -1.57079637051
37  self.scan.angle_max = 1.57079637051
38  self.scan.angle_increment = 0.00436332309619
39  self.scan.time_increment = 1.73611151695e-05
40  self.scan.scan_time = 0.0250000003725
41  self.scan.range_min = 0.019999999553
42  self.scan.range_max = 30.0
43  # ranges_size = 721
44  self.ranges_size = int(1.0 +
45  (self.scan.angle_max - self.scan.angle_min)
46  / self.scan.angle_increment)
47 
48  # subscribe map once
49  self.sub_map = rospy.Subscriber('map', OccupancyGrid,
50  self.map_to_points)
51 
52  ## @brief make constant range, if map and tf have not been recieved
54  for i in range(self.ranges_size):
55  self.scan.ranges.append(10.0)
56 
57  ## @brief map to points
58  ## @param msg nav_msgs/OccupancyGrid
59  def map_to_points(self, msg):
60  map_info = msg.info
61  cr = math.cos(math.acos(map_info.origin.orientation.w) * 2.0)
62  sr = math.sqrt(1.0 - cr * cr)
63  self.mapgrid_list = []
64  for y in range(map_info.height):
65  yidx = y * map_info.width
66  my = y * map_info.resolution + map_info.origin.position.y
67  for x in range(map_info.width):
68  val = msg.data[x + yidx]
69  if val >= 90:
70  mx = x * map_info.resolution + map_info.origin.position.x
71  pt = [mx * cr - my * sr,
72  mx * sr + my * cr,
73  self.laser_height]
74  self.mapgrid_list.append(pt)
75  # if recievved once unregister
76  self.sub_map.unregister()
77 
78  ## @brief make range data from map and current pose
79  def make_map_range(self):
80  laser_pos = (0, 0, 0)
81  laser_theta = 0
82  try:
83  t = rospy.Time()
84  laser_pos, null = self.tf_listener.lookupTransform(
85  '/map',
86  'wheels_base_laser_link',
87  t)
88  # tf orientation is screwed up, calculate from base->laser
89  base_pos, null = self.tf_listener.lookupTransform(
90  '/map',
91  'base_link',
92  t)
93  laser_theta = math.atan2(laser_pos[1] - base_pos[1], laser_pos[0] - base_pos[0])
94  except (Exception):
95  None
96 
97  if len(self.mapgrid_list) < 0:
98  # create constant range if map has not been revieved yet
99  self.make_constant_range()
100  else:
101  self.scan.ranges = []
102  for i in range(self.ranges_size):
103  self.scan.ranges.append(0.0)
104 
105  for mp in self.mapgrid_list:
106  lx = mp[0] - laser_pos[0]
107  ly = mp[1] - laser_pos[1]
108  lrange = math.sqrt(lx * lx + ly * ly)
109  ltheta = math.atan2(ly, lx) - laser_theta
110  if ltheta > math.pi:
111  ltheta = ltheta - self.pi2
112  elif ltheta < -math.pi:
113  ltheta = ltheta + self.pi2
114 
115  if ltheta >= self.scan.angle_min and ltheta <= self.scan.angle_max:
116  li = int((ltheta - self.scan.angle_min) / self.scan.angle_increment)
117  if self.scan.ranges[li] < 1e-5:
118  self.scan.ranges[li] = lrange
119  elif self.scan.ranges[li] > lrange:
120  self.scan.ranges[li] = lrange
121 
122  # @brief create and publish range data
123  def publish(self):
124  self.make_map_range()
125  self.scan.header.stamp = rospy.get_rostime()
126  self.pub.publish(self.scan)
127 
128 if __name__ == '__main__':
129  rospy.init_node('dummy_scan', anonymous = True)
130  dummy_scan = DummyScan()
131 
132  rate = rospy.Rate(40)
133  while not rospy.is_shutdown():
134  dummy_scan.publish()
135  rate.sleep()
def make_constant_range(self)
make constant range, if map and tf have not been recieved
Definition: dummy_scan.py:53
def make_map_range(self)
make range data from map and current pose
Definition: dummy_scan.py:79
def map_to_points(self, msg)
map to points
Definition: dummy_scan.py:59
publiush dummy scan range
Definition: dummy_scan.py:23


seed_r7_navigation
Author(s):
autogenerated on Sun Apr 18 2021 02:40:32