ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | ros @ Robotics Stack Exchange |
1 | initial version |
I solved the problem by myself when I checked again if I started the additional thread correctly at all. And it was a simple and stupid mistake.
Solution:
Just delete the line with someThread.join()
and use someThread.detach()
after intializing the thread and before calling ros::spin()
. Detaching the additional thread ensures that the main thread and the additional one don't block each other.
So the main function looks like the following:
int main(int argc, char **argv)
{
ros::init(argc, argv, "someNode");
ros::NodeHandle n;
ros::Publisher pub = n.advertise<std_msgs::UInt16>("topic", 1);
ros::Subscriber sub = n.subscribe("interestingtopic", 10, subscriberCallback);
msgUInt.data = 1;
std::thread someThread(threadCallback, &pub);
someThread.detach();
ros::spin();
return 0;
}
Now the node terminates as expected.
I'm still not completely sure why the problem occurs in the first place. Because as I understand it, ros:spin()
will return to the calling method (here the main method) as soon as the node should shutdown. Why does the thread not 'join"?
2 | No.2 Revision |
I solved the problem by myself when I checked again if I started the additional thread correctly at all. And it was a simple and stupid mistake.
Solution:
Just delete the line with someThread.join()
and use someThread.detach()
after intializing the thread and before calling ros::spin()
. Detaching the additional thread ensures that the main thread and the additional one don't block each other.
So the main function looks like the following:
int main(int argc, char **argv)
{
ros::init(argc, argv, "someNode");
ros::NodeHandle n;
ros::Publisher pub = n.advertise<std_msgs::UInt16>("topic", 1);
ros::Subscriber sub = n.subscribe("interestingtopic", 10, subscriberCallback);
msgUInt.data = 1;
std::thread someThread(threadCallback, &pub);
someThread.detach();
ros::spin();
return 0;
}
Now the node terminates as expected.
I'm still not completely sure why the problem occurs in the first place. Because as I understand it, ros:spin()
will return to the calling method (here the main method) as soon as the node should shutdown. Why does the thread not 'join"?
EDIT: I forgot to update my solution. See comments below this answer for details. I also changed the inner while loop to something like this:
while(ros::ok())
{
mu.lock()
if(interestingNumber == 0)
{
if(msgUInt.data == 2000)
msgUint.data = 1;
msgUInt.data++;
p->publish(msgUInt);
}
mu.unlock();
loopRateInner.sleep();
}
3 | No.3 Revision |
I solved the problem by myself when I checked again if I started the additional thread correctly at all. And it was a simple and stupid mistake.
Solution:
Just delete the line with someThread.join()
and use someThread.detach()
after intializing the thread and before calling ros::spin()
. Detaching the additional thread ensures that the main thread and the additional one don't block each other.
So the main function looks like the following:
int main(int argc, char **argv)
{
ros::init(argc, argv, "someNode");
ros::NodeHandle n;
ros::Publisher pub = n.advertise<std_msgs::UInt16>("topic", 1);
ros::Subscriber sub = n.subscribe("interestingtopic", 10, subscriberCallback);
msgUInt.data = 1;
std::thread someThread(threadCallback, &pub);
someThread.detach();
ros::spin();
return 0;
}
Now the node terminates as expected.
I'm still not completely sure why the problem occurs in the first place. Because as I understand it, ros:spin()
will return to the calling method (here the main method) as soon as the node should shutdown. Why does the thread not 'join"?
EDIT:
EDIT: I forgot to update my solution. See comments below this answer for details.
I also changed replaced the inner while loop to with an if statement, so it looks something like this:
while(ros::ok())
{
mu.lock()
if(interestingNumber == 0)
{
if(msgUInt.data == 2000)
msgUint.data = 1;
msgUInt.data++;
p->publish(msgUInt);
}
mu.unlock();
loopRateInner.sleep();
}