Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Using C++ message filters in ROS2

I am trying to subscribe to two topics. If their header stamps are equal they should be combined into a single message and published.

I believe that an exact_time message_filter is the way to go here.

In my case the messages will be high resolution images so would like the node to be written in C++ to reduce the CPU cost.

For testing I have wrote up a Python node to to publish two messages (just sensor_msgs::msg::Temperature for this testing case) with the same header stamp. This node works with no issue.

import rclpy
from rclpy.node import Node

from sensor_msgs.msg import Temperature


class DoublePublisher(Node):

    def __init__(self):
        super().__init__('double_publisher')

        # create publishers
        self.publisher_temp_1_ = self.create_publisher(Temperature, 'temp_1', 10)
        self.publisher_temp_2_ = self.create_publisher(Temperature, 'temp_2', 10)

        # create timer
        timer_period = 1 
        self.timer_ = self.create_timer(timer_period, self.timer_callback)

        # initialize counter
        self.i = 0

    def timer_callback(self):
        self.get_logger().info("Publishing messages")

        # get current time for headers
        msg_stamp = self._clock.now().to_msg()

        # create and publish Temperature messages
        msg_1 = Temperature()
        msg_1.header.stamp = msg_stamp
        msg_1.temperature = float(self.i)
        self.publisher_temp_1_.publish(msg_1)

        msg_2 = Temperature()
        msg_2.header.stamp = msg_stamp
        msg_2.temperature = float(self.i + 2)
        self.publisher_temp_2_.publish(msg_2)

        self.i += 1


def main(args=None):
    rclpy.init(args=args)

    minimal_publisher = DoublePublisher()

    rclpy.spin(minimal_publisher)

    minimal_publisher.destroy_node()
    rclpy.shutdown()


if __name__ == '__main__':
    main()

I then tried to make a C++ node that would use message filters to subscribe to the two topics and call a callback if two messages have the same timestamp. I can't really find any solid examples on how to do this in ROS2. I tried to figure it out from the comments in the code from this repo. Below is my code and the compile errors that I get.

The code:

#include <memory>
#include <string>
#include <cstring>

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
#include "sensor_msgs/msg/temperature.hpp"
#include "message_filters/subscriber.h"
#include "message_filters/time_synchronizer.h"

using std::placeholders::_1;
using std::placeholders::_2;

class ExactTimeSubscriber : public rclcpp::Node
{
public:
  ExactTimeSubscriber()
      : Node("exact_time_subscriber")
  {
    subscription_temp_1_.subscribe(this, "temp_1");
    subscription_temp_2_.subscribe(this, "temp_2");

    message_filters::TimeSynchronizer<sensor_msgs::msg::Temperature, sensor_msgs::msg::Temperature> sync_(subscription_temp_1_, subscription_temp_2_, 3);
    sync_.registerCallback(std::bind(&ExactTimeSubscriber::topic_callback, this, _1, _2));
  }

private:
  void topic_callback(const sensor_msgs::msg::Temperature::SharedPtr tmp_1, const sensor_msgs::msg::Temperature::SharedPtr tmp_2) const
  {
    const char *temp_1 = std::to_string(tmp_1->temperature).c_str();
    const char *temp_2 = std::to_string(tmp_2->temperature).c_str();
    RCLCPP_INFO(this->get_logger(), "I heard: '%s' and '%s'", temp_1, temp_2);
  }
  message_filters::Subscriber<sensor_msgs::msg::Temperature> subscription_temp_1_;
  message_filters::Subscriber<sensor_msgs::msg::Temperature> subscription_temp_2_;
};

int main(int argc, char *argv[])
{
  rclcpp::init(argc, argv);
  rclcpp::spin(std::make_shared<ExactTimeSubscriber>());
  rclcpp::shutdown();

  return 0;
}

Does anyone know how to use the message_filters::TimeSynchronizer (or similar) to synchronize messages in ROS2?

My system details are as follows:

  • X86 64 CPU architecture
  • Ubuntu 18.04.5
  • Eloquent

My compile error follows:

--- stderr: synchronizer                             
In file included from /opt/ros/eloquent/include/message_filters/synchronizer.h:47:0,
                 from /opt/ros/eloquent/include/message_filters/time_synchronizer.h:41,
                 from /workspaces/hfss-v3-ros2/test_filters/src/synchronizer/src/exact_time.cpp:9:
