__init__.py
Go to the documentation of this file.
1 import threading
2 import rospy
3 from message_filters import SimpleFilter
4 
6  """
7  Synchronize multiple topics using a simple
8  and non-optimal strategy.
9 
10  This caches messages for all subscribed filters
11  and passes them on (bundled) whenever there are
12  messages available on all topics.
13  """
14 
15  def __init__(self, filters, queue_size=10, max_difference=rospy.Duration(.5)):
16  """
17  :param queue_size: The size of the message buffer for each filter
18  :param max_difference: The maximal time difference between messages in the same bundle
19  """
20 
21  SimpleFilter.__init__(self)
22  self.connectInput(filters)
23 
24  self.queue_size= queue_size
25  self.max_diff = max_difference
26  self.lock = threading.Lock()
27 
28  def connectInput(self, filters):
29 
30  self.queues = [[] for f in filters]
31  self.input_connections = [f.registerCallback(self.add, q) for (f, q) in zip(filters, self.queues)]
32 
33  def add(self, msg, queue):
34 
35  self.lock.acquire()
36  queue.append(msg)
37 
38  while len(queue) > self.queue_size:
39  queue.pop(0)
40 
41  if len(queue) == 1 and not([] in self.queues):
42  # this was the last missing message to fire a synchronized msg
43 
44  t= queue[0].header.stamp
45 
46  def mindiff(queue, time):
47  """ return the message closest to time """
48  selmsg=queue[0]
49  for msg in queue[1:]:
50  if abs(msg.header.stamp - time) < abs(selmsg.header.stamp - time):
51  selmsg= msg
52  elif abs(msg.header.stamp - time) > abs(selmsg.header.stamp - time):
53  break
54  return selmsg
55 
56  # this gets all messages _centered_ around the one which arrived last
57  # _NOT_ the best match as the C++ ApproximateTime policy
58  msgs= [mindiff(q, t) for q in self.queues]
59  times= [m.header.stamp for m in msgs]
60 
61  bundle_size= max(times)-min(times)
62  if bundle_size < self.max_diff:
63  self.signalMessage(*msgs)
64  else:
65  rospy.loginfo("discard bundle because overall time difference %s > %s" % (str(bundle_size), str(self.max_diff)))
66 
67  # cleanup all messages before and including those just sent
68  for (q,t) in zip(self.queues, times):
69  while len(q) > 0 and q[0].header.stamp <= t:
70  q.pop(0)
71 
72  self.lock.release()
void signalMessage(const MConstPtr &msg)
def __init__(self, filters, queue_size=10, max_difference=rospy.Duration(.5))
Definition: __init__.py:15


simple_approximate_time_synchronizer
Author(s): Michael Goerner
autogenerated on Mon Jun 10 2019 15:49:21