ROS中spin和spinOnce

原链接:http://wiki.ros.org/roscpp/Overview/Callbacks%20and%20Spinning

spin

ros::init(argc, argv, "my_node");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe(...);
...
ros::spin();
  • 所有的用户回调都将在ros::spin()调用中被调用, ros::spin()不会return 直到节点被关闭,无论是通过调用ros::shutdown()还是Ctrl-C。

ros::spinOnce()

  • 另一种常见的模式是周期性地调用ros::spinOnce()。
ros::Rate r(10); // 10 hz
while (should_continue)
{
  ... do some work, publish some messages, etc. ...
  ros::spinOnce();
  r.sleep();
}
  • ros::spinOnce()将调用所有在该时间点上等待被调用的回调。
  • 实现我们自己的spin()是非常简单的。
#include 
ros::NodeHandle n;
while (ros::ok())
{
  ros::getGlobalCallbackQueue()->callAvailable(ros::WallDuration(0.1));
}
  • and spinOnce() is simply:
#include 

ros::getGlobalCallbackQueue()->callAvailable(ros::WallDuration(0))

注意:spin()和spinOnce()实际上是为单线程应用程序设计的,并没有为从多线程同时调用进行优化。

你可能感兴趣的:(ROS学习笔记)