/opt/ros/eloquent/include/message_filters/signal9.h: In instantiation of ‘message_filters::Connection message_filters::Signal9<M0, M1, M2, M3, M4, M5, M6, M7, M8>::addCallback(C&) [with C = const std::_Bind<void (ExactTimeSubscriber::*(ExactTimeSubscriber*, std::_Placeholder<1>, std::_Placeholder<2>))(std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >, std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >) const>; M0 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M1 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M2 = message_filters::NullType; M3 = message_filters::NullType; M4 = message_filters::NullType; M5 = message_filters::NullType; M6 = message_filters::NullType; M7 = message_filters::NullType; M8 = message_filters::NullType]’:
/opt/ros/eloquent/include/message_filters/synchronizer.h:298:40:   required from ‘message_filters::Connection message_filters::Synchronizer<Policy>::registerCallback(const C&) [with C = std::_Bind<void (ExactTimeSubscriber::*(ExactTimeSubscriber*, std::_Placeholder<1>, std::_Placeholder<2>))(std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >, std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >) const>; Policy = message_filters::sync_policies::ExactTime<sensor_msgs::msg::Temperature_<std::allocator<void> >, sensor_msgs::msg::Temperature_<std::allocator<void> >, message_filters::NullType, message_filters::NullType, message_filters::NullType, message_filters::NullType, message_filters::NullType, message_filters::NullType, message_filters::NullType>]’
/workspaces/hfss-v3-ros2/test_filters/src/synchronizer/src/exact_time.cpp:24:89:   required from here
/opt/ros/eloquent/include/message_filters/signal9.h:280:40: error: no matching function for call to ‘message_filters::Signal9<sensor_msgs::msg::Temperature_<std::allocator<void> >, sensor_msgs::msg::Temperature_<std::allocator<void> >, message_filters::NullType, message_filters::NullType, message_filters::NullType, message_filters::NullType, message_filters::NullType, message_filters::NullType, message_filters::NullType>::addCallback<const M0ConstPtr&, const M1ConstPtr&, const M2ConstPtr&, const M3ConstPtr&, const M4ConstPtr&, const M5ConstPtr&, const M6ConstPtr&, const M7ConstPtr&, const M8ConstPtr&>(std::_Bind_helper<false, const std::_Bind<void (ExactTimeSubscriber::*(ExactTimeSubscriber*, std::_Placeholder<1>, std::_Placeholder<2>))(std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >, std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >) const>&, const std::_Placeholder<1>&, const std::_Placeholder<2>&, const std::_Placeholder<3>&, const std::_Placeholder<4>&, const std::_Placeholder<5>&, const std::_Placeholder<6>&, const std::_Placeholder<7>&, const std::_Placeholder<8>&, const std::_Placeholder<9>&>::type)’
     return addCallback<const M0ConstPtr&,
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      const M1ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M2ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M3ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M4ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M5ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M6ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M7ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M8ConstPtr&>(std::bind(callback, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, std::placeholders::_7, std::placeholders::_8, std::placeholders::_9));
                      ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /opt/ros/eloquent/include/message_filters/synchronizer.h:47:0,
                 from /opt/ros/eloquent/include/message_filters/time_synchronizer.h:41,
                 from /workspaces/hfss-v3-ros2/test_filters/src/synchronizer/src/exact_time.cpp:9:
/opt/ros/eloquent/include/message_filters/signal9.h:170:14: note: candidate: template<class P0, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8> message_filters::Connection message_filters::Signal9<M0, M1, M2, M3, M4, M5, M6, M7, M8>::addCallback(const std::function<void(P0, P1, P2, P3, P4, P5, P6, P7, P8)>&) [with P0 = P0; P1 = P1; P2 = P2; P3 = P3; P4 = P4; P5 = P5; P6 = P6; P7 = P7; P8 = P8; M0 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M1 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M2 = message_filters::NullType; M3 = message_filters::NullType; M4 = message_filters::NullType; M5 = message_filters::NullType; M6 = message_filters::NullType; M7 = message_filters::NullType; M8 = message_filters::NullType]
   Connection addCallback(const std::function<void(P0, P1, P2, P3, P4, P5, P6, P7, P8)>& callback)
              ^~~~~~~~~~~
/opt/ros/eloquent/include/message_filters/signal9.h:170:14: note:   template argument deduction/substitution failed:
In file included from /opt/ros/eloquent/include/message_filters/synchronizer.h:47:0,
                 from /opt/ros/eloquent/include/message_filters/time_synchronizer.h:41,
                 from /workspaces/hfss-v3-ros2/test_filters/src/synchronizer/src/exact_time.cpp:9:
/opt/ros/eloquent/include/message_filters/signal9.h:280:40: note:   cannot convert ‘std::bind(_Func&&, _BoundArgs&& ...) [with _Func = const std::_Bind<void (ExactTimeSubscriber::*(ExactTimeSubscriber*, std::_Placeholder<1>, std::_Placeholder<2>))(std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >, std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >) const>&; _BoundArgs = {const std::_Placeholder<1>&, const std::_Placeholder<2>&, const std::_Placeholder<3>&, const std::_Placeholder<4>&, const std::_Placeholder<5>&, const std::_Placeholder<6>&, const std::_Placeholder<7>&, const std::_Placeholder<8>&, const std::_Placeholder<9>&}; typename std::_Bind_helper<std::__is_socketlike<_Func>::value, _Func, _BoundArgs ...>::type = std::_Bind<std::_Bind<void (ExactTimeSubscriber::*(ExactTimeSubscriber*, std::_Placeholder<1>, std::_Placeholder<2>))(std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >, std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >) const>(std::_Placeholder<1>, std::_Placeholder<2>, std::_Placeholder<3>, std::_Placeholder<4>, std::_Placeholder<5>, std::_Placeholder<6>, std::_Placeholder<7>, std::_Placeholder<8>, std::_Placeholder<9>)>](std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, std::placeholders::_7, std::placeholders::_8, std::placeholders::_9)’ (type ‘std::_Bind_helper<false, const std::_Bind<void (ExactTimeSubscriber::*(ExactTimeSubscriber*, std::_Placeholder<1>, std::_Placeholder<2>))(std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >, std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >) const>&, const std::_Placeholder<1>&, const std::_Placeholder<2>&, const std::_Placeholder<3>&, const std::_Placeholder<4>&, const std::_Placeholder<5>&, const std::_Placeholder<6>&, const std::_Placeholder<7>&, const std::_Placeholder<8>&, const std::_Placeholder<9>&>::type {aka std::_Bind<std::_Bind<void (ExactTimeSubscriber::*(ExactTimeSubscriber*, std::_Placeholder<1>, std::_Placeholder<2>))(std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >, std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >) const>(std::_Placeholder<1>, std::_Placeholder<2>, std::_Placeholder<3>, std::_Placeholder<4>, std::_Placeholder<5>, std::_Placeholder<6>, std::_Placeholder<7>, std::_Placeholder<8>, std::_Placeholder<9>)>}’) to type ‘const std::function<void(const std::shared_ptr<const sensor_msgs::msg::Temperature_<std::allocator<void> > >&, const std::shared_ptr<const sensor_msgs::msg::Temperature_<std::allocator<void> > >&, const std::shared_ptr<const message_filters::NullType>&, const std::shared_ptr<const message_filters::NullType>&, const std::shared_ptr<const message_filters::NullType>&, const std::shared_ptr<const message_filters::NullType>&, const std::shared_ptr<const message_filters::NullType>&, const std::shared_ptr<const message_filters::NullType>&, const std::shared_ptr<const message_filters::NullType>&)>&’
     return addCallback<const M0ConstPtr&,
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      const M1ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M2ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M3ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M4ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M5ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M6ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M7ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M8ConstPtr&>(std::bind(callback, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, std::placeholders::_7, std::placeholders::_8, std::placeholders::_9));
                      ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /opt/ros/eloquent/include/message_filters/synchronizer.h:47:0,
                 from /opt/ros/eloquent/include/message_filters/time_synchronizer.h:41,
                 from /workspaces/hfss-v3-ros2/test_filters/src/synchronizer/src/exact_time.cpp:9:
