def __init__(self, map_msg, particles, weights, state_lock=None): if state_lock is None: self.state_lock = Lock() else: self.state_lock = state_lock self.particles = particles self.weights = weights self.LASER_RAY_STEP = int(rospy.get_param( "~laser_ray_step")) # Step for downsampling laser scans self.MAX_RANGE_METERS = float( rospy.get_param("~max_range_meters")) # The max range of the laser oMap = range_libc.PyOMap( map_msg) # A version of the map that range_libc can understand max_range_px = int( self.MAX_RANGE_METERS / map_msg.info.resolution) # The max range in pixels of the laser #self.range_method = range_libc.PyCDDTCast(oMap, max_range_px, THETA_DISCRETIZATION) # The range method that will be used for ray casting self.range_method = range_libc.PyRayMarchingGPU( oMap, max_range_px) # The range method that will be used for ray casting self.range_method.set_sensor_model( self.precompute_sensor_model( max_range_px)) # Load the sensor model expressed as a table self.queries = None self.ranges = None self.laser_angles = None # The angles of each ray self.downsampled_angles = None # The angles of the downsampled rays self.do_resample = False # Set so that outside code can know that it's time to resample
def update_range_method_map(self): self.map_msg.data = self.dynamic_map.astype(int).flatten().tolist() print "UPDATING MAP" self.map_debug_pub.publish(self.map_msg) oMap = range_libc.PyOMap(self.map_msg) if self.WHICH_RM == "bl": self.range_method = range_libc.PyBresenhamsLine( oMap, self.MAX_RANGE_PX) elif "cddt" in self.WHICH_RM: self.range_method = range_libc.PyCDDTCast( oMap, self.MAX_RANGE_PX, self.THETA_DISCRETIZATION) if self.WHICH_RM == "pcddt": print "Pruning..." self.range_method.prune() elif self.WHICH_RM == "rm": self.range_method = range_libc.PyRayMarching( oMap, self.MAX_RANGE_PX) elif self.WHICH_RM == "rmgpu": self.range_method = range_libc.PyRayMarchingGPU( oMap, self.MAX_RANGE_PX) elif self.WHICH_RM == "glt": self.range_method = range_libc.PyGiantLUTCast( oMap, self.MAX_RANGE_PX, self.THETA_DISCRETIZATION) self.range_method.set_sensor_model(self.sensor_model_table)
def get_omap(self): ''' Fetch the occupancy grid map from the map_server instance, and initialize the correct RangeLibc method. Also stores a matrix which indicates the permissible region of the map ''' # this way you could give it a different map server as a parameter map_service_name = rospy.get_param("~static_map", "static_map") print("getting map from service: ", map_service_name) rospy.wait_for_service(map_service_name) self.map_msg = rospy.ServiceProxy(map_service_name, GetMap)().map self.dilated_map_msg = rospy.ServiceProxy(map_service_name, GetMap)().map self.map_info = self.map_msg.info self.MAX_RANGE_PX = int(self.MAX_RANGE_METERS / self.map_info.resolution) self.init_dynamic_map(self.MAP_BASE_PATH) self.map_msg.data = self.dynamic_map.astype(float).flatten().tolist() oMap = range_libc.PyOMap(self.map_msg) # initialize range method print "Initializing range method:", self.WHICH_RM if self.WHICH_RM == "bl": self.range_method = range_libc.PyBresenhamsLine( oMap, self.MAX_RANGE_PX) elif "cddt" in self.WHICH_RM: self.range_method = range_libc.PyCDDTCast( oMap, self.MAX_RANGE_PX, self.THETA_DISCRETIZATION) if self.WHICH_RM == "pcddt": print "Pruning..." self.range_method.prune() elif self.WHICH_RM == "rm": self.range_method = range_libc.PyRayMarching( oMap, self.MAX_RANGE_PX) elif self.WHICH_RM == "rmgpu": self.range_method = range_libc.PyRayMarchingGPU( oMap, self.MAX_RANGE_PX) elif self.WHICH_RM == "glt": self.range_method = range_libc.PyGiantLUTCast( oMap, self.MAX_RANGE_PX, self.THETA_DISCRETIZATION) print "Done loading map" # 0: permissible, -1: unmapped, 100: blocked array_255 = np.array(self.map_msg.data).reshape( (self.map_msg.info.height, self.map_msg.info.width)) # 0: not permissible, 1: permissible self.permissible_region = np.zeros_like(array_255, dtype=bool) self.permissible_region[array_255 == 0] = 1 self.map_initialized = True
def get_omap(self): # this way you could give it a different map server as a parameter map_service_name = rospy.get_param("~static_map", "static_map") print("getting map from service: ", map_service_name) rospy.wait_for_service(map_service_name) map_msg = rospy.ServiceProxy(map_service_name, GetMap)().map self.map_info = map_msg.info oMap = range_libc.PyOMap(map_msg) # this value is the max range used internally in RangeLibc # it also should be the size of your sensor model table self.MAX_RANGE_PX = int(self.MAX_RANGE_METERS / self.map_info.resolution) # initialize range method print "Initializing range method:", self.WHICH_RANGE_METHOD if self.WHICH_RANGE_METHOD == "bl": self.range_method = range_libc.PyBresenhamsLine( oMap, self.MAX_RANGE_PX) elif "cddt" in self.WHICH_RANGE_METHOD: self.range_method = range_libc.PyCDDTCast( oMap, self.MAX_RANGE_PX, self.THETA_DISCRETIZATION) if self.WHICH_RANGE_METHOD == "pcddt": print "Pruning..." self.range_method.prune() elif self.WHICH_RANGE_METHOD == "rm": self.range_method = range_libc.PyRayMarching( oMap, self.MAX_RANGE_PX) elif self.WHICH_RANGE_METHOD == "rmgpu": self.range_method = range_libc.PyRayMarchingGPU( oMap, self.MAX_RANGE_PX) elif self.WHICH_RANGE_METHOD == "glt": self.range_method = range_libc.PyGiantLUTCast( oMap, self.MAX_RANGE_PX, self.THETA_DISCRETIZATION) print "Done loading map" # 0: permissible, -1: unmapped, large value: blocked array_255 = np.array(map_msg.data).reshape( (map_msg.info.height, map_msg.info.width)) # 0: not permissible, 1: permissible # this may be useful for global particle initialization - don't initialize particles in non-permissible states self.permissible_region = np.zeros_like(array_255, dtype=bool) self.permissible_region[array_255 == 0] = 1 self.map_initialized = True
def setRaytracingMethod(self, method="RM"): """ Set which Ray tracing method to use """ if not self.hasMap: print "for set RaytracingMethod use setMap first" return if method == "RM": self.scan_method = range_libc.PyRayMarching(self.omap, self.mrx) elif method == "RMGPU": self.scan_method = range_libc.PyRayMarchingGPU(self.omap, self.mrx) else: print "Only ray marching is supported" sys.exit()
def __init__(self, num_rays=None, min_angle=None, max_angle=None, max_range=None, range_method=None, frame=None, omap=None): self.max_range = max_range self.laser_ranges = np.zeros(num_rays, dtype=np.float32) self.laser_angles = np.linspace(min_angle, max_angle, num_rays, endpoint=True) self.queries = np.zeros((num_rays, 3), dtype=np.float32) map_msg = omap.map_msg map_info = map_msg.info oMap = range_libc.PyOMap(map_msg) self.MAX_RANGE_PX = int(self.max_range / map_info.resolution) self.THETA_DISCRETIZATION = 200 # initialize range method print "Initializing range method:", range_method if range_method == "bl": self.range_method = range_libc.PyBresenhamsLine( oMap, self.MAX_RANGE_PX) elif "cddt" in range_method: self.range_method = range_libc.PyCDDTCast( oMap, self.MAX_RANGE_PX, self.THETA_DISCRETIZATION) if range_method == "pcddt": print "Pruning..." self.range_method.prune() elif range_method == "rm": self.range_method = range_libc.PyRayMarching( oMap, self.MAX_RANGE_PX) elif range_method == "rmgpu": self.range_method = range_libc.PyRayMarchingGPU( oMap, self.MAX_RANGE_PX) elif range_method == "glt": self.range_method = range_libc.PyGiantLUTCast( oMap, self.MAX_RANGE_PX, self.THETA_DISCRETIZATION) print "Simulated Laser Scanner Initialized..."
def get_omap(self): ''' Fetch the occupancy grid map from the map_server instance, and initialize the correct RangeLibc method. Also stores a matrix which indicates the permissible region of the map ''' # this way you could give it a different map server as a parameter # map_service_name = rospy.get_param('/static_map', '/static_map') map_service_name = '/static_map' print('getting map from service: ', map_service_name) print('map service name: {}'.format(map_service_name)) rospy.wait_for_service(map_service_name) map_msg = rospy.ServiceProxy(map_service_name, GetMap)().map self.map_info = map_msg.info oMap = range_libc.PyOMap(map_msg) self.MAX_RANGE_PX = int(self.MAX_RANGE_METERS / self.map_info.resolution) # initialize range method print 'Initializing range method:', self.WHICH_RM if self.WHICH_RM == 'bl': self.range_method = range_libc.PyBresenhamsLine(oMap, self.MAX_RANGE_PX) elif 'cddt' in self.WHICH_RM: self.range_method = range_libc.PyCDDTCast(oMap, self.MAX_RANGE_PX, self.THETA_DISCRETIZATION) if self.WHICH_RM == 'pcddt': print 'Pruning...' self.range_method.prune() elif self.WHICH_RM == 'rm': self.range_method = range_libc.PyRayMarching(oMap, self.MAX_RANGE_PX) elif self.WHICH_RM == 'rmgpu': self.range_method = range_libc.PyRayMarchingGPU(oMap, self.MAX_RANGE_PX) elif self.WHICH_RM == 'glt': self.range_method = range_libc.PyGiantLUTCast(oMap, self.MAX_RANGE_PX, self.THETA_DISCRETIZATION) print 'Done loading map' # 0: permissible, -1: unmapped, 100: blocked array_255 = np.array(map_msg.data).reshape((map_msg.info.height, map_msg.info.width)) # 0: not permissible, 1: permissible self.permissible_region = np.zeros_like(array_255, dtype=bool) self.permissible_region[array_255==0] = 1 self.map_initialized = True