35 #ifndef MESSAGE_FILTERS_SYNC_APPROXIMATE_TIME_H
36 #define MESSAGE_FILTERS_SYNC_APPROXIMATE_TIME_H
43 #include <boost/tuple/tuple.hpp>
44 #include <boost/shared_ptr.hpp>
45 #include <boost/function.hpp>
46 #include <boost/thread/mutex.hpp>
48 #include <boost/bind.hpp>
49 #include <boost/type_traits/is_same.hpp>
50 #include <boost/noncopyable.hpp>
51 #include <boost/mpl/or.hpp>
52 #include <boost/mpl/at.hpp>
53 #include <boost/mpl/vector.hpp>
65 namespace sync_policies
68 namespace mpl = boost::mpl;
70 template<
typename M0,
typename M1,
typename M2 = NullType,
typename M3 = NullType,
typename M4 = NullType,
71 typename M5 = NullType,
typename M6 = NullType,
typename M7 = NullType,
typename M8 = NullType>
72 struct ApproximateTime :
public PolicyBase<M0, M1, M2, M3, M4, M5, M6, M7, M8>
74 typedef Synchronizer<ApproximateTime>
Sync;
75 typedef PolicyBase<M0, M1, M2, M3, M4, M5, M6, M7, M8>
Super;
89 typedef std::deque<M0Event>
M0Deque;
90 typedef std::deque<M1Event>
M1Deque;
91 typedef std::deque<M2Event>
M2Deque;
92 typedef std::deque<M3Event>
M3Deque;
93 typedef std::deque<M4Event>
M4Deque;
94 typedef std::deque<M5Event>
M5Deque;
95 typedef std::deque<M6Event>
M6Deque;
96 typedef std::deque<M7Event>
M7Deque;
98 typedef std::vector<M0Event>
M0Vector;
99 typedef std::vector<M1Event>
M1Vector;
100 typedef std::vector<M2Event>
M2Vector;
101 typedef std::vector<M3Event>
M3Vector;
102 typedef std::vector<M4Event>
M4Vector;
103 typedef std::vector<M5Event>
M5Vector;
104 typedef std::vector<M6Event>
M6Vector;
105 typedef std::vector<M7Event>
M7Vector;
106 typedef std::vector<M8Event>
M8Vector;
107 typedef boost::tuple<M0Event, M1Event, M2Event, M3Event, M4Event, M5Event, M6Event, M7Event, M8Event>
Tuple;
108 typedef boost::tuple<M0Deque, M1Deque, M2Deque, M3Deque, M4Deque, M5Deque, M6Deque, M7Deque, M8Deque>
DequeTuple;
109 typedef boost::tuple<M0Vector, M1Vector, M2Vector, M3Vector, M4Vector, M5Vector, M6Vector, M7Vector, M8Vector>
VectorTuple;
166 std::deque<typename mpl::at_c<Events, i>::type>& deque = boost::get<i>(
deques_);
167 std::vector<typename mpl::at_c<Events, i>::type>& v = boost::get<i>(
past_);
169 const typename mpl::at_c<Messages, i>::type &msg = *(deque.back()).getMessage();
170 ros::Time msg_time = mt::TimeStamp<typename mpl::at_c<Messages, i>::type>::value(msg);
172 bool check_ok =
true;
173 if (deque.size() == (
size_t) 1)
180 const typename mpl::at_c<Messages, i>::type &previous_msg = *(v.back()).getMessage();
181 previous_msg_time = mt::TimeStamp<typename mpl::at_c<Messages, i>::type>::value(previous_msg);
186 const typename mpl::at_c<Messages, i>::type &previous_msg = *(deque[deque.size()-2]).getMessage();
187 previous_msg_time = mt::TimeStamp<typename mpl::at_c<Messages, i>::type>::value(previous_msg);
189 if (msg_time < previous_msg_time)
192 ROS_WARN_STREAM(
"Messages of type " << i <<
" arrived out of order (will print only once)");
199 ROS_WARN_STREAM(
"Messages of type " << i <<
" arrived closer (" << (msg_time - previous_msg_time)
201 <<
") (will print only once)");
210 void add(
const typename mpl::at_c<Events, i>::type& evt)
223 ROS_WARN(
"Detected jump back in time. Clearing message filter queues");
234 std::deque<typename mpl::at_c<Events, i>::type>& deque = boost::get<i>(
deques_);
235 deque.push_back(evt);
236 if (deque.size() == (
size_t)1) {
247 if (!checkInterMessageBound<i>())
250 dequeDeleteFront<i>();
255 std::vector<typename mpl::at_c<Events, i>::type>& past = boost::get<i>(
past_);
329 std::deque<typename mpl::at_c<Events, i>::type>& q = boost::get<i>(
deques_);
344 std::deque<typename mpl::at_c<Events, i>::type>& deque = boost::get<i>(
deques_);
359 dequeDeleteFront<0>();
362 dequeDeleteFront<1>();
365 dequeDeleteFront<2>();
368 dequeDeleteFront<3>();
371 dequeDeleteFront<4>();
374 dequeDeleteFront<5>();
377 dequeDeleteFront<6>();
380 dequeDeleteFront<7>();
383 dequeDeleteFront<8>();
394 std::deque<typename mpl::at_c<Events, i>::type>& deque = boost::get<i>(
deques_);
395 std::vector<typename mpl::at_c<Events, i>::type>& vector = boost::get<i>(
past_);
397 vector.push_back(deque.front());
410 dequeMoveFrontToPast<0>();
413 dequeMoveFrontToPast<1>();
416 dequeMoveFrontToPast<2>();
419 dequeMoveFrontToPast<3>();
422 dequeMoveFrontToPast<4>();
425 dequeMoveFrontToPast<5>();
428 dequeMoveFrontToPast<6>();
431 dequeMoveFrontToPast<7>();
434 dequeMoveFrontToPast<8>();
448 if (RealTypeCount::value > 2)
451 if (RealTypeCount::value > 3)
454 if (RealTypeCount::value > 4)
457 if (RealTypeCount::value > 5)
460 if (RealTypeCount::value > 6)
463 if (RealTypeCount::value > 7)
466 if (RealTypeCount::value > 8)
477 boost::get<0>(
past_).clear();
478 boost::get<1>(
past_).clear();
479 boost::get<2>(
past_).clear();
480 boost::get<3>(
past_).clear();
481 boost::get<4>(
past_).clear();
482 boost::get<5>(
past_).clear();
483 boost::get<6>(
past_).clear();
484 boost::get<7>(
past_).clear();
485 boost::get<8>(
past_).clear();
492 void recover(
size_t num_messages)
494 if (i >= RealTypeCount::value)
499 std::vector<typename mpl::at_c<Events, i>::type>& v = boost::get<i>(
past_);
500 std::deque<typename mpl::at_c<Events, i>::type>& q = boost::get<i>(
deques_);
502 while (num_messages > 0)
504 q.push_front(v.back());
519 if (i >= RealTypeCount::value)
524 std::vector<typename mpl::at_c<Events, i>::type>& v = boost::get<i>(
past_);
525 std::deque<typename mpl::at_c<Events, i>::type>& q = boost::get<i>(
deques_);
528 q.push_front(v.back());
542 if (i >= RealTypeCount::value)
547 std::vector<typename mpl::at_c<Events, i>::type>& v = boost::get<i>(
past_);
548 std::deque<typename mpl::at_c<Events, i>::type>& q = boost::get<i>(
deques_);
551 q.push_front(v.back());
578 recoverAndDelete<0>();
579 recoverAndDelete<1>();
580 recoverAndDelete<2>();
581 recoverAndDelete<3>();
582 recoverAndDelete<4>();
583 recoverAndDelete<5>();
584 recoverAndDelete<6>();
585 recoverAndDelete<7>();
586 recoverAndDelete<8>();
612 time = mt::TimeStamp<M0>::value(*m0.getMessage());
614 if (RealTypeCount::value > 1)
617 if ((mt::TimeStamp<M1>::value(*m1.getMessage()) < time) ^ end)
619 time = mt::TimeStamp<M1>::value(*m1.getMessage());
623 if (RealTypeCount::value > 2)
626 if ((mt::TimeStamp<M2>::value(*m2.getMessage()) < time) ^ end)
628 time = mt::TimeStamp<M2>::value(*m2.getMessage());
632 if (RealTypeCount::value > 3)
635 if ((mt::TimeStamp<M3>::value(*m3.getMessage()) < time) ^ end)
637 time = mt::TimeStamp<M3>::value(*m3.getMessage());
641 if (RealTypeCount::value > 4)
644 if ((mt::TimeStamp<M4>::value(*m4.getMessage()) < time) ^ end)
646 time = mt::TimeStamp<M4>::value(*m4.getMessage());
650 if (RealTypeCount::value > 5)
653 if ((mt::TimeStamp<M5>::value(*m5.getMessage()) < time) ^ end)
655 time = mt::TimeStamp<M5>::value(*m5.getMessage());
659 if (RealTypeCount::value > 6)
662 if ((mt::TimeStamp<M6>::value(*m6.getMessage()) < time) ^ end)
664 time = mt::TimeStamp<M6>::value(*m6.getMessage());
668 if (RealTypeCount::value > 7)
671 if ((mt::TimeStamp<M7>::value(*m7.getMessage()) < time) ^ end)
673 time = mt::TimeStamp<M7>::value(*m7.getMessage());
677 if (RealTypeCount::value > 8)
680 if ((mt::TimeStamp<M8>::value(*m8.getMessage()) < time) ^ end)
682 time = mt::TimeStamp<M8>::value(*m8.getMessage());
695 if (i >= RealTypeCount::value)
701 std::vector<typename mpl::at_c<Events, i>::type>& v = boost::get<i>(
past_);
702 std::deque<typename mpl::at_c<Events, i>::type>& q = boost::get<i>(
deques_);
706 ros::Time last_msg_time = mt::TimeStamp<typename mpl::at_c<Messages, i>::type>::value(*(v.back()).getMessage());
710 return msg_time_lower_bound;
714 ros::Time current_msg_time = mt::TimeStamp<typename mpl::at_c<Messages, i>::type>::value(*(q.front()).getMessage());
715 return current_msg_time;
738 std::vector<ros::Time> virtual_times(9);
739 virtual_times[0] = getVirtualTime<0>();
740 virtual_times[1] = getVirtualTime<1>();
741 virtual_times[2] = getVirtualTime<2>();
742 virtual_times[3] = getVirtualTime<3>();
743 virtual_times[4] = getVirtualTime<4>();
744 virtual_times[5] = getVirtualTime<5>();
745 virtual_times[6] = getVirtualTime<6>();
746 virtual_times[7] = getVirtualTime<7>();
747 virtual_times[8] = getVirtualTime<8>();
749 time = virtual_times[0];
751 for (
int i = 0; i < RealTypeCount::value; i++)
753 if ((virtual_times[i] < time) ^ end)
755 time = virtual_times[i];
773 uint32_t end_index, start_index;
776 for (uint32_t i = 0; i < (uint32_t)RealTypeCount::value; i++)
833 if (start_index ==
pivot_)
852 std::vector<int> num_virtual_moves(9,0);
856 uint32_t end_index, start_index;
874 recover<0>(num_virtual_moves[0]);
875 recover<1>(num_virtual_moves[1]);
876 recover<2>(num_virtual_moves[2]);
877 recover<3>(num_virtual_moves[3]);
878 recover<4>(num_virtual_moves[4]);
879 recover<5>(num_virtual_moves[5]);
880 recover<6>(num_virtual_moves[6]);
881 recover<7>(num_virtual_moves[7]);
882 recover<8>(num_virtual_moves[8]);
883 (void)num_non_empty_deques_before_virtual_search;
893 num_virtual_moves[start_index]++;
928 #endif // MESSAGE_FILTERS_SYNC_APPROXIMATE_TIME_H