/opt/ros/eloquent/include/message_filters/signal9.h:180:14: note: candidate: template<class P0, class P1> message_filters::Connection message_filters::Signal9<M0, M1, M2, M3, M4, M5, M6, M7, M8>::addCallback(void (*)(P0, P1)) [with P0 = P0; P1 = P1; M0 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M1 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M2 = message_filters::NullType; M3 = message_filters::NullType; M4 = message_filters::NullType; M5 = message_filters::NullType; M6 = message_filters::NullType; M7 = message_filters::NullType; M8 = message_filters::NullType]
   Connection addCallback(void(*callback)(P0, P1))
              ^~~~~~~~~~~
/opt/ros/eloquent/include/message_filters/signal9.h:180:14: note:   template argument deduction/substitution failed:
In file included from /opt/ros/eloquent/include/message_filters/synchronizer.h:47:0,
                 from /opt/ros/eloquent/include/message_filters/time_synchronizer.h:41,
                 from /workspaces/hfss-v3-ros2/test_filters/src/synchronizer/src/exact_time.cpp:9:
/opt/ros/eloquent/include/message_filters/signal9.h:280:40: error: wrong number of template arguments (9, should be 2)
     return addCallback<const M0ConstPtr&,
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      const M1ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M2ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M3ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M4ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M5ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M6ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M7ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M8ConstPtr&>(std::bind(callback, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, std::placeholders::_7, std::placeholders::_8, std::placeholders::_9));
                      ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /opt/ros/eloquent/include/message_filters/synchronizer.h:47:0,
                 from /opt/ros/eloquent/include/message_filters/time_synchronizer.h:41,
                 from /workspaces/hfss-v3-ros2/test_filters/src/synchronizer/src/exact_time.cpp:9:
/opt/ros/eloquent/include/message_filters/signal9.h:186:14: note: candidate: template<class P0, class P1, class P2> message_filters::Connection message_filters::Signal9<M0, M1, M2, M3, M4, M5, M6, M7, M8>::addCallback(void (*)(P0, P1, P2)) [with P0 = P0; P1 = P1; P2 = P2; M0 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M1 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M2 = message_filters::NullType; M3 = message_filters::NullType; M4 = message_filters::NullType; M5 = message_filters::NullType; M6 = message_filters::NullType; M7 = message_filters::NullType; M8 = message_filters::NullType]
   Connection addCallback(void(*callback)(P0, P1, P2))
              ^~~~~~~~~~~
/opt/ros/eloquent/include/message_filters/signal9.h:186:14: note:   template argument deduction/substitution failed:
In file included from /opt/ros/eloquent/include/message_filters/synchronizer.h:47:0,
                 from /opt/ros/eloquent/include/message_filters/time_synchronizer.h:41,
                 from /workspaces/hfss-v3-ros2/test_filters/src/synchronizer/src/exact_time.cpp:9:
/opt/ros/eloquent/include/message_filters/signal9.h:280:40: error: wrong number of template arguments (9, should be 3)
     return addCallback<const M0ConstPtr&,
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      const M1ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M2ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M3ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M4ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M5ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M6ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M7ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M8ConstPtr&>(std::bind(callback, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, std::placeholders::_7, std::placeholders::_8, std::placeholders::_9));
                      ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /opt/ros/eloquent/include/message_filters/synchronizer.h:47:0,
                 from /opt/ros/eloquent/include/message_filters/time_synchronizer.h:41,
                 from /workspaces/hfss-v3-ros2/test_filters/src/synchronizer/src/exact_time.cpp:9:
/opt/ros/eloquent/include/message_filters/signal9.h:192:14: note: candidate: template<class P0, class P1, class P2, class P3> message_filters::Connection message_filters::Signal9<M0, M1, M2, M3, M4, M5, M6, M7, M8>::addCallback(void (*)(P0, P1, P2, P3)) [with P0 = P0; P1 = P1; P2 = P2; P3 = P3; M0 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M1 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M2 = message_filters::NullType; M3 = message_filters::NullType; M4 = message_filters::NullType; M5 = message_filters::NullType; M6 = message_filters::NullType; M7 = message_filters::NullType; M8 = message_filters::NullType]
   Connection addCallback(void(*callback)(P0, P1, P2, P3))
              ^~~~~~~~~~~
