def query_sensor(self, position, orientation): self.make_sure_raytracer_configured() if self.map is None: raise BVException('Sensor queried before map was defined.') if self.sensor_desc is None: raise BVException('Sensor queried before sensor was defined.') position = aslist(position) orientation = asscalar(orientation) query_object = {"class": "query_sensor", "position": [position[0], position[1]], "orientation": orientation} self.write_to_connection(query_object) answer = self.child_stream.read_next() if answer is None: raise Exception, "Could not communicate with child" luminance = [] for i, surface_id in enumerate(answer['surface']): if answer['valid'][i]: texture = self.surface2texture[surface_id] coord = answer['curvilinear_coordinate'][i] luminance.append(asscalar(texture(coord))) else: luminance.append(float('nan')) answer['luminance'] = luminance return answer
def query_circle(self, center, radius): """ Returns tuple (hit, surface_id) """ if radius is None or center is None: raise ValueError('Invalid parameters %s, %s', (center, radius)) radius = asscalar(radius) centera = array(center, dtype='float32') if numpy.any(numpy.isnan(centera)) or len(centera) != 2: raise ValueError('Invalid parameter center: %s ' % center) if not radius > 0: raise ValueError('radius must be > 0 (got %s) ' % radius) center = aslist(center) self.make_sure_raytracer_configured() if self.map is None: raise BVException('query_circle called before map was defined.') query_object = {"class": "query_circle", "center": [ center[0], center[1] ], "radius": radius} self.write_to_connection(query_object) answer = self.child_stream.read_next() if answer is None: raise BVException, "Could not communicate with child" assert(answer['class'] == "query_circle_response") hit = answer['intersects'] == 1 if hit: surface = answer['surface'] else: surface = None return hit, surface