diff --git a/ais2msg/aismsg_publisher.py b/ais2msg/aismsg_publisher.py index 98a0d15c9ac7f97ce704982a42282886ea482cfa..eb41575a27e62c11aa6dae5f7bdf173aaca357fe 100644 --- a/ais2msg/aismsg_publisher.py +++ b/ais2msg/aismsg_publisher.py @@ -7,6 +7,8 @@ from aismsg.msg import AISObjectStamped, AISObjectArray from ais2msg.object_helper import get_AISobj_from_decode_msg, decode_message QUEUE_SIZE = 1000 +OUTDATED_THRESHOLD_SEC = 20 +OUTDATED_THRESHOLD_NANOSEC = OUTDATED_THRESHOLD_SEC * 1000000000 AIS_OBJECT_PUBLISHER_NAME = "AIS_Publisher" AIS_OBJECT_PUBLISHER_PUB_TOPIC = "/AISObjectPub" AIS_OBJECT_ARRAY_PUBLISHER_NAME = "AIS_Array_Publisher" @@ -23,8 +25,12 @@ class AISObjectPublisher(Node): self._ros_setup() + self.outdated_threshold_nanosec = OUTDATED_THRESHOLD_NANOSEC + self.counter = 0 self.last_mmsi = None + self.last_timestamp = None + self.mmsi_obj_dict = {} def publish_data(self, data): @@ -43,7 +49,6 @@ class AISObjectPublisher(Node): aisobj = get_AISobj_from_decode_msg( decode_msg, self.mmsi_obj_dict[self.last_mmsi]) obj = aisobj.object - obj.timestamp_last_update = self.get_clock().now().nanoseconds self.get_logger().info(f"Update Exist mmsi: {self.last_mmsi}") else: # if mmsi not exist, create a new one @@ -51,13 +56,15 @@ class AISObjectPublisher(Node): aisobj = get_AISobj_from_decode_msg(decode_msg) obj = aisobj.object obj.timestamp_create = self.get_clock().now().nanoseconds - obj.timestamp_last_update = self.get_clock().now().nanoseconds self.mmsi_obj_dict[self.last_mmsi] = aisobj self.get_logger().info(f"Got New mmsi: {self.last_mmsi}") + aisobj.object.timestamp_last_update = self.get_clock().now( + ).nanoseconds aisobj.header.stamp = self.get_clock().now().to_msg() aisobj.header.frame_id = str(self.counter) self.counter += 1 + self.last_timestamp = aisobj.object.timestamp_last_update except RuntimeError: self.get_logger().warning( @@ -65,15 +72,27 @@ class AISObjectPublisher(Node): return self._publish() - - def _publish(self): - self.publisher.publish(self.mmsi_obj_dict[self.last_mmsi]) + self._remove_outdated() def _ros_setup(self): self.publisher = self.create_publisher(AISObjectStamped, AIS_OBJECT_PUBLISHER_PUB_TOPIC, QUEUE_SIZE) + def _publish(self): + self.publisher.publish(self.mmsi_obj_dict[self.last_mmsi]) + + def _remove_outdated(self): + + out_mmsi = [ + k for k, v in self.mmsi_obj_dict.items() if self.last_timestamp - + v.object.timestamp_last_update > self.outdated_threshold_nanosec + ] + + for mmsi in out_mmsi: + self.mmsi_obj_dict.pop(mmsi) + self.get_logger().info(f"Remove outdated mmsi: {mmsi}") + class AISObjectArrayPublisher(AISObjectPublisher):