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")
Esempio n. 2
0
    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)
Esempio n. 3
0
    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)
Esempio n. 4
0
 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
Esempio n. 5
0
    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()
Esempio n. 6
0
    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")
Esempio n. 7
0
 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)