def emit_propagation(self, w: GeoData, w_timestamp: datetime.datetime, p: GeoData, p_timestamp: datetime.datetime, until: datetime.datetime): """Publish current situation assessment.""" current = None if w: current = WildfireMap( header=rospy.Header(stamp=rospy.Time.from_sec(w_timestamp.timestamp())), raster=serialization.raster_msg_from_geodata(w, 'ignition')) pred = PredictedWildfireMap( header=rospy.Header(stamp=rospy.Time.from_sec(p_timestamp.timestamp())), last_valid=rospy.Time.from_sec(until.timestamp()), raster=serialization.raster_msg_from_geodata(p, 'ignition')) # self.pub_wildfire_real.publish(pred) self.pub_wildfire_pred.publish(pred) # self.pub_wildfire_real.publish(WildfireMap( # header=rospy.Header(stamp=rospy.Time.from_sec(p_timestamp.timestamp())), # raster=serialization.raster_msg_from_geodata(p, 'ignition'))) if current: self.pub_wildfire_current.publish(current) if self.sa.elevation_timestamp > self.last_elevation_timestamp: # pub_elevation is latching, don't bother other nodes with unnecessary elevation updates elevation = ElevationMap( header=rospy.Header( stamp=rospy.Time.from_sec(self.sa.elevation_timestamp.timestamp())), raster=serialization.raster_msg_from_geodata(self.sa.elevation, 'elevation')) self.pub_elevation.publish(elevation) rospy.loginfo("A new Elevation Map has been generated") self.last_elevation_timestamp = self.sa.elevation_timestamp g = GeoDataDisplay.pyplot_figure(p) g.draw_ignition_shade(with_colorbar=True) g.figure.savefig("/home/rbailonr/fuego_pre.png") g.close() if w: g = GeoDataDisplay.pyplot_figure(w) g.draw_ignition_shade(with_colorbar=True) g.figure.savefig("/home/rbailonr/fuego_cur.png") g.close() g = GeoDataDisplay.pyplot_figure(self.sa.observed_wildfire.geodata) g.draw_ignition_shade(with_colorbar=True) g.figure.savefig("/home/rbailonr/fuego_obs.png") # obs_cpp = self.sa.observed_wildfire.geodata.as_cpp_raster("ignition") # obs_cpp_bytes = obs_cpp.encoded(3035) # print("Compressed: ") # print(obs_cpp_bytes.hex()) # obs_cpp_bytes = obs_cpp.encoded_uncompressed(3035) # print("Uncompressed: ") # print(obs_cpp_bytes.hex()) g.close() del g rospy.loginfo("Wildfire propagation publishing ended")
def pub_alarm(posx, posy): start_wind = (3.0, 3 * np.pi / 2) environment = fire_rs.firemodel.propagation.Environment( area, start_wind[0], start_wind[1], fire_rs.geodata.environment.World( **world_paths, landcover_to_fuel_remap=fire_rs.geodata.environment.EVERYTHING_FUELMODEL_REMAP)) rw = fire_rs.simulation.wildfire.RealWildfire( datetime.datetime.fromtimestamp( (rospy.Time.now() - rospy.Duration.from_sec(10 * 60)).to_sec()), environment) ignitions = [(posx, posy), ] ignitions_cell = [rw.fire_map.array_index(p) for p in ignitions] rw.ignite((posx, posy)) rospy.loginfo("ignite %s", str((posx, posy))) rw.propagate(datetime.timedelta(minutes=90.)) rospy.loginfo("propagate 90 min") wind = MeanWindStamped(header=Header(stamp=rospy.Time.now()), speed=start_wind[0], direction=start_wind[1]) wind_pub.publish(wind) rospy.loginfo("Notify wind") rospy.loginfo(wind) firemap = rw.perimeter(rospy.Time.now().to_sec()).geodata wildfire_message = WildfireMap(header=rospy.Header(stamp=rospy.Time.now()), raster=serialization.raster_msg_from_geodata( firemap, layer="ignition")) map_pub.publish(wildfire_message) wildfire_real_message = WildfireMap(header=rospy.Header(stamp=rospy.Time.now()), raster=serialization.raster_msg_from_geodata( rw.fire_map, layer="ignition")) rospy.loginfo("Notify alarm map at 15 min") rospy.loginfo(wildfire_message) pub_wildfire_real.publish(wildfire_real_message) rospy.loginfo(wildfire_real_message) firemap.data["ignition"][firemap.data["ignition"] == np.inf] = 0 firemap.data["ignition"][firemap.data["ignition"].nonzero()] = 65535 firemap.write_to_image_file("/home/rbailonr/fire.png", "ignition") fire_pos = Timed2DPointStamped(header=Header(stamp=rospy.Time.now()), x=posx, y=posy, t=rospy.Time.now() - rospy.Duration.from_sec(60 * 30)) alarm_pub.publish(fire_pos) rospy.loginfo("Notify alarm point") rospy.loginfo(fire_pos)
def propagate_and_set_fire_front( self, origin, origin_time: rospy.Time, perimeter_time: rospy.Time, environment: fire_rs.firemodel.propagation.Environment): origin_pos = Timed2DPointStamped(header=Header(stamp=rospy.Time.now()), x=origin[0], y=origin[1], t=origin_time) fireprop = fire_rs.firemodel.propagation.propagate_from_points( environment, fire_rs.firemodel.propagation.TimedPoint(*origin, origin_time.to_sec())) firemap = fireprop.ignitions() array, cells, contours = fire_rs.geodata.wildfire._compute_perimeter( firemap, perimeter_time.to_sec()) # Publish ignition points # initial alarm self.pub_w.publish(origin_pos) self.pub_w.publish(origin_pos) rospy.loginfo(origin_pos) wildfire_message = WildfireMap( header=rospy.Header(stamp=rospy.Time.now()), raster=serialization.raster_msg_from_geodata( firemap.clone(data_array=array, dtype=firemap.data.dtype), 'ignition')) self.pub_wildfire_obs.publish(wildfire_message) rospy.loginfo(wildfire_message)
def on_firemap_from_neptus(self, **kwargs): kwargs['uav'] = "x8-06" if kwargs['uav'] in self._known_uavs: with self.dict_firemap_lock: kwargs["firemap"].data["ignition"] = kwargs["firemap"].data[ "ignition"][..., ::-1] kwargs["firemap"].write_to_image_file( "/home/rbailonr/hola.png", "ignition") firemap_msg = WildfireMap( header=Header(stamp=rospy.Time.from_sec(kwargs['time'])), raster=serialization.raster_msg_from_geodata( kwargs["firemap"], 'ignition')) self.dict_firemap_msg[kwargs['uav']] = firemap_msg
def publish_real_fire(self, real_fire: fire_rs.simulation.wildfire.RealWildfire): current_fire_msg = WildfireMap( header=rospy.Header(stamp=rospy.Time.now()), raster=serialization.raster_msg_from_geodata(real_fire.fire_map, layer="ignition")) self.pub_wildfire_real.publish(current_fire_msg) rospy.loginfo("Publish real fire") rospy.loginfo(current_fire_msg) g = fire_rs.geodata.display.GeoDataDisplay.pyplot_figure( real_fire.fire_map) g.draw_ignition_shade(with_colorbar=True) g.figure.savefig("/home/rbailonr/fuego_ref.png") g.close()
def notify_alarm_map(self, firemap: fire_rs.geodata.geo_data.GeoData): if callable(firemap): firemap = firemap() wildfire_message = WildfireMap( header=rospy.Header(stamp=rospy.Time.now()), raster=serialization.raster_msg_from_geodata(firemap, layer="ignition")) self.pub_wildfire_obs.publish(wildfire_message) rospy.loginfo("Notify alarm map") rospy.loginfo(wildfire_message) firemap.data["ignition"][firemap.data["ignition"] == np.inf] = 0 firemap.data["ignition"][firemap.data["ignition"].nonzero()] = 65535 firemap.write_to_image_file(os.path.join(self.workdir, "fire.png"), "ignition")
def do_mapping(self): if self.firemapper is not None: for uav_str, wp_list in self.location_history.items(): self.firemapper.observe(list(zip(*wp_list)), fire_rs.planning.new_planning.UAVModels.get(uav_str)) # obs_fire_map = GeoData.from_cpp_raster(self.firemapper.firemap, "ignition", # projection=self.elevation_map.projection) fm = self.firemapper.firemap om = self.firemapper.observed print("map") g = fire_rs.geodata.display.GeoDataDisplay.pyplot_figure(fm) g.draw_ignition_shade(with_colorbar=True) g.figure.savefig("/home/rbailonr/fuego_fakemapped.png") g.close() g = fire_rs.geodata.display.GeoDataDisplay.pyplot_figure(om) g.draw_ignition_shade(with_colorbar=True) g.figure.savefig("/home/rbailonr/fuego_fakeobserved.png") g.close() wf_msg = WildfireMap(header=rospy.Header(stamp=rospy.Time.now()), raster=serialization.raster_msg_from_geodata(fm, 'ignition', invert=False)) self.pub_dict_firemap[uav_str].publish(wf_msg)