/opt/ros/eloquent/include/message_filters/signal9.h:192:14: note:   template argument deduction/substitution failed:
In file included from /opt/ros/eloquent/include/message_filters/synchronizer.h:47:0,
                 from /opt/ros/eloquent/include/message_filters/time_synchronizer.h:41,
                 from /workspaces/hfss-v3-ros2/test_filters/src/synchronizer/src/exact_time.cpp:9:
/opt/ros/eloquent/include/message_filters/signal9.h:280:40: error: wrong number of template arguments (9, should be 4)
     return addCallback<const M0ConstPtr&,
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      const M1ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M2ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M3ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M4ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M5ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M6ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M7ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M8ConstPtr&>(std::bind(callback, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, std::placeholders::_7, std::placeholders::_8, std::placeholders::_9));
                      ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /opt/ros/eloquent/include/message_filters/synchronizer.h:47:0,
                 from /opt/ros/eloquent/include/message_filters/time_synchronizer.h:41,
                 from /workspaces/hfss-v3-ros2/test_filters/src/synchronizer/src/exact_time.cpp:9:
/opt/ros/eloquent/include/message_filters/signal9.h:198:14: note: candidate: template<class P0, class P1, class P2, class P3, class P4> message_filters::Connection message_filters::Signal9<M0, M1, M2, M3, M4, M5, M6, M7, M8>::addCallback(void (*)(P0, P1, P2, P3, P4)) [with P0 = P0; P1 = P1; P2 = P2; P3 = P3; P4 = P4; M0 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M1 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M2 = message_filters::NullType; M3 = message_filters::NullType; M4 = message_filters::NullType; M5 = message_filters::NullType; M6 = message_filters::NullType; M7 = message_filters::NullType; M8 = message_filters::NullType]
   Connection addCallback(void(*callback)(P0, P1, P2, P3, P4))
              ^~~~~~~~~~~
/opt/ros/eloquent/include/message_filters/signal9.h:198:14: note:   template argument deduction/substitution failed:
In file included from /opt/ros/eloquent/include/message_filters/synchronizer.h:47:0,
                 from /opt/ros/eloquent/include/message_filters/time_synchronizer.h:41,
                 from /workspaces/hfss-v3-ros2/test_filters/src/synchronizer/src/exact_time.cpp:9:
/opt/ros/eloquent/include/message_filters/signal9.h:280:40: error: wrong number of template arguments (9, should be 5)
     return addCallback<const M0ConstPtr&,
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      const M1ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M2ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M3ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M4ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M5ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M6ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M7ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M8ConstPtr&>(std::bind(callback, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, std::placeholders::_7, std::placeholders::_8, std::placeholders::_9));
                      ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /opt/ros/eloquent/include/message_filters/synchronizer.h:47:0,
                 from /opt/ros/eloquent/include/message_filters/time_synchronizer.h:41,
                 from /workspaces/hfss-v3-ros2/test_filters/src/synchronizer/src/exact_time.cpp:9:
/opt/ros/eloquent/include/message_filters/signal9.h:204:14: note: candidate: template<class P0, class P1, class P2, class P3, class P4, class P5> message_filters::Connection message_filters::Signal9<M0, M1, M2, M3, M4, M5, M6, M7, M8>::addCallback(void (*)(P0, P1, P2, P3, P4, P5)) [with P0 = P0; P1 = P1; P2 = P2; P3 = P3; P4 = P4; P5 = P5; M0 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M1 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M2 = message_filters::NullType; M3 = message_filters::NullType; M4 = message_filters::NullType; M5 = message_filters::NullType; M6 = message_filters::NullType; M7 = message_filters::NullType; M8 = message_filters::NullType]
   Connection addCallback(void(*callback)(P0, P1, P2, P3, P4, P5))
              ^~~~~~~~~~~
/opt/ros/eloquent/include/message_filters/signal9.h:204:14: note:   template argument deduction/substitution failed:
In file included from /opt/ros/eloquent/include/message_filters/synchronizer.h:47:0,
                 from /opt/ros/eloquent/include/message_filters/time_synchronizer.h:41,
                 from /workspaces/hfss-v3-ros2/test_filters/src/synchronizer/src/exact_time.cpp:9:
/opt/ros/eloquent/include/message_filters/signal9.h:280:40: error: wrong number of template arguments (9, should be 6)
     return addCallback<const M0ConstPtr&,
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      const M1ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M2ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M3ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M4ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M5ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M6ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M7ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M8ConstPtr&>(std::bind(callback, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, std::placeholders::_7, std::placeholders::_8, std::placeholders::_9));
                      ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /opt/ros/eloquent/include/message_filters/synchronizer.h:47:0,
                 from /opt/ros/eloquent/include/message_filters/time_synchronizer.h:41,
                 from /workspaces/hfss-v3-ros2/test_filters/src/synchronizer/src/exact_time.cpp:9:
