waitForMessage in thread always time-out

asked 2018-07-12 08:44:09 -0500

thibthib gravatar image

I'm implementing a node that is managing multiple controllers for my robot so I want to have the following behavior:

  • the controllerManager node publish on a "control/manager/tick" topic.
  • On reception of this message: the controller1 and controller2 nodes calculate a commands and each publish back to a topic "control/controllerX/command" on which controllerManager is listening.
  • After publishing the tick, controllerManager wait for receiving the commands from both controller1 AND controller2 to continue.

So I used the following implementation:

void controllerManager::someMethod(){
     // some stuff
     ............

     // create threads that will run until a message is published on some topic or time-out
     std::vector(boost::thread) threads;
     for(auto& ctrler : all_ctrlers){         // all_ctrlers contains an object for controller1 and controller2
              std::string controllerTopic = ctrler.getTopic();
              ros::Duration timeOut(1);
              threads.push_back( boost::bind(
                       ros::topic::waitForMessage<MyMsg>,
                       controllerTopic,
                       timeOut));
     }

     // publish the tick to the controllers
     tickPublisher.publish(tickMsg);
     // On reception of this msg, the controllers node will publish a response 

     // wait for all controller to have published their command in response to the tick
     for(auto& thread : threads){
              thread.join()
     }

     // some more stuff
     ......
}

The issue I'm facing here is that ros::topic::waitForMessage always time-out. I did try:

  • to use the different versions of waitForMessage functions with different types of NodeHandle,
  • to replace this function by its implementation to dig a bit deeper,

but no matter what I try, this is always timing out.

Am I missing some important thing with ROS communication and threading?

edit retag flag offensive close merge delete