/opt/ros/eloquent/include/message_filters/signal9.h:210:14: note: candidate: template<class P0, class P1, class P2, class P3, class P4, class P5, class P6> message_filters::Connection message_filters::Signal9<M0, M1, M2, M3, M4, M5, M6, M7, M8>::addCallback(void (*)(P0, P1, P2, P3, P4, P5, P6)) [with P0 = P0; P1 = P1; P2 = P2; P3 = P3; P4 = P4; P5 = P5; P6 = P6; M0 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M1 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M2 = message_filters::NullType; M3 = message_filters::NullType; M4 = message_filters::NullType; M5 = message_filters::NullType; M6 = message_filters::NullType; M7 = message_filters::NullType; M8 = message_filters::NullType]
   Connection addCallback(void(*callback)(P0, P1, P2, P3, P4, P5, P6))
              ^~~~~~~~~~~
/opt/ros/eloquent/include/message_filters/signal9.h:210:14: note:   template argument deduction/substitution failed:
In file included from /opt/ros/eloquent/include/message_filters/synchronizer.h:47:0,
                 from /opt/ros/eloquent/include/message_filters/time_synchronizer.h:41,
                 from /workspaces/hfss-v3-ros2/test_filters/src/synchronizer/src/exact_time.cpp:9:
/opt/ros/eloquent/include/message_filters/signal9.h:280:40: error: wrong number of template arguments (9, should be 7)
     return addCallback<const M0ConstPtr&,
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      const M1ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M2ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M3ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M4ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M5ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M6ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M7ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M8ConstPtr&>(std::bind(callback, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, std::placeholders::_7, std::placeholders::_8, std::placeholders::_9));
                      ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/ros/eloquent/include/message_filters/signal9.h:216:14: note: candidate: template<class P0, class P1, class P2, class P3, class P4, class P5, class P6, class P7> message_filters::Connection message_filters::Signal9<M0, M1, M2, M3, M4, M5, M6, M7, M8>::addCallback(void (*)(P0, P1, P2, P3, P4, P5, P6, P7)) [with P0 = P0; P1 = P1; P2 = P2; P3 = P3; P4 = P4; P5 = P5; P6 = P6; P7 = P7; M0 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M1 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M2 = message_filters::NullType; M3 = message_filters::NullType; M4 = message_filters::NullType; M5 = message_filters::NullType; M6 = message_filters::NullType; M7 = message_filters::NullType; M8 = message_filters::NullType]
   Connection addCallback(void(*callback)(P0, P1, P2, P3, P4, P5, P6, P7))
              ^~~~~~~~~~~
/opt/ros/eloquent/include/message_filters/signal9.h:216:14: note:   template argument deduction/substitution failed:
/opt/ros/eloquent/include/message_filters/signal9.h:280:40: error: wrong number of template arguments (9, should be 8)
     return addCallback<const M0ConstPtr&,
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      const M1ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M2ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M3ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M4ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M5ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M6ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M7ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M8ConstPtr&>(std::bind(callback, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, std::placeholders::_7, std::placeholders::_8, std::placeholders::_9));
                      ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/ros/eloquent/include/message_filters/signal9.h:222:14: note: candidate: template<class P0, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8> message_filters::Connection message_filters::Signal9<M0, M1, M2, M3, M4, M5, M6, M7, M8>::addCallback(void (*)(P0, P1, P2, P3, P4, P5, P6, P7, P8)) [with P0 = P0; P1 = P1; P2 = P2; P3 = P3; P4 = P4; P5 = P5; P6 = P6; P7 = P7; P8 = P8; M0 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M1 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M2 = message_filters::NullType; M3 = message_filters::NullType; M4 = message_filters::NullType; M5 = message_filters::NullType; M6 = message_filters::NullType; M7 = message_filters::NullType; M8 = message_filters::NullType]
   Connection addCallback(void(*callback)(P0, P1, P2, P3, P4, P5, P6, P7, P8))
              ^~~~~~~~~~~
/opt/ros/eloquent/include/message_filters/signal9.h:222:14: note:   template argument deduction/substitution failed:
/opt/ros/eloquent/include/message_filters/signal9.h:280:40: note:   cannot convert ‘std::bind(_Func&&, _BoundArgs&& ...) [with _Func = const std::_Bind<void (ExactTimeSubscriber::*(ExactTimeSubscriber*, std::_Placeholder<1>, std::_Placeholder<2>))(std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >, std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >) const>&; _BoundArgs = {const std::_Placeholder<1>&, const std::_Placeholder<2>&, const std::_Placeholder<3>&, const std::_Placeholder<4>&, const std::_Placeholder<5>&, const std::_Placeholder<6>&, const std::_Placeholder<7>&, const std::_Placeholder<8>&, const std::_Placeholder<9>&}; typename std::_Bind_helper<std::__is_socketlike<_Func>::value, _Func, _BoundArgs ...>::type = std::_Bind<std::_Bind<void (ExactTimeSubscriber::*(ExactTimeSubscriber*, std::_Placeholder<1>, std::_Placeholder<2>))(std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >, std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >) const>(std::_Placeholder<1>, std::_Placeholder<2>, std::_Placeholder<3>, std::_Placeholder<4>, std::_Placeholder<5>, std::_Placeholder<6>, std::_Placeholder<7>, std::_Placeholder<8>, std::_Placeholder<9>)>](std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, std::placeholders::_7, std::placeholders::_8, std::placeholders::_9)’ (type ‘std::_Bind_helper<false, const std::_Bind<void (ExactTimeSubscriber::*(ExactTimeSubscriber*, std::_Placeholder<1>, std::_Placeholder<2>))(std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >, std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >) const>&, const std::_Placeholder<1>&, const std::_Placeholder<2>&, const std::_Placeholder<3>&, const std::_Placeholder<4>&, const std::_Placeholder<5>&, const std::_Placeholder<6>&, const std::_Placeholder<7>&, const std::_Placeholder<8>&, const std::_Placeholder<9>&>::type {aka std::_Bind<std::_Bind<void (ExactTimeSubscriber::*(ExactTimeSubscriber*, std::_Placeholder<1>, std::_Placeholder<2>))(std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >, std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >) const>(std::_Placeholder<1>, std::_Placeholder<2>, std::_Placeholder<3>, std::_Placeholder<4>, std::_Placeholder<5>, std::_Placeholder<6>, std::_Placeholder<7>, std::_Placeholder<8>, std::_Placeholder<9>)>}’) to type ‘void (*)(const std::shared_ptr<const sensor_msgs::msg::Temperature_<std::allocator<void> > >&, const std::shared_ptr<const sensor_msgs::msg::Temperature_<std::allocator<void> > >&, const std::shared_ptr<const message_filters::NullType>&, const std::shared_ptr<const message_filters::NullType>&, const std::shared_ptr<const message_filters::NullType>&, const std::shared_ptr<const message_filters::NullType>&, const std::shared_ptr<const message_filters::NullType>&, const std::shared_ptr<const message_filters::NullType>&, const std::shared_ptr<const message_filters::NullType>&)’
     return addCallback<const M0ConstPtr&,
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      const M1ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M2ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M3ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M4ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M5ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M6ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M7ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M8ConstPtr&>(std::bind(callback, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, std::placeholders::_7, std::placeholders::_8, std::placeholders::_9));
                      ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/ros/eloquent/include/message_filters/signal9.h:228:14: note: candidate: template<class T, class P0, class P1> message_filters::Connection message_filters::Signal9<M0, M1, M2, M3, M4, M5, M6, M7, M8>::addCallback(void (T::*)(P0, P1), T*) [with T = T; P0 = P0; P1 = P1; M0 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M1 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M2 = message_filters::NullType; M3 = message_filters::NullType; M4 = message_filters::NullType; M5 = message_filters::NullType; M6 = message_filters::NullType; M7 = message_filters::NullType; M8 = message_filters::NullType]
   Connection addCallback(void(T::*callback)(P0, P1), T* t)
              ^~~~~~~~~~~
/opt/ros/eloquent/include/message_filters/signal9.h:228:14: note:   template argument deduction/substitution failed:
/opt/ros/eloquent/include/message_filters/signal9.h:280:40: error: wrong number of template arguments (9, should be 3)
     return addCallback<const M0ConstPtr&,
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      const M1ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M2ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M3ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M4ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M5ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M6ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M7ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M8ConstPtr&>(std::bind(callback, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, std::placeholders::_7, std::placeholders::_8, std::placeholders::_9));
                      ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/ros/eloquent/include/message_filters/signal9.h:234:14: note: candidate: template<class T, class P0, class P1, class P2> message_filters::Connection message_filters::Signal9<M0, M1, M2, M3, M4, M5, M6, M7, M8>::addCallback(void (T::*)(P0, P1, P2), T*) [with T = T; P0 = P0; P1 = P1; P2 = P2; M0 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M1 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M2 = message_filters::NullType; M3 = message_filters::NullType; M4 = message_filters::NullType; M5 = message_filters::NullType; M6 = message_filters::NullType; M7 = message_filters::NullType; M8 = message_filters::NullType]
   Connection addCallback(void(T::*callback)(P0, P1, P2), T* t)
              ^~~~~~~~~~~
/opt/ros/eloquent/include/message_filters/signal9.h:234:14: note:   template argument deduction/substitution failed:
/opt/ros/eloquent/include/message_filters/signal9.h:280:40: error: wrong number of template arguments (9, should be 4)
     return addCallback<const M0ConstPtr&,
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      const M1ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M2ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M3ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M4ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M5ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M6ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M7ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M8ConstPtr&>(std::bind(callback, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, std::placeholders::_7, std::placeholders::_8, std::placeholders::_9));
                      ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/ros/eloquent/include/message_filters/signal9.h:240:14: note: candidate: template<class T, class P0, class P1, class P2, class P3> message_filters::Connection message_filters::Signal9<M0, M1, M2, M3, M4, M5, M6, M7, M8>::addCallback(void (T::*)(P0, P1, P2, P3), T*) [with T = T; P0 = P0; P1 = P1; P2 = P2; P3 = P3; M0 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M1 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M2 = message_filters::NullType; M3 = message_filters::NullType; M4 = message_filters::NullType; M5 = message_filters::NullType; M6 = message_filters::NullType; M7 = message_filters::NullType; M8 = message_filters::NullType]
   Connection addCallback(void(T::*callback)(P0, P1, P2, P3), T* t)
              ^~~~~~~~~~~
/opt/ros/eloquent/include/message_filters/signal9.h:240:14: note:   template argument deduction/substitution failed:
/opt/ros/eloquent/include/message_filters/signal9.h:280:40: error: wrong number of template arguments (9, should be 5)
     return addCallback<const M0ConstPtr&,
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      const M1ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M2ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M3ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M4ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M5ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M6ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M7ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M8ConstPtr&>(std::bind(callback, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, std::placeholders::_7, std::placeholders::_8, std::placeholders::_9));
                      ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/ros/eloquent/include/message_filters/signal9.h:246:14: note: candidate: template<class T, class P0, class P1, class P2, class P3, class P4> message_filters::Connection message_filters::Signal9<M0, M1, M2, M3, M4, M5, M6, M7, M8>::addCallback(void (T::*)(P0, P1, P2, P3, P4), T*) [with T = T; P0 = P0; P1 = P1; P2 = P2; P3 = P3; P4 = P4; M0 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M1 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M2 = message_filters::NullType; M3 = message_filters::NullType; M4 = message_filters::NullType; M5 = message_filters::NullType; M6 = message_filters::NullType; M7 = message_filters::NullType; M8 = message_filters::NullType]
   Connection addCallback(void(T::*callback)(P0, P1, P2, P3, P4), T* t)
              ^~~~~~~~~~~
/opt/ros/eloquent/include/message_filters/signal9.h:246:14: note:   template argument deduction/substitution failed:
/opt/ros/eloquent/include/message_filters/signal9.h:280:40: error: wrong number of template arguments (9, should be 6)
     return addCallback<const M0ConstPtr&,
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      const M1ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M2ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M3ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M4ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M5ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M6ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M7ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M8ConstPtr&>(std::bind(callback, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, std::placeholders::_7, std::placeholders::_8, std::placeholders::_9));
                      ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/ros/eloquent/include/message_filters/signal9.h:252:14: note: candidate: template<class T, class P0, class P1, class P2, class P3, class P4, class P5> message_filters::Connection message_filters::Signal9<M0, M1, M2, M3, M4, M5, M6, M7, M8>::addCallback(void (T::*)(P0, P1, P2, P3, P4, P5), T*) [with T = T; P0 = P0; P1 = P1; P2 = P2; P3 = P3; P4 = P4; P5 = P5; M0 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M1 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M2 = message_filters::NullType; M3 = message_filters::NullType; M4 = message_filters::NullType; M5 = message_filters::NullType; M6 = message_filters::NullType; M7 = message_filters::NullType; M8 = message_filters::NullType]
   Connection addCallback(void(T::*callback)(P0, P1, P2, P3, P4, P5), T* t)
              ^~~~~~~~~~~
/opt/ros/eloquent/include/message_filters/signal9.h:252:14: note:   template argument deduction/substitution failed:
/opt/ros/eloquent/include/message_filters/signal9.h:280:40: error: wrong number of template arguments (9, should be 7)
     return addCallback<const M0ConstPtr&,
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      const M1ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M2ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M3ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M4ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M5ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M6ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M7ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M8ConstPtr&>(std::bind(callback, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, std::placeholders::_7, std::placeholders::_8, std::placeholders::_9));
                      ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/ros/eloquent/include/message_filters/signal9.h:258:14: note: candidate: template<class T, class P0, class P1, class P2, class P3, class P4, class P5, class P6> message_filters::Connection message_filters::Signal9<M0, M1, M2, M3, M4, M5, M6, M7, M8>::addCallback(void (T::*)(P0, P1, P2, P3, P4, P5, P6), T*) [with T = T; P0 = P0; P1 = P1; P2 = P2; P3 = P3; P4 = P4; P5 = P5; P6 = P6; M0 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M1 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M2 = message_filters::NullType; M3 = message_filters::NullType; M4 = message_filters::NullType; M5 = message_filters::NullType; M6 = message_filters::NullType; M7 = message_filters::NullType; M8 = message_filters::NullType]
   Connection addCallback(void(T::*callback)(P0, P1, P2, P3, P4, P5, P6), T* t)
              ^~~~~~~~~~~
/opt/ros/eloquent/include/message_filters/signal9.h:258:14: note:   template argument deduction/substitution failed:
/opt/ros/eloquent/include/message_filters/signal9.h:280:40: error: wrong number of template arguments (9, should be 8)
     return addCallback<const M0ConstPtr&,
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      const M1ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M2ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M3ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M4ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M5ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M6ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M7ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M8ConstPtr&>(std::bind(callback, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, std::placeholders::_7, std::placeholders::_8, std::placeholders::_9));
                      ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/ros/eloquent/include/message_filters/signal9.h:264:14: note: candidate: template<class T, class P0, class P1, class P2, class P3, class P4, class P5, class P6, class P7> message_filters::Connection message_filters::Signal9<M0, M1, M2, M3, M4, M5, M6, M7, M8>::addCallback(void (T::*)(P0, P1, P2, P3, P4, P5, P6, P7), T*) [with T = T; P0 = P0; P1 = P1; P2 = P2; P3 = P3; P4 = P4; P5 = P5; P6 = P6; P7 = P7; M0 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M1 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M2 = message_filters::NullType; M3 = message_filters::NullType; M4 = message_filters::NullType; M5 = message_filters::NullType; M6 = message_filters::NullType; M7 = message_filters::NullType; M8 = message_filters::NullType]
   Connection addCallback(void(T::*callback)(P0, P1, P2, P3, P4, P5, P6, P7), T* t)
              ^~~~~~~~~~~
/opt/ros/eloquent/include/message_filters/signal9.h:264:14: note:   template argument deduction/substitution failed:
/opt/ros/eloquent/include/message_filters/signal9.h: In substitution of ‘template<class T, class P0, class P1, class P2, class P3, class P4, class P5, class P6, class P7> message_filters::Connection message_filters::Signal9<sensor_msgs::msg::Temperature_<std::allocator<void> >, sensor_msgs::msg::Temperature_<std::allocator<void> >, message_filters::NullType, message_filters::NullType, message_filters::NullType, message_filters::NullType, message_filters::NullType, message_filters::NullType, message_filters::NullType>::addCallback<T, P0, P1, P2, P3, P4, P5, P6, P7>(void (T::*)(P0, P1, P2, P3, P4, P5, P6, P7), T*) [with T = const std::shared_ptr<const sensor_msgs::msg::Temperature_<std::allocator<void> > >&; P0 = const std::shared_ptr<const sensor_msgs::msg::Temperature_<std::allocator<void> > >&; P1 = const std::shared_ptr<const message_filters::NullType>&; P2 = const std::shared_ptr<const message_filters::NullType>&; P3 = const std::shared_ptr<const message_filters::NullType>&; P4 = const std::shared_ptr<const message_filters::NullType>&; P5 = const std::shared_ptr<const message_filters::NullType>&; P6 = const std::shared_ptr<const message_filters::NullType>&; P7 = const std::shared_ptr<const message_filters::NullType>&]’:
/opt/ros/eloquent/include/message_filters/signal9.h:280:40:   required from ‘message_filters::Connection message_filters::Signal9<M0, M1, M2, M3, M4, M5, M6, M7, M8>::addCallback(C&) [with C = const std::_Bind<void (ExactTimeSubscriber::*(ExactTimeSubscriber*, std::_Placeholder<1>, std::_Placeholder<2>))(std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >, std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >) const>; M0 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M1 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M2 = message_filters::NullType; M3 = message_filters::NullType; M4 = message_filters::NullType; M5 = message_filters::NullType; M6 = message_filters::NullType; M7 = message_filters::NullType; M8 = message_filters::NullType]’
/opt/ros/eloquent/include/message_filters/synchronizer.h:298:40:   required from ‘message_filters::Connection message_filters::Synchronizer<Policy>::registerCallback(const C&) [with C = std::_Bind<void (ExactTimeSubscriber::*(ExactTimeSubscriber*, std::_Placeholder<1>, std::_Placeholder<2>))(std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >, std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >) const>; Policy = message_filters::sync_policies::ExactTime<sensor_msgs::msg::Temperature_<std::allocator<void> >, sensor_msgs::msg::Temperature_<std::allocator<void> >, message_filters::NullType, message_filters::NullType, message_filters::NullType, message_filters::NullType, message_filters::NullType, message_filters::NullType, message_filters::NullType>]’
/workspaces/hfss-v3-ros2/test_filters/src/synchronizer/src/exact_time.cpp:24:89:   required from here
/opt/ros/eloquent/include/message_filters/signal9.h:264:14: error: forming pointer to reference type ‘const std::shared_ptr<const sensor_msgs::msg::Temperature_<std::allocator<void> > >&’
/opt/ros/eloquent/include/message_filters/signal9.h: In instantiation of ‘message_filters::Connection message_filters::Signal9<M0, M1, M2, M3, M4, M5, M6, M7, M8>::addCallback(C&) [with C = const std::_Bind<void (ExactTimeSubscriber::*(ExactTimeSubscriber*, std::_Placeholder<1>, std::_Placeholder<2>))(std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >, std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >) const>; M0 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M1 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M2 = message_filters::NullType; M3 = message_filters::NullType; M4 = message_filters::NullType; M5 = message_filters::NullType; M6 = message_filters::NullType; M7 = message_filters::NullType; M8 = message_filters::NullType]’:
/opt/ros/eloquent/include/message_filters/synchronizer.h:298:40:   required from ‘message_filters::Connection message_filters::Synchronizer<Policy>::registerCallback(const C&) [with C = std::_Bind<void (ExactTimeSubscriber::*(ExactTimeSubscriber*, std::_Placeholder<1>, std::_Placeholder<2>))(std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >, std::shared_ptr<sensor_msgs::msg::Temperature_<std::allocator<void> > >) const>; Policy = message_filters::sync_policies::ExactTime<sensor_msgs::msg::Temperature_<std::allocator<void> >, sensor_msgs::msg::Temperature_<std::allocator<void> >, message_filters::NullType, message_filters::NullType, message_filters::NullType, message_filters::NullType, message_filters::NullType, message_filters::NullType, message_filters::NullType>]’
/workspaces/hfss-v3-ros2/test_filters/src/synchronizer/src/exact_time.cpp:24:89:   required from here
/opt/ros/eloquent/include/message_filters/signal9.h:270:14: note: candidate: template<class C> message_filters::Connection message_filters::Signal9<M0, M1, M2, M3, M4, M5, M6, M7, M8>::addCallback(C&) [with C = C; M0 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M1 = sensor_msgs::msg::Temperature_<std::allocator<void> >; M2 = message_filters::NullType; M3 = message_filters::NullType; M4 = message_filters::NullType; M5 = message_filters::NullType; M6 = message_filters::NullType; M7 = message_filters::NullType; M8 = message_filters::NullType]
   Connection addCallback( C& callback)
              ^~~~~~~~~~~
/opt/ros/eloquent/include/message_filters/signal9.h:270:14: note:   template argument deduction/substitution failed:
/opt/ros/eloquent/include/message_filters/signal9.h:280:40: error: wrong number of template arguments (9, should be 1)
     return addCallback<const M0ConstPtr&,
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      const M1ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M2ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M3ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M4ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M5ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M6ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M7ConstPtr&,
                      ~~~~~~~~~~~~~~~~~~ 
                      const M8ConstPtr&>(std::bind(callback, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, std::placeholders::_7, std::placeholders::_8, std::placeholders::_9));
                      ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
make[2]: *** [CMakeFiles/exact_time.dir/src/exact_time.cpp.o] Error 1
make[1]: *** [CMakeFiles/exact_time.dir/all] Error 2
make: *** [all] Error 2
---
Failed   <<< synchronizer [2.56s, exited with code 2]